Imported Upstream version 2.6.1
[debian/amanda] / common-src / debug.c
index ed036e48599056208a027e9fa3a55d9455ee5e32..dff138337fb66c36df5b8f3618a8ad6a6136ae60 100644 (file)
@@ -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;
 }