4b7331dcd7d210888c670efb11d2d5609bfba685
[gnupg.git] / g10 / openfile.c
1 /* openfile.c
2  *      Copyright (c) 1997 by Werner Koch (dd9jn)
3  *
4  * This file is part of G10.
5  *
6  * G10 is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * G10 is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19  */
20
21 #include <config.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <assert.h>
26 #include <unistd.h>
27 #include "util.h"
28 #include "memory.h"
29 #include "ttyio.h"
30 #include "options.h"
31 #include "main.h"
32
33
34 /****************
35  * Check wether FNAME exists and ask if it's okay to overwrite an
36  * existing one.
37  * Returns: -1 : Do not overwrite
38  *          0 : it's okay to overwrite or the file does not exist
39  *          >0 : other error
40  */
41 int
42 overwrite_filep( const char *fname )
43 {
44     if( !access( fname, F_OK ) ) {
45         char *p;
46         int okay;
47         int first = 1;
48
49         if( opt.answer_yes )
50             okay = 1;
51         else if( opt.answer_no || opt.batch )
52             okay = 2;
53         else
54             okay = 0;
55
56         while( !okay ) {
57         if( !okay )
58             if( first ) {
59                 tty_printf("File '%s' exists. ", fname);
60                 first = 0;
61             }
62             p = tty_get("Overwrite (y/N)? ");
63             tty_kill_prompt();
64             if( (*p == 'y' || *p == 'Y') && !p[1] )
65                 okay = 1;
66             else if( !*p || ((*p == 'n' || *p == 'N') && !p[1]) )
67                 okay = 2;
68             else
69                 okay = 0;
70             m_free(p);
71         }
72         if( okay == 2 )
73             return -1;
74         /* fixme: add some backup stuff */
75     }
76     return 0;
77 }
78
79
80 /****************
81  * Make an output filename for the inputfile INAME.
82  * Returns an IOBUF
83  */
84 IOBUF
85 open_outfile( const char *iname )
86 {
87     IOBUF a = NULL;
88     int rc;
89
90     if( !iname && !opt.outfile ) {
91         if( !(a = iobuf_create(NULL)) )
92             log_error("can't open [stdout]: %s\n", strerror(errno) );
93         else if( opt.verbose )
94             log_info("writing to stdout\n");
95     }
96     else {
97         char *buf=NULL;
98         const char *name;
99
100         if( opt.outfile )
101             name = opt.outfile;
102         else {
103             buf = m_alloc(strlen(iname)+4+1);
104             strcpy(stpcpy(buf,iname), ".g10");
105             name = buf;
106         }
107         if( !(rc=overwrite_filep( name )) ) {
108             if( !(a = iobuf_create( name )) )
109                 log_error("can't create %s: %s\n", name, strerror(errno) );
110             else if( opt.verbose )
111                 log_info("writing to '%s'\n", name );
112         }
113         else if( rc != -1 )
114             log_error("oops: overwrite_filep(%s): %s\n", name, g10_errstr(rc) );
115         m_free(buf);
116     }
117     return a;
118 }
119