2 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3 * 2005 Free Software Foundation, Inc.
5 * This file is part of GnuPG.
7 * GnuPG is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * GnuPG is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
29 #include <sys/types.h>
43 #define SKELEXT ".skl"
45 #define SKELEXT EXTSEP_S "skel"
48 #if defined (HAVE_DRIVE_LETTERS) || defined (__riscos__)
49 #define CMP_FILENAME(a,b) ascii_strcasecmp( (a), (b) )
51 #define CMP_FILENAME(a,b) strcmp( (a), (b) )
54 #ifdef MKDIR_TAKES_ONE_ARG
56 #define mkdir(a,b) mkdir(a)
59 /* FIXME: Implement opt.interactive. */
62 * Check whether FNAME exists and ask if it's okay to overwrite an
64 * Returns: True: it's okay to overwrite or the file does not exist
65 * False: Do not overwrite
68 overwrite_filep( const char *fname
)
70 if( iobuf_is_pipe_filename (fname
) )
71 return 1; /* Writing to stdout is always okay */
73 if( access( fname
, F_OK
) )
74 return 1; /* does not exist */
76 #ifndef HAVE_DOSISH_SYSTEM
77 if ( !strcmp ( fname
, "/dev/null" ) )
78 return 1; /* does not do any harm */
81 /* fixme: add some backup stuff in case of overwrite */
84 if( opt
.answer_no
|| opt
.batch
)
85 return 0; /* do not overwrite */
87 tty_printf(_("File `%s' exists. "), fname
);
90 if( cpr_get_answer_is_yes("openfile.overwrite.okay",
91 _("Overwrite? (y/N) ")) )
98 * Strip known extensions from iname and return a newly allocated
99 * filename. Return NULL if we can't do that.
102 make_outfile_name( const char *iname
)
106 if ( iobuf_is_pipe_filename (iname
) )
110 if( n
> 4 && ( !CMP_FILENAME(iname
+n
-4, EXTSEP_S
"gpg")
111 || !CMP_FILENAME(iname
+n
-4, EXTSEP_S
"pgp")
112 || !CMP_FILENAME(iname
+n
-4, EXTSEP_S
"sig")
113 || !CMP_FILENAME(iname
+n
-4, EXTSEP_S
"asc") ) ) {
114 char *buf
= xstrdup( iname
);
118 else if( n
> 5 && !CMP_FILENAME(iname
+n
-5, EXTSEP_S
"sign") ) {
119 char *buf
= xstrdup( iname
);
124 log_info(_("%s: unknown suffix\n"), iname
);
129 /* Ask for an output filename; use the given one as default. Return
130 NULL if no file has been given or if it is not possible to ask the
131 user. NAME is the template len which might conatin enbedded Nuls.
132 NAMELEN is its actual length.
135 ask_outfile_name( const char *name
, size_t namelen
)
146 defname
= name
&& namelen
? make_printable_string (name
, namelen
, 0) : NULL
;
148 s
= _("Enter new filename");
149 n
= strlen(s
) + (defname
?strlen (defname
):0) + 10;
150 prompt
= xmalloc (n
);
152 snprintf (prompt
, n
-1, "%s [%s]: ", s
, defname
);
154 snprintf (prompt
, n
-1, "%s: ", s
);
155 tty_enable_completion(NULL
);
156 fname
= cpr_get ("openfile.askoutname", prompt
);
158 tty_disable_completion ();
174 * Make an output filename for the inputfile INAME.
175 * Returns an IOBUF and an errorcode
176 * Mode 0 = use ".gpg"
181 open_outfile( const char *iname
, int mode
, IOBUF
*a
)
186 if( iobuf_is_pipe_filename (iname
) && !opt
.outfile
) {
187 *a
= iobuf_create(NULL
);
189 rc
= gpg_error_from_syserror ();
190 log_error(_("can't open `%s': %s\n"), "[stdout]", strerror(errno
) );
192 else if( opt
.verbose
)
193 log_info(_("writing to stdout\n"));
201 else if( opt
.outfile
)
204 #ifdef USE_ONLY_8DOT3
205 if (opt
.mangle_dos_filenames
)
207 /* It is quite common DOS system to have only one dot in a
208 * a filename So if we have something like this, we simple
209 * replace the suffix execpt in cases where the suffix is
210 * larger than 3 characters and not the same as.
211 * We should really map the filenames to 8.3 but this tends to
212 * be more complicated and is probaly a duty of the filesystem
215 const char *newsfx
= mode
==1 ? ".asc" :
216 mode
==2 ? ".sig" : ".gpg";
218 buf
= xmalloc(strlen(iname
)+4+1);
220 dot
= strchr(buf
, '.' );
221 if ( dot
&& dot
> buf
&& dot
[1] && strlen(dot
) <= 4
222 && CMP_FILENAME(newsfx
, dot
) )
224 strcpy(dot
, newsfx
);
226 else if ( dot
&& !dot
[1] ) /* don't duplicate a dot */
227 strcpy( dot
, newsfx
+1 );
229 strcat ( buf
, newsfx
);
232 #endif /* USE_ONLY_8DOT3 */
234 buf
= xmalloc(strlen(iname
)+4+1);
235 strcpy(stpcpy(buf
,iname
), mode
==1 ? EXTSEP_S
"asc" :
236 mode
==2 ? EXTSEP_S
"sig" : EXTSEP_S
"gpg");
242 while( !overwrite_filep (name
) )
244 char *tmp
= ask_outfile_name (NULL
, 0);
248 rc
= gpg_error (GPG_ERR_EEXIST
);
257 if (is_secured_filename (name
) )
263 *a
= iobuf_create( name
);
266 rc
= gpg_error_from_syserror ();
267 log_error(_("can't create `%s': %s\n"), name
, strerror(errno
) );
269 else if( opt
.verbose
)
270 log_info(_("writing to `%s'\n"), name
);
276 iobuf_ioctl (*a
,3,1,NULL
); /* disable fd caching */
283 * Try to open a file without the extension ".sig" or ".asc"
284 * Return NULL if such a file is not available.
287 open_sigfile( const char *iname
, progress_filter_context_t
*pfx
)
292 if( !iobuf_is_pipe_filename (iname
) ) {
294 if( len
> 4 && ( !strcmp(iname
+ len
- 4, EXTSEP_S
"sig")
295 || ( len
> 5 && !strcmp(iname
+ len
- 5, EXTSEP_S
"sign") )
296 || !strcmp(iname
+ len
- 4, EXTSEP_S
"asc")) ) {
298 buf
= xstrdup(iname
);
299 buf
[len
-(buf
[len
-1]=='n'?5:4)] = 0 ;
300 a
= iobuf_open( buf
);
301 if (a
&& is_secured_file (iobuf_get_fd (a
)))
307 if( a
&& opt
.verbose
)
308 log_info(_("assuming signed data in `%s'\n"), buf
);
310 handle_progress (pfx
, a
, buf
);
318 * Copy the option file skeleton to the given directory.
321 copy_options_file( const char *destdir
)
323 const char *datadir
= GNUPG_DATADIR
;
335 fname
= xmalloc( strlen(datadir
) + strlen(destdir
) + 15 );
336 strcpy(stpcpy(fname
, datadir
), DIRSEP_S
"gpg-conf" SKELEXT
);
337 src
= fopen( fname
, "r" );
338 if (src
&& is_secured_file (fileno (src
)))
345 log_info (_("can't open `%s': %s\n"), fname
, strerror(errno
) );
349 strcpy(stpcpy(fname
, destdir
), DIRSEP_S
"gpg" EXTSEP_S
"conf" );
351 if ( is_secured_filename (fname
) )
357 dst
= fopen( fname
, "w" );
360 log_info (_("can't create `%s': %s\n"), fname
, strerror(errno
) );
366 while( (c
=getc(src
)) != EOF
) {
367 if( linefeeds
< 3 ) {
376 if (c
== ' ' || c
== '\t')
387 log_info(_("new configuration file `%s' created\n"), fname
);
389 log_info (_("WARNING: options in `%s'"
390 " are not yet active during this run\n"),
397 try_make_homedir( const char *fname
)
399 const char *defhome
= GNUPG_DEFAULT_HOMEDIR
;
401 /* Create the directory only if the supplied directory name
402 * is the same as the default one. This way we avoid to create
403 * arbitrary directories when a non-default homedirectory is used.
404 * To cope with HOME, we do compare only the suffix if we see that
405 * the default homedir does start with a tilde.
407 if( opt
.dry_run
|| opt
.no_homedir_creation
)
410 if ( ( *defhome
== '~'
411 && ( strlen(fname
) >= strlen (defhome
+1)
412 && !strcmp(fname
+strlen(fname
)-strlen(defhome
+1),
415 && !compare_filenames( fname
, defhome
) )
417 if( mkdir( fname
, S_IRUSR
|S_IWUSR
|S_IXUSR
) )
418 log_fatal( _("can't create directory `%s': %s\n"),
419 fname
, strerror(errno
) );
420 else if( !opt
.quiet
)
421 log_info( _("directory `%s' created\n"), fname
);
422 copy_options_file( fname
);
423 /* log_info(_("you have to start GnuPG again, " */
424 /* "so it can read the new configuration file\n") ); */