Core: Add compile time option to use native OS logging facility
authorToby Gray <toby.gray@realvnc.com>
Tue, 9 Jul 2013 15:05:39 +0000 (16:05 +0100)
committerPete Batard <pete@akeo.ie>
Fri, 9 Aug 2013 00:55:04 +0000 (01:55 +0100)
* This change makes it easier to debug issues in UI applications
  which don't necessarily have a console connected to stderr.
* Outputting to the debugger shouldn't occur in normal situations so
  this change has to be explicitly enabled by a build-time config flag.
* Uses OutputDebugString() on Windows platforms or the syslog facility
  on other OSes, if available.
* Also align the report of configure defaults to autotool's.

configure.ac
libusb/core.c
libusb/version_nano.h
msvc/config.h

index 669fcf8..72ed647 100644 (file)
@@ -89,7 +89,7 @@ linux)
        AC_SUBST(OS_LINUX)
        AC_SEARCH_LIBS(clock_gettime, rt, [], [], -pthread)
        AC_ARG_ENABLE([udev],
-               [AC_HELP_STRING([--enable-udev], [use udev for device enumeration and hotplug support (recommended, default: yes)])],
+               [AC_HELP_STRING([--enable-udev], [use udev for device enumeration and hotplug support (recommended) [default=yes]])],
                [], [enable_udev="yes"])
                if test "x$enable_udev" = "xyes" ; then
                        # system has udev. use it or fail!
@@ -158,7 +158,7 @@ fi
 AC_CHECK_HEADER([sys/timerfd.h], [timerfd_h=1], [timerfd_h=0])
 AC_ARG_ENABLE([timerfd],
        [AS_HELP_STRING([--enable-timerfd],
-               [use timerfd for timing (default auto)])],
+               [use timerfd for timing [default=auto]])],
        [use_timerfd=$enableval], [use_timerfd='auto'])
 
 if test "x$use_timerfd" = "xyes" -a "x$timerfd_h" = "x0"; then
@@ -193,23 +193,38 @@ if test "x$log_enabled" != "xno"; then
 fi
 
 AC_ARG_ENABLE([debug-log], [AS_HELP_STRING([--enable-debug-log],
-       [start with debug message logging enabled (default n)])],
+       [start with debug message logging enabled [default=no]])],
        [debug_log_enabled=$enableval],
        [debug_log_enabled='no'])
 if test "x$debug_log_enabled" != "xno"; then
        AC_DEFINE([ENABLE_DEBUG_LOGGING], 1, [Start with debug message logging enabled])
 fi
 
+AC_ARG_ENABLE([system-log], [AS_HELP_STRING([--enable-system-log],
+       [output logging messages to system wide log, if supported by the OS [default=no]])],
+       [system_log_enabled=$enableval],
+       [system_log_enabled='no'])
+if test "x$system_log_enabled" != "xno"; then
+       AC_DEFINE([USE_SYSTEM_LOGGING_FACILITY], 1, [Enable output to system log])
+fi
+
+# Check if syslog is available in standard C library
+AC_CHECK_HEADERS(syslog.h)
+AC_CHECK_FUNC([syslog], [have_syslog=yes], [have_syslog=no])
+if test "x$have_syslog" != "xno"; then
+       AC_DEFINE([HAVE_SYSLOG_FUNC], 1, [syslog() function available])
+fi
+
 # Examples build
 AC_ARG_ENABLE([examples-build], [AS_HELP_STRING([--enable-examples-build],
-       [build example applications (default n)])],
+       [build example applications [default=no]])],
        [build_examples=$enableval],
        [build_examples='no'])
 AM_CONDITIONAL([BUILD_EXAMPLES], [test "x$build_examples" != "xno"])
 
 # Tests build
 AC_ARG_ENABLE([tests-build], [AS_HELP_STRING([--enable-tests-build],
-       [build test applications (default n)])],
+       [build test applications [default=no]])],
        [build_tests=$enableval],
        [build_tests='no'])
 AM_CONDITIONAL([BUILD_TESTS], [test "x$build_tests" != "xno"])
index 4f2f366..1418415 100644 (file)
@@ -33,6 +33,9 @@
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
 
 #ifdef __ANDROID__
 #include <android/log.h>
@@ -2026,10 +2029,34 @@ int usbi_gettimeofday(struct timeval *tp, void *tzp)
 }
 #endif
 
-static void usbi_log_str(struct libusb_context *ctx, const char * str)
+static void usbi_log_str(struct libusb_context *ctx,
+       enum libusb_log_level level, const char * str)
 {
-       UNUSED(ctx);
+#if defined(USE_SYSTEM_LOGGING_FACILITY)
+#if defined(OS_WINDOWS) || defined(OS_WINCE)
+       /* Windows CE only supports the Unicode version of OutputDebugString. */
+       WCHAR wbuf[USBI_MAX_LOG_LEN];
+       MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuf, sizeof(wbuf));
+       OutputDebugStringW(wbuf);
+#elif defined(HAVE_SYSLOG_FUNC)
+       int syslog_level = LOG_INFO;
+       switch (level) {
+       case LIBUSB_LOG_LEVEL_INFO: syslog_level = LOG_INFO; break;
+       case LIBUSB_LOG_LEVEL_WARNING: syslog_level = LOG_WARNING; break;
+       case LIBUSB_LOG_LEVEL_ERROR: syslog_level = LOG_ERR; break;
+       case LIBUSB_LOG_LEVEL_DEBUG: syslog_level = LOG_DEBUG; break;
+       case LIBUSB_LOG_LEVEL_NONE: break;
+       }
+       syslog(syslog_level, "%s", str);
+#else /* All of gcc, Clang, XCode seem to use #warning */
+#warning System logging is not supported on this platform. Logging to stderr will be used instead.
        fputs(str, stderr);
+#endif
+#else
+       fputs(str, stderr);
+#endif /* USE_SYSTEM_LOGGING_FACILITY */
+       UNUSED(ctx);
+       UNUSED(level);
 }
 
 void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level,
@@ -2084,8 +2111,8 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level,
        usbi_gettimeofday(&now, NULL);
        if ((global_debug) && (!has_debug_header_been_displayed)) {
                has_debug_header_been_displayed = 1;
-               usbi_log_str(ctx, "[timestamp] [threadID] facility level [function call] <message>\n");
-               usbi_log_str(ctx, "--------------------------------------------------------------------------------\n");
+               usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] <message>\n");
+               usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "--------------------------------------------------------------------------------\n");
        }
        if (now.tv_usec < timestamp_origin.tv_usec) {
                now.tv_sec--;
@@ -2143,7 +2170,7 @@ void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level,
        }
        strcpy(buf + header_len + text_len, USBI_LOG_LINE_END);
 
-       usbi_log_str(ctx, buf);
+       usbi_log_str(ctx, level, buf);
 #endif
 }
 
index 7ee3d41..ab03695 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 10805
+#define LIBUSB_NANO 10806
index bb542c5..4b418db 100644 (file)
@@ -25,6 +25,9 @@
 /* Uncomment to start with debug message logging enabled */
 // #define ENABLE_DEBUG_LOGGING 1
 
+/* Uncomment to enabling logging to system log */
+// #define USE_SYSTEM_LOGGING_FACILITY
+
 /* type of second poll() argument */
 #define POLL_NFDS_TYPE unsigned int