X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Fdebug.c;h=dff138337fb66c36df5b8f3618a8ad6a6136ae60;hb=2627875b7d18858bc1f9f7652811e4d8c15a23eb;hp=ed036e48599056208a027e9fa3a55d9455ee5e32;hpb=fb2bd066c2f8b34addafe48d62550e3033a59431;p=debian%2Famanda diff --git a/common-src/debug.c b/common-src/debug.c index ed036e4..dff1383 100644 --- a/common-src/debug.c +++ b/common-src/debug.c @@ -64,7 +64,7 @@ static time_t open_time; static void (*logerror_fn)(char *) = NULL; /* storage for global variables */ -erroutput_type_t erroutput_type = ERR_INTERACTIVE; +erroutput_type_t erroutput_type = ERR_FROM_CONTEXT; int error_exit_status = 1; /* static function prototypes */ @@ -126,29 +126,60 @@ debug_logging_handler(const gchar *log_domain G_GNUC_UNUSED, gpointer user_data G_GNUC_UNUSED) { char *maxlevel = NULL; + pcontext_t context = get_pcontext(); + + /* scriptutil context doesn't do any logging except for critical + * and error levels */ + if (context != CONTEXT_SCRIPTUTIL) { + /* convert the highest level to a string and dbprintf it */ + if (log_level & G_LOG_LEVEL_ERROR) + maxlevel = _("error (fatal): "); + else if (log_level & G_LOG_LEVEL_CRITICAL) + maxlevel = _("critical (fatal): "); + else if (log_level & G_LOG_LEVEL_WARNING) + maxlevel = _("warning: "); + else if (log_level & G_LOG_LEVEL_MESSAGE) + maxlevel = _("message: "); + else if (log_level & G_LOG_LEVEL_INFO) + maxlevel = _("info: "); + else + maxlevel = ""; /* no level displayed for debugging */ - /* convert the highest level to a string and dbprintf it */ - if (log_level & G_LOG_LEVEL_ERROR) - maxlevel = _("error (fatal): "); - else if (log_level & G_LOG_LEVEL_CRITICAL) - maxlevel = _("critical (fatal): "); - else if (log_level & G_LOG_LEVEL_WARNING) - maxlevel = _("warning: "); - else if (log_level & G_LOG_LEVEL_MESSAGE) - maxlevel = _("message: "); - else if (log_level & G_LOG_LEVEL_INFO) - maxlevel = _("info: "); - else - maxlevel = ""; /* no level displayed for debugging */ - - debug_printf("%s%s\n", maxlevel, message); + debug_printf("%s%s\n", maxlevel, message); + } /* error and critical levels have special handling */ if (log_level & (G_LOG_LEVEL_ERROR|G_LOG_LEVEL_CRITICAL)) { - if (erroutput_type & ERR_AMANDALOG && logerror_fn != NULL) + erroutput_type_t local_erroutput; + + /* Calculate a local version of erroutput_type, based on the + * context if the process has not set erroutput_type explicitly */ + if (!(erroutput_type & ERR_FROM_CONTEXT)) { + local_erroutput = erroutput_type; + } else { + switch (context) { + case CONTEXT_SCRIPTUTIL: + local_erroutput = ERR_INTERACTIVE; + break; + + case CONTEXT_DAEMON: + local_erroutput = ERR_INTERACTIVE + | ERR_AMANDALOG + | ERR_SYSLOG; + break; + + case CONTEXT_CMDLINE: + case CONTEXT_DEFAULT: + default: + local_erroutput = ERR_INTERACTIVE; + break; + } + } + + if (local_erroutput & ERR_AMANDALOG && logerror_fn != NULL) (*logerror_fn)((char *)message); /* discard 'const' */ - if (erroutput_type & ERR_SYSLOG) { + if (local_erroutput & ERR_SYSLOG) { #ifdef LOG_AUTH openlog(get_pname(), LOG_PID, LOG_AUTH); #else @@ -158,7 +189,7 @@ debug_logging_handler(const gchar *log_domain G_GNUC_UNUSED, closelog(); } - if (erroutput_type & ERR_INTERACTIVE) { + if (local_erroutput & ERR_INTERACTIVE) { g_fprintf(stderr, "%s: %s\n", get_pname(), message); fflush(stderr); } @@ -379,9 +410,10 @@ debug_setup_2( /* * Make the first debug log file entry. */ - debug_printf(_("pid %ld ruid %ld euid %ld: %s at %s"), + debug_printf(_("pid %ld ruid %ld euid %ld version %s: %s at %s"), (long)getpid(), (long)getuid(), (long)geteuid(), + VERSION, annotation, ctime(&open_time)); } @@ -410,6 +442,19 @@ msg_timestamp(void) * ---- public functions */ +void +debug_init(void) +{ + debug_setup_logging(); + + /* the scriptutil context does not create a debug log, since such + * processes are invoked many times. + */ + if (get_pcontext() != CONTEXT_SCRIPTUTIL) { + debug_open(get_ptype()); + } +} + void set_logerror(void (*f)(char *)) { @@ -647,6 +692,7 @@ printf_arglist_function(void debug_printf, const char *, format) { va_list argp; int save_errno; + static GStaticMutex mutex = G_STATIC_MUTEX_INIT; /* * It is common in the code to call dbprintf to write out @@ -662,6 +708,7 @@ printf_arglist_function(void debug_printf, const char *, format) db_file = stderr; } if(db_file != NULL) { + g_static_mutex_lock(&mutex); if (db_file != stderr) g_fprintf(db_file, "%s: %s: ", msg_timestamp(), get_pname()); else @@ -670,6 +717,7 @@ printf_arglist_function(void debug_printf, const char *, format) g_vfprintf(db_file, format, argp); arglist_end(argp); fflush(db_file); + g_static_mutex_unlock(&mutex); } errno = save_errno; }