From eb0faef81dae2cba1f62056fdc4dc2a7d58ac86a Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Mon, 6 Feb 2012 20:50:47 +0100 Subject: [PATCH] common: Add a global variable to for the default error source. For the shared code parts it is cumbersome to pass an error sourse variable to each function. Its value is always a constant for a given binary and thus a global variable makes things a lot easier than the former macro stuff. * common/init.c (default_errsource): New global var. (init_common_subsystems): Rename to _init_common_subsystems. Set DEFAULT_ERRSOURCE. * common/init.h: Assert value of GPG_ERR_SOURCE_DEFAULT. (init_common_subsystems): New macro. * common/util.h (default_errsource): Add declaration. * kbx/keybox-defs.h: Add some GPG_ERR_SOURCE_DEFAULT trickery. --- agent/gpg-agent.c | 2 ++ agent/preset-passphrase.c | 1 + agent/protect-tool.c | 1 + common/init.c | 14 +++++++++++++- common/init.h | 12 ++++++++++-- common/util.h | 7 ++++++- dirmngr/dirmngr.c | 1 + dirmngr/dirmngr_ldap.c | 1 + g10/gpg.c | 1 + g10/gpgv.c | 1 + g13/g13.c | 1 + kbx/kbxutil.c | 4 ++-- kbx/keybox-defs.h | 7 +++++-- scd/scdaemon.c | 2 ++ sm/gpgsm.c | 2 ++ tools/gpg-check-pattern.c | 37 +++++++++++++++++++------------------ tools/gpg-connect-agent.c | 1 + tools/gpgconf.c | 2 ++ tools/gpgtar.c | 15 ++++++++------- tools/symcryptrun.c | 1 + 20 files changed, 80 insertions(+), 33 deletions(-) diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index bc5a6cd1b..3a868676b 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -52,6 +52,8 @@ #include "exechelp.h" #include "asshelp.h" #include "../include/cipher.h" /* for PUBKEY_ALGO_ECDSA, PUBKEY_ALGO_ECDH */ +#include "../common/init.h" + enum cmd_and_opt_values { aNull = 0, diff --git a/agent/preset-passphrase.c b/agent/preset-passphrase.c index f303d5b7f..3f7933638 100644 --- a/agent/preset-passphrase.c +++ b/agent/preset-passphrase.c @@ -46,6 +46,7 @@ #include "simple-pwquery.h" #include "i18n.h" #include "sysutils.h" +#include "../common/init.h" enum cmd_and_opt_values diff --git a/agent/protect-tool.c b/agent/protect-tool.c index a2531438c..57842a083 100644 --- a/agent/protect-tool.c +++ b/agent/protect-tool.c @@ -43,6 +43,7 @@ #include "i18n.h" #include "get-passphrase.h" #include "sysutils.h" +#include "../common/init.h" enum cmd_and_opt_values diff --git a/common/init.c b/common/init.c index f551416c5..475eaefda 100644 --- a/common/init.c +++ b/common/init.c @@ -37,6 +37,12 @@ #include "util.h" +/* The default error source of the application. This is different + from GPG_ERR_SOURCE_DEFAULT in that it does not depend on the + source file and thus is usable in code shared by applications. */ +gpg_err_source_t default_errsource; + + #ifdef HAVE_W32CE_SYSTEM static void parse_std_file_handles (int *argcp, char ***argvp); static void @@ -74,10 +80,16 @@ writestring_via_estream (int mode, const char *string) required for logging is ready. ARGCP and ARGVP are the addresses of the parameters given to main. This function may modify them. + This function should be called only via the macro + init_common_subsystems. + CAUTION: This might be called while running suid(root). */ void -init_common_subsystems (int *argcp, char ***argvp) +_init_common_subsystems (gpg_err_source_t errsource, int *argcp, char ***argvp) { + /* Store the error source in a gloabl variable. */ + default_errsource = errsource; + /* Try to auto set the character set. */ set_native_charset (NULL); diff --git a/common/init.h b/common/init.h index e8fe499d8..b13c060a6 100644 --- a/common/init.h +++ b/common/init.h @@ -1,5 +1,5 @@ /* init.h - Definitions for init fucntions. - * Copyright (C) 2007 Free Software Foundation, Inc. + * Copyright (C) 2007, 2012 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -20,7 +20,15 @@ #ifndef GNUPG_COMMON_INIT_H #define GNUPG_COMMON_INIT_H -void init_common_subsystems (int *argcp, char ***argvp); +#ifndef GPG_ERR_SOURCE_DEFAULT +# error GPG_ERR_SOURCE_DEFAULT is not defined +#elseif GPG_ERR_SOURCE_DEFAULT == GPG_ERR_SOURCE_UNKNOWN +# error GPG_ERR_SOURCE_DEFAULT has default value +#endif +void _init_common_subsystems (gpg_err_source_t errsource, + int *argcp, char ***argvp); +#define init_common_subsystems(a,b) \ + _init_common_subsystems (GPG_ERR_SOURCE_DEFAULT, (a), (b)) #endif /*GNUPG_COMMON_INIT_H*/ diff --git a/common/util.h b/common/util.h index 9381f29e4..5ea7b819a 100644 --- a/common/util.h +++ b/common/util.h @@ -63,7 +63,6 @@ #include "../common/utf8conv.h" #include "../common/dynload.h" -#include "init.h" #include "gettime.h" /* Redefine asprintf by our estream version which uses our own memory @@ -113,6 +112,12 @@ typedef char **rl_completion_func_t (const char *, int, int); #define xmalloc_clear(a) gcry_xcalloc (1, (a)) #define xmalloc_secure_clear(a) gcry_xcalloc_secure (1, (a)) +/* The default error source of the application. This is different + from GPG_ERR_SOURCE_DEFAULT in that it does not depend on the + source file and thus is usable in code shared by applications. + Defined by init.c. */ +extern gpg_err_source_t default_errsource; + /* Convenience function to return a gpg-error code for memory allocation failures. This function makes sure that an error will be returned even if accidently ERRNO is not set. */ diff --git a/dirmngr/dirmngr.c b/dirmngr/dirmngr.c index b0410afd0..ee857189f 100644 --- a/dirmngr/dirmngr.c +++ b/dirmngr/dirmngr.c @@ -56,6 +56,7 @@ #include "ldapserver.h" #include "asshelp.h" #include "ldap-wrapper.h" +#include "../common/init.h" /* The plain Windows version uses the windows service system. For example to start the service you may use "sc start dirmngr". diff --git a/dirmngr/dirmngr_ldap.c b/dirmngr/dirmngr_ldap.c index f166f19e2..2e7349392 100644 --- a/dirmngr/dirmngr_ldap.c +++ b/dirmngr/dirmngr_ldap.c @@ -57,6 +57,7 @@ #include "i18n.h" #include "util.h" +#include "../common/init.h" /* With the ldap wrapper, there is no need for the npth_unprotect and leave functions; thus we redefine them to nops. If we are not using the diff --git a/g10/gpg.c b/g10/gpg.c index aa37a88b6..07d5172c5 100644 --- a/g10/gpg.c +++ b/g10/gpg.c @@ -55,6 +55,7 @@ #include "gc-opt-flags.h" #include "asshelp.h" #include "call-dirmngr.h" +#include "../common/init.h" #if defined(HAVE_DOSISH_SYSTEM) || defined(__CYGWIN__) #define MY_O_BINARY O_BINARY diff --git a/g10/gpgv.c b/g10/gpgv.c index b62ab8224..07e4a2e37 100644 --- a/g10/gpgv.c +++ b/g10/gpgv.c @@ -49,6 +49,7 @@ #include "sysutils.h" #include "status.h" #include "call-agent.h" +#include "../common/init.h" enum cmd_and_opt_values { diff --git a/g13/g13.c b/g13/g13.c index b33ea61ed..6fc83b52c 100644 --- a/g13/g13.c +++ b/g13/g13.c @@ -36,6 +36,7 @@ #include "sysutils.h" #include "gc-opt-flags.h" #include "asshelp.h" +#include "../common/init.h" #include "keyblob.h" #include "server.h" #include "runner.h" diff --git a/kbx/kbxutil.c b/kbx/kbxutil.c index 333c28695..9762add2a 100644 --- a/kbx/kbxutil.c +++ b/kbx/kbxutil.c @@ -34,11 +34,11 @@ #include "../common/stringhelp.h" #include "../common/utf8conv.h" #include "i18n.h" -#include "init.h" #include "keybox-defs.h" - +#include "../common/init.h" #include + enum cmd_and_opt_values { aNull = 0, oArmor = 'a', diff --git a/kbx/keybox-defs.h b/kbx/keybox-defs.h index aad07f9d6..9a2930239 100644 --- a/kbx/keybox-defs.h +++ b/kbx/keybox-defs.h @@ -21,9 +21,12 @@ #define KEYBOX_DEFS_H 1 #ifdef GPG_ERR_SOURCE_DEFAULT -#error GPG_ERR_SOURCE_DEFAULT already defined +# if GPG_ERR_SOURCE_DEFAULT != GPG_ERR_SOURCE_KEYBOX +# error GPG_ERR_SOURCE_DEFAULT already defined +# endif +#else +# define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_KEYBOX #endif -#define GPG_ERR_SOURCE_DEFAULT GPG_ERR_SOURCE_KEYBOX #include #define map_assuan_err(a) \ map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a)) diff --git a/scd/scdaemon.c b/scd/scdaemon.c index e8073b7ee..7e7850d91 100644 --- a/scd/scdaemon.c +++ b/scd/scdaemon.c @@ -53,6 +53,8 @@ #include "mkdtemp.h" #include "gc-opt-flags.h" #include "asshelp.h" +#include "../common/init.h" + enum cmd_and_opt_values { aNull = 0, diff --git a/sm/gpgsm.c b/sm/gpgsm.c index 7164f4274..b2d1d2f67 100644 --- a/sm/gpgsm.c +++ b/sm/gpgsm.c @@ -38,6 +38,8 @@ #include "sysutils.h" #include "gc-opt-flags.h" #include "asshelp.h" +#include "../common/init.h" + #ifndef O_BINARY #define O_BINARY 0 diff --git a/tools/gpg-check-pattern.c b/tools/gpg-check-pattern.c index 42a6c62f0..e6b8b276b 100644 --- a/tools/gpg-check-pattern.c +++ b/tools/gpg-check-pattern.c @@ -45,9 +45,10 @@ #include "util.h" #include "i18n.h" #include "sysutils.h" +#include "../common/init.h" -enum cmd_and_opt_values +enum cmd_and_opt_values { aNull = 0, oVerbose = 'v', oArmor = 'a', @@ -66,12 +67,12 @@ enum cmd_and_opt_values /* The list of commands and options. */ static ARGPARSE_OPTS opts[] = { - + { 301, NULL, 0, N_("@Options:\n ") }, { oVerbose, "verbose", 0, "verbose" }, - { oHomedir, "homedir", 2, "@" }, + { oHomedir, "homedir", 2, "@" }, { oCheck, "check", 0, "run only a syntax check on the patternfile" }, { oNull, "null", 0, "input is expected to be null delimited" }, @@ -80,7 +81,7 @@ static ARGPARSE_OPTS opts[] = { /* Global options are accessed through the usual OPT structure. */ -static struct +static struct { int verbose; const char *homedir; @@ -99,7 +100,7 @@ enum { /* An object to decibe an item of our pattern table. */ struct pattern_s { - int type; + int type; unsigned int lineno; /* Line number of the pattern file. */ union { struct { @@ -111,7 +112,7 @@ struct pattern_s we need for PAT_STRING and we expect only a few regex in a patternfile. It would be a waste of core to have so many unused stuff in the table. */ - regex_t *regex; + regex_t *regex; } r; /*PAT_REGEX*/ } u; }; @@ -141,14 +142,14 @@ my_strusage (int level) case 19: p = _("Please report bugs to <@EMAIL@>.\n"); break; case 1: - case 40: + case 40: p = _("Usage: gpg-check-pattern [options] patternfile (-h for help)\n"); break; - case 41: + case 41: p = _("Syntax: gpg-check-pattern [options] patternfile\n" "Check a passphrase given on stdin against the patternfile\n"); break; - + default: p = NULL; } return p; @@ -165,7 +166,7 @@ main (int argc, char **argv ) set_strusage (my_strusage); gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN); - log_set_prefix ("gpg-check-pattern", 1); + log_set_prefix ("gpg-check-pattern", 1); /* Make sure that our subsystems are ready. */ i18n_init (); @@ -194,13 +195,13 @@ main (int argc, char **argv ) case oHomedir: opt.homedir = pargs.r.ret_str; break; case oCheck: opt.checkonly = 1; break; case oNull: opt.null = 1; break; - + default : pargs.err = 2; break; } } if (log_get_errorcount(0)) exit (2); - + if (argc != 1) usage (1); @@ -239,7 +240,7 @@ read_file (const char *fname, size_t *r_length) FILE *fp; char *buf; size_t buflen; - + if (!strcmp (fname, "-")) { size_t nread, bufsize = 0; @@ -251,7 +252,7 @@ read_file (const char *fname, size_t *r_length) buf = NULL; buflen = 0; #define NCHUNK 8192 - do + do { bufsize += NCHUNK; if (!buf) @@ -282,14 +283,14 @@ read_file (const char *fname, size_t *r_length) log_error ("can't open `%s': %s\n", fname, strerror (errno)); return NULL; } - + if (fstat (fileno(fp), &st)) { log_error ("can't stat `%s': %s\n", fname, strerror (errno)); fclose (fp); return NULL; } - + buflen = st.st_size; buf = xmalloc (buflen+1); if (fread (buf, buflen, 1, fp) != 1) @@ -331,7 +332,7 @@ parse_pattern_file (char *data, size_t datalen) pattern_t *array; size_t arraysize, arrayidx; unsigned int lineno = 0; - + /* Estimate the number of entries by counting the non-comment lines. */ arraysize = 0; p = data; @@ -456,7 +457,7 @@ process (FILE *fp, pattern_t *patarray) int c; unsigned long lineno = 0; pattern_t *pat; - + idx = 0; c = 0; while (idx < sizeof buffer -1 && c != EOF ) diff --git a/tools/gpg-connect-agent.c b/tools/gpg-connect-agent.c index 7472728c6..d340c7f0e 100644 --- a/tools/gpg-connect-agent.c +++ b/tools/gpg-connect-agent.c @@ -37,6 +37,7 @@ #ifdef HAVE_W32_SYSTEM # include "../common/exechelp.h" #endif +#include "../common/init.h" #define CONTROL_D ('D' - 'A' + 1) diff --git a/tools/gpgconf.c b/tools/gpgconf.c index da10e4d73..cff6e4b3c 100644 --- a/tools/gpgconf.c +++ b/tools/gpgconf.c @@ -26,6 +26,8 @@ #include "gpgconf.h" #include "i18n.h" #include "sysutils.h" +#include "../common/init.h" + /* Constants to identify the commands and options. */ enum cmd_and_opt_values diff --git a/tools/gpgtar.c b/tools/gpgtar.c index ace45c42d..b6dd5e10a 100644 --- a/tools/gpgtar.c +++ b/tools/gpgtar.c @@ -37,6 +37,7 @@ #include "i18n.h" #include "sysutils.h" #include "../common/openpgpdefs.h" +#include "../common/init.h" #include "gpgtar.h" @@ -71,7 +72,7 @@ enum cmd_and_opt_values /* The list of commands and options. */ static ARGPARSE_OPTS opts[] = { ARGPARSE_group (300, N_("@Commands:\n ")), - + ARGPARSE_c (aEncrypt, "encrypt", N_("create an archive")), ARGPARSE_c (aDecrypt, "decrypt", N_("extract an archive")), ARGPARSE_c (aSign, "sign", N_("create a signed archive")), @@ -146,7 +147,7 @@ set_cmd (enum cmd_and_opt_values *ret_cmd, enum cmd_and_opt_values new_cmd) cmd = aSignEncrypt; else if (cmd == aEncrypt && new_cmd == aSign) cmd = aSignEncrypt; - else + else { log_error (_("conflicting commands\n")); exit (2); @@ -194,7 +195,7 @@ main (int argc, char **argv) case oNoVerbose: opt.verbose = 0; break; case oFilesFrom: files_from = pargs.r.ret_str; break; case oNull: null_names = 1; break; - + case aList: case aDecrypt: case aEncrypt: @@ -217,7 +218,7 @@ main (int argc, char **argv) default: pargs.err = 2; break; } } - + if ((files_from && !null_names) || (!files_from && null_names)) log_error ("--files-from and --null may only be used in conjunction\n"); if (files_from && strcmp (files_from, "-")) @@ -324,7 +325,7 @@ write_record (estream_t stream, const void *record) } else err = 0; - + return err; } @@ -341,9 +342,9 @@ openpgp_message_p (estream_t fp) if (ctb != EOF) { if (es_ungetc (ctb, fp)) - log_fatal ("error ungetting first byte: %s\n", + log_fatal ("error ungetting first byte: %s\n", gpg_strerror (gpg_error_from_syserror ())); - + if ((ctb & 0x80)) { switch ((ctb & 0x40) ? (ctb & 0x3f) : ((ctb>>2)&0xf)) diff --git a/tools/symcryptrun.c b/tools/symcryptrun.c index c75f637e6..942fafa09 100644 --- a/tools/symcryptrun.c +++ b/tools/symcryptrun.c @@ -89,6 +89,7 @@ #define JNLIB_NEED_LOG_LOGV #include "i18n.h" #include "../common/util.h" +#include "../common/init.h" #include "mkdtemp.h" /* FIXME: Bah. For spwq_secure_free. */