From 9429b4172f56653fee1d21d1f0e0838ff417faa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Sat, 18 Feb 2023 14:37:35 +0100 Subject: [PATCH 1/2] log.c: add syslog() support When building with -DUSE_SYSLOG, logging is done through syslog. --- log.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/log.c b/log.c index a989904..eb4feab 100644 --- a/log.c +++ b/log.c @@ -25,6 +25,10 @@ #include #include +#ifdef USE_SYSLOG +#include +#endif + #include "upnpglobalvars.h" #include "log.h" @@ -56,16 +60,31 @@ const char *level_name[] = { 0 }; +#ifdef USE_SYSLOG +int syslog_level[] = { + LOG_DEBUG, // E_OFF + LOG_ERR, // E_FATAL + LOG_ERR, // E_ERROR + LOG_WARNING, // E_WARN + LOG_INFO, // E_INFO + LOG_DEBUG, // E_DEBUG + LOG_DEBUG // E_MAXDEBUG +}; +#endif + void log_close(void) { +#ifndef USE_SYSLOG if (log_fp) fclose(log_fp); +#endif } void log_reopen(void) { +#ifndef USE_SYSLOG if (log_path[0] && log_fp) { char logfile[1048]; @@ -74,6 +93,7 @@ log_reopen(void) log_fp = fopen(logfile, "a"); DPRINTF(E_INFO, L_GENERAL, "Reopened log file\n"); } +#endif } int find_matching_name(const char* str, const char* names[]) @@ -97,7 +117,9 @@ int log_init(const char *debug) { int i; +#ifndef USE_SYSLOG FILE *fp = NULL; +#endif int level = find_matching_name(debug, level_name); int default_log_level = (level == -1) ? _default_log_level : level; @@ -134,7 +156,7 @@ log_init(const char *debug) } while (*lhs && *lhs==','); } } - +#ifndef USE_SYSLOG if (log_path[0]) { char logfile[1048]; @@ -143,6 +165,7 @@ log_init(const char *debug) return -1; } log_fp = fp; +#endif return 0; } @@ -151,10 +174,32 @@ void log_err(int level, enum _log_facility facility, char *fname, int lineno, char *fmt, ...) { va_list ap; +#ifdef USE_SYSLOG + static char *msgbuf = NULL; + static size_t msgbuf_size = 0; + size_t required; +#endif if (level && level>log_level[facility] && level>E_FATAL) return; + // user log +#ifdef USE_SYSLOG + for (;;) { + va_start(ap, fmt); + required = vsnprintf(msgbuf, msgbuf_size, fmt, ap) + 1; + va_end(ap); + if (required <= msgbuf_size) + break; + msgbuf = realloc(msgbuf, required); + msgbuf_size = required; + } + + if (level) + syslog(syslog_level[level], "%s:%d: %s: %s", fname, lineno, level_name[level], msgbuf); + else + syslog(LOG_INFO, "%s:%d: %s", fname, lineno, msgbuf); +#else if (!log_fp) log_fp = stdout; @@ -185,6 +230,7 @@ log_err(int level, enum _log_facility facility, char *fname, int lineno, char *f va_end(ap); fflush(log_fp); +#endif if (level==E_FATAL) exit(-1); From b27ce5bb7914178e6f1e8cd29e0cbaf934854f73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20E=C3=9Fer?= Date: Sat, 18 Feb 2023 23:22:02 +0100 Subject: [PATCH 2/2] Make logging through syslog() a run-time option on FreeBSD This feature is only compiled in on FreeBSD, if the #ifdef __FreeBSD__ clauses are kept. But it should apply to all systems that do not use systemd as well, if the definition of SYSLOG_MASK to a non-zero value is made unconditional (except on Linux, since I'm repurposing the -S option, which may be a debatable decision). This change allows the following patch to be applied to the service script: diff --git a/net/minidlna/files/minidlna.in b/net/minidlna/files/minidlna.in index 4329e9c00927..a62cbd4c6632 100644 --- a/net/minidlna/files/minidlna.in +++ b/net/minidlna/files/minidlna.in @@ -19,11 +19,7 @@ minidlna_enable=${minidlna_enable-"NO"} minidlna_uid=${minidlna_uid-"%%USER%%"} command=%%PREFIX%%/sbin/minidlnad -pidfile="/var/run/minidlna/minidlna.pid" -command_args="-P $pidfile -u $minidlna_uid -f %%PREFIX%%/etc/minidlna.conf" - -start_precmd="install -d -o $minidlna_uid ${pidfile%/*} /var/db/minidlna" -stop_postcmd="rm -f $pidfile" +command_args="-S -u $minidlna_uid -f %%PREFIX%%/etc/minidlna.conf" extra_commands=rescan rescan_cmd="$command $command_args -R" There is no need for a PID file, if logging is through syslog(). --- log.c | 103 ++++++++++++++++++++++------------------------- minidlna.c | 4 ++ upnpglobalvars.h | 5 +++ 3 files changed, 58 insertions(+), 54 deletions(-) diff --git a/log.c b/log.c index eb4feab..89c4618 100644 --- a/log.c +++ b/log.c @@ -25,7 +25,7 @@ #include #include -#ifdef USE_SYSLOG +#ifdef __FreeBSD__ #include #endif @@ -60,7 +60,7 @@ const char *level_name[] = { 0 }; -#ifdef USE_SYSLOG +#ifdef __FreeBSD__ int syslog_level[] = { LOG_DEBUG, // E_OFF LOG_ERR, // E_FATAL @@ -75,17 +75,14 @@ int syslog_level[] = { void log_close(void) { -#ifndef USE_SYSLOG if (log_fp) fclose(log_fp); -#endif } void log_reopen(void) { -#ifndef USE_SYSLOG - if (log_path[0] && log_fp) + if (!GETFLAG(SYSLOG_MASK) && log_path[0] && log_fp) { char logfile[1048]; snprintf(logfile, sizeof(logfile), "%s/" LOGFILE_NAME, log_path); @@ -93,7 +90,6 @@ log_reopen(void) log_fp = fopen(logfile, "a"); DPRINTF(E_INFO, L_GENERAL, "Reopened log file\n"); } -#endif } int find_matching_name(const char* str, const char* names[]) @@ -117,9 +113,7 @@ int log_init(const char *debug) { int i; -#ifndef USE_SYSLOG FILE *fp = NULL; -#endif int level = find_matching_name(debug, level_name); int default_log_level = (level == -1) ? _default_log_level : level; @@ -156,8 +150,8 @@ log_init(const char *debug) } while (*lhs && *lhs==','); } } -#ifndef USE_SYSLOG - if (log_path[0]) + + if (!GETFLAG(SYSLOG_MASK) && log_path[0]) { char logfile[1048]; snprintf(logfile, sizeof(logfile), "%s/" LOGFILE_NAME, log_path); @@ -165,7 +159,6 @@ log_init(const char *debug) return -1; } log_fp = fp; -#endif return 0; } @@ -174,63 +167,65 @@ void log_err(int level, enum _log_facility facility, char *fname, int lineno, char *fmt, ...) { va_list ap; -#ifdef USE_SYSLOG static char *msgbuf = NULL; static size_t msgbuf_size = 0; size_t required; -#endif if (level && level>log_level[facility] && level>E_FATAL) return; // user log -#ifdef USE_SYSLOG - for (;;) { + if (!GETFLAG(SYSLOG_MASK)) { + if (!log_fp) + log_fp = stdout; + + // timestamp + if (!GETFLAG(SYSTEMD_MASK)) + { + time_t t; + struct tm *tm; + t = time(NULL); + tm = localtime(&t); + fprintf(log_fp, "[%04d/%02d/%02d %02d:%02d:%02d] ", + tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, + tm->tm_hour, tm->tm_min, tm->tm_sec); + } + + if (level) + fprintf(log_fp, "%s:%d: %s: ", fname, lineno, level_name[level]); + else + fprintf(log_fp, "%s:%d: ", fname, lineno); + + // user log va_start(ap, fmt); - required = vsnprintf(msgbuf, msgbuf_size, fmt, ap) + 1; + if (vfprintf(log_fp, fmt, ap) == -1) + { + va_end(ap); + return; + } va_end(ap); - if (required <= msgbuf_size) - break; - msgbuf = realloc(msgbuf, required); - msgbuf_size = required; - } - if (level) - syslog(syslog_level[level], "%s:%d: %s: %s", fname, lineno, level_name[level], msgbuf); - else - syslog(LOG_INFO, "%s:%d: %s", fname, lineno, msgbuf); -#else - if (!log_fp) - log_fp = stdout; + fflush(log_fp); + } else { + va_start(ap, fmt); + required = vsnprintf(msgbuf, msgbuf_size, fmt, ap) + 1; + va_end(ap); - // timestamp - if (!GETFLAG(SYSTEMD_MASK)) - { - time_t t; - struct tm *tm; - t = time(NULL); - tm = localtime(&t); - fprintf(log_fp, "[%04d/%02d/%02d %02d:%02d:%02d] ", - tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, - tm->tm_hour, tm->tm_min, tm->tm_sec); - } + if (required > msgbuf_size) { + free(msgbuf); + msgbuf = malloc(required); + msgbuf_size = required; - if (level) - fprintf(log_fp, "%s:%d: %s: ", fname, lineno, level_name[level]); - else - fprintf(log_fp, "%s:%d: ", fname, lineno); + va_start(ap, fmt); + (void)vsnprintf(msgbuf, msgbuf_size, fmt, ap); + va_end(ap); + } - // user log - va_start(ap, fmt); - if (vfprintf(log_fp, fmt, ap) == -1) - { - va_end(ap); - return; + if (level) + syslog(syslog_level[level], "%s:%d: %s: %s", fname, lineno, level_name[level], msgbuf); + else + syslog(LOG_INFO, "%s:%d: %s", fname, lineno, msgbuf); } - va_end(ap); - - fflush(log_fp); -#endif if (level==E_FATAL) exit(-1); diff --git a/minidlna.c b/minidlna.c index 999adee..ab52044 100644 --- a/minidlna.c +++ b/minidlna.c @@ -954,6 +954,10 @@ init(int argc, char **argv) case 'S': SETFLAG(SYSTEMD_MASK); break; +#elif defined(__FreeBSD__) + case 'S': + SETFLAG(SYSLOG_MASK); + break; #endif case 'V': printf("Version " MINIDLNA_VERSION "\n"); diff --git a/upnpglobalvars.h b/upnpglobalvars.h index 8a35555..6469e7f 100644 --- a/upnpglobalvars.h +++ b/upnpglobalvars.h @@ -207,6 +207,11 @@ extern uint32_t runtime_flags; #define RESCAN_MASK 0x0200 #define SUBTITLES_MASK 0x0400 #define FORCE_ALPHASORT_MASK 0x0800 +#ifdef __FreeBSD__ +#define SYSLOG_MASK 0x1000 +#else +#define SYSLOG_MASK 0x0000 +#endif #define SETFLAG(mask) runtime_flags |= mask #define GETFLAG(mask) (runtime_flags & mask)