common,gpg,sm: Move the compliance option parser.
authorJustus Winter <justus@g10code.com>
Wed, 7 Jun 2017 09:50:54 +0000 (11:50 +0200)
committerJustus Winter <justus@g10code.com>
Wed, 7 Jun 2017 14:53:31 +0000 (16:53 +0200)
* common/compliance.c (gnupg_parse_compliance_option): New function.
* common/compliance.h (struct gnupg_compliance_option): New type.
(gnupg_parse_compliance_option): New prototype.
* g10/gpg.c (parse_compliance_option): Remove function.
(compliance_options): New variable.
(main): Adapt callsite.
* sm/gpgsm.c (main): Use the new common function.
* sm/gpgsm.h (opt): New field 'compliance'.

GnuPG-bug-id: 3191
Signed-off-by: Justus Winter <justus@g10code.com>
common/compliance.c
common/compliance.h
g10/gpg.c
sm/gpgsm.c
sm/gpgsm.h

index 14ba097..d81a503 100644 (file)
@@ -33,6 +33,7 @@
 #include "openpgpdefs.h"
 #include "logging.h"
 #include "util.h"
 #include "openpgpdefs.h"
 #include "logging.h"
 #include "util.h"
+#include "i18n.h"
 #include "compliance.h"
 
 /* Return true if ALGO with a key of KEYLENGTH is compliant to the
 #include "compliance.h"
 
 /* Return true if ALGO with a key of KEYLENGTH is compliant to the
@@ -210,3 +211,35 @@ gnupg_status_compliance_flag (enum gnupg_compliance_mode compliance)
     }
   log_assert (!"invalid compliance mode");
 }
     }
   log_assert (!"invalid compliance mode");
 }
+
+
+/* Parse the value of --compliance.  Returns the value corresponding
+ * to the given STRING according to OPTIONS of size LENGTH, or -1
+ * indicating that the lookup was unsuccessful, or the list of options
+ * was printed.  If quiet is false, an additional hint to use 'help'
+ * is printed on unsuccessful lookups.  */
+int
+gnupg_parse_compliance_option (const char *string,
+                              struct gnupg_compliance_option options[],
+                              size_t length,
+                              int quiet)
+{
+  size_t i;
+
+  if (! ascii_strcasecmp (string, "help"))
+    {
+      log_info (_ ("valid values for option '%s':\n"), "--compliance");
+      for (i = 0; i < length; i++)
+        log_info ("  %s\n", options[i].keyword);
+      return -1;
+    }
+
+  for (i = 0; i < length; i++)
+    if (! ascii_strcasecmp (string, options[i].keyword))
+      return options[i].value;
+
+  log_error (_ ("invalid value for option '%s'\n"), "--compliance");
+  if (! quiet)
+    log_info (_ ("(use \"help\" to list choices)\n"));
+  return -1;
+}
index 4f78ad4..198447c 100644 (file)
@@ -48,4 +48,15 @@ int gnupg_digest_is_compliant (enum gnupg_compliance_mode compliance,
                                digest_algo_t digest);
 const char *gnupg_status_compliance_flag (enum gnupg_compliance_mode compliance);
 
                                digest_algo_t digest);
 const char *gnupg_status_compliance_flag (enum gnupg_compliance_mode compliance);
 
+struct gnupg_compliance_option
+{
+  const char *keyword;
+  int value;
+};
+
+int gnupg_parse_compliance_option (const char *string,
+                                   struct gnupg_compliance_option options[],
+                                   size_t length,
+                                   int quiet);
+
 #endif /*GNUPG_COMMON_COMPLIANCE_H*/
 #endif /*GNUPG_COMMON_COMPLIANCE_H*/
index cddaf77..686fcd7 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -2073,11 +2073,8 @@ parse_tofu_policy (const char *policystr)
 }
 
 
 }
 
 
-/* Parse the value of --compliance.  */
-static int
-parse_compliance_option (const char *string)
-{
-  struct { const char *keyword; enum cmd_and_opt_values option; } list[] = {
+static struct gnupg_compliance_option compliance_options[] =
+  {
     { "gnupg",      oGnuPG },
     { "openpgp",    oOpenPGP },
     { "rfc4880bis", oRFC4880bis },
     { "gnupg",      oGnuPG },
     { "openpgp",    oOpenPGP },
     { "rfc4880bis", oRFC4880bis },
@@ -2088,26 +2085,6 @@ parse_compliance_option (const char *string)
     { "pgp8",       oPGP8 },
     { "de-vs",      oDE_VS }
   };
     { "pgp8",       oPGP8 },
     { "de-vs",      oDE_VS }
   };
-  int i;
-
-  if (!ascii_strcasecmp (string, "help"))
-    {
-      log_info (_("valid values for option '%s':\n"), "--compliance");
-      for (i=0; i < DIM (list); i++)
-        log_info ("  %s\n", list[i].keyword);
-      g10_exit (1);
-    }
-
-  for (i=0; i < DIM (list); i++)
-    if (!ascii_strcasecmp (string, list[i].keyword))
-      return list[i].option;
-
-  log_error (_("invalid value for option '%s'\n"), "--compliance");
-  if (!opt.quiet)
-    log_info (_("(use \"help\" to list choices)\n"));
-  g10_exit (1);
-}
-
 
 
 /* Helper to set compliance related options.  This is a separate
 
 
 /* Helper to set compliance related options.  This is a separate
@@ -2862,7 +2839,15 @@ main (int argc, char **argv)
            break;
 
           case oCompliance:
            break;
 
           case oCompliance:
-            set_compliance_option (parse_compliance_option (pargs.r.ret_str));
+           {
+             int compliance = gnupg_parse_compliance_option (pargs.r.ret_str,
+                                                             compliance_options,
+                                                             DIM (compliance_options),
+                                                             opt.quiet);
+             if (compliance < 0)
+               g10_exit (1);
+             set_compliance_option (compliance);
+           }
             break;
           case oOpenPGP:
           case oRFC2440:
             break;
           case oOpenPGP:
           case oRFC2440:
index cb181e8..4b80778 100644 (file)
@@ -41,6 +41,7 @@
 #include "../common/gc-opt-flags.h"
 #include "../common/asshelp.h"
 #include "../common/init.h"
 #include "../common/gc-opt-flags.h"
 #include "../common/asshelp.h"
 #include "../common/init.h"
+#include "../common/compliance.h"
 
 
 #ifndef O_BINARY
 
 
 #ifndef O_BINARY
@@ -1443,7 +1444,19 @@ main ( int argc, char **argv)
         case oNoAutostart: opt.autostart = 0; break;
 
         case oCompliance:
         case oNoAutostart: opt.autostart = 0; break;
 
         case oCompliance:
-          /* Dummy option for now.  */
+          {
+            struct gnupg_compliance_option compliance_options[] =
+              {
+                { "de-vs", CO_DE_VS }
+              };
+            int compliance = gnupg_parse_compliance_option (pargs.r.ret_str,
+                                                            compliance_options,
+                                                            DIM (compliance_options),
+                                                            opt.quiet);
+            if (compliance < 0)
+              gpgsm_exit (1);
+            opt.compliance = compliance;
+          }
           break;
 
         default:
           break;
 
         default:
index df96770..8c1f520 100644 (file)
@@ -34,6 +34,7 @@
 #include "../common/audit.h"
 #include "../common/session-env.h"
 #include "../common/ksba-io-support.h"
 #include "../common/audit.h"
 #include "../common/session-env.h"
 #include "../common/ksba-io-support.h"
+#include "../common/compliance.h"
 
 
 #define MAX_DIGEST_LEN 64
 
 
 #define MAX_DIGEST_LEN 64
@@ -144,6 +145,7 @@ struct
      OID per string.  */
   strlist_t ignored_cert_extensions;
 
      OID per string.  */
   strlist_t ignored_cert_extensions;
 
+  enum gnupg_compliance_mode compliance;
 } opt;
 
 /* Debug values and macros.  */
 } opt;
 
 /* Debug values and macros.  */