aboutsummaryrefslogtreecommitdiffstats
path: root/common/comopt.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/comopt.c')
-rw-r--r--common/comopt.c131
1 files changed, 131 insertions, 0 deletions
diff --git a/common/comopt.c b/common/comopt.c
new file mode 100644
index 000000000..764df57c6
--- /dev/null
+++ b/common/comopt.c
@@ -0,0 +1,131 @@
+/* comopt.c - Common options for GnUPG (common.conf)
+ * Copyright (C) 2021 g10 Code GmbH
+ *
+ * This file is part of GnuPG.
+ *
+ * This file is free software; you can redistribute it and/or modify
+ * it under the terms of either
+ *
+ * - the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * or
+ *
+ * - the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * or both in parallel, as here.
+ *
+ * This file is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: (LGPL-3.0-or-later OR GPL-2.0-or-later)
+ */
+
+#include <config.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+
+#include "util.h"
+#include "i18n.h"
+#include "comopt.h"
+
+
+enum opt_values
+ {
+ aNull = 0,
+
+ oLogFile = 500,
+ oUseKeyboxd,
+ oKeyboxdProgram,
+
+ oNoop
+ };
+
+static gpgrt_opt_t opts[] = {
+ ARGPARSE_s_s (oLogFile, "log-file", "@"),
+ ARGPARSE_s_n (oUseKeyboxd, "use-keyboxd", "@"),
+ ARGPARSE_s_s (oKeyboxdProgram, "keyboxd-program", "@"),
+
+ ARGPARSE_end ()
+};
+
+
+
+/* Parse the common options in the homedir and etc. This needs to be
+ * called after the gpgrt config directories are. MODULE_ID is one of
+ * the GNUPG_MODULE_NAME_ constants. If verbose is true info about
+ * the parsing is printed. Note that this function is not
+ * thread-safe. */
+gpg_error_t
+parse_comopt (int module_id, int verbose)
+{
+ gpg_error_t err = 0;
+ gpgrt_argparse_t pargs;
+ int argc = 0;
+ char **argv = NULL;
+
+ /* Reset all options in case we are called a second time. */
+ xfree (comopt.logfile);
+ xfree (comopt.keyboxd_program);
+ memset (&comopt, 0, sizeof comopt);
+
+ /* Start the parser. */
+ pargs.argc = &argc;
+ pargs.argv = &argv;
+ pargs.flags = (ARGPARSE_FLAG_NOVERSION
+ | ARGPARSE_FLAG_SYS
+ | ARGPARSE_FLAG_USER
+ );
+ while (gpgrt_argparser (&pargs, opts, "common" EXTSEP_S "conf" ))
+ {
+ switch (pargs.r_opt)
+ {
+ case ARGPARSE_CONFFILE:
+ if (verbose)
+ log_info (_("reading options from '%s'\n"),
+ pargs.r_type? pargs.r.ret_str: "[cmdline]");
+ break;
+
+ case oLogFile:
+ comopt.logfile = pargs.r.ret_str;
+ break;
+
+ case oUseKeyboxd:
+ comopt.use_keyboxd = 1;
+ break;
+
+ case oKeyboxdProgram:
+ comopt.keyboxd_program = pargs.r.ret_str;
+ break;
+
+ default:
+ pargs.err = ARGPARSE_PRINT_WARNING;
+ err = gpg_error (GPG_ERR_GENERAL);
+ break;
+ }
+ }
+
+ gpgrt_argparse (NULL, &pargs, NULL); /* Release internal state. */
+
+ if (comopt.logfile && !(!strncmp (comopt.logfile, "socket:", 7)
+ || !strncmp (comopt.logfile, "tcp:", 4)) )
+ {
+ /* Letting all modules write to the same log file is not a good
+ * idea. Append the module name. */
+ char *p;
+
+ p = xstrconcat (comopt.logfile, "-", gnupg_module_name (module_id), NULL);
+ xfree (comopt.logfile);
+ comopt.logfile = p;
+ }
+
+ return err;
+}