some platforms (e.g. FreeBSD4) need netinet/in.h to be included
[asterisk/asterisk.git] / main / logger.c
index a74cfa3..eb7ceeb 100644 (file)
  * \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$")
 
+#include "asterisk/_private.h"
+#include "asterisk/paths.h"    /* use ast_config_AST_LOG_DIR */
 #include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <unistd.h>
 #include <time.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #if ((defined(AST_DEVMODE)) && (defined(linux)))
@@ -61,9 +62,9 @@ static int syslog_level_map[] = {
 
 #define SYSLOG_NLEVELS sizeof(syslog_level_map) / sizeof(int)
 
+#undef _ASTERISK_LOGGER_H      /* now include logger.h */
 #include "asterisk/logger.h"
 #include "asterisk/lock.h"
-#include "asterisk/options.h"
 #include "asterisk/channel.h"
 #include "asterisk/config.h"
 #include "asterisk/term.h"
@@ -72,7 +73,6 @@ static int syslog_level_map[] = {
 #include "asterisk/manager.h"
 #include "asterisk/threadstorage.h"
 #include "asterisk/strings.h"
-#include "asterisk/channel.h"
 #include "asterisk/pbx.h"
 
 #if defined(__linux__) && !defined(__NR_gettid)
@@ -148,6 +148,7 @@ static int close_logger_thread;
 static FILE *eventlog;
 static FILE *qlog;
 
+/*! \brief Logging channels used in the Asterisk logging system */
 static char *levels[] = {
        "DEBUG",
        "EVENT",
@@ -158,6 +159,7 @@ static char *levels[] = {
        "DTMF"
 };
 
+/*! \brief Colors used in the console for logging */
 static int colors[] = {
        COLOR_BRGREEN,
        COLOR_BRBLUE,
@@ -174,11 +176,11 @@ AST_THREADSTORAGE(verbose_buf);
 AST_THREADSTORAGE(log_buf);
 #define LOG_BUF_INIT_SIZE       256
 
-static int make_components(char *s, int lineno)
+static int make_components(const char *s, int lineno)
 {
        char *w;
        int res = 0;
-       char *stringp = s;
+       char *stringp = ast_strdupa(s);
 
        while ((w = strsep(&stringp, ","))) {
                w = ast_skip_blanks(w);
@@ -204,7 +206,7 @@ static int make_components(char *s, int lineno)
        return res;
 }
 
-static struct logchannel *make_logchannel(char *channel, char *components, int lineno)
+static struct logchannel *make_logchannel(const char *channel, const char *components, int lineno)
 {
        struct logchannel *chan;
        char *facility;
@@ -505,7 +507,7 @@ static int rotate_file(const char *filename)
 
        if (!ast_strlen_zero(exec_after_rotate)) {
                struct ast_channel *c = ast_channel_alloc(0, 0, "", "", "", "", "", 0, "Logger/rotate");
-               char buf[512] = "";
+               char buf[512];
                pbx_builtin_setvar_helper(c, "filename", filename);
                pbx_substitute_variables_helper(c, exec_after_rotate, buf, sizeof(buf));
                system(buf);
@@ -514,7 +516,7 @@ static int rotate_file(const char *filename)
        return res;
 }
 
-int reload_logger(int rotate)
+static int reload_logger(int rotate)
 {
        char old[PATH_MAX] = "";
        int event_rotate = rotate, queue_rotate = rotate;
@@ -616,6 +618,15 @@ int reload_logger(int rotate)
        return res;
 }
 
+/*! \brief Reload the logger module without rotating log files (also used from loader.c during
+       a full Asterisk reload) */
+int logger_reload(void)
+{
+       if(reload_logger(0))
+               return RESULT_FAILURE;
+       return RESULT_SUCCESS;
+}
+
 static char *handle_logger_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
        switch (cmd) {
@@ -631,8 +642,8 @@ static char *handle_logger_reload(struct ast_cli_entry *e, int cmd, struct ast_c
        if (reload_logger(0)) {
                ast_cli(a->fd, "Failed to reload the logger\n");
                return CLI_FAILURE;
-       } else
-               return CLI_SUCCESS;
+       }
+       return CLI_SUCCESS;
 }
 
 static char *handle_logger_rotate(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
@@ -650,8 +661,8 @@ static char *handle_logger_rotate(struct ast_cli_entry *e, int cmd, struct ast_c
        if (reload_logger(1)) {
                ast_cli(a->fd, "Failed to reload the logger and rotate log files\n");
                return CLI_FAILURE;
-       } else
-               return CLI_SUCCESS;
+       } 
+       return CLI_SUCCESS;
 }
 
 /*! \brief CLI command to show logging system configuration */
@@ -708,9 +719,9 @@ struct verb {
 static AST_RWLIST_HEAD_STATIC(verbosers, verb);
 
 static struct ast_cli_entry cli_logger[] = {
-       NEW_CLI(handle_logger_show_channels, "List configured log channels"),
-       NEW_CLI(handle_logger_reload, "Reopens the log files"),
-       NEW_CLI(handle_logger_rotate, "Rotates and reopens the log files")
+       AST_CLI_DEFINE(handle_logger_show_channels, "List configured log channels"),
+       AST_CLI_DEFINE(handle_logger_reload, "Reopens the log files"),
+       AST_CLI_DEFINE(handle_logger_rotate, "Rotates and reopens the log files")
 };
 
 static int handle_SIGXFSZ(int sig) 
@@ -745,7 +756,7 @@ static void ast_log_vsyslog(int level, const char *file, int line, const char *f
         syslog(syslog_level_map[level], "%s", buf);
 }
 
-/* Print a normal log message to the channels */
+/*! \brief Print a normal log message to the channels */
 static void logger_print_normal(struct logmsg *logmsg)
 {
        struct logchannel *chan = NULL;
@@ -831,7 +842,7 @@ static void logger_print_normal(struct logmsg *logmsg)
        return;
 }
 
-/* Print a verbose message to the verbosers */
+/*! \brief Print a verbose message to the verbosers */
 static void logger_print_verbose(struct logmsg *logmsg)
 {
        struct verb *v = NULL;
@@ -845,7 +856,7 @@ static void logger_print_verbose(struct logmsg *logmsg)
        return;
 }
 
-/* Actual logging thread */
+/*! \brief Actual logging thread */
 static void *logger_thread(void *data)
 {
        struct logmsg *next = NULL, *msg = NULL;
@@ -859,10 +870,6 @@ static void *logger_thread(void *data)
                AST_LIST_HEAD_INIT_NOLOCK(&logmsgs);
                AST_LIST_UNLOCK(&logmsgs);
 
-               /* If we should stop, then stop */
-               if (close_logger_thread)
-                       break;
-
                /* Otherwise go through and process each message in the order added */
                while ((msg = next)) {
                        /* Get the next entry now so that we can free our current structure later */
@@ -877,6 +884,10 @@ static void *logger_thread(void *data)
                        /* Free the data since we are done */
                        free(msg);
                }
+
+               /* If we should stop, then stop */
+               if (close_logger_thread)
+                       break;
        }
 
        return NULL;
@@ -937,6 +948,9 @@ void close_logger(void)
        ast_cond_signal(&logcond);
        AST_LIST_UNLOCK(&logmsgs);
 
+       if (logthread != AST_PTHREADT_NULL)
+               pthread_join(logthread, NULL);
+
        AST_RWLIST_WRLOCK(&logchannels);
 
        if (eventlog) {
@@ -1101,7 +1115,7 @@ void ast_verbose(const char *fmt, ...)
                 char date[40];
                 char *datefmt;
 
-                               tv = ast_tvnow();
+               tv = ast_tvnow();
                 ast_localtime(&tv, &tm, NULL);
                 ast_strftime(date, sizeof(date), dateformat, &tm);
                 datefmt = alloca(strlen(date) + 3 + strlen(fmt) + 1);
@@ -1163,12 +1177,12 @@ int ast_unregister_verbose(void (*v)(const char *string))
        AST_RWLIST_WRLOCK(&verbosers);
        AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) {
                if (cur->verboser == v) {
-                       AST_RWLIST_REMOVE_CURRENT(&verbosers, list);
+                       AST_RWLIST_REMOVE_CURRENT(list);
                        free(cur);
                        break;
                }
        }
-       AST_RWLIST_TRAVERSE_SAFE_END
+       AST_RWLIST_TRAVERSE_SAFE_END;
        AST_RWLIST_UNLOCK(&verbosers);
        
        return cur ? 0 : -1;