summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorJustus Winter <justus@g10code.com>2017-06-07 11:50:54 +0200
committerJustus Winter <justus@g10code.com>2017-06-07 16:53:31 +0200
commit842d233d408457cfa9a8473a6748472956f44e84 (patch)
treee9805a911bb19472f463f6a0fe47aed7fef8ab9b /common
parentgpg: Improve compliance with CO_DE_VS. (diff)
downloadgnupg2-842d233d408457cfa9a8473a6748472956f44e84.tar.xz
gnupg2-842d233d408457cfa9a8473a6748472956f44e84.zip
common,gpg,sm: Move the compliance option parser.
* 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>
Diffstat (limited to 'common')
-rw-r--r--common/compliance.c33
-rw-r--r--common/compliance.h11
2 files changed, 44 insertions, 0 deletions
diff --git a/common/compliance.c b/common/compliance.c
index 14ba0970d..d81a50385 100644
--- a/common/compliance.c
+++ b/common/compliance.c
@@ -33,6 +33,7 @@
#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
@@ -210,3 +211,35 @@ gnupg_status_compliance_flag (enum gnupg_compliance_mode compliance)
}
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;
+}
diff --git a/common/compliance.h b/common/compliance.h
index 4f78ad42f..198447c6e 100644
--- a/common/compliance.h
+++ b/common/compliance.h
@@ -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);
+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*/