This allows external programs to drop a configuration file in the directory and avoid the need to edit the main configuraion file.
* doc/inetutils.texi: Document new -D and --rcdir syslogd options. * paths (PATH_LOGCONFD): New variable. * syslogd/Makefile.am (AM_CPPFLAGS): Add PATHDEF_LOGCONFD. * syslogd/syslogd.c: Include <dirent.h>. (ConfDir): New variable. (load_confdir): New function declaration. (argp_options): Add rcdir entry. (parse_opt): Handle 'D' option. (load_confdir): New function definition. (init): Call load_confdir instead of load_conffile. --- doc/inetutils.texi | 6 +++++ paths | 1 + syslogd/Makefile.am | 3 +- syslogd/syslogd.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/doc/inetutils.texi b/doc/inetutils.texi index 0cc0d98..5f85063 100644 --- a/doc/inetutils.texi +++ b/doc/inetutils.texi @@ -2288,6 +2288,12 @@ syslogd [...@var{options}]@dots{} @opindex --rcfile Override configuration (the default file is @file{/etc/syslog.conf}). +...@item -D @var{dir} +...@itemx --rcd...@var{dir} +...@opindex -D +...@opindex --rcdir +Override configuration directory (the default is @file{/etc/syslog.d}). + @item --pidfi...@var{file} @opindex --pidfile Override pidfile (the default file is @file{/var/run/syslogd.pid}). diff --git a/paths b/paths index a0117f2..8ef5430 100644 --- a/paths +++ b/paths @@ -90,6 +90,7 @@ PATH_LASTLOG <utmp.h> $(localstatedir)/log/lastlog search:lastlog:/var/log:/var/ PATH_LOG <syslog.h> /dev/log PATH_KLOG <syslog.h> /dev/klog no PATH_LOGCONF $(sysconfdir)/syslog.conf +PATH_LOGCONFD $(sysconfdir)/syslog.d PATH_LOGIN x $(bindir)/login search:login PATH_LOGPID $(localstatedir)/run/syslog.pid PATH_NOLOGIN $(sysconfdir)/nologin diff --git a/syslogd/Makefile.am b/syslogd/Makefile.am index 889810f..dc607b6 100644 --- a/syslogd/Makefile.am +++ b/syslogd/Makefile.am @@ -28,7 +28,8 @@ syslogd_SOURCES = syslogd.c @PATHDEFS_MAKE@ AM_CPPFLAGS = $(PATHDEF_LOG) $(PATHDEF_KLOG) $(PATHDEF_LOGCONF) \ - $(PATHDEF_LOGPID) $(PATHDEF_CONSOLE) $(PATHDEF_UTMP) + $(PATHDEF_LOGCONFD) $(PATHDEF_LOGPID) $(PATHDEF_CONSOLE) \ + $(PATHDEF_UTMP) INCLUDES = -I$(top_srcdir)/libinetutils -I$(top_srcdir)/lib -I../lib diff --git a/syslogd/syslogd.c b/syslogd/syslogd.c index edde0c2..e2c83fb 100644 --- a/syslogd/syslogd.c +++ b/syslogd/syslogd.c @@ -116,6 +116,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <dirent.h> #include <unistd.h> #ifdef HAVE_STDARG_H @@ -144,6 +145,7 @@ int facilities_seen; const char *ConfFile = PATH_LOGCONF; /* Default Configuration file. */ +const char *ConfDir = PATH_LOGCONFD; /* Default Configuration directory. */ const char *PidFile = PATH_LOGPID; /* Default path to tuck pid. */ char ctty[] = PATH_CONSOLE; /* Default console to send message info. */ @@ -262,6 +264,7 @@ void doexit (int); void domark (int); void fprintlog (struct filed *, const char *, int, const char *); static int load_conffile (const char *, struct filed **); +static void load_confdir (struct filed **); void init (int); void logerror (const char *); void logmsg (int, const char *, const char *, int); @@ -340,6 +343,8 @@ static struct argp_option argp_options[] = { {"rcfile", 'f', "FILE", 0, "override configuration file (default: " PATH_LOGCONF ")", GRP+1}, + {"rcdir", 'D', "DIR", 0, "override configuration directory (default: " + PATH_LOGCONFD ")", GRP+1}, {"socket", 'p', "FILE", 0, "override default unix domain socket " PATH_LOG, GRP+1}, {"sync", 'S', NULL, 0, "force a file sync on every line", GRP+1}, @@ -411,6 +416,10 @@ parse_opt (int key, char *arg, struct argp_state *state) ConfFile = arg; break; + case 'D': + ConfDir = arg; + break; + case 'p': funix[0].name = arg; funix[0].fd = -1; @@ -1679,6 +1688,48 @@ load_conffile (const char *filename, struct filed **nextp) return 1; } +static void +load_confdir (struct filed **nextp) +{ + struct dirent *dent; + DIR *dir; + + if (!load_conffile (ConfFile, nextp)) + return; + + dir = opendir (ConfDir); + if (dir == NULL) + { + dbg_printf ("cannot open %s\n", ConfDir); + return; + } + + while ((dent = readdir (dir)) != NULL) + { + struct stat st; + char *file; + + if (asprintf (&file, "%s/%s", ConfDir, dent->d_name) < 0) + { + dbg_printf ("cannot allocate space for configuration filename\n"); + return; + } + + if (stat (file, &st) != 0) + { + dbg_printf ("cannot stat file configuration file\n"); + continue; + } + + if (S_ISREG (st.st_mode)) + load_conffile (file, nextp); + + free (file); + } + + closedir (dir); +} + /* INIT -- Initialize syslogd from configuration table. */ RETSIGTYPE init (int signo ARG_UNUSED) @@ -1726,7 +1777,7 @@ init (int signo ARG_UNUSED) /* Foreach line in the conf table, open that file. */ f = NULL; - load_conffile (ConfFile, nextp); + load_confdir (nextp); Initialized = 1; -- 1.6.5.4