implement impl_in_flight API for MQ, replacing evacuation
[oweals/gnunet.git] / src / util / common_logging.c
index 0cefa194d128bebe8311614e53f0e14f4061f124..5989db00cf2f717fc1b6dfe3609dde4e71709c62 100644 (file)
@@ -25,6 +25,7 @@
  */
 #include "platform.h"
 #include "gnunet_crypto_lib.h"
+#include "gnunet_disk_lib.h"
 #include "gnunet_strings_lib.h"
 #include <regex.h>
 
@@ -256,6 +257,8 @@ get_type (const char *log)
     return GNUNET_ERROR_TYPE_DEBUG;
   if (0 == strcasecmp (log, _("INFO")))
     return GNUNET_ERROR_TYPE_INFO;
+  if (0 == strcasecmp (log, _("MESSAGE")))
+    return GNUNET_ERROR_TYPE_MESSAGE;
   if (0 == strcasecmp (log, _("WARNING")))
     return GNUNET_ERROR_TYPE_WARNING;
   if (0 == strcasecmp (log, _("ERROR")))
@@ -291,6 +294,7 @@ GNUNET_abort_ ()
 }
 
 
+#if ! TALER_WALLET_ONLY
 /**
  * Rotate logs, deleting the oldest log.
  *
@@ -357,6 +361,15 @@ setup_log_file (const struct tm *tm)
     return GNUNET_OK; /* no change */
   log_rotate (last_fn);
   strcpy (last_fn, fn);
+  if (GNUNET_SYSERR ==
+      GNUNET_DISK_directory_create_for_file (fn))
+  {
+    fprintf (stderr,
+             "Failed to create directory for `%s': %s\n",
+             fn,
+             STRERROR (errno));
+    return GNUNET_SYSERR;
+  }
 #if WINDOWS
   altlog_fd = OPEN (fn, O_APPEND |
                         O_BINARY |
@@ -395,6 +408,7 @@ setup_log_file (const struct tm *tm)
   GNUNET_stderr = altlog;
   return GNUNET_OK;
 }
+#endif
 
 
 /**
@@ -510,9 +524,10 @@ GNUNET_get_log_call_status (int caller_level,
   if (min_level >= 0)
     return caller_level <= min_level;
   /* All programs/services previously defaulted to WARNING.
-   * Now WE default to WARNING, and THEY default to NULL.
+   * Now *we* default to WARNING, and THEY default to NULL.
+   * Or rather we default to MESSAGE, since things aren't always bad.
    */
-  return caller_level <= GNUNET_ERROR_TYPE_WARNING;
+  return caller_level <= GNUNET_ERROR_TYPE_MESSAGE;
 }
 
 
@@ -678,8 +693,6 @@ GNUNET_log_setup (const char *comp,
                  const char *logfile)
 {
   const char *env_logfile;
-  const struct tm *tm;
-  time_t t;
 
   min_level = get_type (loglevel);
 #if !defined(GNUNET_CULL_LOGGING)
@@ -702,9 +715,20 @@ GNUNET_log_setup (const char *comp,
   log_file_name = GNUNET_STRINGS_filename_expand (logfile);
   if (NULL == log_file_name)
     return GNUNET_SYSERR;
-  t = time (NULL);
-  tm = gmtime (&t);
-  return setup_log_file (tm);
+#if TALER_WALLET_ONLY
+  /* log file option not allowed for wallet logic */
+  GNUNET_assert (NULL == logfile);
+  return GNUNET_OK;
+#else
+  {
+    time_t t;
+    const struct tm *tm;
+
+    t = time (NULL);
+    tm = gmtime (&t);
+    return setup_log_file (tm);
+  }
+#endif
 }
 
 
@@ -788,12 +812,26 @@ output_message (enum GNUNET_ErrorType kind,
   if ( (NULL != GNUNET_stderr) &&
        (NULL == loggers) )
   {
-    FPRINTF (GNUNET_stderr,
+    if (kind == GNUNET_ERROR_TYPE_MESSAGE) {
+       /* The idea here is to produce "normal" output messages
+        * for end users while still having the power of the
+        * logging engine for developer needs. So ideally this
+        * is what it should look like when CLI tools are used
+        * interactively, yet the same message shouldn't look
+        * this way if the output is going to logfiles or robots
+        * instead. Is this the right place to do this? --lynX
+        */
+       FPRINTF (GNUNET_stderr,
+             "* %s",
+             msg);
+    } else {
+       FPRINTF (GNUNET_stderr,
              "%s %s %s %s",
              datestr,
              comp,
              GNUNET_error_type_to_string (kind),
              msg);
+    }
     fflush (GNUNET_stderr);
   }
   pos = loggers;
@@ -821,7 +859,8 @@ flush_bulk (const char *datestr)
   char *last;
   const char *ft;
 
-  if ((0 == last_bulk_time.abs_value_us) || (0 == last_bulk_repeat))
+  if ( (0 == last_bulk_time.abs_value_us) ||
+       (0 == last_bulk_repeat) )
     return;
   rev = 0;
   last = memchr (last_bulk, '\0', BULK_TRACK_SIZE);
@@ -906,10 +945,15 @@ mylog (enum GNUNET_ErrorType kind,
   va_list vacp;
 
   va_copy (vacp, va);
-  size = VSNPRINTF (NULL, 0, message, vacp) + 1;
+  size = VSNPRINTF (NULL,
+                    0,
+                    message,
+                    vacp) + 1;
   GNUNET_assert (0 != size);
   va_end (vacp);
-  memset (date, 0, DATE_STR_SIZE);
+  memset (date,
+          0,
+          DATE_STR_SIZE);
   {
     char buf[size];
     long long offset;
@@ -929,8 +973,13 @@ mylog (enum GNUNET_ErrorType kind,
     }
     else
     {
-      strftime (date2, DATE_STR_SIZE, "%b %d %H:%M:%S-%%020llu", tmptr);
-      snprintf (date, sizeof (date), date2,
+      strftime (date2,
+                DATE_STR_SIZE,
+                "%b %d %H:%M:%S-%%020llu",
+                tmptr);
+      snprintf (date,
+                sizeof (date),
+                date2,
                (long long) (pc.QuadPart /
                             (performance_frequency.QuadPart / 1000)));
     }
@@ -965,17 +1014,26 @@ mylog (enum GNUNET_ErrorType kind,
     tmptr = localtime (&timeofday.tv_sec);
     if (NULL == tmptr)
     {
-      strcpy (date, "localtime error");
+      strcpy (date,
+              "localtime error");
     }
     else
     {
-      strftime (date2, DATE_STR_SIZE, "%b %d %H:%M:%S-%%06u", tmptr);
-      snprintf (date, sizeof (date), date2, timeofday.tv_usec);
+      strftime (date2,
+                DATE_STR_SIZE,
+                "%b %d %H:%M:%S-%%06u",
+                tmptr);
+      snprintf (date,
+                sizeof (date),
+                date2,
+                timeofday.tv_usec);
     }
 #endif
     VSNPRINTF (buf, size, message, va);
+#if ! TALER_WALLET_ONLY
     if (NULL != tmptr)
       (void) setup_log_file (tmptr);
+#endif
     if ((0 != (kind & GNUNET_ERROR_TYPE_BULK)) &&
         (0 != last_bulk_time.abs_value_us) &&
         (0 == strncmp (buf, last_bulk, sizeof (last_bulk))))
@@ -988,12 +1046,19 @@ mylog (enum GNUNET_ErrorType kind,
       return;
     }
     flush_bulk (date);
-    strncpy (last_bulk, buf, sizeof (last_bulk));
+    strncpy (last_bulk,
+             buf,
+             sizeof (last_bulk));
     last_bulk_repeat = 0;
     last_bulk_kind = kind;
     last_bulk_time = GNUNET_TIME_absolute_get ();
-    strncpy (last_bulk_comp, comp, COMP_TRACK_SIZE);
-    output_message (kind, comp, date, buf);
+    strncpy (last_bulk_comp,
+             comp,
+             COMP_TRACK_SIZE);
+    output_message (kind,
+                    comp,
+                    date,
+                    buf);
   }
 }
 
@@ -1056,6 +1121,8 @@ GNUNET_error_type_to_string (enum GNUNET_ErrorType kind)
     return _("ERROR");
   if ((kind & GNUNET_ERROR_TYPE_WARNING) > 0)
     return _("WARNING");
+  if ((kind & GNUNET_ERROR_TYPE_MESSAGE) > 0)
+    return _("MESSAGE");
   if ((kind & GNUNET_ERROR_TYPE_INFO) > 0)
     return _("INFO");
   if ((kind & GNUNET_ERROR_TYPE_DEBUG) > 0)