[Pkg-gnupg-commit] [gnupg2] 74/112: gpg: New option --input-size-hint.

Daniel Kahn Gillmor dkg at fifthhorseman.net
Tue Aug 30 17:48:22 UTC 2016


This is an automated email from the git hooks/post-receive script.

dkg pushed a commit to branch master
in repository gnupg2.

commit 70b5d7c43a57a44dad60c2c700a263610748d8f4
Author: Werner Koch <wk at gnupg.org>
Date:   Thu Aug 11 21:31:12 2016 +0200

    gpg: New option --input-size-hint.
    
    * g10/options.h: Include stdint.h.
    (struct opt): Add field 'input_size_hint'.
    * g10/gpg.c (oInputSizeHint): New.
    (opts): Add --input-size-hint.
    (main): Set opt.input_size_hint.
    * g10/progress.c (write_status_progress): Use the hint.
    --
    
    This is a prerequisite to fix
    GnuPG-bug-id: 2368
    
    Signed-off-by: Werner Koch <wk at gnupg.org>
---
 doc/gpg.texi   | 9 +++++++++
 g10/gpg.c      | 8 ++++++++
 g10/options.h  | 7 +++++++
 g10/progress.c | 9 +++++++--
 4 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/doc/gpg.texi b/doc/gpg.texi
index 944734b..894d384 100644
--- a/doc/gpg.texi
+++ b/doc/gpg.texi
@@ -2155,6 +2155,15 @@ works properly with such messages, there is often a desire to set a
 maximum file size that will be generated before processing is forced to
 stop by the OS limits. Defaults to 0, which means "no limit".
 
+ at item --input-size-hint @var{n}
+ at opindex input-size-hint
+This option can be used to tell GPG the size of the input data in
+bytes.  @var{n} must be a positive base-10 number.  This option is
+only useful if the input is not taken from a file.  GPG may use thos
+hint to optimize its buffer allocation strategy.  It is also used by
+the @option{--status-fd} line ``PROGRESS'' to provide a value for
+``total'' if that is not available by other means.
+
 @item --import-options @code{parameters}
 @opindex import-options
 This is a space or comma delimited string that gives options for
diff --git a/g10/gpg.c b/g10/gpg.c
index adc32f0..fd21fde 100644
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -99,6 +99,7 @@ enum cmd_and_opt_values
     aListSecretKeys = 'K',
     oBatch	  = 500,
     oMaxOutput,
+    oInputSizeHint,
     oSigNotation,
     oCertNotation,
     oShowNotation,
@@ -554,6 +555,7 @@ static ARGPARSE_OPTS opts[] = {
 
   ARGPARSE_s_s (oOutput, "output", N_("|FILE|write output to FILE")),
   ARGPARSE_p_u (oMaxOutput, "max-output", "@"),
+  ARGPARSE_s_s (oInputSizeHint, "input-size-hint", "@"),
 
   ARGPARSE_s_n (oVerbose, "verbose", N_("verbose")),
   ARGPARSE_s_n (oQuiet,	  "quiet",   "@"),
@@ -2459,7 +2461,13 @@ main (int argc, char **argv)
 
 	  case oArmor: opt.armor = 1; opt.no_armor=0; break;
 	  case oOutput: opt.outfile = pargs.r.ret_str; break;
+
 	  case oMaxOutput: opt.max_output = pargs.r.ret_ulong; break;
+
+          case oInputSizeHint:
+            opt.input_size_hint = string_to_u64 (pargs.r.ret_str);
+            break;
+
 	  case oQuiet: opt.quiet = 1; break;
 	  case oNoTTY: tty_no_terminal(1); break;
 	  case oDryRun: opt.dry_run = 1; break;
diff --git a/g10/options.h b/g10/options.h
index d1c3634..230c96a 100644
--- a/g10/options.h
+++ b/g10/options.h
@@ -23,6 +23,7 @@
 
 #include <sys/types.h>
 #include <types.h>
+#include <stdint.h>
 #include "main.h"
 #include "packet.h"
 #include "tofu.h"
@@ -54,6 +55,12 @@ struct
   char *outfile;
   estream_t outfp;  /* Hack, sometimes used in place of outfile.  */
   off_t max_output;
+
+  /* If > 0 a hint with the expected number of input data bytes.  This
+   * is not necessary an exact number but intended to be used for
+   * progress info and to decide on how to allocate buffers.  */
+  uint64_t input_size_hint;
+
   int dry_run;
   int autostart;
   int list_only;
diff --git a/g10/progress.c b/g10/progress.c
index efc3b3a..f151657 100644
--- a/g10/progress.c
+++ b/g10/progress.c
@@ -73,11 +73,12 @@ release_progress_context (progress_filter_context_t *pfx)
 
 static void
 write_status_progress (const char *what,
-                       unsigned long current, unsigned long total)
+                       unsigned long current, unsigned long total_arg)
 {
   char buffer[60];
   char units[] = "BKMGTPEZY?";
   int unitidx = 0;
+  uint64_t total = total_arg;
 
   /* Although we use an unsigned long for the values, 32 bit
    * applications using GPGME will use an "int" and thus are limited
@@ -91,6 +92,10 @@ write_status_progress (const char *what,
    * thus scaling CURRENT and TOTAL down before they get to large,
    * should not have a noticeable effect except for rounding
    * imprecision. */
+
+  if (!total && opt.input_size_hint)
+    total = opt.input_size_hint;
+
   if (total)
     {
       if (current > total)
@@ -116,7 +121,7 @@ write_status_progress (const char *what,
     unitidx = 9;
 
   snprintf (buffer, sizeof buffer, "%.20s ? %lu %lu %c%s",
-            what? what : "?", current, total,
+            what? what : "?", current, (unsigned long)total,
             units[unitidx],
             unitidx? "iB" : "");
   write_status_text (STATUS_PROGRESS, buffer);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gnupg2.git



More information about the Pkg-gnupg-commit mailing list