#include <limits.h>
#include <stdio.h>
-
-#include <atalk/boolean.h>
+#include <stdbool.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#define MAXLOGSIZE 512
+/* logger is used by pam modules */
+#ifndef UAM_MODULE_EXPORT
+#define UAM_MODULE_EXPORT
+#endif
enum loglevels {
log_none,
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,
- logtype_core,
logtype_logger,
logtype_cnid,
logtype_afpd,
- logtype_atalkd,
- logtype_papd,
+ logtype_dsi,
logtype_uams,
-
+ logtype_fce,
+ logtype_ad,
+ logtype_sl,
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 */
/* 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 */
+ bool inited; /* file log config initialized ? */
+ bool syslog_opened; /* syslog opened ? */
+ bool console; /* if logging to console from a cli util */
+ char processname[16];
+ int syslog_facility;
+ int syslog_display_options;
} 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;
+ bool set; /* set individually ? yes: changing default
+ * doesnt change it. no: it changes it.*/
+ bool syslog; /* This type logs to syslog */
+ int fd; /* logfiles fd */
+ enum loglevels level; /* Log Level to put in this file */
+ int display_options;
+} logtype_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
+extern UAM_MODULE_EXPORT logtype_conf_t type_configs[logtype_end_of_list_marker];
/* =========================================================================
Global function decarations
========================================================================= */
-/* */
-void log_init(void);
-
-/* Setup the level and type of log that will be logged for file loggging */
-void log_setup(const char *filename, enum loglevels loglevel, enum logtypes logtype);
-
-/* Setup the level and type of log that will be logged to syslog. */
-void syslog_setup(int loglevel, enum logtypes logtype,
- int display_options, int facility);
-
-/* This gets called e.g. from afpd.conf parsing code with a string like: */
-/* "default log_maxdebug /var/log/afpd.log" */
-void setuplog(const char *logstr);
-
-/* This gets called e.g. from afpd.conf parsing code with a string like: */
-/* "default dummyname" */
-void unsetuplog(const char *logstr);
-
-/* finish up and close the logs */
-void log_close(void);
-
-/* This function sets up the ProcessName */
+void setuplog(const char *loglevel, const char *logfile);
void set_processname(const char *processname);
+/* LOG macro func no.1: log the message to file */
+UAM_MODULE_EXPORT void make_log_entry(enum loglevels loglevel, enum logtypes logtype, const char *file, int line, char *message, ...);
+
/*
* How to write a LOG macro:
* http://c-faq.com/cpp/debugmacs.html
* We choose the verbose form in favor of the obfuscated ones, its easier
* to parse for human beings and facilitates expanding the macro for
* inline checks for debug levels.
- *
- * How to properly enclose multistatement macros:
- * http://en.wikipedia.org/wiki/C_macro#Multiple_statements
*/
-/* LOG macro func no.1: log the message to file */
-void make_log_entry(enum loglevels loglevel, enum logtypes logtype, char *message, ...);
+#define LOG_MAX log_info
-/* LOG macro func no.2: log the message to syslog */
-void make_syslog_entry(enum loglevels loglevel, enum logtypes logtype, char *message, ...);
+#ifdef NO_DEBUG
+
+#define LOG(log_level, type, ...) \
+ do { \
+ if (log_level <= LOG_MAX) \
+ if (log_level <= type_configs[type].level) \
+ make_log_entry((log_level), (type), __FILE__, __LINE__, __VA_ARGS__); \
+ } while(0)
+
+#else /* ! NO_DEBUG */
+
+#define LOG(log_level, type, ...) \
+ do { \
+ if (log_level <= type_configs[type].level) \
+ make_log_entry((log_level), (type), __FILE__, __LINE__, __VA_ARGS__); \
+ } while(0)
+
+#endif /* NO_DEBUG */
-/*
- Note:
- any configured file-logging deactivates syslog logging
- */
-#define LOG(log_level, type, ...) \
- do { \
- if (log_level < 0) \
- 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__); \
- } while(0)
#endif /* _ATALK_LOGGER_H */