#include <limits.h>
#include <stdio.h>
-
-#include <atalk/boolean.h>
+#include <stdbool.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+/* logger is used by pam modules */
+#ifndef UAM_MODULE_EXPORT
+#define UAM_MODULE_EXPORT
+#endif
+
enum loglevels {
log_none,
log_severe,
/* 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 */
};
#define logfacility_authpriv (10<<3) /* security/auth messages (private) */
#define logfacility_ftp (11<<3) /* ftp daemon */
-/* =========================================================================
- Global function decarations
+/* =========================================================================
+ Structure definitions
========================================================================= */
-/* */
-void log_init(void);
+/* Main log config */
+typedef struct {
+ 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;
-/* 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);
+/* This stores the config and options for one filelog type (e.g. logger, afpd etc.) */
+typedef struct {
+ 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;
-/* 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);
+/* =========================================================================
+ Global variables
+ ========================================================================= */
-/* This gets called e.g. from afpd.conf parsing code with a string like: */
-/* "default dummyname" */
-void unsetuplog(const char *logstr);
+/* Make config accessible for LOG macro */
+extern log_config_t log_config;
-/* finish up and close the logs */
-void log_close(void);
+extern UAM_MODULE_EXPORT logtype_conf_t type_configs[logtype_end_of_list_marker];
-/* This function sets up the ProcessName */
+/* =========================================================================
+ Global function decarations
+ ========================================================================= */
+
+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, const char *file, int line, char *message, ...);
+#define LOG_MAX log_info
-/*
- 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 > LOG_MAX) \
- break; \
- make_log_entry((log_level), (type), __FILE__, __LINE__, __VA_ARGS__); \
- } while(0)
+#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 */
+
#endif /* _ATALK_LOGGER_H */