tools: Fix error handling.
[gnupg.git] / tools / gpgtar-create.c
index d8d1d54..6780eff 100644 (file)
@@ -36,8 +36,9 @@
 #include <assert.h>
 
 #include "i18n.h"
 #include <assert.h>
 
 #include "i18n.h"
-#include "../common/sh-exectool.h"
+#include "../common/exectool.h"
 #include "../common/sysutils.h"
 #include "../common/sysutils.h"
+#include "../common/ccparray.h"
 #include "gpgtar.h"
 
 #ifndef HAVE_LSTAT
 #include "gpgtar.h"
 
 #ifndef HAVE_LSTAT
@@ -72,13 +73,13 @@ fillup_entry_w32 (tar_header_t hdr)
   for (p=hdr->name; *p; p++)
     if (*p == '/')
       *p = '\\';
   for (p=hdr->name; *p; p++)
     if (*p == '/')
       *p = '\\';
-  wfname = utf8_to_wchar (hdr->name);
+  wfname = native_to_wchar (hdr->name);
   for (p=hdr->name; *p; p++)
     if (*p == '\\')
       *p = '/';
   if (!wfname)
     {
   for (p=hdr->name; *p; p++)
     if (*p == '\\')
       *p = '/';
   if (!wfname)
     {
-      log_error ("error utf8-ing '%s': %s\n", hdr->name, w32_strerror (-1));
+      log_error ("error converting '%s': %s\n", hdr->name, w32_strerror (-1));
       return gpg_error_from_syserror ();
     }
   if (!GetFileAttributesExW (wfname, GetFileExInfoStandard, &fad))
       return gpg_error_from_syserror ();
     }
   if (!GetFileAttributesExW (wfname, GetFileExInfoStandard, &fad))
@@ -299,7 +300,7 @@ scan_directory (const char *dname, scanctrl_t scanctrl)
     for (p=fname; *p; p++)
       if (*p == '/')
         *p = '\\';
     for (p=fname; *p; p++)
       if (*p == '/')
         *p = '\\';
-    wfname = utf8_to_wchar (fname);
+    wfname = native_to_wchar (fname);
     xfree (fname);
     if (!wfname)
       {
     xfree (fname);
     if (!wfname)
       {
@@ -322,11 +323,11 @@ scan_directory (const char *dname, scanctrl_t scanctrl)
 
   do
     {
 
   do
     {
-      char *fname = wchar_to_utf8 (fi.cFileName);
+      char *fname = wchar_to_native (fi.cFileName);
       if (!fname)
         {
           err = gpg_error_from_syserror ();
       if (!fname)
         {
           err = gpg_error_from_syserror ();
-          log_error ("error utf8-ing filename: %s\n", w32_strerror (-1));
+          log_error ("error converting filename: %s\n", w32_strerror (-1));
           break;
         }
       for (p=fname; *p; p++)
           break;
         }
       for (p=fname; *p; p++)
@@ -852,8 +853,6 @@ gpgtar_create (char **inpattern, int encrypt, int sign)
       if (!outstream)
         {
           err = gpg_error_from_syserror ();
       if (!outstream)
         {
           err = gpg_error_from_syserror ();
-          log_error (_("can't create '%s': %s\n"),
-                     opt.outfile, gpg_strerror (err));
           goto leave;
         }
     }
           goto leave;
         }
     }
@@ -888,8 +887,8 @@ gpgtar_create (char **inpattern, int encrypt, int sign)
 
   if (encrypt || sign)
     {
 
   if (encrypt || sign)
     {
-      int i;
       strlist_t arg;
       strlist_t arg;
+      ccparray_t ccp;
       const char **argv;
 
       err = es_fseek (outstream, 0, SEEK_SET);
       const char **argv;
 
       err = es_fseek (outstream, 0, SEEK_SET);
@@ -899,46 +898,39 @@ gpgtar_create (char **inpattern, int encrypt, int sign)
       /* '--encrypt' may be combined with '--symmetric', but 'encrypt'
          is set either way.  Clear it if no recipients are specified.
          XXX: Fix command handling.  */
       /* '--encrypt' may be combined with '--symmetric', but 'encrypt'
          is set either way.  Clear it if no recipients are specified.
          XXX: Fix command handling.  */
-       if (opt.symmetric && opt.recipients == NULL)
-         encrypt = 0;
-
-      argv = xtrycalloc (strlist_length (opt.gpg_arguments)
-                         + 2 * strlist_length (opt.recipients)
-                         + 1 + !!encrypt + !!sign + 2 * !!opt.user
-                         + !!opt.symmetric,
-                         sizeof *argv);
-      if (argv == NULL)
-        {
-          err = gpg_error_from_syserror ();
-          goto leave;
-        }
-      i = 0;
+      if (opt.symmetric && opt.recipients == NULL)
+        encrypt = 0;
+
+      ccparray_init (&ccp, 0);
       if (encrypt)
       if (encrypt)
-        argv[i++] = "--encrypt";
+        ccparray_put (&ccp, "--encrypt");
       if (sign)
       if (sign)
-        argv[i++] = "--sign";
+        ccparray_put (&ccp, "--sign");
       if (opt.user)
         {
       if (opt.user)
         {
-          argv[i++] = "--local-user";
-          argv[i++] = opt.user;
+          ccparray_put (&ccp, "--local-user");
+          ccparray_put (&ccp, opt.user);
         }
       if (opt.symmetric)
         }
       if (opt.symmetric)
-        argv[i++] = "--symmetric";
+        ccparray_put (&ccp, "--symmetric");
       for (arg = opt.recipients; arg; arg = arg->next)
         {
       for (arg = opt.recipients; arg; arg = arg->next)
         {
-          argv[i++] = "--recipient";
-          argv[i++] = arg->d;
+          ccparray_put (&ccp, "--recipient");
+          ccparray_put (&ccp, arg->d);
         }
       for (arg = opt.gpg_arguments; arg; arg = arg->next)
         }
       for (arg = opt.gpg_arguments; arg; arg = arg->next)
-        argv[i++] = arg->d;
-      argv[i++] = NULL;
-      assert (i == strlist_length (opt.gpg_arguments)
-              + 2 * strlist_length (opt.recipients)
-              + 1 + !!encrypt + !!sign + 2 * !!opt.user
-              + !!opt.symmetric);
-
-      err = sh_exec_tool_stream (opt.gpg_program, argv,
-                                 outstream, cipher_stream);
+        ccparray_put (&ccp, arg->d);
+
+      ccparray_put (&ccp, NULL);
+      argv = ccparray_get (&ccp, NULL);
+      if (!argv)
+        {
+          err = gpg_error_from_syserror ();
+          goto leave;
+        }
+
+      err = gnupg_exec_tool_stream (opt.gpg_program, argv,
+                                    outstream, NULL, cipher_stream, NULL, NULL);
       xfree (argv);
       if (err)
         goto leave;
       xfree (argv);
       if (err)
         goto leave;
@@ -964,7 +956,7 @@ gpgtar_create (char **inpattern, int encrypt, int sign)
   if (err)
     {
       log_error ("creating tarball '%s' failed: %s\n",
   if (err)
     {
       log_error ("creating tarball '%s' failed: %s\n",
-                 es_fname_get (outstream), gpg_strerror (err));
+                 opt.outfile ? opt.outfile : "-", gpg_strerror (err));
       if (outstream && outstream != es_stdout)
         es_fclose (outstream);
       if (cipher_stream && cipher_stream != es_stdout)
       if (outstream && outstream != es_stdout)
         es_fclose (outstream);
       if (cipher_stream && cipher_stream != es_stdout)