[git] GnuPG - branch, master, updated. gnupg-2.1.9-182-g676b2d7

by Justus Winter cvs at cvs.gnupg.org
Thu Nov 26 17:58:50 CET 2015


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "The GNU Privacy Guard".

The branch, master has been updated
       via  676b2d7081291f7e47a66755ab07af259fea130b (commit)
       via  69a8440f44fa025e33a4cc32d17695c9ac385043 (commit)
       via  1a045b1324efabe7423a8d00245f01718ed72556 (commit)
       via  2eb3248058330dd5c37560d9887db5b5266c54fe (commit)
       via  35c0c8b211bc891335e822379b33ea34fbc1f84f (commit)
      from  556e8c44267fe3b829ca06286e9b5637ca1a6a73 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 676b2d7081291f7e47a66755ab07af259fea130b
Author: Justus Winter <justus at g10code.com>
Date:   Thu Nov 26 17:05:12 2015 +0100

    tools/gpgtar: Add '--dry-run'.
    
    * tools/gpgtar-extract.c (extract_{regular,directory}): Honor
    '--dry-run'.
    * tools/gpgtar.c (enum cmd_and_opt_values): New value.
    (opts): Add '--dry-run'.
    (parse_arguments): Handle '--dry-run'.
    * tools/gpgtar.h (opt): Add field 'dry_run'.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/tools/gpgtar-extract.c b/tools/gpgtar-extract.c
index 3b73c85..728737d 100644
--- a/tools/gpgtar-extract.c
+++ b/tools/gpgtar-extract.c
@@ -53,7 +53,10 @@ extract_regular (estream_t stream, const char *dirname,
   else
     err = 0;
 
-  outfp = es_fopen (fname, "wb");
+  if (opt.dry_run)
+    outfp = es_fopenmem (0, "wb");
+  else
+    outfp = es_fopen (fname, "wb");
   if (!outfp)
     {
       err = gpg_error_from_syserror ();
@@ -120,7 +123,7 @@ extract_directory (const char *dirname, tar_header_t hdr)
 
  /* Note that we don't need to care about EEXIST because we always
      extract into a new hierarchy.  */
-  if (gnupg_mkdir (fname, "-rwx------"))
+  if (! opt.dry_run && gnupg_mkdir (fname, "-rwx------"))
     {
       err = gpg_error_from_syserror ();
       if (gpg_err_code (err) == GPG_ERR_ENOENT)
diff --git a/tools/gpgtar.c b/tools/gpgtar.c
index 90fee05..a46a339 100644
--- a/tools/gpgtar.c
+++ b/tools/gpgtar.c
@@ -77,6 +77,9 @@ enum cmd_and_opt_values
     /* Compatibility with gpg-zip.  */
     oGpgArgs,
     oTarArgs,
+
+    /* Debugging.  */
+    oDryRun,
   };
 
 
@@ -100,6 +103,7 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_n (oQuiet,	"quiet",  N_("be somewhat more quiet")),
   ARGPARSE_s_s (oGpgProgram, "gpg", "@"),
   ARGPARSE_s_n (oSkipCrypto, "skip-crypto", N_("skip the crypto processing")),
+  ARGPARSE_s_n (oDryRun, "dry-run", N_("do not make any changes")),
   ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
   ARGPARSE_s_n (oOpenPGP, "openpgp", "@"),
   ARGPARSE_s_n (oCMS, "cms", "@"),
@@ -377,6 +381,10 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
             }
           break;
 
+        case oDryRun:
+          opt.dry_run = 1;
+          break;
+
         default: pargs->err = 2; break;
 	}
     }
diff --git a/tools/gpgtar.h b/tools/gpgtar.h
index f130c94..eadbcac 100644
--- a/tools/gpgtar.h
+++ b/tools/gpgtar.h
@@ -29,6 +29,7 @@ struct
   int verbose;
   unsigned int debug_level;
   int quiet;
+  int dry_run;
   const char *gpg_program;
   strlist_t gpg_arguments;
   const char *outfile;

commit 69a8440f44fa025e33a4cc32d17695c9ac385043
Author: Justus Winter <justus at g10code.com>
Date:   Thu Nov 26 15:36:52 2015 +0100

    tools/gpgtar: Handle '--gpg-args'.
    
    * tools/gpgtar-create.c (gpgtar_create): Use given arguments.
    * tools/gpgtar-extract.c (gpgtar_extract): Likewise.
    * tools/gpgtar-list.c (gpgtar_list): Likewise.
    * tools/gpgtar.c (enum cmd_and_opt_values): New value.
    (opts): Add 'gpg-args'.
    (parse_arguments): Handle arguments.
    * tools/gpgtar.h (opt): Add field 'gpg_arguments'.
    * tests/openpgp/gpgtar.test: Simplify accordingly.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/tests/openpgp/gpgtar.test b/tests/openpgp/gpgtar.test
index 5cb2353..acfaf3f 100755
--- a/tests/openpgp/gpgtar.test
+++ b/tests/openpgp/gpgtar.test
@@ -25,24 +25,30 @@ TESTFILES="$plain_files $data_files"
 TESTDIR=gpgtar.d
 FILELIST="${TESTDIR}/filelist"
 GPG=../../g10/gpg2
+GPGARGS="--trust-model=always"
+
 GPGTAR="../../tools/gpgtar"
-GPGZIP="sh ../../tools/gpg-zip --gpg-args --trust-model=always"
+GPGZIP="sh ../../tools/gpg-zip"
 
 for TOOL in "$GPGTAR" "$GPGZIP"
 do
     rm -rf -- "${TESTDIR}"
     mkdir "${TESTDIR}"
 
-    $TOOL --gpg "$GPG" --encrypt --recipient "$usrname2" \
+    $TOOL --gpg "$GPG" --gpg-args "$GPGARGS" \
+          --encrypt --recipient "$usrname2" \
 	  --output "${TESTDIR}/test.tar.pgp" $TESTFILES
 
-    $TOOL --gpg "$GPG" --list-archive "${TESTDIR}/test.tar.pgp" >"$FILELIST"
+    $TOOL --gpg "$GPG" --gpg-args "$GPGARGS" \
+          --list-archive "${TESTDIR}/test.tar.pgp" \
+          >"$FILELIST"
     for F in $TESTFILES
     do
 	grep -qe "\\b${F}\\b" "$FILELIST"
     done
 
-    $TOOL --gpg "$GPG" --tar-args --directory="${TESTDIR}" \
+    $TOOL --gpg "$GPG"  --gpg-args "$GPGARGS" \
+          --tar-args --directory="${TESTDIR}" \
           --decrypt "${TESTDIR}/test.tar.pgp"
     for F in $TESTFILES
     do
diff --git a/tools/gpgtar-create.c b/tools/gpgtar-create.c
index 774fcd3..cc82889 100644
--- a/tools/gpgtar-create.c
+++ b/tools/gpgtar-create.c
@@ -894,7 +894,7 @@ gpgtar_create (char **inpattern, int encrypt)
 
       err = gpg_encrypt_stream (NULL,
                                 opt.gpg_program,
-                                NULL,
+                                opt.gpg_arguments,
                                 outstream,
                                 opt.recipients,
                                 cipher_stream);
diff --git a/tools/gpgtar-extract.c b/tools/gpgtar-extract.c
index 7e7a351..3b73c85 100644
--- a/tools/gpgtar-extract.c
+++ b/tools/gpgtar-extract.c
@@ -303,7 +303,7 @@ gpgtar_extract (const char *filename, int decrypt)
           err = gpg_error_from_syserror ();
           goto leave;
         }
-      err = gpg_decrypt_stream (NULL, opt.gpg_program, NULL,
+      err = gpg_decrypt_stream (NULL, opt.gpg_program, opt.gpg_arguments,
                                 cipher_stream, stream);
       if (err)
         goto leave;
diff --git a/tools/gpgtar-list.c b/tools/gpgtar-list.c
index 1eab7e5..cb2ca5d 100644
--- a/tools/gpgtar-list.c
+++ b/tools/gpgtar-list.c
@@ -306,7 +306,7 @@ gpgtar_list (const char *filename, int decrypt)
           err = gpg_error_from_syserror ();
           goto leave;
         }
-      err = gpg_decrypt_stream (NULL, opt.gpg_program, NULL,
+      err = gpg_decrypt_stream (NULL, opt.gpg_program, opt.gpg_arguments,
                                 cipher_stream, stream);
       if (err)
         goto leave;
diff --git a/tools/gpgtar.c b/tools/gpgtar.c
index 2968fb5..90fee05 100644
--- a/tools/gpgtar.c
+++ b/tools/gpgtar.c
@@ -75,6 +75,7 @@ enum cmd_and_opt_values
     oNull,
 
     /* Compatibility with gpg-zip.  */
+    oGpgArgs,
     oTarArgs,
   };
 
@@ -111,6 +112,7 @@ static ARGPARSE_OPTS opts[] = {
                 N_("|FILE|get names to create from FILE")),
   ARGPARSE_s_n (oNull, "null", N_("-T reads null-terminated names")),
 
+  ARGPARSE_s_s (oGpgArgs, "gpg-args", "@"),
   ARGPARSE_s_s (oTarArgs, "tar-args", "@"),
 
   ARGPARSE_end ()
@@ -340,6 +342,20 @@ parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
         case oOpenPGP: /* Dummy option for now.  */ break;
         case oCMS:     /* Dummy option for now.  */ break;
 
+        case oGpgArgs:;
+          strlist_t list;
+          if (shell_parse_stringlist (pargs->r.ret_str, &list))
+            log_error ("failed to parse gpg arguments '%s'\n",
+                       pargs->r.ret_str);
+          else
+            {
+              if (opt.gpg_arguments)
+                strlist_last (opt.gpg_arguments)->next = list;
+              else
+                opt.gpg_arguments = list;
+            }
+          break;
+
         case oTarArgs:;
           int tar_argc;
           char **tar_argv;
diff --git a/tools/gpgtar.h b/tools/gpgtar.h
index 66a8ae1..f130c94 100644
--- a/tools/gpgtar.h
+++ b/tools/gpgtar.h
@@ -30,6 +30,7 @@ struct
   unsigned int debug_level;
   int quiet;
   const char *gpg_program;
+  strlist_t gpg_arguments;
   const char *outfile;
   strlist_t recipients;
   const char *user;

commit 1a045b1324efabe7423a8d00245f01718ed72556
Author: Justus Winter <justus at g10code.com>
Date:   Thu Nov 26 15:01:40 2015 +0100

    common: Make the GPG arguments configurable in call-gpg.
    
    * common/call-gpg.c (start_gpg): Add parameter 'gpg_arguments'.
    (_gpg_encrypt, gpg_encrypt_blob, gpg_encrypt_stream): Likewise.
    (_gpg_decrypt, gpg_decrypt_blob, gpg_decrypt_stream): Likewise.
    * common/call-gpg.h: Adapt prototypes.
    * g13/create.c (encrypt_keyblob): Adapt callsite.
    * g13/g13-common.h (opt): Add field 'gpg_arguments'.
    * g13/g13.c (main): Construct default arguments.
    * g13/mount.c (decrypt_keyblob): Adapt callsite.
    * tools/gpgtar-create.c (gpgtar_create): Likewise.
    * tools/gpgtar-extract.c (gpgtar_extract): Likewise.
    * tools/gpgtar-list.c (gpgtar_list): Likewise.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/common/call-gpg.c b/common/call-gpg.c
index 8258b83..4a32c88 100644
--- a/common/call-gpg.c
+++ b/common/call-gpg.c
@@ -33,19 +33,20 @@
 #include "i18n.h"
 #include "logging.h"
 #include "membuf.h"
+#include "strlist.h"
 #include "util.h"
 
 

 /* Fire up a new GPG.  Handle the server's initial greeting.  Returns
    0 on success and stores the assuan context at R_CTX.  */
 static gpg_error_t
-start_gpg (ctrl_t ctrl, const char *gpg_program,
+start_gpg (ctrl_t ctrl, const char *gpg_program, strlist_t gpg_arguments,
            int input_fd, int output_fd, assuan_context_t *r_ctx)
 {
   gpg_error_t err;
   assuan_context_t ctx = NULL;
   const char *pgmname;
-  const char *argv[10];
+  const char **argv;
   int no_close_list[5];
   int i;
   char line[ASSUAN_LINELENGTH];
@@ -78,13 +79,17 @@ start_gpg (ctrl_t ctrl, const char *gpg_program,
       return err;
     }
 
+  argv = xtrycalloc (strlist_length (gpg_arguments) + 3, sizeof *argv);
+  if (argv == NULL)
+    {
+      err = gpg_error_from_syserror ();
+      return err;
+    }
   i = 0;
   argv[i++] = pgmname;
   argv[i++] = "--server";
-  argv[i++] = "-z";
-  argv[i++] = "0";
-  argv[i++] = "--trust-model";
-  argv[i++] = "always";
+  for (; gpg_arguments; gpg_arguments = gpg_arguments->next)
+    argv[i++] = gpg_arguments->d;
   argv[i++] = NULL;
 
   i = 0;
@@ -386,7 +391,9 @@ start_reader (int fd, membuf_t *mb, estream_t stream,
 
  */
 static gpg_error_t
-_gpg_encrypt (ctrl_t ctrl, const char *gpg_program,
+_gpg_encrypt (ctrl_t ctrl,
+              const char *gpg_program,
+              strlist_t gpg_arguments,
               const void *plain, size_t plainlen,
               estream_t plain_stream,
               strlist_t keys,
@@ -420,7 +427,8 @@ _gpg_encrypt (ctrl_t ctrl, const char *gpg_program,
     }
 
   /* Start GPG and send the INPUT and OUTPUT commands.  */
-  err = start_gpg (ctrl, gpg_program, outbound_fds[0], inbound_fds[1], &ctx);
+  err = start_gpg (ctrl, gpg_program, gpg_arguments,
+                   outbound_fds[0], inbound_fds[1], &ctx);
   if (err)
     goto leave;
   close (outbound_fds[0]); outbound_fds[0] = -1;
@@ -514,7 +522,9 @@ _gpg_encrypt (ctrl_t ctrl, const char *gpg_program,
 }
 
 gpg_error_t
-gpg_encrypt_blob (ctrl_t ctrl, const char *gpg_program,
+gpg_encrypt_blob (ctrl_t ctrl,
+                  const char *gpg_program,
+                  strlist_t gpg_arguments,
                   const void *plain, size_t plainlen,
                   strlist_t keys,
                   void **r_ciph, size_t *r_ciphlen)
@@ -528,7 +538,7 @@ gpg_encrypt_blob (ctrl_t ctrl, const char *gpg_program,
   /* Init the memory buffer to receive the encrypted stuff.  */
   init_membuf (&reader_mb, 4096);
 
-  err = _gpg_encrypt (ctrl, gpg_program,
+  err = _gpg_encrypt (ctrl, gpg_program, gpg_arguments,
                       plain, plainlen, NULL,
                       keys,
                       &reader_mb, NULL);
@@ -550,12 +560,14 @@ gpg_encrypt_blob (ctrl_t ctrl, const char *gpg_program,
 }
 
 gpg_error_t
-gpg_encrypt_stream (ctrl_t ctrl, const char *gpg_program,
+gpg_encrypt_stream (ctrl_t ctrl,
+                    const char *gpg_program,
+                    strlist_t gpg_arguments,
                     estream_t plain_stream,
                     strlist_t keys,
                     estream_t cipher_stream)
 {
-  return _gpg_encrypt (ctrl, gpg_program,
+  return _gpg_encrypt (ctrl, gpg_program, gpg_arguments,
                        NULL, 0, plain_stream,
                        keys,
                        NULL, cipher_stream);
@@ -566,7 +578,9 @@ gpg_encrypt_stream (ctrl_t ctrl, const char *gpg_program,
 
  */
 static gpg_error_t
-_gpg_decrypt (ctrl_t ctrl, const char *gpg_program,
+_gpg_decrypt (ctrl_t ctrl,
+              const char *gpg_program,
+              strlist_t gpg_arguments,
               const void *ciph, size_t ciphlen,
               estream_t cipher_stream,
               membuf_t *reader_mb,
@@ -597,7 +611,8 @@ _gpg_decrypt (ctrl_t ctrl, const char *gpg_program,
     }
 
   /* Start GPG and send the INPUT and OUTPUT commands.  */
-  err = start_gpg (ctrl, gpg_program, outbound_fds[0], inbound_fds[1], &ctx);
+  err = start_gpg (ctrl, gpg_program, gpg_arguments,
+                   outbound_fds[0], inbound_fds[1], &ctx);
   if (err)
     goto leave;
   close (outbound_fds[0]); outbound_fds[0] = -1;
@@ -677,7 +692,9 @@ _gpg_decrypt (ctrl_t ctrl, const char *gpg_program,
 }
 
 gpg_error_t
-gpg_decrypt_blob (ctrl_t ctrl, const char *gpg_program,
+gpg_decrypt_blob (ctrl_t ctrl,
+                  const char *gpg_program,
+                  strlist_t gpg_arguments,
                   const void *ciph, size_t ciphlen,
                   void **r_plain, size_t *r_plainlen)
 {
@@ -690,7 +707,7 @@ gpg_decrypt_blob (ctrl_t ctrl, const char *gpg_program,
   /* Init the memory buffer to receive the encrypted stuff.  */
   init_membuf_secure (&reader_mb, 1024);
 
-  err = _gpg_decrypt (ctrl, gpg_program,
+  err = _gpg_decrypt (ctrl, gpg_program, gpg_arguments,
                       ciph, ciphlen, NULL,
                       &reader_mb, NULL);
 
@@ -711,11 +728,13 @@ gpg_decrypt_blob (ctrl_t ctrl, const char *gpg_program,
 }
 
 gpg_error_t
-gpg_decrypt_stream (ctrl_t ctrl, const char *gpg_program,
+gpg_decrypt_stream (ctrl_t ctrl,
+                    const char *gpg_program,
+                    strlist_t gpg_arguments,
                     estream_t cipher_stream,
                     estream_t plain_stream)
 {
-  return _gpg_decrypt (ctrl, gpg_program,
+  return _gpg_decrypt (ctrl, gpg_program, gpg_arguments,
                        NULL, 0, cipher_stream,
                        NULL, plain_stream);
 }
diff --git a/common/call-gpg.h b/common/call-gpg.h
index 2c5854d..74d3819 100644
--- a/common/call-gpg.h
+++ b/common/call-gpg.h
@@ -26,21 +26,29 @@
 
 typedef struct server_control_s *ctrl_t;
 
-gpg_error_t gpg_encrypt_blob (ctrl_t ctrl, const char *gpg_program,
+gpg_error_t gpg_encrypt_blob (ctrl_t ctrl,
+			      const char *gpg_program,
+			      strlist_t gpg_arguments,
                               const void *plain, size_t plainlen,
                               strlist_t keys,
                               void **r_ciph, size_t *r_ciphlen);
 
-gpg_error_t gpg_encrypt_stream (ctrl_t ctrl, const char *gpg_program,
+gpg_error_t gpg_encrypt_stream (ctrl_t ctrl,
+				const char *gpg_program,
+				strlist_t gpg_arguments,
 				estream_t plain_stream,
 				strlist_t keys,
 				estream_t cipher_stream);
 
-gpg_error_t gpg_decrypt_blob (ctrl_t ctrl, const char *gpg_program,
+gpg_error_t gpg_decrypt_blob (ctrl_t ctrl,
+			      const char *gpg_program,
+			      strlist_t gpg_arguments,
 			      const void *ciph, size_t ciphlen,
                               void **r_plain, size_t *r_plainlen);
 
-gpg_error_t gpg_decrypt_stream (ctrl_t ctrl, const char *gpg_program,
+gpg_error_t gpg_decrypt_stream (ctrl_t ctrl,
+				const char *gpg_program,
+				strlist_t gpg_arguments,
 				estream_t cipher_stream,
 				estream_t plain_stream);
 
diff --git a/g13/create.c b/g13/create.c
index c4e94b8..91b290c 100644
--- a/g13/create.c
+++ b/g13/create.c
@@ -111,7 +111,9 @@ encrypt_keyblob (ctrl_t ctrl, void *keyblob, size_t keybloblen,
   gpg_error_t err;
 
   /* FIXME:  For now we only implement OpenPGP.  */
-  err = gpg_encrypt_blob (ctrl, opt.gpg_program, keyblob, keybloblen, keys,
+  err = gpg_encrypt_blob (ctrl, opt.gpg_program, opt.gpg_arguments,
+                          keyblob, keybloblen,
+                          keys,
                           r_encblob, r_encbloblen);
 
   return err;
diff --git a/g13/g13-common.h b/g13/g13-common.h
index f27dca4..316b94a 100644
--- a/g13/g13-common.h
+++ b/g13/g13-common.h
@@ -30,6 +30,7 @@
 #include "../common/util.h"
 #include "../common/status.h"
 #include "../common/session-env.h"
+#include "../common/strlist.h"
 
 
 /* Debug values and macros.  */
@@ -65,6 +66,9 @@ struct
      filename.  */
   const char *gpg_program;
 
+  /* GPG arguments.  XXX: Currently it is not possible to set them.  */
+  strlist_t gpg_arguments;
+
   /* Environment variables passed along to the engine.  */
   char *display;
   char *ttyname;
diff --git a/g13/g13.c b/g13/g13.c
index e6c7613..7fe207a 100644
--- a/g13/g13.c
+++ b/g13/g13.c
@@ -577,6 +577,16 @@ main ( int argc, char **argv)
 	}
     }
 
+  /* XXX Construct GPG arguments.  */
+  {
+    strlist_t last;
+    last = strlist_append (&opt.gpg_arguments, "-z");
+    last = strlist_append (&last, "0");
+    last = strlist_append (&last, "--trust-model");
+    last = strlist_append (&last, "always");
+    (void) last;
+  }
+
   if (configfp)
     {
       fclose (configfp);
diff --git a/g13/mount.c b/g13/mount.c
index 1f7fbcc..e9b9c1b 100644
--- a/g13/mount.c
+++ b/g13/mount.c
@@ -202,7 +202,8 @@ decrypt_keyblob (ctrl_t ctrl, const void *enckeyblob, size_t enckeybloblen,
   gpg_error_t err;
 
   /* FIXME:  For now we only implement OpenPGP.  */
-  err = gpg_decrypt_blob (ctrl, opt.gpg_program, enckeyblob, enckeybloblen,
+  err = gpg_decrypt_blob (ctrl, opt.gpg_program, opt.gpg_arguments,
+                          enckeyblob, enckeybloblen,
                           r_keyblob, r_keybloblen);
 
   return err;
diff --git a/tools/gpgtar-create.c b/tools/gpgtar-create.c
index 92c1fb8..774fcd3 100644
--- a/tools/gpgtar-create.c
+++ b/tools/gpgtar-create.c
@@ -894,6 +894,7 @@ gpgtar_create (char **inpattern, int encrypt)
 
       err = gpg_encrypt_stream (NULL,
                                 opt.gpg_program,
+                                NULL,
                                 outstream,
                                 opt.recipients,
                                 cipher_stream);
diff --git a/tools/gpgtar-extract.c b/tools/gpgtar-extract.c
index fa2f362..7e7a351 100644
--- a/tools/gpgtar-extract.c
+++ b/tools/gpgtar-extract.c
@@ -303,7 +303,8 @@ gpgtar_extract (const char *filename, int decrypt)
           err = gpg_error_from_syserror ();
           goto leave;
         }
-      err = gpg_decrypt_stream (NULL, opt.gpg_program, cipher_stream, stream);
+      err = gpg_decrypt_stream (NULL, opt.gpg_program, NULL,
+                                cipher_stream, stream);
       if (err)
         goto leave;
 
diff --git a/tools/gpgtar-list.c b/tools/gpgtar-list.c
index cdc7fc4..1eab7e5 100644
--- a/tools/gpgtar-list.c
+++ b/tools/gpgtar-list.c
@@ -306,7 +306,8 @@ gpgtar_list (const char *filename, int decrypt)
           err = gpg_error_from_syserror ();
           goto leave;
         }
-      err = gpg_decrypt_stream (NULL, opt.gpg_program, cipher_stream, stream);
+      err = gpg_decrypt_stream (NULL, opt.gpg_program, NULL,
+                                cipher_stream, stream);
       if (err)
         goto leave;
 

commit 2eb3248058330dd5c37560d9887db5b5266c54fe
Author: Justus Winter <justus at g10code.com>
Date:   Thu Nov 26 14:08:48 2015 +0100

    tools/gpgtar: Handle '--tar-args' for compatibility with gpg-zip.
    
    * tools/gpgtar.c (enum cmd_and_opt_values): New value.
    (opts): Add new group for tar options, rearrange a little, add
    '--tar-args'.
    (tar_opts): New variable.
    (shell_parse_stringlist): New function.
    (shell_parse_argv): Likewise.
    (parse_arguments): Add option argument, handle '--tar-args'.
    (main): Fix invokation of 'parse_arguments'.
    * tests/openpgp/gpgtar.test: Simplify decryption.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/tests/openpgp/gpgtar.test b/tests/openpgp/gpgtar.test
index 7d55862..5cb2353 100755
--- a/tests/openpgp/gpgtar.test
+++ b/tests/openpgp/gpgtar.test
@@ -42,12 +42,8 @@ do
 	grep -qe "\\b${F}\\b" "$FILELIST"
     done
 
-    EXTRACT_FLAGS="--directory=${TESTDIR}"
-    if [ "$TOOL" = "$GPGZIP" ]
-    then
-	EXTRACT_FLAGS="--tar-args $EXTRACT_FLAGS"
-    fi
-    $TOOL --gpg "$GPG" $EXTRACT_FLAGS --decrypt "${TESTDIR}/test.tar.pgp"
+    $TOOL --gpg "$GPG" --tar-args --directory="${TESTDIR}" \
+          --decrypt "${TESTDIR}/test.tar.pgp"
     for F in $TESTFILES
     do
 	diff -q "$F" "${TESTDIR}/$F"
diff --git a/tools/gpgtar.c b/tools/gpgtar.c
index 04d23b5..2968fb5 100644
--- a/tools/gpgtar.c
+++ b/tools/gpgtar.c
@@ -28,6 +28,7 @@
 
 #include <config.h>
 #include <assuan.h>
+#include <ctype.h>
 #include <errno.h>
 #include <npth.h>
 #include <stdio.h>
@@ -41,6 +42,7 @@
 #include "../common/asshelp.h"
 #include "../common/openpgpdefs.h"
 #include "../common/init.h"
+#include "../common/strlist.h"
 
 #include "gpgtar.h"
 
@@ -70,7 +72,10 @@ enum cmd_and_opt_values
     oOpenPGP,
     oCMS,
     oSetFilename,
-    oNull
+    oNull,
+
+    /* Compatibility with gpg-zip.  */
+    oTarArgs,
   };
 
 
@@ -90,18 +95,35 @@ static ARGPARSE_OPTS opts[] = {
   ARGPARSE_s_s (oUser, "local-user",
                 N_("|USER-ID|use USER-ID to sign or decrypt")),
   ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
-  ARGPARSE_s_s (oDirectory, "directory",
-                N_("|DIRECTORY|extract files into DIRECTORY")),
   ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
   ARGPARSE_s_n (oQuiet,	"quiet",  N_("be somewhat more quiet")),
   ARGPARSE_s_s (oGpgProgram, "gpg", "@"),
   ARGPARSE_s_n (oSkipCrypto, "skip-crypto", N_("skip the crypto processing")),
   ARGPARSE_s_s (oSetFilename, "set-filename", "@"),
+  ARGPARSE_s_n (oOpenPGP, "openpgp", "@"),
+  ARGPARSE_s_n (oCMS, "cms", "@"),
+
+  ARGPARSE_group (302, N_("@\nTar options:\n ")),
+
+  ARGPARSE_s_s (oDirectory, "directory",
+                N_("|DIRECTORY|extract files into DIRECTORY")),
+  ARGPARSE_s_s (oFilesFrom, "files-from",
+                N_("|FILE|get names to create from FILE")),
+  ARGPARSE_s_n (oNull, "null", N_("-T reads null-terminated names")),
+
+  ARGPARSE_s_s (oTarArgs, "tar-args", "@"),
+
+  ARGPARSE_end ()
+};
+
+
+/* The list of commands and options for tar that we understand. */
+static ARGPARSE_OPTS tar_opts[] = {
+  ARGPARSE_s_s (oDirectory, "directory",
+                N_("|DIRECTORY|extract files into DIRECTORY")),
   ARGPARSE_s_s (oFilesFrom, "files-from",
                 N_("|FILE|get names to create from FILE")),
   ARGPARSE_s_n (oNull, "null", N_("-T reads null-terminated names")),
-  ARGPARSE_s_n (oOpenPGP, "openpgp", "@"),
-  ARGPARSE_s_n (oCMS, "cms", "@"),
 
   ARGPARSE_end ()
 };
@@ -156,6 +178,105 @@ set_cmd (enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd)
 
   *ret_cmd = cmd;
 }
+

+/* Shell-like argument splitting.
+
+   For compatibility with gpg-zip we accept arguments for GnuPG and
+   tar given as a string argument to '--gpg-args' and '--tar-args'.
+   gpg-zip was implemented as a Bourne Shell script, and therefore, we
+   need to split the string the same way the shell would.  */
+static int
+shell_parse_stringlist (const char *str, strlist_t *r_list)
+{
+  strlist_t list = NULL;
+  const char *s = str;
+  char quoted = 0;
+  char arg[1024];
+  char *p = arg;
+#define addchar(c) \
+  do { if (p - arg + 2 < sizeof arg) *p++ = (c); else return 1; } while (0)
+#define addargument()                           \
+  do {                                          \
+    if (p > arg)                                \
+      {                                         \
+        *p = 0;                                 \
+        append_to_strlist (&list, arg);         \
+        p = arg;                                \
+      }                                         \
+  } while (0)
+
+#define unquoted	0
+#define singlequote	'\''
+#define doublequote	'"'
+
+  for (; *s; s++)
+    {
+      switch (quoted)
+        {
+        case unquoted:
+          if (isspace (*s))
+            addargument ();
+          else if (*s == singlequote || *s == doublequote)
+            quoted = *s;
+          else
+            addchar (*s);
+          break;
+
+        case singlequote:
+          if (*s == singlequote)
+            quoted = unquoted;
+          else
+            addchar (*s);
+          break;
+
+        case doublequote:
+          assert (s > str || !"cannot be quoted at first char");
+          if (*s == doublequote && *(s - 1) != '\\')
+            quoted = unquoted;
+          else
+            addchar (*s);
+          break;
+
+        default:
+          assert (! "reached");
+        }
+    }
+
+  /* Append the last argument.  */
+  addargument ();
+
+#undef doublequote
+#undef singlequote
+#undef unquoted
+#undef addargument
+#undef addchar
+  *r_list = list;
+  return 0;
+}
+
+
+/* Like shell_parse_stringlist, but returns an argv vector
+   instead of a strlist.  */
+static int
+shell_parse_argv (const char *s, int *r_argc, char ***r_argv)
+{
+  int i;
+  strlist_t list;
+
+  if (shell_parse_stringlist (s, &list))
+    return 1;
+
+  *r_argc = strlist_length (list);
+  *r_argv = xtrycalloc (*r_argc, sizeof **r_argv);
+  if (*r_argv == NULL)
+    return 1;
+
+  for (i = 0; list; i++)
+    (*r_argv)[i] = list->d, list = list->next;
+  return 0;
+}
+

+/* Define Assuan hooks for NPTH.  */
 
 ASSUAN_SYSTEM_NPTH_IMPL;
 
@@ -169,11 +290,11 @@ int null_names = 0;
 
 /* Command line parsing.  */
 static void
-parse_arguments (ARGPARSE_ARGS *pargs)
+parse_arguments (ARGPARSE_ARGS *pargs, ARGPARSE_OPTS *popts)
 {
   int no_more_options = 0;
 
-  while (!no_more_options && optfile_parse (NULL, NULL, NULL, pargs, opts))
+  while (!no_more_options && optfile_parse (NULL, NULL, NULL, pargs, popts))
     {
       switch (pargs->r_opt)
         {
@@ -219,6 +340,27 @@ parse_arguments (ARGPARSE_ARGS *pargs)
         case oOpenPGP: /* Dummy option for now.  */ break;
         case oCMS:     /* Dummy option for now.  */ break;
 
+        case oTarArgs:;
+          int tar_argc;
+          char **tar_argv;
+
+          if (shell_parse_argv (pargs->r.ret_str, &tar_argc, &tar_argv))
+            log_error ("failed to parse tar arguments '%s'\n",
+                       pargs->r.ret_str);
+          else
+            {
+              ARGPARSE_ARGS tar_args;
+              tar_args.argc = &tar_argc;
+              tar_args.argv = &tar_argv;
+              tar_args.flags = ARGPARSE_FLAG_ARG0;
+              parse_arguments (&tar_args, tar_opts);
+              if (tar_args.err)
+                log_error ("unsupported tar arguments '%s'\n",
+                           pargs->r.ret_str);
+              pargs->err = tar_args.err;
+            }
+          break;
+
         default: pargs->err = 2; break;
 	}
     }
@@ -252,7 +394,7 @@ main (int argc, char **argv)
   pargs.argc  = &argc;
   pargs.argv  = &argv;
   pargs.flags = ARGPARSE_FLAG_KEEP;
-  parse_arguments (&pargs);
+  parse_arguments (&pargs, opts);
 
   if ((files_from && !null_names) || (!files_from && null_names))
     log_error ("--files-from and --null may only be used in conjunction\n");

commit 35c0c8b211bc891335e822379b33ea34fbc1f84f
Author: Justus Winter <justus at g10code.com>
Date:   Thu Nov 26 11:46:35 2015 +0100

    tools/gpgtar: Rework argument parsing.
    
    * tools/gpgtar.c (main): Move argument parsing into its own function.
    
    Signed-off-by: Justus Winter <justus at g10code.com>

diff --git a/tools/gpgtar.c b/tools/gpgtar.c
index 991fbed..04d23b5 100644
--- a/tools/gpgtar.c
+++ b/tools/gpgtar.c
@@ -160,65 +160,46 @@ set_cmd (enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd)
 ASSUAN_SYSTEM_NPTH_IMPL;
 
 

-/* gpgtar main. */
-int
-main (int argc, char **argv)
-{
-  gpg_error_t err;
-  ARGPARSE_ARGS pargs;
-  const char *fname;
-  int no_more_options = 0;
-  enum cmd_and_opt_values cmd = 0;
-  int skip_crypto = 0;
-  const char *files_from = NULL;
-  int null_names = 0;
+/* Global flags.  */
+enum cmd_and_opt_values cmd = 0;
+int skip_crypto = 0;
+const char *files_from = NULL;
+int null_names = 0;
 
-  assert (sizeof (struct ustar_raw_header) == 512);
 
-  gnupg_reopen_std (GPGTAR_NAME);
-  set_strusage (my_strusage);
-  log_set_prefix (GPGTAR_NAME, 1);
-
-  /* Make sure that our subsystems are ready.  */
-  i18n_init();
-  init_common_subsystems (&argc, &argv);
-  npth_init ();
-  assuan_set_assuan_log_prefix (log_get_prefix (NULL));
-  assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
-  assuan_set_system_hooks (ASSUAN_SYSTEM_NPTH);
-  assuan_sock_init ();
+/* Command line parsing.  */
+static void
+parse_arguments (ARGPARSE_ARGS *pargs)
+{
+  int no_more_options = 0;
 
-  /* Parse the command line. */
-  pargs.argc  = &argc;
-  pargs.argv  = &argv;
-  pargs.flags = ARGPARSE_FLAG_KEEP;
-  while (!no_more_options && optfile_parse (NULL, NULL, NULL, &pargs, opts))
+  while (!no_more_options && optfile_parse (NULL, NULL, NULL, pargs, opts))
     {
-      switch (pargs.r_opt)
+      switch (pargs->r_opt)
         {
-        case oOutput:    opt.outfile = pargs.r.ret_str; break;
-        case oDirectory: opt.directory = pargs.r.ret_str; break;
-        case oSetFilename: opt.filename = pargs.r.ret_str; break;
+        case oOutput:    opt.outfile = pargs->r.ret_str; break;
+        case oDirectory: opt.directory = pargs->r.ret_str; break;
+        case oSetFilename: opt.filename = pargs->r.ret_str; break;
 	case oQuiet:     opt.quiet = 1; break;
         case oVerbose:   opt.verbose++; break;
         case oNoVerbose: opt.verbose = 0; break;
-        case oFilesFrom: files_from = pargs.r.ret_str; break;
+        case oFilesFrom: files_from = pargs->r.ret_str; break;
         case oNull: null_names = 1; break;
 
 	case aList:
         case aDecrypt:
         case aEncrypt:
         case aSign:
-          set_cmd (&cmd, pargs.r_opt);
+          set_cmd (&cmd, pargs->r_opt);
 	  break;
 
         case oRecipient:
-          add_to_strlist (&opt.recipients, pargs.r.ret_str);
+          add_to_strlist (&opt.recipients, pargs->r.ret_str);
           break;
 
         case oUser:
           log_info ("note: ignoring option --user\n");
-          opt.user = pargs.r.ret_str;
+          opt.user = pargs->r.ret_str;
           break;
 
         case oSymmetric:
@@ -228,7 +209,7 @@ main (int argc, char **argv)
           break;
 
         case oGpgProgram:
-          opt.gpg_program = pargs.r.ret_str;
+          opt.gpg_program = pargs->r.ret_str;
           break;
 
         case oSkipCrypto:
@@ -238,9 +219,40 @@ main (int argc, char **argv)
         case oOpenPGP: /* Dummy option for now.  */ break;
         case oCMS:     /* Dummy option for now.  */ break;
 
-        default: pargs.err = 2; break;
+        default: pargs->err = 2; break;
 	}
     }
+}
+
+

+/* gpgtar main. */
+int
+main (int argc, char **argv)
+{
+  gpg_error_t err;
+  const char *fname;
+  ARGPARSE_ARGS pargs;
+
+  assert (sizeof (struct ustar_raw_header) == 512);
+
+  gnupg_reopen_std (GPGTAR_NAME);
+  set_strusage (my_strusage);
+  log_set_prefix (GPGTAR_NAME, 1);
+
+  /* Make sure that our subsystems are ready.  */
+  i18n_init();
+  init_common_subsystems (&argc, &argv);
+  npth_init ();
+  assuan_set_assuan_log_prefix (log_get_prefix (NULL));
+  assuan_set_gpg_err_source (GPG_ERR_SOURCE_DEFAULT);
+  assuan_set_system_hooks (ASSUAN_SYSTEM_NPTH);
+  assuan_sock_init ();
+
+  /* Parse the command line. */
+  pargs.argc  = &argc;
+  pargs.argv  = &argv;
+  pargs.flags = ARGPARSE_FLAG_KEEP;
+  parse_arguments (&pargs);
 
   if ((files_from && !null_names) || (!files_from && null_names))
     log_error ("--files-from and --null may only be used in conjunction\n");

-----------------------------------------------------------------------

Summary of changes:
 common/call-gpg.c         |  55 ++++++----
 common/call-gpg.h         |  16 ++-
 g13/create.c              |   4 +-
 g13/g13-common.h          |   4 +
 g13/g13.c                 |  10 ++
 g13/mount.c               |   3 +-
 tests/openpgp/gpgtar.test |  20 ++--
 tools/gpgtar-create.c     |   1 +
 tools/gpgtar-extract.c    |  10 +-
 tools/gpgtar-list.c       |   3 +-
 tools/gpgtar.c            | 268 ++++++++++++++++++++++++++++++++++++++--------
 tools/gpgtar.h            |   2 +
 12 files changed, 314 insertions(+), 82 deletions(-)


hooks/post-receive
-- 
The GNU Privacy Guard
http://git.gnupg.org




More information about the Gnupg-commits mailing list