asserts
[oweals/gnunet.git] / src / util / common_logging.c
index b0c97df7db2738d752389bc686fffe97c9a67258..73a374f465bbc50738bf2efc54633ac927e6c1b8 100644 (file)
  */
 #define BULK_TRACK_SIZE 256
 
+/**
+ * How many characters do we use for matching of
+ * bulk components?
+ */
+#define COMP_TRACK_SIZE 32
+
 /**
  * How many characters can a date/time string
  * be at most?
@@ -99,14 +105,14 @@ static struct GNUNET_TIME_Absolute last_bulk_time;
 static unsigned int last_bulk_repeat;
 
 /**
- * Component when the last bulk was logged.
+ * Component when the last bulk was logged.  Will be 0-terminated.
  */
-static const char *last_bulk_comp;
+static char last_bulk_comp[COMP_TRACK_SIZE+1];
 
 /**
  * Running component.
  */
-static const char *component;
+static char *component;
 
 /**
  * Minimum log level.
@@ -162,17 +168,31 @@ int
 GNUNET_log_setup (const char *comp, const char *loglevel, const char *logfile)
 {
   FILE *altlog;
-
-  component = comp;
+  int dirwarn;
+  char *fn;
+
+  GNUNET_free_non_null (component);
+  GNUNET_asprintf (&component,
+                  "%s-%d",
+                  comp,
+                  getpid());
   min_level = get_type (loglevel);
   if (logfile == NULL)
     return GNUNET_OK;
-  altlog = FOPEN (logfile, "a");
+  fn = GNUNET_STRINGS_filename_expand (logfile);
+  dirwarn = (GNUNET_OK !=  GNUNET_DISK_directory_create_for_file (fn));
+  altlog = FOPEN (fn, "a");
   if (altlog == NULL)
     {
-      GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "fopen", logfile);
+      GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "fopen", fn);
+      if (dirwarn) 
+       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                   _("Failed to create or access directory for log file `%s'\n"), 
+                   fn);
+      GNUNET_free (fn);
       return GNUNET_SYSERR;
     }
+  GNUNET_free (fn);
   if (GNUNET_stderr != NULL)
     fclose (GNUNET_stderr);
   GNUNET_stderr = altlog;
@@ -240,8 +260,11 @@ output_message (enum GNUNET_ErrorType kind,
 {
   struct CustomLogger *pos;
   if (GNUNET_stderr != NULL)
-    fprintf (GNUNET_stderr, "%s %s %s %s", datestr, comp,
-             GNUNET_error_type_to_string (kind), msg);
+    {
+      fprintf (GNUNET_stderr, "%s %s %s %s", datestr, comp, 
+              GNUNET_error_type_to_string (kind), msg);
+      fflush (GNUNET_stderr);
+    }
   pos = loggers;
   while (pos != NULL)
     {
@@ -369,7 +392,7 @@ mylog (enum GNUNET_ErrorType kind,
   last_bulk_repeat = 0;
   last_bulk_kind = kind;
   last_bulk_time = GNUNET_TIME_absolute_get ();
-  last_bulk_comp = comp;
+  strncpy (last_bulk_comp, comp, sizeof (last_bulk_comp));
   output_message (kind, comp, date, buf);
   free (buf);
 }