Fix a for a bug fix in the latest Libgcrypt.
[gnupg.git] / g10 / openfile.c
index 8c0601c..55dd42c 100644 (file)
@@ -6,7 +6,7 @@
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -15,9 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
@@ -77,6 +75,10 @@ overwrite_filep( const char *fname )
     if ( !strcmp ( fname, "/dev/null" ) )
         return 1; /* does not do any harm */
 #endif
+#ifdef HAVE_W32_SYSTEM
+    if ( !strcmp ( fname, "nul" ) )
+        return 1;
+#endif
 
     /* fixme: add some backup stuff in case of overwrite */
     if( opt.answer_yes )
@@ -95,7 +97,7 @@ overwrite_filep( const char *fname )
 
 
 /****************
- * Strip know extensions from iname and return a newly allocated
+ * Strip known extensions from iname and return a newly allocated
  * filename.  Return NULL if we can't do that.
  */
 char *
@@ -126,45 +128,47 @@ make_outfile_name( const char *iname )
 }
 
 
-/****************
- * Ask for a outputfilename and use the given one as default.
- * Return NULL if no file has been given or it is not possible to
* ask the user.
+/* Ask for an output filename; use the given one as default.  Return
+   NULL if no file has been given or if it is not possible to ask the
+   user.  NAME is the template len which might conatin enbedded Nuls.
  NAMELEN is its actual length.
  */
 char *
 ask_outfile_name( const char *name, size_t namelen )
 {
-    size_t n;
-    const char *s;
-    char *prompt;
-    char *fname;
-    char *defname;
-
-    if( opt.batch )
-       return NULL;
+  size_t n;
+  const char *s;
+  char *prompt;
+  char *fname;
+  char *defname;
 
-    s = _("Enter new filename");
-
-    n = strlen(s) + namelen + 10;
-    defname = name && namelen? make_printable_string( name, namelen, 0): NULL;
-    prompt = xmalloc(n);
-    if( defname )
-       sprintf(prompt, "%s [%s]: ", s, defname );
-    else
-       sprintf(prompt, "%s: ", s );
-    tty_enable_completion(NULL);
-    fname = cpr_get("openfile.askoutname", prompt );
-    cpr_kill_prompt();
-    tty_disable_completion();
-    xfree(prompt);
-    if( !*fname ) {
-       xfree( fname ); fname = NULL;
-       fname = defname; defname = NULL;
+  if ( opt.batch )
+    return NULL;
+  
+  defname = name && namelen? make_printable_string (name, namelen, 0) : NULL;
+
+  s = _("Enter new filename");
+  n = strlen(s) + (defname?strlen (defname):0) + 10;
+  prompt = xmalloc (n);
+  if (defname)
+    snprintf (prompt, n-1, "%s [%s]: ", s, defname );
+  else
+    snprintf (prompt, n-1, "%s: ", s );
+  tty_enable_completion(NULL);
+  fname = cpr_get ("openfile.askoutname", prompt );
+  cpr_kill_prompt ();
+  tty_disable_completion ();
+  xfree (prompt);
+  if ( !*fname ) 
+    {
+      xfree (fname); 
+      fname = defname;
+      defname = NULL;
     }
-    xfree(defname);
-    if (fname)
-        trim_spaces (fname);
-    return fname;
+  xfree (defname);
+  if (fname)
+    trim_spaces (fname);
+  return fname;
 }
 
 
@@ -184,7 +188,7 @@ open_outfile( const char *iname, int mode, IOBUF *a )
   if( iobuf_is_pipe_filename (iname) && !opt.outfile ) {
     *a = iobuf_create(NULL);
     if( !*a ) {
-      rc = gpg_error_from_errno (errno);
+      rc = gpg_error_from_syserror ();
       log_error(_("can't open `%s': %s\n"), "[stdout]", strerror(errno) );
     }
     else if( opt.verbose )
@@ -194,8 +198,14 @@ open_outfile( const char *iname, int mode, IOBUF *a )
     char *buf = NULL;
     const char *name;
     
-    if( opt.dry_run )
-      name = "/dev/null";
+    if ( opt.dry_run )
+      {
+#ifdef HAVE_W32_SYSTEM
+        name = "nul";
+#else
+        name = "/dev/null";
+#endif
+      }
     else if( opt.outfile )
       name = opt.outfile;
     else {
@@ -261,7 +271,7 @@ open_outfile( const char *iname, int mode, IOBUF *a )
           *a = iobuf_create( name );
         if( !*a )
           {
-            rc = gpg_error_from_errno (errno);
+            rc = gpg_error_from_syserror ();
             log_error(_("can't create `%s': %s\n"), name, strerror(errno) );
           }
         else if( opt.verbose )
@@ -318,7 +328,7 @@ open_sigfile( const char *iname, progress_filter_context_t *pfx )
 static void
 copy_options_file( const char *destdir )
 {
-    const char *datadir = GNUPG_DATADIR;
+    const char *datadir = gnupg_datadir ();
     char *fname;
     FILE *src, *dst;
     int linefeeds=0;
@@ -340,7 +350,7 @@ copy_options_file( const char *destdir )
         errno = EPERM;
       }
     if( !src ) {
-       log_error(_("can't open `%s': %s\n"), fname, strerror(errno) );
+       log_info (_("can't open `%s': %s\n"), fname, strerror(errno) );
        xfree(fname);
        return;
     }
@@ -355,7 +365,7 @@ copy_options_file( const char *destdir )
       dst = fopen( fname, "w" );
     umask(oldmask);
     if( !dst ) {
-       log_error(_("can't create `%s': %s\n"), fname, strerror(errno) );
+       log_info (_("can't create `%s': %s\n"), fname, strerror(errno) );
        fclose( src );
        xfree(fname);
        return;
@@ -392,34 +402,35 @@ copy_options_file( const char *destdir )
 
 
 void
-try_make_homedir( const char *fname )
+try_make_homedir (const char *fname)
 {
-    const char *defhome = GNUPG_DEFAULT_HOMEDIR;
-
-    /* Create the directory only if the supplied directory name
-     * is the same as the default one.  This way we avoid to create
-     * arbitrary directories when a non-default homedirectory is used.
-     * To cope with HOME, we do compare only the suffix if we see that
-     * the default homedir does start with a tilde.
-     */
-    if( opt.dry_run || opt.no_homedir_creation )
-       return;
-
-    if ( ( *defhome == '~'
-           && ( strlen(fname) >= strlen (defhome+1)
-                && !strcmp(fname+strlen(fname)-strlen(defhome+1),
-                           defhome+1 ) ))
-         || ( *defhome != '~'
-              && !compare_filenames( fname, defhome ) )
-        ) {
-       if( mkdir( fname, S_IRUSR|S_IWUSR|S_IXUSR ) )
-           log_fatal( _("can't create directory `%s': %s\n"),
-                                       fname,  strerror(errno) );
-       else if( !opt.quiet )
-           log_info( _("directory `%s' created\n"), fname );
-       copy_options_file( fname );
-/*     log_info(_("you have to start GnuPG again, " */
-/*                "so it can read the new configuration file\n") ); */
-/*     g10_exit(1); */
+  const char *defhome = standard_homedir ();
+
+  /* Create the directory only if the supplied directory name is the
+     same as the default one.  This way we avoid to create arbitrary
+     directories when a non-default home directory is used.  To cope
+     with HOME, we do compare only the suffix if we see that the
+     default homedir does start with a tilde.  */
+  if ( opt.dry_run || opt.no_homedir_creation )
+    return;
+
+  if (
+#ifdef HAVE_W32_SYSTEM
+      ( !compare_filenames (fname, defhome) )
+#else
+      ( *defhome == '~'
+        && (strlen(fname) >= strlen (defhome+1)
+            && !strcmp(fname+strlen(fname)-strlen(defhome+1), defhome+1 ) ))
+      || (*defhome != '~'  && !compare_filenames( fname, defhome ) )
+#endif
+      )
+    {
+      if ( mkdir (fname, S_IRUSR|S_IWUSR|S_IXUSR) )
+        log_fatal ( _("can't create directory `%s': %s\n"),
+                    fname, strerror(errno) );
+      else if (!opt.quiet )
+        log_info ( _("directory `%s' created\n"), fname );
+      copy_options_file( fname );
+      
     }
 }