]> arthur.barton.de Git - netatalk.git/commitdiff
move most of a LOG macros in the logger function
authordidg <didg>
Thu, 29 Oct 2009 16:19:49 +0000 (16:19 +0000)
committerdidg <didg>
Thu, 29 Oct 2009 16:19:49 +0000 (16:19 +0000)
include/atalk/logger.h
libatalk/util/logger.c

index 27e870cf1bc09531248383c7a0fb84c64a47796f..0ad267bcae1b12bb5f453bd2ffd2c90ba2788a21 100644 (file)
@@ -64,8 +64,6 @@
 #include "config.h"
 #endif
 
-#define MAXLOGSIZE 512
-
 enum loglevels {
     log_none,
     log_severe,
@@ -73,37 +71,14 @@ enum loglevels {
     log_warning,
     log_note,
     log_info,
-#ifndef NO_DEBUG
     log_debug,
     log_debug6,
     log_debug7,
     log_debug8,
     log_debug9,
     log_maxdebug
-#else
-#define log_debug -1
-#define log_debug6 -1
-#define log_debug7 -1
-#define log_debug8 -1
-#define log_debug9 -1
-#define log_maxdebug -1 
-#endif    
 };
 
-#define LOGLEVEL_STRING_IDENTIFIERS { \
-  "LOG_NOTHING",                      \
-  "LOG_SEVERE",                       \
-  "LOG_ERROR",                        \
-  "LOG_WARN",                         \
-  "LOG_NOTE",                         \
-  "LOG_INFO",                         \
-  "LOG_DEBUG",                        \
-  "LOG_DEBUG6",                       \
-  "LOG_DEBUG7",                       \
-  "LOG_DEBUG8",                       \
-  "LOG_DEBUG9",                       \
-  "LOG_MAXDEBUG"}                        
-
 /* this is the enum specifying all availiable logtypes */
 enum logtypes {
   logtype_default,
@@ -118,18 +93,6 @@ enum logtypes {
   logtype_end_of_list_marker  /* don't put any logtypes after this */
 };
 
-/* these are the string identifiers corresponding to each logtype */
-#define LOGTYPE_STRING_IDENTIFIERS { \
-  "Default",                         \
-  "Core",                            \
-  "Logger",                          \
-  "CNID",                            \
-  "AFPDaemon",                       \
-  "ATalkDaemon",                     \
-  "PAPDaemon",                       \
-  "UAMSDaemon",                      \
-                                     \
-  "end_of_list_marker"}              \
 
 /* Display Option flags. */
 /* redefine these so they can don't interfeer with syslog */
@@ -155,46 +118,6 @@ enum logtypes {
 #define logfacility_authpriv    (10<<3) /* security/auth messages (private) */
 #define logfacility_ftp         (11<<3) /* ftp daemon */
 
-/* ========================================================================= 
-    Structure definitions
-   ========================================================================= */
-
-/* Main log config */
-typedef struct {
-    int   inited;                /* file log config initialized ? */
-    int   filelogging;           /* Any level set to filelogging ? */
-                                  /* Deactivates syslog logging */
-    char  processname[16];
-    int   syslog_opened;         /* syslog opened ? */
-    int   facility;               /* syslog facility to use */
-    int   syslog_display_options;
-    int   syslog_level;           /* Log Level to send to syslog */
-} log_config_t;
-
-/* This stores the config and options for one filelog type (e.g. logger, afpd etc.) */
-typedef struct {
-    int  set;                    /* set individually ? yes: changing default
-                                  * doesnt change it. no: it changes it.*/
-    char *filename;               /* Name of file */
-    int  fd;                      /* logfiles fd */
-    int  level;                   /* Log Level to put in this file */
-    int  display_options;
-} filelog_conf_t;
-
-/* ========================================================================= 
-    Global variables
-   ========================================================================= */
-
-#ifndef LOGGER_C
-/* Make config accessible for LOG macro */
-extern log_config_t log_config;
-extern filelog_conf_t file_configs[logtype_end_of_list_marker];
-
-/* These are used by the LOG macro to store __FILE__ and __LINE__ */
-extern char *log_src_filename;
-extern int  log_src_linenumber;
-#endif
-
 /* =========================================================================
     Global function decarations
    ========================================================================= */
@@ -236,26 +159,24 @@ void set_processname(const char *processname);
  */
 
 /* LOG macro func no.1: log the message to file */
-void make_log_entry(enum loglevels loglevel, enum logtypes logtype, char *message, ...);
-
-/* LOG macro func no.2: log the message to syslog */
-void make_syslog_entry(enum loglevels loglevel, enum logtypes logtype, char *message, ...);
+void make_log_entry(enum loglevels loglevel, enum logtypes logtype, const char *file, int line, char *message, ...);
 
 /* 
    Note:
    any configured file-logging deactivates syslog logging
+   log_level is always a constant with O2 a sane compiler will remove the call to
+   make_log_entry
  */
+#ifdef NO_DEBUG
+#define LOG_MAX log_info
+#else 
+#define LOG_MAX log_maxdebug
+#endif
+
 #define LOG(log_level, type, ...)  \
   do { \
-    if (log_level < 0) \
+    if (log_level > LOG_MAX) \
       break; \
-    if ( ! log_config.inited) \
-      log_init(); \
-    if (file_configs[(type)].level >= (log_level)) \
-      log_src_filename = __FILE__, \
-      log_src_linenumber = __LINE__, \
-      make_log_entry((log_level), (type), __VA_ARGS__); \
-    else if (( ! log_config.filelogging) && (log_config.syslog_level >= (log_level))) \
-       make_syslog_entry((log_level), (type), __VA_ARGS__); \
+    make_log_entry((log_level), (type), __FILE__, __LINE__,  __VA_ARGS__); \
   } while(0)  
 #endif /* _ATALK_LOGGER_H */
index e6328ea4ce819ac31ecc8dd7e5461419683924d6..939d7f4d3caa524d43e87170d7b8faadd8b7f92c 100644 (file)
@@ -31,20 +31,73 @@ Netatalk 2001 (c)
 #include <atalk/boolean.h>
 #include <atalk/util.h>
 
-#define LOGGER_C
 #include <atalk/logger.h>
-#undef LOGGER_C
 
 #define OPEN_LOGS_AS_UID 0
 
 #define COUNT_ARRAY(array) (sizeof((array))/sizeof((array)[0]))
 
+#define MAXLOGSIZE 512
+
+#define LOGLEVEL_STRING_IDENTIFIERS { \
+  "LOG_NOTHING",                      \
+  "LOG_SEVERE",                       \
+  "LOG_ERROR",                        \
+  "LOG_WARN",                         \
+  "LOG_NOTE",                         \
+  "LOG_INFO",                         \
+  "LOG_DEBUG",                        \
+  "LOG_DEBUG6",                       \
+  "LOG_DEBUG7",                       \
+  "LOG_DEBUG8",                       \
+  "LOG_DEBUG9",                       \
+  "LOG_MAXDEBUG"}                        
+
+/* these are the string identifiers corresponding to each logtype */
+#define LOGTYPE_STRING_IDENTIFIERS { \
+  "Default",                         \
+  "Core",                            \
+  "Logger",                          \
+  "CNID",                            \
+  "AFPDaemon",                       \
+  "ATalkDaemon",                     \
+  "PAPDaemon",                       \
+  "UAMSDaemon",                      \
+                                     \
+  "end_of_list_marker"}              \
+
+/* ========================================================================= 
+    Structure definitions
+   ========================================================================= */
+
+/* Main log config */
+typedef struct {
+    int   inited;                /* file log config initialized ? */
+    int   filelogging;           /* Any level set to filelogging ? */
+                                  /* Deactivates syslog logging */
+    char  processname[16];
+    int   syslog_opened;         /* syslog opened ? */
+    int   facility;               /* syslog facility to use */
+    int   syslog_display_options;
+    int   syslog_level;           /* Log Level to send to syslog */
+} log_config_t;
+
+/* This stores the config and options for one filelog type (e.g. logger, afpd etc.) */
+typedef struct {
+    int  set;                    /* set individually ? yes: changing default
+                                  * doesnt change it. no: it changes it.*/
+    char *filename;               /* Name of file */
+    int  fd;                      /* logfiles fd */
+    int  level;                   /* Log Level to put in this file */
+    int  display_options;
+} filelog_conf_t;
+
 /* =========================================================================
    Config
    ========================================================================= */
 
 /* Main log config container, must be globally visible */
-log_config_t log_config = {
+static log_config_t log_config = {
     0,                  /* Initialized ? 0 = no */
     0,                  /* No filelogging setup yet */
     {0},                /* processname */
@@ -62,7 +115,7 @@ log_config_t log_config = {
    0:    Display options */
 #define DEFAULT_LOG_CONFIG {0, NULL, -1, 0, 0}
 
-filelog_conf_t file_configs[logtype_end_of_list_marker] = {
+static filelog_conf_t file_configs[logtype_end_of_list_marker] = {
     DEFAULT_LOG_CONFIG, /* logtype_default */
     DEFAULT_LOG_CONFIG, /* logtype_core */
     DEFAULT_LOG_CONFIG, /* logtype_logger */
@@ -74,8 +127,8 @@ filelog_conf_t file_configs[logtype_end_of_list_marker] = {
 };
 
 /* These are used by the LOG macro to store __FILE__ and __LINE__ */
-char *log_src_filename;
-int  log_src_linenumber;
+static const char *log_src_filename;
+static int  log_src_linenumber;
 
 /* Array to store text to list given a log type */
 static const char *arr_logtype_strings[] =  LOGTYPE_STRING_IDENTIFIERS;
@@ -372,13 +425,25 @@ void set_processname(const char *processname)
     log_config.processname[15] = 0;
 }
 
+/* Called by the LOG macro for syslog messages */
+static void make_syslog_entry(enum loglevels loglevel, enum logtypes logtype _U_, char *message)
+{
+    if ( !log_config.syslog_opened ) {
+        openlog(log_config.processname, log_config.syslog_display_options,
+                log_config.facility);
+        log_config.syslog_opened = 1;
+    }
+
+    syslog(get_syslog_equivalent(loglevel), "%s", message);
+}
+
 /* -------------------------------------------------------------------------
    make_log_entry has 1 main flaws:
    The message in its entirity, must fit into the tempbuffer.
    So it must be shorter than MAXLOGSIZE
    ------------------------------------------------------------------------- */
 void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
-                    char *message, ...)
+                    const char *file, int line, char *message, ...)
 {
     /* fn is not reentrant but is used in signal handler
      * with LOGGER it's a little late source name and line number
@@ -393,6 +458,31 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
     if (inlog)
         return;
 
+    inlog = 1;
+
+    if (!log_config.inited) {
+      log_init();
+    }
+    
+    if (file_configs[logtype].level >= loglevel) {
+      log_src_filename = file;
+      log_src_linenumber = line;
+    }
+    else if (!log_config.filelogging && log_config.syslog_level >= loglevel) {
+       /* Initialise the Messages */
+       va_start(args, message);
+       vsnprintf(temp_buffer, MAXLOGSIZE -1, message, args);
+       va_end(args);
+       temp_buffer[MAXLOGSIZE -1] = 0;
+       make_syslog_entry(loglevel, logtype, temp_buffer);
+       inlog = 0;
+       return;
+    }
+    else {
+       inlog = 0;
+       return;
+    }
+
     /* Check if requested logtype is setup */
     if (file_configs[logtype].set)
         /* Yes */
@@ -406,7 +496,6 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
         return;
     }
 
-    inlog = 1;
     /* Initialise the Messages */
     va_start(args, message);
     len = vsnprintf(temp_buffer, MAXLOGSIZE -1, message, args);
@@ -440,40 +529,10 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
     inlog = 0;
 }
 
-/* Called by the LOG macro for syslog messages */
-void make_syslog_entry(enum loglevels loglevel, enum logtypes logtype _U_, char *message, ...)
-{
-    va_list args;
-    char log_buffer[MAXLOGSIZE];
-    /* fn is not reentrant but is used in signal handler
-     * with LOGGER it's a little late source name and line number
-     * are already changed.
-     */
-    static int inlog = 0;
-
-    if (inlog)
-        return;
-    inlog = 1;
-
-    if ( ! (log_config.syslog_opened) ) {
-        openlog(log_config.processname, log_config.syslog_display_options,
-                log_config.facility);
-        log_config.syslog_opened = 1;
-    }
-
-    /* Initialise the Messages */
-    va_start(args, message);
-    vsnprintf(log_buffer, sizeof(log_buffer), message, args);
-    va_end(args);
-    log_buffer[MAXLOGSIZE -1] = 0;
-    syslog(get_syslog_equivalent(loglevel), "%s", log_buffer);
-
-    inlog = 0;
-}
 
 void setuplog(const char *logstr)
 {
-    char *ptr, *ptrbak, *logtype, *loglevel, *filename;
+    char *ptr, *ptrbak, *logtype, *loglevel = NULL, *filename = NULL;
     ptr = strdup(logstr);
     ptrbak = ptr;