Am 02.12.2010 18:40, schrieb Alejandro Guerrieri:
> Ok. I'll write the userguide documentation and commit afterwards.

thanks Alejandro.

I have made some source code intend cleanup, and removed some unnecessary
Octstr* that have been used. So it's a bit more "compact" now. In addition added
the "without [<pid>]" logging for the syslog target, so we don't duplicates of
PID values in the syslog line.

Can you please use the attached patch as "base" for the commit? ;)

Stipe

-- 
-------------------------------------------------------------------
Kölner Landstrasse 419
40589 Düsseldorf, NRW, Germany

tolj.org system architecture      Kannel Software Foundation (KSF)
http://www.tolj.org/              http://www.kannel.org/

mailto:st_{at}_tolj.org           mailto:stolj_{at}_kannel.org
-------------------------------------------------------------------
Index: gwlib/cfg.def
===================================================================
--- gwlib/cfg.def       (revision 4871)
+++ gwlib/cfg.def       (working copy)
@@ -94,6 +94,8 @@
     OCTSTR(wdp-interface-name)
     OCTSTR(log-file)
     OCTSTR(log-level)
+    OCTSTR(syslog-level)
+    OCTSTR(syslog-facility)
     OCTSTR(access-log)
     OCTSTR(access-log-time)
     OCTSTR(access-log-format)
@@ -152,6 +154,7 @@
     OCTSTR(log-file)
     OCTSTR(log-level)
     OCTSTR(syslog-level)
+    OCTSTR(syslog-facility)
     OCTSTR(smart-errors)
     OCTSTR(access-log)
     OCTSTR(access-log-time)
@@ -263,6 +266,8 @@
     OCTSTR(global-sender)
     OCTSTR(log-file)
     OCTSTR(log-level)
+    OCTSTR(syslog-level)
+    OCTSTR(syslog-facility)
     OCTSTR(access-log)
     OCTSTR(access-log-time)
     OCTSTR(access-log-clean)
Index: gwlib/log.c
===================================================================
--- gwlib/log.c (revision 4871)
+++ gwlib/log.c (working copy)
@@ -66,12 +66,14 @@
 #include <time.h>
 #include <stdarg.h>
 #include <string.h>
+#include <ctype.h>
 
 #ifdef HAVE_EXECINFO_H
 #include <execinfo.h>
 #endif
 
 #if HAVE_SYSLOG_H
+#define        SYSLOG_NAMES
 #include <syslog.h>
 #else
 
@@ -144,9 +146,27 @@
  * Syslog support.
  */
 static int sysloglevel;
+static int syslogfacility = LOG_DAEMON;
 static int dosyslog = 0;
 
+/*
+ * Decode the syslog name to its int value
+ */
+static int decode(char *name, CODE *facilities)
+{
+       register CODE *c;
 
+       if (isdigit(*name)) {
+           return (atoi(name));
+       }
+       for (c = facilities; c->c_name; c++) {
+           if (!strcasecmp(name, c->c_name)) {
+               return (c->c_val);
+           }
+       }
+       return LOG_DAEMON;
+}
+
 /*
  * Make sure stderr is included in the list.
  */
@@ -192,10 +212,10 @@
     int i;
 
     for (i = 0; i < num_logfiles; ++i) {
-       if (logfiles[i].file == stderr) {
-           logfiles[i].minimum_output_level = level;
-           break;
-       }
+        if (logfiles[i].file == stderr) {
+            logfiles[i].minimum_output_level = level;
+            break;
+        }
     }
 }
 
@@ -212,16 +232,21 @@
     }
 }
 
+void log_set_syslog_facility(char *facility)
+{
+    if (facility != NULL)
+        syslogfacility = decode(facility, facilitynames);
+}
 
 void log_set_syslog(const char *ident, int syslog_level)
 {
     if (ident == NULL)
-       dosyslog = 0;
+        dosyslog = 0;
     else {
-       dosyslog = 1;
-       sysloglevel = syslog_level;
-       openlog(ident, LOG_PID, LOG_DAEMON);
-       debug("gwlib.log", 0, "Syslog logging enabled.");
+        dosyslog = 1;
+        sysloglevel = syslog_level;
+        openlog(ident, LOG_PID, syslogfacility);
+        debug("gwlib.log", 0, "Syslog logging enabled.");
     }
 }
 
@@ -360,15 +385,15 @@
 
 #define FORMAT_SIZE (1024)
 static void format(char *buf, int level, const char *place, int e,
-                  const char *fmt, int with_timestamp)
+                  const char *fmt, int with_timestamp_and_pid)
 {
     static char *tab[] = {
-       "DEBUG: ",
-       "INFO: ",
-       "WARNING: ",
-       "ERROR: ",
-       "PANIC: ",
-       "LOG: "
+        "DEBUG: ",
+        "INFO: ",
+        "WARNING: ",
+        "ERROR: ",
+        "PANIC: ",
+        "LOG: "
     };
     static int tab_size = sizeof(tab) / sizeof(tab[0]);
     time_t t;
@@ -378,7 +403,7 @@
     
     p = prefix;
 
-    if (with_timestamp) {
+    if (with_timestamp_and_pid) {
         time(&t);
 #if LOG_TIMESTAMP_LOCALTIME
         tm = gw_localtime(t);
@@ -388,33 +413,38 @@
         sprintf(p, "%04d-%02d-%02d %02d:%02d:%02d ",
         tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
         tm.tm_hour, tm.tm_min, tm.tm_sec);
-    
+
         p = strchr(p, '\0');
+
+        /* print PID and thread ID */
+        gwthread_self_ids(&tid, &pid);
+        sprintf(p, "[%ld] [%ld] ", pid, tid);
+    } else {
+        /* thread ID only */
+        tid = gwthread_self();
+        sprintf(p, "[%ld] ", tid);
     }
 
-    gwthread_self_ids(&tid, &pid);
-    sprintf(p, "[%ld] [%ld] ", pid, tid);
-    
     p = strchr(p, '\0');
     if (level < 0 || level >= tab_size)
-       sprintf(p, "UNKNOWN: ");
+        sprintf(p, "UNKNOWN: ");
     else
-       sprintf(p, "%s", tab[level]);
+        sprintf(p, "%s", tab[level]);
 
     p = strchr(p, '\0');
     if (place != NULL && *place != '\0')
-       sprintf(p, "%s: ", place);
+        sprintf(p, "%s: ", place);
     
     if (strlen(prefix) + strlen(fmt) > FORMAT_SIZE / 2) {
-       sprintf(buf, "%s <OUTPUT message too long>\n", prefix);
-       return;
+        sprintf(buf, "%s <OUTPUT message too long>\n", prefix);
+        return;
     }
     
     if (e == 0)
-       sprintf(buf, "%s%s\n", prefix, fmt);
+        sprintf(buf, "%s%s\n", prefix, fmt);
     else
-       sprintf(buf, "%s%s\n%sSystem error %d: %s\n",
-               prefix, fmt, prefix, e, strerror(e));
+        sprintf(buf, "%s%s\n%sSystem error %d: %s\n",
+                prefix, fmt, prefix, e, strerror(e));
 }
 
 
@@ -431,35 +461,35 @@
     int translog;
     
     if (level >= sysloglevel && dosyslog) {
-       if (args == NULL) {
-           strncpy(buf, format, sizeof(buf));
-           buf[sizeof(buf) - 1] = '\0';
-       } else {
-           vsnprintf(buf, sizeof(buf), format, args);
-           /* XXX vsnprint not 100% portable */
-       }
+        if (args == NULL) {
+            strncpy(buf, format, sizeof(buf));
+            buf[sizeof(buf) - 1] = '\0';
+        } else {
+            vsnprintf(buf, sizeof(buf), format, args);
+            /* XXX vsnprint not 100% portable */
+        }
 
-       switch(level) {
-       case GW_DEBUG:
-           translog = LOG_DEBUG;
-           break;
-       case GW_INFO:
-           translog = LOG_INFO;
-           break;
-       case GW_WARNING:
-           translog = LOG_WARNING;
-           break;
-       case GW_ERROR:
-           translog = LOG_ERR;
-           break;
-       case GW_PANIC:
-           translog = LOG_ALERT;
-           break;
-       default:
-           translog = LOG_INFO;
-           break;
-       }
-       syslog(translog, "%s", buf);
+        switch(level) {
+            case GW_DEBUG:
+                translog = LOG_DEBUG;
+                break;
+            case GW_INFO:
+                translog = LOG_INFO;
+                break;
+            case GW_WARNING:
+                translog = LOG_WARNING;
+                break;
+            case GW_ERROR:
+                translog = LOG_ERR;
+                break;
+            case GW_PANIC:
+                translog = LOG_ALERT;
+                break;
+            default:
+                translog = LOG_INFO;
+                break;
+        }
+        syslog(translog, "%s", buf);
     }
 }
 
@@ -608,7 +638,8 @@
     
     len = strlen(pat);
     if (pat[len-1] == '*')
-       return (strncasecmp(place, pat, len - 1) == 0);
+        return (strncasecmp(place, pat, len - 1) == 0);
+
     return (strcasecmp(place, pat) == 0);
 }
 
@@ -620,9 +651,9 @@
     if (num_places == 0)
        return 1;
     for (i = 0; i < num_places; ++i) {
-       if (*loggable_places[i] != '-' && 
-           place_matches(place, loggable_places[i]))
-               return 1;
+        if (*loggable_places[i] != '-' && 
+            place_matches(place, loggable_places[i]))
+            return 1;
     }
     return 0;
 }
@@ -635,9 +666,9 @@
     if (num_places == 0)
        return 0;
     for (i = 0; i < num_places; ++i) {
-       if (*loggable_places[i] == '-' &&
-           place_matches(place, loggable_places[i]+1))
-               return 1;
+        if (*loggable_places[i] == '-' &&
+            place_matches(place, loggable_places[i]+1))
+            return 1;
     }
     return 0;
 }
@@ -670,8 +701,8 @@
     p = strtok(gw_strdup(places), " ,");
     num_places = 0;
     while (p != NULL && num_places < MAX_LOGGABLE_PLACES) {
-       loggable_places[num_places++] = p;
-       p = strtok(NULL, " ,");
+        loggable_places[num_places++] = p;
+        p = strtok(NULL, " ,");
     }
 }
 
@@ -685,4 +716,3 @@
              thread_id, logfiles[idx].filename, 
logfiles[idx].minimum_output_level);
     thread_to[thread_id] = idx;
 }
-
Index: gwlib/log.h
===================================================================
--- gwlib/log.h (revision 4871)
+++ gwlib/log.h (working copy)
@@ -138,6 +138,11 @@
 void log_set_log_level(enum output_level level);
 
 /*
+ * Set the syslog facility to use.
+ */
+void log_set_syslog_facility(char *facility);
+
+/*
  * Set syslog usage. If `ident' is NULL, syslog is not used.
  */
 void log_set_syslog(const char *ident, int syslog_level);
Index: gw/bearerbox.c
===================================================================
--- gw/bearerbox.c      (revision 4871)
+++ gw/bearerbox.c      (working copy)
@@ -390,6 +390,22 @@
         log_open(octstr_get_cstr(log), loglevel, GW_NON_EXCL);
         octstr_destroy(log);
     }
+    if ((val = cfg_get(grp, octstr_imm("syslog-level"))) != NULL) {
+        long level;
+        Octstr *facility;
+        if ((facility = cfg_get(grp, octstr_imm("syslog-facility"))) != NULL) {
+            log_set_syslog_facility(octstr_get_cstr(facility));
+            octstr_destroy(facility);
+        }
+        if (octstr_compare(val, octstr_imm("none")) == 0) {
+            log_set_syslog(NULL, 0);
+        } else if (octstr_parse_long(&level, val, 0, 10) > 0) {
+            log_set_syslog("bearerbox", level);
+        }
+        octstr_destroy(val);
+    } else {
+        log_set_syslog(NULL, 0);
+    }
 
     if (check_config(cfg) == -1)
         panic(0, "Cannot start with corrupted configuration");
Index: gw/smsbox.c
===================================================================
--- gw/smsbox.c (revision 4871)
+++ gw/smsbox.c (working copy)
@@ -3403,6 +3403,22 @@
        log_open(octstr_get_cstr(logfile), lvl, GW_NON_EXCL);
        octstr_destroy(logfile);
     }
+    if ((p = cfg_get(grp, octstr_imm("syslog-level"))) != NULL) {
+        long level;
+        Octstr *facility;
+        if ((facility = cfg_get(grp, octstr_imm("syslog-facility"))) != NULL) {
+            log_set_syslog_facility(octstr_get_cstr(facility));
+            octstr_destroy(facility);
+        }
+        if (octstr_compare(p, octstr_imm("none")) == 0) {
+            log_set_syslog(NULL, 0);
+        } else if (octstr_parse_long(&level, p, 0, 10) > 0) {
+            log_set_syslog("smsbox", level);
+        }
+        octstr_destroy(p);
+    } else {
+        log_set_syslog(NULL, 0);
+    }
     if (global_sender != NULL) {
        info(0, "Service global sender set as '%s'", 
             octstr_get_cstr(global_sender));
Index: gw/wapbox.c
===================================================================
--- gw/wapbox.c (revision 4871)
+++ gw/wapbox.c (working copy)
@@ -172,11 +172,15 @@
 
     if ((s = cfg_get(grp, octstr_imm("syslog-level"))) != NULL) {
         long level;
-       
+        Octstr *facility;
+        if ((facility = cfg_get(grp, octstr_imm("syslog-facility"))) != NULL) {
+            log_set_syslog_facility(octstr_get_cstr(facility));
+            octstr_destroy(facility);
+        }
         if (octstr_compare(s, octstr_imm("none")) == 0) {
             log_set_syslog(NULL, 0);
             debug("wap", 0, "syslog parameter is none");
-        } else if (octstr_parse_long(&level, s, 0, 0) == -1) {
+        } else if (octstr_parse_long(&level, s, 0, 10) > 0) {
             log_set_syslog("wapbox", level);
             debug("wap", 0, "syslog parameter is %ld", level);
         }

Reply via email to