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>
42 #define SKELEXT ".skl"
44 #define SKELEXT EXTSEP_S "skel"
47 #if defined (HAVE_DRIVE_LETTERS) || defined (__riscos__)
48 #define CMP_FILENAME(a,b) ascii_strcasecmp( (a), (b) )
50 #define CMP_FILENAME(a,b) strcmp( (a), (b) )
53 #ifdef MKDIR_TAKES_ONE_ARG
55 #define mkdir(a,b) mkdir(a)
58 /* FIXME: Implement opt.interactive. */
61 * Check whether FNAME exists and ask if it's okay to overwrite an
63 * Returns: True: it's okay to overwrite or the file does not exist
64 * False: Do not overwrite
67 overwrite_filep( const char *fname
)
69 if( iobuf_is_pipe_filename (fname
) )
70 return 1; /* Writing to stdout is always okay */
72 if( access( fname
, F_OK
) )
73 return 1; /* does not exist */
75 #ifndef HAVE_DOSISH_SYSTEM
76 if ( !strcmp ( fname
, "/dev/null" ) )
77 return 1; /* does not do any harm */
80 /* fixme: add some backup stuff in case of overwrite */
83 if( opt
.answer_no
|| opt
.batch
)
84 return 0; /* do not overwrite */
86 tty_printf(_("File `%s' exists. "), fname
);
89 if( cpr_get_answer_is_yes("openfile.overwrite.okay",
90 _("Overwrite? (y/N) ")) )
97 * Strip know extensions from iname and return a newly allocated
98 * filename. Return NULL if we can't do that.
101 make_outfile_name( const char *iname
)
105 if ( iobuf_is_pipe_filename (iname
) )
109 if( n
> 4 && ( !CMP_FILENAME(iname
+n
-4, EXTSEP_S
"gpg")
110 || !CMP_FILENAME(iname
+n
-4, EXTSEP_S
"pgp")
111 || !CMP_FILENAME(iname
+n
-4, EXTSEP_S
"sig")
112 || !CMP_FILENAME(iname
+n
-4, EXTSEP_S
"asc") ) ) {
113 char *buf
= xstrdup( iname
);
117 else if( n
> 5 && !CMP_FILENAME(iname
+n
-5, EXTSEP_S
"sign") ) {
118 char *buf
= xstrdup( iname
);
123 log_info(_("%s: unknown suffix\n"), iname
);
129 * Ask for a outputfilename and use the given one as default.
130 * Return NULL if no file has been given or it is not possible to
134 ask_outfile_name( const char *name
, size_t namelen
)
145 s
= _("Enter new filename");
147 n
= strlen(s
) + namelen
+ 10;
148 defname
= name
&& namelen
? make_printable_string( name
, namelen
, 0): NULL
;
151 sprintf(prompt
, "%s [%s]: ", s
, defname
);
153 sprintf(prompt
, "%s: ", s
);
154 tty_enable_completion(NULL
);
155 fname
= cpr_get("openfile.askoutname", prompt
);
157 tty_disable_completion();
160 xfree( fname
); fname
= NULL
;
161 fname
= defname
; defname
= NULL
;
171 * Make an output filename for the inputfile INAME.
172 * Returns an IOBUF and an errorcode
173 * Mode 0 = use ".gpg"
178 open_outfile( const char *iname
, int mode
, IOBUF
*a
)
183 if( iobuf_is_pipe_filename (iname
) && !opt
.outfile
) {
184 *a
= iobuf_create(NULL
);
186 log_error(_("can't open `%s': %s\n"), "[stdout]", strerror(errno
) );
187 rc
= G10ERR_CREATE_FILE
;
189 else if( opt
.verbose
)
190 log_info(_("writing to stdout\n"));
198 else if( opt
.outfile
)
201 #ifdef USE_ONLY_8DOT3
202 if (opt
.mangle_dos_filenames
)
204 /* It is quite common DOS system to have only one dot in a
205 * a filename So if we have something like this, we simple
206 * replace the suffix execpt in cases where the suffix is
207 * larger than 3 characters and not the same as.
208 * We should really map the filenames to 8.3 but this tends to
209 * be more complicated and is probaly a duty of the filesystem
212 const char *newsfx
= mode
==1 ? ".asc" :
213 mode
==2 ? ".sig" : ".gpg";
215 buf
= xmalloc(strlen(iname
)+4+1);
217 dot
= strchr(buf
, '.' );
218 if ( dot
&& dot
> buf
&& dot
[1] && strlen(dot
) <= 4
219 && CMP_FILENAME(newsfx
, dot
) )
221 strcpy(dot
, newsfx
);
223 else if ( dot
&& !dot
[1] ) /* don't duplicate a dot */
224 strcpy( dot
, newsfx
+1 );
226 strcat ( buf
, newsfx
);
229 #endif /* USE_ONLY_8DOT3 */
231 buf
= xmalloc(strlen(iname
)+4+1);
232 strcpy(stpcpy(buf
,iname
), mode
==1 ? EXTSEP_S
"asc" :
233 mode
==2 ? EXTSEP_S
"sig" : EXTSEP_S
"gpg");
239 while( !overwrite_filep (name
) )
241 char *tmp
= ask_outfile_name (NULL
, 0);
245 rc
= G10ERR_FILE_EXISTS
;
254 if (is_secured_filename (name
) )
260 *a
= iobuf_create( name
);
263 log_error(_("can't create `%s': %s\n"), name
, strerror(errno
) );
264 rc
= G10ERR_CREATE_FILE
;
266 else if( opt
.verbose
)
267 log_info(_("writing to `%s'\n"), name
);
273 iobuf_ioctl (*a
,3,1,NULL
); /* disable fd caching */
280 * Try to open a file without the extension ".sig" or ".asc"
281 * Return NULL if such a file is not available.
284 open_sigfile( const char *iname
, progress_filter_context_t
*pfx
)
289 if( !iobuf_is_pipe_filename (iname
) ) {
291 if( len
> 4 && ( !strcmp(iname
+ len
- 4, EXTSEP_S
"sig")
292 || ( len
> 5 && !strcmp(iname
+ len
- 5, EXTSEP_S
"sign") )
293 || !strcmp(iname
+ len
- 4, EXTSEP_S
"asc")) ) {
295 buf
= xstrdup(iname
);
296 buf
[len
-(buf
[len
-1]=='n'?5:4)] = 0 ;
297 a
= iobuf_open( buf
);
298 if (a
&& is_secured_file (iobuf_get_fd (a
)))
304 if( a
&& opt
.verbose
)
305 log_info(_("assuming signed data in `%s'\n"), buf
);
307 handle_progress (pfx
, a
, buf
);
315 * Copy the option file skeleton to the given directory.
318 copy_options_file( const char *destdir
)
320 const char *datadir
= GNUPG_DATADIR
;
332 fname
= xmalloc( strlen(datadir
) + strlen(destdir
) + 15 );
333 strcpy(stpcpy(fname
, datadir
), DIRSEP_S
"options" SKELEXT
);
334 src
= fopen( fname
, "r" );
335 if (src
&& is_secured_file (fileno (src
)))
342 log_error(_("can't open `%s': %s\n"), fname
, strerror(errno
) );
346 strcpy(stpcpy(fname
, destdir
), DIRSEP_S
"gpg" EXTSEP_S
"conf" );
348 if ( is_secured_filename (fname
) )
354 dst
= fopen( fname
, "w" );
357 log_error(_("can't create `%s': %s\n"), fname
, strerror(errno
) );
363 while( (c
=getc(src
)) != EOF
) {
364 if( linefeeds
< 3 ) {
373 if (c
== ' ' || c
== '\t')
384 log_info(_("new configuration file `%s' created\n"), fname
);
386 log_info (_("WARNING: options in `%s'"
387 " are not yet active during this run\n"),
394 try_make_homedir( const char *fname
)
396 const char *defhome
= GNUPG_HOMEDIR
;
398 /* Create the directory only if the supplied directory name
399 * is the same as the default one. This way we avoid to create
400 * arbitrary directories when a non-default homedirectory is used.
401 * To cope with HOME, we do compare only the suffix if we see that
402 * the default homedir does start with a tilde.
404 if( opt
.dry_run
|| opt
.no_homedir_creation
)
407 if ( ( *defhome
== '~'
408 && ( strlen(fname
) >= strlen (defhome
+1)
409 && !strcmp(fname
+strlen(fname
)-strlen(defhome
+1),
412 && !compare_filenames( fname
, defhome
) )
414 if( mkdir( fname
, S_IRUSR
|S_IWUSR
|S_IXUSR
) )
415 log_fatal( _("can't create directory `%s': %s\n"),
416 fname
, strerror(errno
) );
417 else if( !opt
.quiet
)
418 log_info( _("directory `%s' created\n"), fname
);
419 copy_options_file( fname
);
420 /* log_info(_("you have to start GnuPG again, " */
421 /* "so it can read the new configuration file\n") ); */