sync
[gnupg.git] / g10 / openfile.c
1 /* openfile.c
2  *      Copyright (C) 1998 Free Software Foundation, Inc.
3  *
4  * This file is part of GNUPG.
5  *
6  * GNUPG 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  * GNUPG 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 <errno.h>
27 #include <unistd.h>
28 #include "util.h"
29 #include "memory.h"
30 #include "ttyio.h"
31 #include "options.h"
32 #include "main.h"
33
34
35 /****************
36  * Check whether FNAME exists and ask if it's okay to overwrite an
37  * existing one.
38  * Returns: -1 : Do not overwrite
39  *          0 : it's okay to overwrite or the file does not exist
40  *          >0 : other error
41  */
42 int
43 overwrite_filep( const char *fname )
44 {
45     if( !fname || (*fname == '-' && !fname[1]) )
46         return 0; /* stdout */
47     if( !access( fname, F_OK ) ) {
48         char *p;
49         int okay;
50         int first = 1;
51
52         if( opt.answer_yes )
53             okay = 1;
54         else if( opt.answer_no || opt.batch )
55             okay = 2;
56         else
57             okay = 0;
58
59         while( !okay ) {
60             if( first ) {
61                 tty_printf("File '%s' exists. ", fname);
62                 first = 0;
63             }
64             p = tty_get("Overwrite (y/N)? ");
65             tty_kill_prompt();
66             if( (*p == 'y' || *p == 'Y') && !p[1] )
67                 okay = 1;
68             else if( !*p || ((*p == 'n' || *p == 'N') && !p[1]) )
69                 okay = 2;
70             else
71                 okay = 0;
72             m_free(p);
73         }
74         if( okay == 2 )
75             return -1;
76         /* fixme: add some backup stuff */
77     }
78     return 0;
79 }
80
81
82 /****************
83  * Make an output filename for the inputfile INAME.
84  * Returns an IOBUF
85  * Mode 0 = use ".gpg"
86  *      1 = use ".asc"
87  *      2 = use ".sig"
88  */
89 IOBUF
90 open_outfile( const char *iname, int mode )
91 {
92     IOBUF a = NULL;
93     int rc;
94
95     if( (!iname || (*iname=='-' && !iname[1])) && !opt.outfile ) {
96         if( !(a = iobuf_create(NULL)) )
97             log_error("can't open [stdout]: %s\n", strerror(errno) );
98         else if( opt.verbose )
99             log_info("writing to stdout\n");
100     }
101     else {
102         char *buf=NULL;
103         const char *name;
104
105         if( opt.outfile )
106             name = opt.outfile;
107         else {
108             buf = m_alloc(strlen(iname)+4+1);
109             strcpy(stpcpy(buf,iname), mode==1 ? ".asc" :
110                                       mode==2 ? ".sig" : ".gpg");
111             name = buf;
112         }
113         if( !(rc=overwrite_filep( name )) ) {
114             if( !(a = iobuf_create( name )) )
115                 log_error("can't create %s: %s\n", name, strerror(errno) );
116             else if( opt.verbose )
117                 log_info("writing to '%s'\n", name );
118         }
119         else if( rc != -1 )
120             log_error("oops: overwrite_filep(%s): %s\n", name, g10_errstr(rc) );
121         m_free(buf);
122     }
123     return a;
124 }
125
126
127 /****************
128  * Try to open a file without the extension ".sig" or ".asc"
129  * Return NULL if such a file is not available.
130  */
131 IOBUF
132 open_sigfile( const char *iname )
133 {
134     IOBUF a = NULL;
135     size_t len;
136
137     if( iname && !(*iname == '-' && !iname[1]) ) {
138         len = strlen(iname);
139         if( len > 4 && ( !strcmp(iname + len - 4, ".sig")
140                         || !strcmp(iname + len - 4, ".asc")) ) {
141             char *buf;
142             buf = m_strdup(iname);
143             buf[len-4] = 0 ;
144             a = iobuf_open( buf );
145             if( opt.verbose )
146                 log_info("assuming signed data in '%s'\n", buf );
147             m_free(buf);
148         }
149     }
150     return a;
151 }
152