[tor-commits] [obfsproxy/master] Clean up the logging API.

nickm at torproject.org nickm at torproject.org
Thu Jul 14 16:28:32 UTC 2011


commit 97e0e668dde5168c926722d367cc86bef2fb38c3
Author: Zack Weinberg <zackw at panix.com>
Date:   Fri Jul 8 15:38:16 2011 -0700

    Clean up the logging API.
    
    Not so many ifdefs, and now uses the standard unixy -1/error, 0/success
    return value convention where that makes sense, or no return value at
    all for functions that shouldn't ever fail.
---
 src/main.c |    3 +-
 src/util.c |  122 +++++++++++++++++++++--------------------------------------
 src/util.h |   60 +++++++++++++-----------------
 3 files changed, 71 insertions(+), 114 deletions(-)

diff --git a/src/main.c b/src/main.c
index a8347c2..0ba1f3f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -362,8 +362,7 @@ main(int argc, const char **argv)
 
   log_info("Exiting.");
 
-  if (close_obfsproxy_logfile() < 0)
-    printf("Failed closing logfile!\n");
+  close_obfsproxy_logfile();
 
   /* We are exiting. Clean everything. */
   for (h=0;h<n_listeners;h++)
diff --git a/src/util.c b/src/util.c
index ce9a042..9ac2260 100644
--- a/src/util.c
+++ b/src/util.c
@@ -25,14 +25,6 @@
 /** Any size_t larger than this amount is likely to be an underflow. */
 #define SIZE_T_CEILING  (SIZE_MAX/2 - 16)
 
-static const char *sev_to_string(int severity);
-static int sev_is_valid(int severity);
-static int write_logfile_prologue(int fd);
-static int compose_logfile_prologue(char *buf, size_t buflen);
-static int string_to_sev(const char *string);
-static int open_and_set_obfsproxy_logfile(const char *filename);
-static void logv(int severity, const char *format, va_list ap);
-
 /************************ Obfsproxy Network Routines *************************/
 
 int
@@ -146,7 +138,7 @@ obfs_vsnprintf(char *str, size_t size, const char *format, va_list args)
 }
 
 /************************ Logging Subsystem *************************/
-/** The code of this section was to a great extend shamelessly copied
+/** The code of this section was to a great extent shamelessly copied
     off tor. It's basicaly a stripped down version of tor's logging
     system. Thank you tor. */
 
@@ -157,6 +149,12 @@ obfs_vsnprintf(char *str, size_t size, const char *format, va_list args)
 /* strlen(TRUNCATED_STR) */
 #define TRUNCATED_STR_LEN 14
 
+/** Logging severities */
+
+#define LOG_SEV_WARN    3
+#define LOG_SEV_INFO    2
+#define LOG_SEV_DEBUG   1
+
 /* logging method */
 static int logging_method=LOG_METHOD_STDOUT;
 /* minimum logging severity */
@@ -199,31 +197,12 @@ string_to_sev(const char *string)
 static int
 sev_is_valid(int severity)
 {
-  return (severity == LOG_SEV_WARN || 
-          severity == LOG_SEV_INFO || 
+  return (severity == LOG_SEV_WARN ||
+          severity == LOG_SEV_INFO ||
           severity == LOG_SEV_DEBUG);
 }
 
 /**
-   Sets the global logging 'method' and also sets and open the logfile
-   'filename' in case we want to log into a file.
-   It returns 1 on success and -1 on fail.
-*/
-int
-log_set_method(int method, const char *filename)
-{
-  
-  logging_method = method;
-  if (method == LOG_METHOD_FILE) {
-    if (open_and_set_obfsproxy_logfile(filename) < 0)
-      return -1;
-    if (write_logfile_prologue(logging_logfile) < 0)
-      return -1;
-  }    
-  return 1;
-}
-
-/**
    Helper: Opens 'filename' and sets it as the obfsproxy logfile.
    On success it returns 1, on fail it returns -1.
 */
@@ -232,56 +211,55 @@ open_and_set_obfsproxy_logfile(const char *filename)
 {
   if (!filename)
     return -1;
-  logging_logfile = open(filename, 
+  logging_logfile = open(filename,
                          O_WRONLY|O_CREAT|O_APPEND,
                          0644);
   if (logging_logfile < 0)
     return -1;
-  return 1;
+  return 0;
 }
 
 /**
    Closes the obfsproxy logfile if it exists.
-   Returns 0 on success or if we weren't using a logfile (that's
-   close()'s success return value) and -1 on failure.
+   Ignores errors.
 */
-int
+void
 close_obfsproxy_logfile(void)
 {
-  if (logging_logfile < 0) /* no logfile. */
-    return 0;
-  else
-    return close(logging_logfile);
+  if (logging_logfile >= 0)
+    close(logging_logfile);
 }
 
 /**
-   Writes a small prologue in the logfile 'fd' that mentions the
-   obfsproxy version and helps separate log instances.
+   Writes a small prologue in the logfile 'fd' to separate log
+   instances.
 */
 static int
-write_logfile_prologue(int logfile) {
-  char buf[256];
-  if (compose_logfile_prologue(buf, sizeof(buf)) < 0)
-    return -1;
-  if (write(logfile, buf, strlen(buf)) < 0)
+write_logfile_prologue(int logfile)
+{
+  static const char prologue[] = "\nBrand new obfsproxy log:\n";
+  if (write(logfile, prologue, strlen(prologue)) != strlen(prologue))
     return -1;
-  return 1;
+  return 0;
 }
 
-#define TEMP_PROLOGUE "\nBrand new obfsproxy log:\n"
 /**
-   Helper: Composes the logfile prologue.
+   Sets the global logging 'method' and also sets and open the logfile
+   'filename' in case we want to log into a file.
+   It returns 1 on success and -1 on fail.
 */
-static int
-compose_logfile_prologue(char *buf, size_t buflen)
-{  
-  if (obfs_snprintf(buf, buflen, TEMP_PROLOGUE) < 0) {
-    log_warn("Logfile prologue couldn't be written.");
-    return -1;
+int
+log_set_method(int method, const char *filename)
+{
+  logging_method = method;
+  if (method == LOG_METHOD_FILE) {
+    if (open_and_set_obfsproxy_logfile(filename) < 0)
+      return -1;
+    if (write_logfile_prologue(logging_logfile) < 0)
+      return -1;
   }
-  return 1;
+  return 0;
 }
-#undef TEMP_PROLOGUE
 
 /**
    Sets the minimum logging severity of obfsproxy to the severity
@@ -289,37 +267,23 @@ compose_logfile_prologue(char *buf, size_t buflen)
    not a valid severity, it returns -1.
 */
 int
-log_set_min_severity(const char* sev_string) {
+log_set_min_severity(const char* sev_string)
+{
   int severity = string_to_sev(sev_string);
   if (!sev_is_valid(severity)) {
     log_warn("Severity '%s' makes no sense.", sev_string);
     return -1;
   }
   logging_min_sev = severity;
-  return 1;
+  return 0;
 }
 
 /**
-    Logging function of obfsproxy.
-    Don't call this directly; use the log_* macros defined in util.h
-    instead.
-
-    It accepts a logging 'severity' and a 'format' string and logs the
+    Logging worker function.
+    Accepts a logging 'severity' and a 'format' string and logs the
     message in 'format' according to the configured obfsproxy minimum
     logging severity and logging method.
 */
-void
-log_fn(int severity, const char *format, ...)
-{
-
-  va_list ap;
-  va_start(ap,format);
-
-  logv(severity, format, ap);
-
-  va_end(ap);
-}
-
 static void
 logv(int severity, const char *format, va_list ap)
 {
@@ -369,7 +333,8 @@ logv(int severity, const char *format, va_list ap)
     assert(0);
 }
 
-#ifdef NEED_LOG_WRAPPERS
+/**** Public logging API. ****/
+
 void
 log_info(const char *format, ...)
 {
@@ -380,6 +345,7 @@ log_info(const char *format, ...)
 
   va_end(ap);
 }
+
 void
 log_warn(const char *format, ...)
 {
@@ -390,6 +356,7 @@ log_warn(const char *format, ...)
 
   va_end(ap);
 }
+
 void
 log_debug(const char *format, ...)
 {
@@ -400,4 +367,3 @@ log_debug(const char *format, ...)
 
   va_end(ap);
 }
-#endif
diff --git a/src/util.h b/src/util.h
index 9a8a577..f52f335 100644
--- a/src/util.h
+++ b/src/util.h
@@ -8,6 +8,10 @@
 #include <stdarg.h> /* for va_list */
 #include <stddef.h> /* for size_t etc */
 
+#ifndef __GNUC__
+#define __attribute__(x) /* nothing */
+#endif
+
 struct sockaddr;
 struct event_base;
 struct evdns_base;
@@ -25,10 +29,6 @@ int init_evdns_base(struct event_base *base);
 
 /***** String functions stuff. *****/
 
-#ifndef __GNUC__
-#define __attribute__(x)
-#endif
-
 int obfs_vsnprintf(char *str, size_t size,
                    const char *format, va_list args);
 int obfs_snprintf(char *str, size_t size,
@@ -37,30 +37,6 @@ int obfs_snprintf(char *str, size_t size,
 
 /***** Logging subsystem stuff. *****/
 
-void log_fn(int severity, const char *format, ...)
-  __attribute__((format(printf, 2, 3)));
-int log_set_method(int method, const char *filename);
-int log_set_min_severity(const char* sev_string);
-int close_obfsproxy_logfile(void);
-
-#ifdef __GNUC__
-#define log_info(args...) log_fn(LOG_SEV_INFO, args)
-#define log_warn(args...) log_fn(LOG_SEV_WARN, args)
-#define log_debug(args...) log_fn(LOG_SEV_DEBUG, args)
-#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-#define log_info(...) log_fn(LOG_SEV_INFO, __VA_ARGS__)
-#define log_warn(...) log_fn(LOG_SEV_WARN, __VA_ARGS__)
-#define log_debug(...) log_fn(LOG_SEV_DEBUG, __VA_ARGS__)
-#else
-#define NEED_LOG_WRAPPERS
-void log_info(const char *format, ...)
-  __attribute__((format(printf, 1, 2)));
-void log_warn(const char *format, ...)
-  __attribute__((format(printf, 1, 2)));
-void log_debug(const char *format, ...)
-  __attribute__((format(printf, 1, 2)));
-#endif
-
 /** Logging methods */
 
 /** Spit log messages on stdout. */
@@ -68,17 +44,33 @@ void log_debug(const char *format, ...)
 /** Place log messages in a file. */
 #define LOG_METHOD_FILE 2
 /** We don't want no logs. */
-#define LOG_METHOD_NULL 3 
+#define LOG_METHOD_NULL 3
+
+/** Set the log method, and open the logfile 'filename' if appropriate. */
+int log_set_method(int method, const char *filename);
+
+/** Set the minimum severity that will be logged.
+    'sev_string' may be "warn", "info", or "debug" (case-insensitively). */
+int log_set_min_severity(const char* sev_string);
+
+/** Close the logfile if it's open.  Ignores errors. */
+void close_obfsproxy_logfile(void);
+
+/** The actual log-emitting functions */
 
-/** Logging severities */
+/** Warn-level severity: for messages that only appear when something
+    has gone wrong. */
+void log_warn(const char *format, ...)
+  __attribute__((format(printf, 1, 2)));
 
-/** Warn-level severity: for messages that only appear when something has gone  wrong. */
-#define LOG_SEV_WARN    3
 /** Info-level severity: for messages that should be sent to the user
     during normal operation. */
-#define LOG_SEV_INFO    2
+void log_info(const char *format, ...)
+  __attribute__((format(printf, 1, 2)));
+
 /** Debug-level severity: for hyper-verbose messages of no interest to
     anybody but developers. */
-#define LOG_SEV_DEBUG   1
+void log_debug(const char *format, ...)
+  __attribute__((format(printf, 1, 2)));
 
 #endif





More information about the tor-commits mailing list