Renamed to GNUPG
[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 wether 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( !access( fname, F_OK ) ) {
46         char *p;
47         int okay;
48         int first = 1;
49
50         if( opt.answer_yes )
51             okay = 1;
52         else if( opt.answer_no || opt.batch )
53             okay = 2;
54         else
55             okay = 0;
56
57         while( !okay ) {
58         if( !okay )
59             if( first ) {
60                 tty_printf("File '%s' exists. ", fname);
61                 first = 0;
62             }
63             p = tty_get("Overwrite (y/N)? ");
64             tty_kill_prompt();
65             if( (*p == 'y' || *p == 'Y') && !p[1] )
66                 okay = 1;
67             else if( !*p || ((*p == 'n' || *p == 'N') && !p[1]) )
68                 okay = 2;
69             else
70                 okay = 0;
71             m_free(p);
72         }
73         if( okay == 2 )
74             return -1;
75         /* fixme: add some backup stuff */
76     }
77     return 0;
78 }
79
80
81 /****************
82  * Make an output filename for the inputfile INAME.
83  * Returns an IOBUF
84  * Mode 0 = use ".gpg"
85  *      1 = use ".asc"
86  *      2 = use ".sig"
87  */
88 IOBUF
89 open_outfile( const char *iname, int mode )
90 {
91     IOBUF a = NULL;
92     int rc;
93
94     if( !iname && !opt.outfile ) {
95         if( !(a = iobuf_create(NULL)) )
96             log_error("can't open [stdout]: %s\n", strerror(errno) );
97         else if( opt.verbose )
98             log_info("writing to stdout\n");
99     }
100     else {
101         char *buf=NULL;
102         const char *name;
103
104         if( opt.outfile )
105             name = opt.outfile;
106         else {
107             buf = m_alloc(strlen(iname)+4+1);
108             strcpy(stpcpy(buf,iname), mode==1 ? ".asc" :
109                                       mode==2 ? ".sig" : ".gpg");
110             name = buf;
111         }
112         if( !(rc=overwrite_filep( name )) ) {
113             if( !(a = iobuf_create( name )) )
114                 log_error("can't create %s: %s\n", name, strerror(errno) );
115             else if( opt.verbose )
116                 log_info("writing to '%s'\n", name );
117         }
118         else if( rc != -1 )
119             log_error("oops: overwrite_filep(%s): %s\n", name, g10_errstr(rc) );
120         m_free(buf);
121     }
122     return a;
123 }
124
125
126 /****************
127  * Try to open a file without the extension ".sig"
128  * Return NULL if such a file is not available.
129  */
130 IOBUF
131 open_sigfile( const char *iname )
132 {
133     IOBUF a = NULL;
134     size_t len;
135
136     if( iname ) {
137         len = strlen(iname);
138         if( len > 4 && !strcmp(iname + len - 4, ".sig") ) {
139             char *buf;
140             buf = m_strdup(iname);
141             buf[len-4] = 0 ;
142             a = iobuf_open( buf );
143             m_free(buf);
144         }
145     }
146     return a;
147 }
148