gpg: Change armor Version header to emit only the major version.
authorWerner Koch <wk@gnupg.org>
Wed, 27 Nov 2013 08:20:02 +0000 (09:20 +0100)
committerWerner Koch <wk@gnupg.org>
Wed, 27 Nov 2013 10:00:55 +0000 (11:00 +0100)
* g10/options.h (opt): Rename field no_version to emit_version.
* g10/gpg.c (main): Init opt.emit_vesion to 1.  Change --emit-version
to bump up opt.emit_version.
* g10/armor.c (armor_filter): Implement different --emit-version
values.
--

GnuPG-bug-id: 1572
Signed-off-by: Werner Koch <wk@gnupg.org>
(cherry picked from commit e951782e937ce290be0d89d83e84b3daea997587)

Resolved conflicts:
NEWS
g10/armor.c
g10/gpg.c

NEWS
doc/gpg.texi
g10/armor.c
g10/gpg.c
g10/options.h

diff --git a/NEWS b/NEWS
index ad3471e..6122540 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,9 @@ Noteworthy changes in version 1.4.16 (unreleased)
 
  * Do not create a trustdb file if --trust-model=always is used.
 
+ * Only the major version number is by default included in the armored
+   output.
+
 
 Noteworthy changes in version 1.4.15 (2013-10-04)
 -------------------------------------------------
index c588d7a..26179bd 100644 (file)
@@ -2408,8 +2408,12 @@ protected by the signature.
 @item --emit-version
 @itemx --no-emit-version
 @opindex emit-version
-Force inclusion of the version string in ASCII armored output.
-@option{--no-emit-version} disables this option.
+Force inclusion of the version string in ASCII armored output.  If
+given once only the name of the program and the major number is
+emitted (default), given twice the minor is also emitted, given triple
+the micro is added, and given quad an operating system identification
+is also emitted.  @option{--no-emit-version} disables the version
+line.
 
 @item --sig-notation @code{name=value}
 @itemx --cert-notation @code{name=value}
index 0fbb997..c50525c 100644 (file)
@@ -148,11 +148,11 @@ release_armor_context (armor_filter_context_t *afx)
 int
 push_armor_filter (armor_filter_context_t *afx, iobuf_t iobuf)
 {
-  int rc; 
+  int rc;
 
   if (!afx->refcount)
     return iobuf_push_filter (iobuf, armor_filter, afx);
-    
+
   afx->refcount++;
   rc = iobuf_push_filter (iobuf, armor_filter, afx);
   if (rc)
@@ -801,7 +801,7 @@ radix64_read( armor_filter_context_t *afx, IOBUF a, size_t *retn,
                    goto again;
                }
            }
-            
+
            if (!n)
              onlypad = 1;
 
@@ -985,7 +985,7 @@ armor_filter( void *opaque, int control,
         /* We need some space for the faked packet.  The minmum
          * required size is the PARTIAL_CHUNK size plus a byte for the
          * length itself */
-       if( size < PARTIAL_CHUNK+1 ) 
+       if( size < PARTIAL_CHUNK+1 )
            BUG(); /* supplied buffer too short */
 
        if( afx->faked )
@@ -1004,7 +1004,7 @@ armor_filter( void *opaque, int control,
                unsigned int hashes = afx->hashes;
                 const byte *sesmark;
                 size_t sesmarklen;
-                
+
                 sesmark = get_session_marker( &sesmarklen );
                 if ( sesmarklen > 20 )
                     BUG();
@@ -1026,7 +1026,7 @@ armor_filter( void *opaque, int control,
                 buf[n++] = 0xff; /* new format, type 63, 1 length byte */
                 n++;   /* see below */
                 memcpy(buf+n, sesmark, sesmarklen ); n+= sesmarklen;
-                buf[n++] = CTRLPKT_CLEARSIGN_START; 
+                buf[n++] = CTRLPKT_CLEARSIGN_START;
                 buf[n++] = afx->not_dash_escaped? 0:1; /* sigclass */
                 if( hashes & 1 )
                     buf[n++] = DIGEST_ALGO_RMD160;
@@ -1080,10 +1080,25 @@ armor_filter( void *opaque, int control,
            iobuf_writestr(a, head_strings[afx->what] );
            iobuf_writestr(a, "-----" );
            iobuf_writestr(a,afx->eol);
-           if( !opt.no_version )
+           if (opt.emit_version)
              {
-               iobuf_writestr(a, "Version: GnuPG v"  VERSION " ("
-                              PRINTABLE_OS_NAME ")" );
+               iobuf_writestr (a, "Version: GnuPG v");
+                for (s=VERSION; *s && *s != '.'; s++)
+                  iobuf_writebyte (a, *s);
+                if (opt.emit_version > 1 && *s)
+                  {
+                    iobuf_writebyte (a, *s++);
+                    for (; *s && *s != '.'; s++)
+                      iobuf_writebyte (a, *s);
+                    if (opt.emit_version > 2)
+                      {
+                        for (; *s && *s != '-' && !spacep (s); s++)
+                          iobuf_writebyte (a, *s);
+                        if (opt.emit_version > 3)
+                          iobuf_writestr (a, " (" PRINTABLE_OS_NAME ")");
+                      }
+                  }
+
                iobuf_writestr(a,afx->eol);
              }
 
@@ -1287,7 +1302,7 @@ make_radix64_string( const byte *data, size_t len )
 
 /***********************************************
  *  For the pipemode command we can't use the armor filter for various
- *  reasons, so we use this new unarmor_pump stuff to remove the armor 
+ *  reasons, so we use this new unarmor_pump stuff to remove the armor
  */
 
 enum unarmor_state_e {
@@ -1295,7 +1310,7 @@ enum unarmor_state_e {
     STA_bypass,
     STA_wait_newline,
     STA_wait_dash,
-    STA_first_dash, 
+    STA_first_dash,
     STA_compare_header,
     STA_found_header_wait_newline,
     STA_skip_header_lines,
@@ -1334,12 +1349,12 @@ unarmor_pump_release (UnarmorPump x)
     xfree (x);
 }
 
-/* 
+/*
  * Get the next character from the ascii armor taken from the IOBUF
  * created earlier by unarmor_pump_new().
  * Return:  c = Character
  *        256 = ignore this value
- *         -1 = End of current armor 
+ *         -1 = End of current armor
  *         -2 = Premature EOF (not used)
  *         -3 = Invalid armor
  */
@@ -1350,9 +1365,9 @@ unarmor_pump (UnarmorPump x, int c)
 
     switch (x->state) {
       case STA_init:
-        { 
+        {
             byte tmp[1];
-            tmp[0] = c; 
+            tmp[0] = c;
             if ( is_armored (tmp) )
                 x->state = c == '-'? STA_first_dash : STA_wait_newline;
             else {
@@ -1375,10 +1390,10 @@ unarmor_pump (UnarmorPump x, int c)
         x->state = STA_compare_header;
       case STA_compare_header:
         if ( "-----BEGIN PGP SIGNATURE-----"[++x->pos] == c ) {
-            if ( x->pos == 28 ) 
+            if ( x->pos == 28 )
                 x->state = STA_found_header_wait_newline;
         }
-        else 
+        else
             x->state = c == '\n'? STA_wait_dash : STA_wait_newline;
         break;
       case STA_found_header_wait_newline:
@@ -1425,7 +1440,7 @@ unarmor_pump (UnarmorPump x, int c)
                 break;
             }
         }
-        
+
         switch(x->pos) {
           case 0:
             x->val = c << 2;
@@ -1466,7 +1481,7 @@ unarmor_pump (UnarmorPump x, int c)
             x->state = STA_ready; /* not sure whether this is correct */
             break;
         }
-        
+
         switch(x->pos) {
           case 0:
             x->val = c << 2;
index ca120ab..c58ee41 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -1908,6 +1908,7 @@ main (int argc, char **argv )
     opt.def_cert_expire="0";
     set_homedir ( default_homedir () );
     opt.passwd_repeat=1;
+    opt.emit_version = 1; /* Limit to the major number.  */
 
 #ifdef ENABLE_CARD_SUPPORT
 #if defined(_WIN32) || defined(__CYGWIN__)
@@ -2245,8 +2246,8 @@ main (int argc, char **argv )
          case oNoVerbose: g10_opt_verbose = 0;
                           opt.verbose = 0; opt.list_sigs=0; break;
          case oQuickRandom: quick_random_gen(1); break;
-         case oEmitVersion: opt.no_version=0; break;
-         case oNoEmitVersion: opt.no_version=1; break;
+         case oEmitVersion: opt.emit_version++; break;
+         case oNoEmitVersion: opt.emit_version=0; break;
          case oCompletesNeeded: opt.completes_needed = pargs.r.ret_int; break;
          case oMarginalsNeeded: opt.marginals_needed = pargs.r.ret_int; break;
          case oMaxCertDepth: opt.max_cert_depth = pargs.r.ret_int; break;
index de4a2e2..d6326d8 100644 (file)
@@ -79,7 +79,11 @@ struct
   int def_cert_level;
   int min_cert_level;
   int ask_cert_level;
-  int no_version;
+  int emit_version;       /* 0 = none,
+                             1 = major only,
+                             2 = major and minor,
+                             3 = full version,
+                             4 = full version plus OS string. */
   int marginals_needed;
   int completes_needed;
   int max_cert_depth;