common: Add a global variable to for the default error source.
authorWerner Koch <wk@gnupg.org>
Mon, 6 Feb 2012 19:50:47 +0000 (20:50 +0100)
committerWerner Koch <wk@gnupg.org>
Mon, 6 Feb 2012 19:50:47 +0000 (20:50 +0100)
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.

20 files changed:
agent/gpg-agent.c
agent/preset-passphrase.c
agent/protect-tool.c
common/init.c
common/init.h
common/util.h
dirmngr/dirmngr.c
dirmngr/dirmngr_ldap.c
g10/gpg.c
g10/gpgv.c
g13/g13.c
kbx/kbxutil.c
kbx/keybox-defs.h
scd/scdaemon.c
sm/gpgsm.c
tools/gpg-check-pattern.c
tools/gpg-connect-agent.c
tools/gpgconf.c
tools/gpgtar.c
tools/symcryptrun.c

index bc5a6cd..3a86867 100644 (file)
@@ -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,
index f303d5b..3f79336 100644 (file)
@@ -46,6 +46,7 @@
 #include "simple-pwquery.h"
 #include "i18n.h"
 #include "sysutils.h"
+#include "../common/init.h"
 
 
 enum cmd_and_opt_values
index a253143..57842a0 100644 (file)
@@ -43,6 +43,7 @@
 #include "i18n.h"
 #include "get-passphrase.h"
 #include "sysutils.h"
+#include "../common/init.h"
 
 
 enum cmd_and_opt_values
index f551416..475eaef 100644 (file)
 #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);
 
index e8fe499..b13c060 100644 (file)
@@ -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.
  *
 #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*/
index 9381f29..5ea7b81 100644 (file)
@@ -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.  */
index b0410af..ee85718 100644 (file)
@@ -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".
index f166f19..2e73493 100644 (file)
@@ -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
index aa37a88..07d5172 100644 (file)
--- 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
index b62ab82..07e4a2e 100644 (file)
@@ -49,6 +49,7 @@
 #include "sysutils.h"
 #include "status.h"
 #include "call-agent.h"
+#include "../common/init.h"
 
 
 enum cmd_and_opt_values {
index b33ea61..6fc83b5 100644 (file)
--- 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"
index 333c286..9762add 100644 (file)
 #include "../common/stringhelp.h"
 #include "../common/utf8conv.h"
 #include "i18n.h"
-#include "init.h"
 #include "keybox-defs.h"
-
+#include "../common/init.h"
 #include <gcrypt.h>
 
+
 enum cmd_and_opt_values {
   aNull = 0,
   oArmor         = 'a',
index aad07f9..9a29302 100644 (file)
 #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 <gpg-error.h>
 #define map_assuan_err(a) \
         map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a))
index e8073b7..7e7850d 100644 (file)
@@ -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,
index 7164f42..b2d1d2f 100644 (file)
@@ -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
index 42a6c62..e6b8b27 100644 (file)
 #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 )
index 7472728..d340c7f 100644 (file)
@@ -37,6 +37,7 @@
 #ifdef HAVE_W32_SYSTEM
 #  include "../common/exechelp.h"
 #endif
+#include "../common/init.h"
 
 
 #define CONTROL_D ('D' - 'A' + 1)
index da10e4d..cff6e4b 100644 (file)
@@ -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
index ace45c4..b6dd5e1 100644 (file)
@@ -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))
index c75f637..942fafa 100644 (file)
@@ -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.  */