From 9a34b607ab025febf0fae9aa79b6013bda30a979 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Thu, 5 Dec 2002 15:21:17 +0000 Subject: [PATCH] * g10.c: New options --[no-]mangle-dos-filenames. * options.h (opt): Added mangle-dos-filenames. * openfile.c (open_outfile) [USE_ONLY_8DOT3]: Truncate the filename only when this option is set; this is the default. NOT YET TESTED! --- g10/ChangeLog | 7 +++ g10/g10.c | 29 +++++----- g10/openfile.c | 147 ++++++++++++++++++++++++++----------------------- g10/options.h | 1 + 4 files changed, 101 insertions(+), 83 deletions(-) diff --git a/g10/ChangeLog b/g10/ChangeLog index e40e9b56f..78f8860f9 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,10 @@ +2002-12-05 Werner Koch + + * g10.c: New options --[no-]mangle-dos-filenames. + * options.h (opt): Added mangle-dos-filenames. + * openfile.c (open_outfile) [USE_ONLY_8DOT3]: Truncate the + filename only when this option is set; this is the default. + 2002-12-04 David Shaw * main.h, keyedit.c, keygen.c: Back out previous (2002-12-01) diff --git a/g10/g10.c b/g10/g10.c index a84bb9173..d333bc675 100644 --- a/g10/g10.c +++ b/g10/g10.c @@ -149,13 +149,9 @@ enum cmd_and_opt_values { aNull = 0, oDebug, oDebugAll, oStatusFD, -#ifdef __riscos__ - oStatusFile, -#endif /* __riscos__ */ + oStatusFile, /* only used with risc os */ oAttributeFD, -#ifdef __riscos__ - oAttributeFile, -#endif /* __riscos__ */ + oAttributeFile, /* only used with risc os */ oSKComments, oNoSKComments, oNoVersion, @@ -179,13 +175,9 @@ enum cmd_and_opt_values { aNull = 0, oCertDigestAlgo, oCompressAlgo, oPasswdFD, -#ifdef __riscos__ - oPasswdFile, -#endif /* __riscos__ */ + oPasswdFile, /* only used with risc os */ oCommandFD, -#ifdef __riscos__ - oCommandFile, -#endif /* __riscos__ */ + oCommandFile, /* only used with risc os */ oQuickRandom, oNoVerbose, oTrustDBName, @@ -251,9 +243,7 @@ enum cmd_and_opt_values { aNull = 0, oEncryptTo, oNoEncryptTo, oLoggerFD, -#ifdef __riscos__ - oLoggerFile, -#endif /* __riscos__ */ + oLoggerFile, /* only used with risc os */ oUtf8Strings, oNoUtf8Strings, oDisableCipherAlgo, @@ -304,6 +294,8 @@ enum cmd_and_opt_values { aNull = 0, oGroup, oStrict, oNoStrict, + oMangleDosFilenames, + oNoMangleDosFilenames, aTest }; @@ -597,6 +589,8 @@ static ARGPARSE_OPTS opts[] = { { oGroup, "group", 2, "@" }, { oStrict, "strict", 0, "@" }, { oNoStrict, "no-strict", 0, "@" }, + { oMangleDosFilenames, "mangle-dos-filenames", 0, "@" }, + { oNoMangleDosFilenames, "no-mangle-dos-filenames", 0, "@" }, {0} }; @@ -1112,6 +1106,7 @@ main( int argc, char **argv ) EXPORT_INCLUDE_NON_RFC|EXPORT_INCLUDE_ATTRIBUTES; opt.keyserver_options.include_subkeys=1; opt.keyserver_options.include_revoked=1; + opt.mangle_dos_filenames = 1; #if defined (__MINGW32__) set_homedir ( read_w32_registry_string( NULL, "Software\\GNU\\GnuPG", "HomeDir" )); @@ -1685,6 +1680,10 @@ main( int argc, char **argv ) case oGroup: add_group(pargs.r.ret_str); break; case oStrict: /* noop */ break; case oNoStrict: /* noop */ break; + + case oMangleDosFilenames: opt.mangle_dos_filenames = 1; break; + case oNoMangleDosFilenames: opt.mangle_dos_filenames = 0; break; + default : pargs.err = configfp? 1:2; break; } } diff --git a/g10/openfile.c b/g10/openfile.c index 83c734dfd..64e1b8dc2 100644 --- a/g10/openfile.c +++ b/g10/openfile.c @@ -172,80 +172,91 @@ ask_outfile_name( const char *name, size_t namelen ) int open_outfile( const char *iname, int mode, IOBUF *a ) { - int rc = 0; + int rc = 0; - *a = NULL; - if( (!iname || (*iname=='-' && !iname[1])) && !opt.outfile ) { - if( !(*a = iobuf_create(NULL)) ) { - log_error(_("%s: can't open: %s\n"), "[stdout]", strerror(errno) ); - rc = G10ERR_CREATE_FILE; - } - else if( opt.verbose ) - log_info(_("writing to stdout\n")); + *a = NULL; + if( (!iname || (*iname=='-' && !iname[1])) && !opt.outfile ) { + if( !(*a = iobuf_create(NULL)) ) { + log_error(_("%s: can't open: %s\n"), "[stdout]", strerror(errno) ); + rc = G10ERR_CREATE_FILE; } + else if( opt.verbose ) + log_info(_("writing to stdout\n")); + } + else { + char *buf = NULL; + const char *name; + + if( opt.dry_run ) + name = "/dev/null"; + else if( opt.outfile ) + name = opt.outfile; else { - char *buf=NULL; - const char *name; - - if( opt.dry_run ) - name = "/dev/null"; - else if( opt.outfile ) - name = opt.outfile; - else { - #ifdef USE_ONLY_8DOT3 - /* It is quite common DOS system to have only one dot in a - * a filename So if we have something like this, we simple - * replace the suffix execpt in cases where the suffix is - * larger than 3 characters and not the same as. - * We should really map the filenames to 8.3 but this tends to - * be more complicated and is probaly a duty of the filesystem - */ - char *dot; - const char *newsfx = mode==1 ? ".asc" : - mode==2 ? ".sig" : ".gpg"; - - buf = m_alloc(strlen(iname)+4+1); - strcpy(buf,iname); - dot = strchr(buf, '.' ); - if( dot && dot > buf && dot[1] && strlen(dot) <= 4 - && CMP_FILENAME(newsfx, dot) ) { - strcpy(dot, newsfx ); - } - else if( dot && !dot[1] ) /* don't duplicate a dot */ - strcpy( dot, newsfx+1 ); - else - strcat( buf, newsfx ); - #else - buf = m_alloc(strlen(iname)+4+1); - strcpy(stpcpy(buf,iname), mode==1 ? EXTSEP_S "asc" : - mode==2 ? EXTSEP_S "sig" : EXTSEP_S "gpg"); - #endif - name = buf; - } - - rc = 0; - while( !overwrite_filep (name) ) { - char *tmp = ask_outfile_name (NULL, 0); - if ( !tmp || !*tmp ) { - m_free (tmp); - rc = G10ERR_FILE_EXISTS; - break; +#ifdef USE_ONLY_8DOT3 + if (opt.mangle_dos_filenames) + { + /* It is quite common DOS system to have only one dot in a + * a filename So if we have something like this, we simple + * replace the suffix execpt in cases where the suffix is + * larger than 3 characters and not the same as. + * We should really map the filenames to 8.3 but this tends to + * be more complicated and is probaly a duty of the filesystem + */ + char *dot; + const char *newsfx = mode==1 ? ".asc" : + mode==2 ? ".sig" : ".gpg"; + + buf = m_alloc(strlen(iname)+4+1); + strcpy(buf,iname); + dot = strchr(buf, '.' ); + if ( dot && dot > buf && dot[1] && strlen(dot) <= 4 + && CMP_FILENAME(newsfx, dot) ) + { + strcpy(dot, newsfx ); } - m_free (buf); - name = buf = tmp; + else if ( dot && !dot[1] ) /* don't duplicate a dot */ + strcpy( dot, newsfx+1 ); + else + strcat ( buf, newsfx ); } - - if( !rc ) { - if( !(*a = iobuf_create( name )) ) { - log_error(_("%s: can't create: %s\n"), name, strerror(errno) ); - rc = G10ERR_CREATE_FILE; - } - else if( opt.verbose ) - log_info(_("writing to `%s'\n"), name ); - } - m_free(buf); + if (!buf) +#endif /* USE_ONLY_8DOT3 */ + { + buf = m_alloc(strlen(iname)+4+1); + strcpy(stpcpy(buf,iname), mode==1 ? EXTSEP_S "asc" : + mode==2 ? EXTSEP_S "sig" : EXTSEP_S "gpg"); + } + name = buf; } - return rc; + + rc = 0; + while( !overwrite_filep (name) ) + { + char *tmp = ask_outfile_name (NULL, 0); + if ( !tmp || !*tmp ) + { + m_free (tmp); + rc = G10ERR_FILE_EXISTS; + break; + } + m_free (buf); + name = buf = tmp; + } + + if( !rc ) + { + if( !(*a = iobuf_create( name )) ) + { + log_error(_("%s: can't create: %s\n"), name, strerror(errno) ); + rc = G10ERR_CREATE_FILE; + } + else if( opt.verbose ) + log_info(_("writing to `%s'\n"), name ); + } + m_free(buf); + } + + return rc; } diff --git a/g10/options.h b/g10/options.h index 8031523ad..9e597806d 100644 --- a/g10/options.h +++ b/g10/options.h @@ -178,6 +178,7 @@ struct { int no_homedir_creation; int show_keyring; struct groupitem *grouplist; + int mangle_dos_filenames; } opt;