Convert logging and timer calls to new os_specific API (os_system)
authorHenning Rogge <hrogge@googlemail.com>
Sat, 15 Oct 2011 14:13:09 +0000 (16:13 +0200)
committerHenning Rogge <hrogge@googlemail.com>
Sat, 15 Oct 2011 14:13:09 +0000 (16:13 +0200)
12 files changed:
src/core/olsr_clock.c
src/core/olsr_http.c
src/core/olsr_logging.c
src/core/olsr_logging_cfg.c
src/core/os_net.h
src/core/os_system.h
src/core/os_system_generic.c [new file with mode: 0644]
src/core/os_time.h
src/olsr.c
src/os_bsd/os_system_bsd.h [new file with mode: 0644]
src/os_linux/os_net_linux.h
src/os_linux/os_system_linux.h [new file with mode: 0644]

index 41fc85c..3f96fe6 100644 (file)
@@ -45,7 +45,7 @@
 #include <stdio.h>
 #include <time.h>
 
-#include "os_time.h"
+#include "os_system.h"
 #include "olsr_logging.h"
 #include "olsr_clock.h"
 #include "olsr.h"
@@ -70,7 +70,7 @@ olsr_clock_init(void) {
     return 0;
 
   /* Grab initial timestamp */
-  if (os_gettimeofday(&first_tv, NULL)) {
+  if (os_system_gettimeofday(&first_tv)) {
     OLSR_WARN(LOG_TIMER, "OS clock is not working: %s (%d)\n", strerror(errno), errno);
     return -1;
   }
@@ -101,7 +101,7 @@ olsr_clock_update(void)
   struct timeval tv;
   uint32_t t;
 
-  if (os_gettimeofday(&tv, NULL) != 0) {
+  if (os_system_gettimeofday(&tv) != 0) {
     OLSR_WARN(LOG_TIMER, "OS clock is not working: %s (%d)\n", strerror(errno), errno);
     return -1;
   }
@@ -241,13 +241,12 @@ const char *
 olsr_clock_getWallclockString(struct timeval_buf *buf)
 {
   struct timeval now;
-  int sec, usec;
-
-  os_gettimeofday(&now, NULL);
-
-  sec = (int)now.tv_sec + olsr_get_timezone();
-  usec = (int)now.tv_usec;
+  int sec = 0, usec = 0;
 
+  if (os_system_gettimeofday(&now) == 0) {
+    sec = (int)now.tv_sec + olsr_get_timezone();
+    usec = (int)now.tv_usec;
+  }
   snprintf(buf->buf, sizeof(buf), "%02d:%02d:%02d.%06d",
       (sec % 86400) / 3600, (sec % 3600) / 60, sec % 60, usec);
 
@@ -292,7 +291,7 @@ olsr_get_timezone(void)
     struct tm gmt;
     struct tm *loc;
 
-    if (os_gettimeofday(&tv, 0)) {
+    if (os_system_gettimeofday(&tv)) {
       OLSR_WARN(LOG_TIMER, "Cannot read internal clock: %s (%d)",
           strerror(errno), errno);
       return 0;
index c433c11..a1284eb 100644 (file)
@@ -17,7 +17,7 @@
 #include "olsr_logging.h"
 #include "olsr_netaddr_acl.h"
 #include "olsr_stream_socket.h"
-#include "os_time.h"
+#include "os_system.h"
 #include "olsr.h"
 #include "olsr_setup.h"
 #include "olsr_http.h"
@@ -487,7 +487,7 @@ _create_http_header(struct olsr_stream_session *session,
   abuf_appendf(&buf, "%s %d %s\r\n", HTTP_VERSION_1_0, code, _get_headertype_string(code));
 
   /* Date */
-  os_gettimeofday(&currtime, NULL);
+  os_system_gettimeofday(&currtime);
   abuf_strftime(&buf, "Date: %a, %d %b %Y %H:%M:%S GMT\r\n", localtime(&currtime.tv_sec));
 
   /* Server version */
index 5b4f761..2390d28 100644 (file)
@@ -232,17 +232,20 @@ olsr_log(enum log_severity severity, enum log_source source, bool no_header,
     struct timeval timeval;
 
     /* calculate local time */
-    os_gettimeofday(&timeval, NULL);
-
-    /* there is no localtime_r in win32 */
-    tm_ptr = localtime((time_t *) & timeval.tv_sec);
+    if (os_system_gettimeofday(&timeval)) {
+      p1 = abuf_appendf(&logbuffer, "gettimeofday-error ");
+    }
+    else {
+      /* there is no localtime_r in win32 */
+      tm_ptr = localtime((time_t *) & timeval.tv_sec);
 
-    p1 = abuf_appendf(&logbuffer, "%d:%02d:%02d.%03ld ",
-                  tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec,
-                  (long)(timeval.tv_usec / 1000));
+      p1 = abuf_appendf(&logbuffer, "%d:%02d:%02d.%03ld ",
+          tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec,
+          (long)(timeval.tv_usec / 1000));
+    }
 
     p2 = abuf_appendf(&logbuffer, "%s(%s) %s %d: ",
-        LOG_SEVERITY_NAMES[severity], LOG_SOURCE_NAMES[source], file, line);
+          LOG_SEVERITY_NAMES[severity], LOG_SOURCE_NAMES[source], file, line);
   }
   p3 = abuf_vappendf(&logbuffer, format, ap);
 
@@ -259,7 +262,7 @@ olsr_log(enum log_severity severity, enum log_source source, bool no_header,
   param.line = line;
   param.buffer = logbuffer.buf;
   param.timeLength = p1;
-  param.prefixLength = p2-p1;
+  param.prefixLength = p2;
 
   /* use stderr logger if nothing has been configured */
   if (list_is_empty(&log_handler_list)) {
@@ -381,5 +384,5 @@ void
 olsr_log_syslog(struct log_handler_entry *entry __attribute__ ((unused)),
     struct log_parameters *param)
 {
-  os_printline(severity, param->buffer + param->timeLength);
+  os_system_log(param->severity, param->buffer + param->timeLength);
 }
index 3f7b411..fa8ec02 100644 (file)
@@ -54,6 +54,7 @@
 #include "olsr_logging_cfg.h"
 #include "olsr_cfg.h"
 #include "olsr.h"
+#include "os_system.h"
 
 #define LOG_SECTION     "log"
 #define LOG_LEVEL_ENTRY "level"
@@ -321,6 +322,6 @@ _apply_log_setting(struct cfg_named_section *named,
 static void
 _cb_logcfg_apply(void) {
   if (olsr_logcfg_apply(olsr_cfg_get_db())) {
-    // TODO: open logging file failed, decide what to do
+    os_system_log(SEVERITY_WARN, "Could not open logging file");
   }
 }
index 5f0739a..82f9773 100644 (file)
@@ -94,7 +94,7 @@ enum olsr_socket_opt {
   OS_SOCKET_MULTICAST = 4,
 };
 
-/* prototypes for all os_net interfaces */
+/* prototypes for all os_net functions */
 EXPORT int os_net_getsocket(union netaddr_socket *bindto,
     enum olsr_socket_opt flags, int recvbuf, enum log_source log_src);
 EXPORT int os_net_configsocket(int sock, union netaddr_socket *bindto,
@@ -111,7 +111,7 @@ static INLINE int os_select(
     int num, fd_set *r,fd_set *w,fd_set *e, struct timeval *timeout);
 
 /*
- * INLINE implementations for generic os_net  interface
+ * INLINE implementations for generic os_net functions
  */
 
 #if OS_NET_CLOSE == OS_GENERIC
index c55bebb..5d665b2 100644 (file)
 #define OS_SYSTEM_H_
 
 #include <stdio.h>
+#include <sys/time.h>
+
+#include "common/common_types.h"
+#include "olsr_logging.h"
+
+#define MSEC_PER_SEC 1000
+#define USEC_PER_MSEC 1000
+
+/*
+ * Set one of the following defines in the os specific os_net includes
+ * to OS_SPECIFIC to define that the os code is implementing the function
+ * itself and does not use the generic function
+ * Set it to OS_GENERIC to define that the code use the default implementation.
+ *
+ * Example from os_system_linux.h:
+ *
+ * #define OS_SYSTEM_GETTIMEOFDAY OS_GENERIC
+ * #define OS_SYSTEM_LOG          OS_GENERIC
+ */
+
+/* set the guard macro so we can include the os specific settings */
+#define OS_NET_SPECIFIC_INCLUDE
+#include "os_helper.h"
+
+#ifdef OS_LINUX
+#include "os_linux/os_system_linux.h"
+#endif
+
+#ifdef OS_BSD
+#include "os_bsd/os_system_bsd.h"
+#endif
+
+#ifdef OS_WIN32
+#include "os_win32/os_system_win32.h"
+#endif
+
+#undef OS_NET_SPECIFIC_INCLUDE
+
+/* prototypes for all os_system functions */
+EXPORT void os_system_openlog(void);
+EXPORT void os_system_closelog(void);
+EXPORT void os_system_log(enum log_severity, const char *);
+static INLINE int os_system_gettimeofday(struct timeval *);
+
+/*
+ * INLINE implementations for generic os_net functions
+ */
+
+#if OS_NET_CLOSE == OS_GENERIC
+/**
+ * Close a file descriptor
+ * @param fd filedescriptor
+ */
+static INLINE int
+os_system_gettimeofday(struct timeval *tv) {
+  return gettimeofday(tv, NULL);
+}
+#endif
 
-// TODO: include in os_specific interface or just remove it
-#define os_printline(level,line) fputs(line, stderr)
 
 #endif /* OS_SYSTEM_H_ */
diff --git a/src/core/os_system_generic.c b/src/core/os_system_generic.c
new file mode 100644 (file)
index 0000000..dd09716
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * os_system_generic.c
+ *
+ *  Created on: Oct 15, 2011
+ *      Author: henning
+ */
+
+#include <syslog.h>
+
+#include "builddata/data.h"
+#include "os_system.h"
+#include "olsr_setup.h"
+#include "olsr.h"
+
+#if OS_SYSTEM_LOG == OS_GENERIC
+OLSR_SUBSYSTEM_STATE(_os_log_state);
+#endif
+
+
+#if OS_SYSTEM_LOG == OS_GENERIC
+/**
+ * Initialize syslog system
+ */
+void
+os_system_openlog(void) {
+  if (olsr_subsystem_init(&_os_log_state)) {
+    return;
+  }
+
+  openlog(OLSR_SETUP_PROGRAM, LOG_PID | LOG_ODELAY, LOG_DAEMON);
+  setlogmask(LOG_UPTO(LOG_DEBUG));
+
+  return;
+}
+
+/**
+ * Cleanup syslog system
+ */
+void
+os_system_closelog(void) {
+  if (olsr_subsystem_cleanup(&_os_log_state)) {
+    return;
+  }
+
+  closelog();
+}
+
+/**
+ * Print a line to the syslog
+ * @param severity severity of entry
+ * @param msg line to print
+ */
+void
+os_system_log(enum log_severity severity, const char *msg) {
+  int log_sev;
+
+  switch (severity) {
+    case SEVERITY_DEBUG:
+      log_sev = LOG_DEBUG;
+      break;
+    case SEVERITY_INFO:
+      log_sev = LOG_DEBUG;
+      break;
+    default:
+    case SEVERITY_WARN:
+      log_sev = LOG_WARNING;
+      break;
+  }
+
+  syslog(log_sev, "%s", msg);
+}
+#endif
index f0c5747..ac8a606 100644 (file)
 #ifndef OS_TIME_H_
 #define OS_TIME_H_
 
-#include <sys/time.h>
-
-#define MSEC_PER_SEC 1000
-#define USEC_PER_MSEC 1000
-
-// TODO: include in os_specific interface
-#define os_gettimeofday(t1,t2)    gettimeofday(t1,t2)
 
 #endif /* OS_TIME_H_ */
index 5896a84..25538ee 100644 (file)
@@ -57,6 +57,7 @@
 #include "builddata/plugin_static.h"
 #include "builddata/version.h"
 #include "builddata/data.h"
+#include "os_system.h"
 #include "olsr_cfg.h"
 #include "olsr_clock.h"
 #include "olsr_http.h"
@@ -220,6 +221,7 @@ main(int argc, char **argv) {
   }
 
   /* initialize basic framework */
+  os_system_openlog();
   olsr_memcookie_init();
   if (olsr_clock_init()) {
     goto olsrd_cleanup;
@@ -288,6 +290,7 @@ olsrd_cleanup:
   olsr_socket_cleanup();
   olsr_timer_cleanup();
   olsr_memcookie_cleanup();
+  os_system_closelog();
   olsr_logcfg_cleanup();
 
   /* free configuration resources */
diff --git a/src/os_bsd/os_system_bsd.h b/src/os_bsd/os_system_bsd.h
new file mode 100644 (file)
index 0000000..88d673a
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * os_system_bsd.h
+ *
+ *  Created on: Oct 15, 2011
+ *      Author: henning
+ */
+
+#ifndef OS_SYSTEM_BSD_H_
+#define OS_SYSTEM_BSD_H_
+
+#ifndef OS_NET_SPECIFIC_INCLUDE
+#error "DO not include this file directly, always use 'os_system.h'"
+#endif
+
+/* BSD os_system runs on "all default" */
+#define OS_SYSTEM_GETTIMEOFDAY OS_GENERIC
+#define OS_SYSTEM_LOG          OS_GENERIC
+
+#endif /* OS_SYSTEM_BSD_H_ */
index 1486b2a..80af7e3 100644 (file)
@@ -42,7 +42,6 @@
 #ifndef OS_NET_LINUX_H_
 #define OS_NET_LINUX_H_
 
-
 #ifndef OS_NET_SPECIFIC_INCLUDE
 #error "DO not include this file directly, always use 'os_net.h'"
 #endif
diff --git a/src/os_linux/os_system_linux.h b/src/os_linux/os_system_linux.h
new file mode 100644 (file)
index 0000000..b827170
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * os_system_linux.h
+ *
+ *  Created on: Oct 15, 2011
+ *      Author: henning
+ */
+
+#ifndef OS_SYSTEM_LINUX_H_
+#define OS_SYSTEM_LINUX_H_
+
+#ifndef OS_NET_SPECIFIC_INCLUDE
+#error "DO not include this file directly, always use 'os_system.h'"
+#endif
+
+/* Linux os_system runs on "all default" */
+#define OS_SYSTEM_GETTIMEOFDAY OS_GENERIC
+#define OS_SYSTEM_LOG          OS_GENERIC
+
+#endif /* OS_SYSTEM_LINUX_H_ */