#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
+#include <syslog.h>
#include "options.h"
#include "log.h"
#define PREFIX_PACKAGE_NAME 1
-#define ADD_LINEFEED 0
extern struct options_t options;
#endif /* PREFIX_PACKAGE_NAME */
}
-static void
-log_suffix_newline(FILE *stream)
+static void log_common(const int priority, const char* format, va_list ap)
{
-#if ADD_LINEFEED
- fprintf(stream, "\n");
-#else
- (void) stream;
-#endif /* ADD_LINEFEED */
+ va_list ap_syslog;
+ FILE *stream;
+
+ va_copy(ap_syslog, ap);
+
+ switch (priority) {
+ case LOG_ERR:
+ case LOG_WARNING:
+ case LOG_EMERG:
+ case LOG_ALERT:
+ case LOG_CRIT:
+ stream = stderr;
+ break;
+ default:
+ stream = stdout;
+ break;
+ }
+
+ log_prefix_package_name(stream, "debug");
+
+ (void) vfprintf(stream, format, ap);
+ va_end(ap);
+
+ vsyslog(priority, format, ap_syslog);
+ va_end(ap_syslog);
}
void
log_debug(const char *format, ...)
{
- FILE *stream = stdout;
-
- if (options.log_level >= LOG_LEVEL_DEBUG) {
- va_list ap;
-
- log_prefix_package_name(stream, "debug");
+ va_list ap;
- va_start(ap, format);
- (void) vfprintf(stream, format, ap);
- va_end(ap);
+ if (options.log_level < LOG_LEVEL_DEBUG)
+ return;
- log_suffix_newline(stream);
- }
+ va_start(ap, format);
+ log_common(LOG_DEBUG, format, ap);
}
void
log_info(const char *format, ...)
{
- FILE *stream = stdout;
-
- if (options.log_level >= LOG_LEVEL_INFO) {
- va_list ap;
-
- log_prefix_package_name(stream, "info");
+ va_list ap;
- va_start(ap, format);
- (void) vfprintf(stream, format, ap);
- va_end(ap);
+ if (options.log_level < LOG_LEVEL_INFO)
+ return;
- log_suffix_newline(stream);
- }
+ va_start(ap, format);
+ log_common(LOG_INFO, format, ap);
}
void
log_warn(const char *format, ...)
{
- FILE *stream = stderr;
-
- if (options.log_level >= LOG_LEVEL_WARN) {
- va_list ap;
-
- log_prefix_package_name(stream, "warn");
+ va_list ap;
- va_start(ap, format);
- (void) vfprintf(stream, format, ap);
- va_end(ap);
+ if (options.log_level < LOG_LEVEL_WARNING)
+ return;
- log_suffix_newline(stream);
- }
+ va_start(ap, format);
+ log_common(LOG_WARNING, format, ap);
}
void
log_err(const char *format, ...)
{
- FILE *stream = stderr;
va_list ap;
- log_prefix_package_name(stream, "error");
-
va_start(ap, format);
- (void) vfprintf(stream, format, ap);
- va_end(ap);
-
- log_suffix_newline(stream);
+ log_common(LOG_ERR, format, ap);
}
/* Log error message and exits with error code. */
void
log_fail(const char *format, ...)
{
- FILE *stream = stderr;
va_list ap;
- log_prefix_package_name(stream, "error");
-
va_start(ap, format);
- (void) vfprintf(stream, format, ap);
- va_end(ap);
-
- log_suffix_newline(stream);
+ log_common(LOG_ERR, format, ap);
exit(EXIT_FAILURE);
}