dhtlog updates
[oweals/gnunet.git] / src / util / common_logging.c
index c06aadc2f148a4ff66dc794eb91901d8e3a9df5a..e0560098610098317df968721b5603d9cab3eef0 100644 (file)
@@ -180,6 +180,8 @@ GNUNET_log_setup (const char *comp, const char *loglevel, const char *logfile)
   if (logfile == NULL)
     return GNUNET_OK;
   fn = GNUNET_STRINGS_filename_expand (logfile);
+  if (NULL == fn)    
+    return GNUNET_SYSERR;    
   dirwarn = (GNUNET_OK !=  GNUNET_DISK_directory_create_for_file (fn));
   altlog = FOPEN (fn, "a");
   if (altlog == NULL)
@@ -374,7 +376,10 @@ mylog (enum GNUNET_ErrorType kind,
   time (&timetmp);
   memset (date, 0, DATE_STR_SIZE);
   tmptr = localtime (&timetmp);
-  strftime (date, DATE_STR_SIZE, "%b %d %H:%M:%S", tmptr);
+  if (NULL != tmptr)
+    strftime (date, DATE_STR_SIZE, "%b %d %H:%M:%S", tmptr);
+  else
+    strcpy (date, "localtime error");
   if ((0 != (kind & GNUNET_ERROR_TYPE_BULK)) &&
       (last_bulk_time.value != 0) &&
       (0 == strncmp (buf, last_bulk, sizeof (last_bulk))))
@@ -392,7 +397,7 @@ mylog (enum GNUNET_ErrorType kind,
   last_bulk_repeat = 0;
   last_bulk_kind = kind;
   last_bulk_time = GNUNET_TIME_absolute_get ();
-  strncpy (last_bulk_comp, comp, sizeof (last_bulk_comp));
+  strncpy (last_bulk_comp, comp, COMP_TRACK_SIZE);
   output_message (kind, comp, date, buf);
   free (buf);
 }
@@ -468,11 +473,29 @@ const char *
 GNUNET_h2s (const GNUNET_HashCode * hc)
 {
   static struct GNUNET_CRYPTO_HashAsciiEncoded ret;
+
   GNUNET_CRYPTO_hash_to_enc (hc, &ret);
   ret.encoding[8] = '\0';
   return (const char *) ret.encoding;
 }
 
+/**
+ * Convert a hash to a string (for printing debug messages).
+ * This is one of the very few calls in the entire API that is
+ * NOT reentrant!
+ *
+ * @param hc the hash code
+ * @return string form; will be overwritten by next call to GNUNET_h2s_full.
+ */
+const char *
+GNUNET_h2s_full (const GNUNET_HashCode * hc)
+{
+  static struct GNUNET_CRYPTO_HashAsciiEncoded ret;
+
+  GNUNET_CRYPTO_hash_to_enc (hc, &ret);
+  ret.encoding[sizeof(ret)-1] = '\0';
+  return (const char *) ret.encoding;
+}
 
 /**
  * Convert a peer identity to a string (for printing debug messages).
@@ -487,6 +510,7 @@ const char *
 GNUNET_i2s (const struct GNUNET_PeerIdentity *pid)
 {
   static struct GNUNET_CRYPTO_HashAsciiEncoded ret;
+
   GNUNET_CRYPTO_hash_to_enc (&pid->hashPubKey, &ret);
   ret.encoding[4] = '\0';
   return (const char *) ret.encoding;
@@ -519,25 +543,31 @@ GNUNET_a2s (const struct sockaddr *addr, socklen_t addrlen)
   switch (addr->sa_family)
     {
     case AF_INET:
+      if (addrlen != sizeof (struct sockaddr_in))
+       return "<invalid v4 address>";
       v4 = (const struct sockaddr_in *) addr;
       inet_ntop (AF_INET, &v4->sin_addr, buf, INET_ADDRSTRLEN);
       if (0 == ntohs (v4->sin_port))
         return buf;
       strcat (buf, ":");
-      sprintf (b2, "%u", ntohs (v4->sin_port));
+      GNUNET_snprintf (b2, sizeof(b2), "%u", ntohs (v4->sin_port));
       strcat (buf, b2);
       return buf;
     case AF_INET6:
+      if (addrlen != sizeof (struct sockaddr_in6))
+       return "<invalid v4 address>";
       v6 = (const struct sockaddr_in6 *) addr;
       buf[0] = '[';
       inet_ntop (AF_INET6, &v6->sin6_addr, &buf[1], INET6_ADDRSTRLEN);
       if (0 == ntohs (v6->sin6_port))
         return &buf[1];
       strcat (buf, "]:");
-      sprintf (b2, "%u", ntohs (v6->sin6_port));
+      GNUNET_snprintf (b2, sizeof(b2), "%u", ntohs (v6->sin6_port));
       strcat (buf, b2);
       return buf;
     case AF_UNIX:
+      if (addrlen <= sizeof (sa_family_t))
+       return "<unbound UNIX client>";
       un = (const struct sockaddr_un*) addr;
       off = 0;
       if (un->sun_path[0] == '\0') off++;
@@ -545,7 +575,7 @@ GNUNET_a2s (const struct sockaddr *addr, socklen_t addrlen)
                sizeof (buf),
                "%s%.*s", 
                (off == 1) ? "@" : "",
-               addrlen - sizeof (sa_family_t) - 1 - off,
+               (int) (addrlen - sizeof (sa_family_t) - 1 - off),
                &un->sun_path[off]);
       return buf;
     default:
@@ -560,6 +590,20 @@ GNUNET_a2s (const struct sockaddr *addr, socklen_t addrlen)
 void __attribute__ ((constructor)) GNUNET_util_cl_init ()
 {
   GNUNET_stderr = stderr;
+#ifdef MINGW
+  InitWinEnv (NULL);
+#endif
+}
+
+
+/**
+ * Destructor
+ */
+void __attribute__ ((destructor)) GNUNET_util_cl_fini ()
+{
+#ifdef MINGW
+  ShutdownWinEnv ();
+#endif
 }
 
 /* end of common_logging.c */