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.
This commit is contained in:
Werner Koch 2012-02-06 20:50:47 +01:00
parent ecda65498a
commit eb0faef81d
20 changed files with 80 additions and 33 deletions

View 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,

View File

@ -46,6 +46,7 @@
#include "simple-pwquery.h"
#include "i18n.h"
#include "sysutils.h"
#include "../common/init.h"
enum cmd_and_opt_values

View File

@ -43,6 +43,7 @@
#include "i18n.h"
#include "get-passphrase.h"
#include "sysutils.h"
#include "../common/init.h"
enum cmd_and_opt_values

View File

@ -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);

View 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.
*
@ -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*/

View 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. */

View 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".

View 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

View File

@ -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

View File

@ -49,6 +49,7 @@
#include "sysutils.h"
#include "status.h"
#include "call-agent.h"
#include "../common/init.h"
enum cmd_and_opt_values {

View File

@ -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"

View File

@ -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 <gcrypt.h>
enum cmd_and_opt_values {
aNull = 0,
oArmor = 'a',

View File

@ -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 <gpg-error.h>
#define map_assuan_err(a) \
map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a))

View 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,

View 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

View File

@ -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 )

View File

@ -37,6 +37,7 @@
#ifdef HAVE_W32_SYSTEM
# include "../common/exechelp.h"
#endif
#include "../common/init.h"
#define CONTROL_D ('D' - 'A' + 1)

View 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

View 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))

View 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. */