Move syslog utility functions into a separate file so they can be re-used.
authorSean Bright <sean@malleable.com>
Thu, 25 Jun 2009 23:54:03 +0000 (23:54 +0000)
committerSean Bright <sean@malleable.com>
Thu, 25 Jun 2009 23:54:03 +0000 (23:54 +0000)
This has the pleasant side effect of cleaning up the header inclusion process
in logger.c.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@203508 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/syslog.h [new file with mode: 0644]
main/logger.c
main/syslog.c [new file with mode: 0644]

diff --git a/include/asterisk/syslog.h b/include/asterisk/syslog.h
new file mode 100644 (file)
index 0000000..ca8ea8f
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2009, malleable, LLC.
+ *
+ * Sean Bright <sean@malleable.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file syslog.h
+ * \brief Syslog support functions for Asterisk logging.
+ */
+
+#ifndef _ASTERISK_SYSLOG_H
+#define _ASTERISK_SYSLOG_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
+/*!
+ * \since 1.6.3
+ * \brief Maps a syslog facility name from a string to a syslog facility
+ *        constant.
+ *
+ * \param facility Facility name to map (i.e. "daemon")
+ *
+ * \retval syslog facility constant (i.e. LOG_DAEMON) if found
+ * \retval -1 if facility is not found
+ */
+int ast_syslog_facility(const char *facility);
+
+/*!
+ * \since 1.6.3
+ * \brief Maps a syslog priority name from a string to a syslog priority
+ *        constant.
+ *
+ * \param priority Priority name to map (i.e. "notice")
+ *
+ * \retval syslog priority constant (i.e. LOG_NOTICE) if found
+ * \retval -1 if priority is not found
+ */
+int ast_syslog_priority(const char *priority);
+
+/*!
+ * \since 1.6.3
+ * \brief Maps an Asterisk log level (i.e. LOG_ERROR) to a syslog priority
+ *        constant.
+ *
+ * \param level Asterisk log level constant (i.e. LOG_ERROR)
+ *
+ * \retval syslog priority constant (i.e. LOG_ERR) if found
+ * \retval -1 if priority is not found
+ */
+int ast_syslog_priority_from_loglevel(int level);
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* _ASTERISK_SYSLOG_H */
index 23d5ce1..3400905 100644 (file)
 /*! \file
  *
  * \brief Asterisk Logger
- * 
+ *
  * Logging routines
  *
  * \author Mark Spencer <markster@digium.com>
  */
 
-/*
- * define _ASTERISK_LOGGER_H to prevent the inclusion of logger.h;
- * it redefines LOG_* which we need to define syslog_level_map.
- * later, we force the inclusion of logger.h again.
- */
-#define _ASTERISK_LOGGER_H
 #include "asterisk.h"
 
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 
-/*
- * WARNING: additional #include directives should NOT be placed here, they 
- * should be placed AFTER '#undef _ASTERISK_LOGGER_H' below
- */
-#include "asterisk/_private.h"
-#include "asterisk/paths.h"    /* use ast_config_AST_LOG_DIR */
-#include <signal.h>
-#include <time.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#ifdef HAVE_BKTR
-#include <execinfo.h>
-#define MAX_BACKTRACE_FRAMES 20
-#endif
-
-#define SYSLOG_NAMES /* so we can map syslog facilities names to their numeric values,
-                       from <syslog.h> which is included by logger.h */
+/* When we include logger.h again it will trample on some stuff in syslog.h, but
+ * nothing we care about in here. */
 #include <syslog.h>
 
-static const int syslog_level_map[] = {
-       LOG_DEBUG,
-       LOG_INFO,    /* arbitrary equivalent of LOG_EVENT */
-       LOG_NOTICE,
-       LOG_WARNING,
-       LOG_ERR,
-       LOG_DEBUG,
-       LOG_DEBUG
-};
-
-#define SYSLOG_NLEVELS sizeof(syslog_level_map) / sizeof(int)
-
-#undef _ASTERISK_LOGGER_H      /* now include logger.h */
+#include "asterisk/_private.h"
+#include "asterisk/paths.h"    /* use ast_config_AST_LOG_DIR */
 #include "asterisk/logger.h"
 #include "asterisk/lock.h"
 #include "asterisk/channel.h"
@@ -79,6 +47,16 @@ static const int syslog_level_map[] = {
 #include "asterisk/strings.h"
 #include "asterisk/pbx.h"
 #include "asterisk/app.h"
+#include "asterisk/syslog.h"
+
+#include <signal.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#ifdef HAVE_BKTR
+#include <execinfo.h>
+#define MAX_BACKTRACE_FRAMES 20
+#endif
 
 #if defined(__linux__) && !defined(__NR_gettid)
 #include <asm/unistd.h>
@@ -256,9 +234,6 @@ static struct logchannel *make_logchannel(const char *channel, const char *compo
 {
        struct logchannel *chan;
        char *facility;
-#ifndef SOLARIS
-       CODE *cptr;
-#endif
 
        if (ast_strlen_zero(channel) || !(chan = ast_calloc(1, sizeof(*chan) + strlen(components) + 1)))
                return NULL;
@@ -278,61 +253,9 @@ static struct logchannel *make_logchannel(const char *channel, const char *compo
                        facility = "local0";
                }
 
-#ifndef SOLARIS
-               /*
-               * Walk through the list of facilitynames (defined in sys/syslog.h)
-               * to see if we can find the one we have been given
-               */
-               chan->facility = -1;
-               cptr = facilitynames;
-               while (cptr->c_name) {
-                       if (!strcasecmp(facility, cptr->c_name)) {
-                               chan->facility = cptr->c_val;
-                               break;
-                       }
-                       cptr++;
-               }
-#else
-               chan->facility = -1;
-               if (!strcasecmp(facility, "kern")) 
-                       chan->facility = LOG_KERN;
-               else if (!strcasecmp(facility, "USER")) 
-                       chan->facility = LOG_USER;
-               else if (!strcasecmp(facility, "MAIL")) 
-                       chan->facility = LOG_MAIL;
-               else if (!strcasecmp(facility, "DAEMON")) 
-                       chan->facility = LOG_DAEMON;
-               else if (!strcasecmp(facility, "AUTH")) 
-                       chan->facility = LOG_AUTH;
-               else if (!strcasecmp(facility, "SYSLOG")) 
-                       chan->facility = LOG_SYSLOG;
-               else if (!strcasecmp(facility, "LPR")) 
-                       chan->facility = LOG_LPR;
-               else if (!strcasecmp(facility, "NEWS")) 
-                       chan->facility = LOG_NEWS;
-               else if (!strcasecmp(facility, "UUCP")) 
-                       chan->facility = LOG_UUCP;
-               else if (!strcasecmp(facility, "CRON")) 
-                       chan->facility = LOG_CRON;
-               else if (!strcasecmp(facility, "LOCAL0")) 
-                       chan->facility = LOG_LOCAL0;
-               else if (!strcasecmp(facility, "LOCAL1")) 
-                       chan->facility = LOG_LOCAL1;
-               else if (!strcasecmp(facility, "LOCAL2")) 
-                       chan->facility = LOG_LOCAL2;
-               else if (!strcasecmp(facility, "LOCAL3")) 
-                       chan->facility = LOG_LOCAL3;
-               else if (!strcasecmp(facility, "LOCAL4")) 
-                       chan->facility = LOG_LOCAL4;
-               else if (!strcasecmp(facility, "LOCAL5")) 
-                       chan->facility = LOG_LOCAL5;
-               else if (!strcasecmp(facility, "LOCAL6")) 
-                       chan->facility = LOG_LOCAL6;
-               else if (!strcasecmp(facility, "LOCAL7")) 
-                       chan->facility = LOG_LOCAL7;
-#endif /* Solaris */
-
-               if (0 > chan->facility) {
+               chan->facility = ast_syslog_facility(facility);
+
+               if (chan->facility < 0) {
                        fprintf(stderr, "Logger Warning: bad syslog facility in logger.conf\n");
                        ast_free(chan);
                        return NULL;
@@ -843,8 +766,9 @@ static int handle_SIGXFSZ(int sig)
 static void ast_log_vsyslog(struct logmsg *msg)
 {
        char buf[BUFSIZ];
+       int syslog_level = ast_syslog_priority_from_loglevel(msg->level);
 
-       if (msg->level >= SYSLOG_NLEVELS) {
+       if (syslog_level < 0) {
                /* we are locked here, so cannot ast_log() */
                fprintf(stderr, "ast_log_vsyslog called with bogus level: %d\n", msg->level);
                return;
@@ -862,7 +786,7 @@ static void ast_log_vsyslog(struct logmsg *msg)
        }
 
        term_strip(buf, buf, strlen(buf) + 1);
-       syslog(syslog_level_map[msg->level], "%s", buf);
+       syslog(syslog_level, "%s", buf);
 }
 
 /*! \brief Print a normal log message to the channels */
diff --git a/main/syslog.c b/main/syslog.c
new file mode 100644 (file)
index 0000000..466e21c
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2009, malleable, LLC.
+ *
+ * Sean Bright <sean@malleable.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*! \file
+ *
+ * \brief Asterisk Syslog Utility Functions
+ * \author Sean Bright <sean@malleable.com>
+ */
+
+#include "asterisk.h"
+#include "asterisk/utils.h"
+#include "asterisk/syslog.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include <syslog.h>
+
+int ast_syslog_facility(const char *facility)
+{
+    if (!strcasecmp(facility, "KERN")) {
+               return LOG_KERN;
+    } else if (!strcasecmp(facility, "USER")) {
+               return LOG_USER;
+    } else if (!strcasecmp(facility, "MAIL")) {
+               return LOG_MAIL;
+    } else if (!strcasecmp(facility, "DAEMON")) {
+               return LOG_DAEMON;
+    } else if (!strcasecmp(facility, "AUTH")) {
+               return LOG_AUTH;
+       } else if (!strcasecmp(facility, "AUTHPRIV")) {
+               return LOG_AUTHPRIV;
+    } else if (!strcasecmp(facility, "SYSLOG")) {
+               return LOG_SYSLOG;
+       } else if (!strcasecmp(facility, "SECURITY")) {
+               return LOG_AUTH;
+       } else if (!strcasecmp(facility, "FTP")) {
+               return LOG_FTP;
+    } else if (!strcasecmp(facility, "LPR")) {
+               return LOG_LPR;
+    } else if (!strcasecmp(facility, "NEWS")) {
+               return LOG_NEWS;
+    } else if (!strcasecmp(facility, "UUCP")) {
+               return LOG_UUCP;
+    } else if (!strcasecmp(facility, "CRON")) {
+               return LOG_CRON;
+    } else if (!strcasecmp(facility, "LOCAL0")) {
+               return LOG_LOCAL0;
+    } else if (!strcasecmp(facility, "LOCAL1")) {
+               return LOG_LOCAL1;
+    } else if (!strcasecmp(facility, "LOCAL2")) {
+               return LOG_LOCAL2;
+    } else if (!strcasecmp(facility, "LOCAL3")) {
+               return LOG_LOCAL3;
+    } else if (!strcasecmp(facility, "LOCAL4")) {
+               return LOG_LOCAL4;
+    } else if (!strcasecmp(facility, "LOCAL5")) {
+               return LOG_LOCAL5;
+    } else if (!strcasecmp(facility, "LOCAL6")) {
+               return LOG_LOCAL6;
+    } else if (!strcasecmp(facility, "LOCAL7")) {
+               return LOG_LOCAL7;
+    }
+
+    return -1;
+}
+
+int ast_syslog_priority(const char *priority)
+{
+    if (!strcasecmp(priority, "ALERT")) {
+               return LOG_ALERT;
+    } else if (!strcasecmp(priority, "CRIT")) {
+               return LOG_CRIT;
+    } else if (!strcasecmp(priority, "DEBUG")) {
+               return LOG_DEBUG;
+    } else if (!strcasecmp(priority, "EMERG")) {
+               return LOG_EMERG;
+    } else if (!strcasecmp(priority, "ERR")) {
+               return LOG_ERR;
+    } else if (!strcasecmp(priority, "INFO")) {
+               return LOG_INFO;
+    } else if (!strcasecmp(priority, "NOTICE")) {
+               return LOG_NOTICE;
+    } else if (!strcasecmp(priority, "WARNING")) {
+               return LOG_WARNING;
+    }
+
+    return -1;
+}
+
+static const int logger_level_to_syslog_map[] = {
+       [__LOG_DEBUG]   = LOG_DEBUG,
+       [1]             = LOG_INFO,    /* Only kept for backwards compatibility */
+       [__LOG_NOTICE]  = LOG_NOTICE,
+       [__LOG_WARNING] = LOG_WARNING,
+       [__LOG_ERROR]   = LOG_ERR,
+       [__LOG_VERBOSE] = LOG_DEBUG,
+       [__LOG_DTMF]    = LOG_DEBUG,
+};
+
+int ast_syslog_priority_from_loglevel(int level) {
+       if (level < 0 || level >= ARRAY_LEN(logger_level_to_syslog_map)) {
+               return -1;
+       }
+       return logger_level_to_syslog_map[level];
+}