1 #ifndef _ATALK_LOGGER_H
2 #define _ATALK_LOGGER_H 1
5 * logger LOG Macro Usage
6 * ======================
8 * LOG(<logtype>, <loglevel>, "<string>"[, args]);
17 * setuplog(char *confstring)
18 * confstring = "<logtype> <loglevel> [<filename>]"
20 * Calling without <filename> configures basic logging to syslog. Specifying <filename>
21 * configures extended logging to <filename>.
23 * You can later disable logging by calling
25 * unsetuplog(char *confstring)
26 * confstring = "<logtype> [<any_string>]"
28 * Calling without <any_string> disables syslog logging, calling with <any_string>
29 * disables file logging.
32 * you can setup a default with "Default". Any other logtype used in LOG will then
33 * use the default if not setup itself. This is probabyl the only thing you may
37 * setuplog("default log_debug /var/log/debug.log");
38 * See also libatalk/util/test/logger_test.c
43 * Some netatalk daemons (31.3.2009.: e.g. atalkd, papd) may not be converted to
44 * use the new API and might still call
46 * syslog_setup(int loglevel, enum logtypes logtype, int display_options, int facility);
48 * directly. These daemons are therefore limited to syslog logging. Also their
49 * loglevel can't be changed at runtime.
53 * dont get confused by log_init(). It only gets called if your app
54 * forgets to setup logging before calling LOG.
66 /* logger is used by pam modules */
67 #ifndef UAM_MODULE_EXPORT
68 #define UAM_MODULE_EXPORT
86 /* this is the enum specifying all availiable logtypes */
95 logtype_end_of_list_marker /* don't put any logtypes after this */
99 /* Display Option flags. */
100 /* redefine these so they can don't interfeer with syslog */
101 /* these can be used in standard logging too */
102 #define logoption_nsrcinfo 0x04 /* don't log source info */
103 /* the following do not work anymore, they're only provided in order to not
104 * break existing source code */
105 #define logoption_pid 0x01 /* log the pid with each message */
106 #define logoption_cons 0x02 /* log on the console if error logging */
107 #define logoption_ndelay 0x08 /* don't delay open */
108 #define logoption_perror 0x20 /* log to stderr as well */
109 #define logoption_nfile 0x40 /* ignore the file that called the log */
110 #define logoption_nline 0x80 /* ignore the line that called the log*/
113 /* redefine these so they can don't interfeer with syslog */
114 #define logfacility_user (1<<3) /* random user-level messages */
115 #define logfacility_mail (2<<3) /* mail system */
116 #define logfacility_daemon (3<<3) /* system daemons */
117 #define logfacility_auth (4<<3) /* security/authorization messages */
118 #define logfacility_syslog (5<<3) /* messages generated by syslogd */
119 #define logfacility_lpr (6<<3) /* line printer subsystem */
120 #define logfacility_authpriv (10<<3) /* security/auth messages (private) */
121 #define logfacility_ftp (11<<3) /* ftp daemon */
123 /* =========================================================================
124 Structure definitions
125 ========================================================================= */
127 /* Main log config */
129 bool inited; /* file log config initialized ? */
130 bool syslog_opened; /* syslog opened ? */
131 bool console; /* if logging to console from a cli util */
132 char processname[16];
134 int syslog_display_options;
137 /* This stores the config and options for one filelog type (e.g. logger, afpd etc.) */
139 bool set; /* set individually ? yes: changing default
140 * doesnt change it. no: it changes it.*/
141 bool syslog; /* This type logs to syslog */
142 int fd; /* logfiles fd */
143 enum loglevels level; /* Log Level to put in this file */
148 /* =========================================================================
150 ========================================================================= */
152 /* Make config accessible for LOG macro */
153 extern log_config_t log_config;
155 extern UAM_MODULE_EXPORT logtype_conf_t type_configs[logtype_end_of_list_marker];
157 /* =========================================================================
158 Global function decarations
159 ========================================================================= */
161 void setuplog(const char *loglevel, const char *logfile);
162 void set_processname(const char *processname);
164 /* LOG macro func no.1: log the message to file */
165 UAM_MODULE_EXPORT void make_log_entry(enum loglevels loglevel, enum logtypes logtype, const char *file, int line, char *message, ...);
168 * How to write a LOG macro:
169 * http://c-faq.com/cpp/debugmacs.html
171 * We choose the verbose form in favor of the obfuscated ones, its easier
172 * to parse for human beings and facilitates expanding the macro for
173 * inline checks for debug levels.
176 #define LOG_MAX log_info
180 #define LOG(log_level, type, ...) \
182 if (log_level <= LOG_MAX) \
183 if (log_level <= type_configs[type].level) \
184 make_log_entry((log_level), (type), __FILE__, __LINE__, __VA_ARGS__); \
187 #else /* ! NO_DEBUG */
189 #define LOG(log_level, type, ...) \
191 if (log_level <= type_configs[type].level) \
192 make_log_entry((log_level), (type), __FILE__, __LINE__, __VA_ARGS__); \
195 #endif /* NO_DEBUG */
197 #endif /* _ATALK_LOGGER_H */