diff options
| author | Mr. Goblin <mrgoblin@mrgoblin.net> | 2026-10-02 22:47:33 +0300 |
|---|---|---|
| committer | Mr. Goblin <mrgoblin@mrgoblin.net> | 2026-10-02 22:47:33 +0300 |
| commit | b6db5f69f96501aaa21e7aa9c4b6ba40548956f9 (patch) | |
| tree | 53fb9ca8d136f3ad3e6bb043fc0ef44cf383d3b8 /lib/logger/logger.c | |
| parent | ec49f04faa8a4f643eb8bb4a8c75ac2bff92a8f8 (diff) | |
logger library and flag to run as daemon
Diffstat (limited to 'lib/logger/logger.c')
| -rw-r--r-- | lib/logger/logger.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/lib/logger/logger.c b/lib/logger/logger.c new file mode 100644 index 0000000..64a6754 --- /dev/null +++ b/lib/logger/logger.c @@ -0,0 +1,78 @@ +#include <syslog.h> +#include <stdarg.h> +#include <stdio.h> +#include <errno.h> +#include <string.h> +#include "logger.h" + +static int use_syslog = 0; + +void +logger_init(const char *name, int daemon_flag) +{ + use_syslog = daemon_flag; + if (use_syslog) + openlog(name, LOG_PID, LOG_DAEMON); +} + +void +logger_close(void) +{ + if (use_syslog) + closelog(); +} + +void +logger_log(enum logger_lvl level, const char *format, ...) +{ + int saved_errno = errno; + va_list vargs; + va_start(vargs, format); + if (use_syslog) { + switch (level) { + case log_lvl_info: + vsyslog(LOG_INFO, format, vargs); + break; + case log_lvl_warning: + vsyslog(LOG_WARNING, format, vargs); + break; + case log_lvl_err: + vsyslog(LOG_ERR, format, vargs); + break; + } + } else { + FILE *f = NULL; + switch (level) { + case log_lvl_info: + f = stdout; + fprintf(f, "[INFO] "); + break; + case log_lvl_warning: + f = stderr; + fprintf(f, "[WARNING] "); + break; + case log_lvl_err: + f = stderr; + fprintf(f, "[ERROR] "); + break; + default: + f = stderr; + fprintf(f, "[UNKNOWN] "); + break; + } + vfprintf(f, format, vargs); + } + errno = saved_errno; +} + +void +logger_perror(const char *s) +{ + int saved_errno = errno; + if (use_syslog) { + syslog(LOG_ERR, "%s: %s\n", s, strerror(errno)); + } else { + perror(s); + } + errno = saved_errno; +} |
