diff --git a/man/syslogd.8 b/man/syslogd.8 index 444dacf..7678860 100644 --- a/man/syslogd.8 +++ b/man/syslogd.8 @@ -14,7 +14,6 @@ .Sh SYNOPSIS .Nm .Op Fl ?46Adhnrv -.Op Fl a Ar SOCK .Op Fl b Ar :SVC .Op Fl f Ar FILE .Op Fl l Ar HOST[:HOST] @@ -94,18 +93,6 @@ tries to send the message to only one address even if the host has more than one A or AAAA record. If this option is specified, .Nm tries to send the message to all addresses. -.It Fl a Ar SOCK -Using this argument you can specify additional sockets from that -.Nm -has to listen to. This is needed if you're going to let some daemon -run within a -.Xr chroot 8 -environment. You can use up to 19 additional sockets. If your -environment needs even more, you have to increase the symbol -.Ql MAXFUNIX -within the -.Pa syslogd.c -source file. .It Fl b Ar :service Bind to a specific port. The port can be specified as a service name or number. The default service is @@ -159,6 +146,16 @@ The default is .It Fl p Ar SOCK Specify an alternate UNIX domain socket instead of the default .Pa /dev/log . +When a single +.Fl p +option is specified, the default pathname is replaced with the specified +one. When two or more +.Fl p +options are specified, the remaining pathnames are treated as additional +log sockets. This might be needed when running applications in +containers or a +.Xr chroot 8 +environment. In total 20 UNIX domain sockets are supported. .It Fl R Ar size[:count] Enable built-in support for log rotation of files listed in .Pa /etc/syslog.conf . diff --git a/src/syslogd.c b/src/syslogd.c index 7be5dfb..170a4b9 100644 --- a/src/syslogd.c +++ b/src/syslogd.c @@ -110,11 +110,9 @@ static int restart = 0; #define MAXFUNIX 20 -int nfunix = 1; -char *funixn[MAXFUNIX] = { _PATH_LOG }; -int funix[MAXFUNIX] = { - -1, -}; +int nfunix; +char *funixn[MAXFUNIX]; +int funix[MAXFUNIX]; /* * Intervals at which we flush out "message repeated" messages, @@ -199,12 +197,12 @@ int main(int argc, char *argv[]) int num_fds, maxfds; int i, ch; - for (i = 1; i < MAXFUNIX; i++) { - funixn[i] = ""; + for (i = 0; i < MAXFUNIX; i++) { + funixn[i] = NULL; funix[i] = -1; } - while ((ch = getopt(argc, argv, "46Aa:b:dhHf:l:m:nP:p:R:rs:v?")) != EOF) { + while ((ch = getopt(argc, argv, "46Ab:dhHf:l:m:nP:p:R:rs:v?")) != EOF) { switch ((char)ch) { case '4': family = PF_INET; @@ -218,13 +216,6 @@ int main(int argc, char *argv[]) send_to_all++; break; - case 'a': - if (nfunix < MAXFUNIX) - funixn[nfunix++] = optarg; - else - fprintf(stderr, "Out of descriptors, ignoring %s\n", optarg); - break; - case 'b': ptr = strchr(optarg, ':'); if (ptr) @@ -269,7 +260,10 @@ int main(int argc, char *argv[]) break; case 'p': /* path to regular log socket */ - funixn[0] = optarg; + if (nfunix < MAXFUNIX) + funixn[nfunix++] = optarg; + else + fprintf(stderr, "Max log sockets reached, ignoring %s\n", optarg); break; case 'R': @@ -306,6 +300,10 @@ int main(int argc, char *argv[]) if ((argc -= optind)) usage(1); + /* Default to _PATH_LOG for the UNIX domain socket */ + if (!nfunix) + funixn[nfunix++] = _PATH_LOG; + if ((!Foreground) && (!Debug)) { signal(SIGTERM, doexit); chdir("/"); @@ -2295,13 +2293,23 @@ void init(void) fhead = newf; for (i = 0; i < nfunix; i++) { - if (funix[i] != -1) - /* Don't close the socket, preserve it instead - close(funix[i]); - */ + /* + * UNIX domain sockets are given on the command line, so + * there's no need to close them if they're already + * open. Doing so would only cause loss of any already + * buffered messages + */ + logit("Checking if we should open UNIX socket %s ...", funixn[i]); + if (funix[i] != -1) { + logit(" nope, already open.\n"); continue; - if ((funix[i] = create_unix_socket(funixn[i])) != -1) - logit("Opened UNIX socket `%s'.\n", funixn[i]); + } + + funix[i] = create_unix_socket(funixn[i]); + if (funix[i] == -1) + logit(" failed, error %d: %s\n", strerror(errno)); + else + logit(" opened successfully\n", funixn[i]); } if (cffwd() || AcceptRemote) {