diff options
| author | Guido van Rooij <guido@FreeBSD.org> | 1998-06-25 19:39:19 +0000 |
|---|---|---|
| committer | Guido van Rooij <guido@FreeBSD.org> | 1998-06-25 19:39:19 +0000 |
| commit | 79962d3ede6fcb8dcd7cd221b3552743da75ed1c (patch) | |
| tree | 2c65e5624d3661425ebcfafc996b5bf5f33859e4 /usr.sbin/syslogd | |
| parent | 7d0cc08e7f7f17d088d78f4b1bf68b00eb5502d2 (diff) | |
Notes
Diffstat (limited to 'usr.sbin/syslogd')
| -rw-r--r-- | usr.sbin/syslogd/syslogd.8 | 13 | ||||
| -rw-r--r-- | usr.sbin/syslogd/syslogd.c | 144 |
2 files changed, 98 insertions, 59 deletions
diff --git a/usr.sbin/syslogd/syslogd.8 b/usr.sbin/syslogd/syslogd.8 index 2ce370d77fc9..d3ee32103089 100644 --- a/usr.sbin/syslogd/syslogd.8 +++ b/usr.sbin/syslogd/syslogd.8 @@ -30,7 +30,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)syslogd.8 8.1 (Berkeley) 6/6/93 -.\" $Id: syslogd.8,v 1.13 1997/10/20 12:55:48 charnier Exp $ +.\" $Id: syslogd.8,v 1.14 1998/04/24 17:32:20 phk Exp $ .\" .Dd October 12, 1995 .Dt SYSLOGD 8 @@ -45,6 +45,7 @@ .Op Fl f Ar config_file .Op Fl m Ar mark_interval .Op Fl p Ar log_socket +.Op Fl l Ar path .Sh DESCRIPTION The .Nm @@ -115,9 +116,17 @@ Select the number of minutes between .Dq mark messages; the default is 20 minutes. .It Fl p -Specify the pathname of an alternate log socket; +Specify the pathname of an alternate log socket to be used instead; the default is .Pa /var/run/log . +.It Fl l +Specify a location where +.Nm syslogd +should place an additional log socket. +Up to 19 additional logging sockets can be specified. +The primary use for this is to place additional log sockets in +.Pa /dev/log +of various chroot filespaces. .It Fl s Operate in secure mode. Do not log messages from remote machines. The messages will be received and counted and a log entry produced every time diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c index 5c3420a6d980..e2fa9afd0583 100644 --- a/usr.sbin/syslogd/syslogd.c +++ b/usr.sbin/syslogd/syslogd.c @@ -42,7 +42,7 @@ static const char copyright[] = static char sccsid[] = "@(#)syslogd.c 8.3 (Berkeley) 4/4/94"; #endif static const char rcsid[] = - "$Id: syslogd.c,v 1.33 1998/06/10 04:34:56 julian Exp $"; + "$Id: syslogd.c,v 1.34 1998/06/24 23:50:20 julian Exp $"; #endif /* not lint */ /* @@ -111,17 +111,20 @@ static const char rcsid[] = #define SYSLOG_NAMES #include <sys/syslog.h> -const char *LogName = _PATH_LOG; const char *ConfFile = _PATH_LOGCONF; const char *PidFile = _PATH_LOGPID; const char ctty[] = _PATH_CONSOLE; -#define FDMASK(fd) (1 << (fd)) - #define dprintf if (Debug) printf #define MAXUNAMES 20 /* maximum number of user names */ +#define MAXFUNIX 20 + +int nfunix = 1; +char *funixn[MAXFUNIX] = { _PATH_LOG }; +int funix[MAXFUNIX]; + /* * Flags to logmsg(). */ @@ -250,7 +253,6 @@ int MarkSeq = 0; /* mark sequence number */ int SecureMode = 0; /* when true, receive only unix domain socks */ u_int Vogons = 0; /* packets arriving in SecureMode */ -int created_lsock = 0; /* Flag if local socket created */ char bootfile[MAXLINE+1]; /* booted kernel file */ struct allowedpeer *AllowedPeers; @@ -283,7 +285,7 @@ main(argc, argv) int argc; char *argv[]; { - int ch, funix, i, inetm, fklog, klogm, len; + int ch, i, l, fklog, len; struct sockaddr_un sunx, fromunix; struct sockaddr_in sin, frominet; FILE *fp; @@ -291,7 +293,7 @@ main(argc, argv) struct timeval tv, *tvp; pid_t ppid; - while ((ch = getopt(argc, argv, "a:dsf:m:p:")) != -1) + while ((ch = getopt(argc, argv, "a:dl:sf:m:p:")) != -1) switch(ch) { case 'd': /* debug */ Debug++; @@ -307,11 +309,19 @@ main(argc, argv) MarkInterval = atoi(optarg) * 60; break; case 'p': /* path */ - LogName = optarg; + funixn[0] = optarg; break; case 's': /* no network mode */ SecureMode++; break; + case 'l': + if (nfunix < MAXFUNIX) + funixn[nfunix++] = optarg; + else + fprintf(stderr, + "syslogd: out of descriptors, ignoring %s\n", + optarg); + break; case '?': default: usage(); @@ -351,22 +361,23 @@ main(argc, argv) #ifndef SUN_LEN #define SUN_LEN(unp) (strlen((unp)->sun_path) + 2) #endif - memset(&sunx, 0, sizeof(sunx)); - sunx.sun_family = AF_UNIX; - (void)strncpy(sunx.sun_path, LogName, sizeof(sunx.sun_path)); - (void)unlink(LogName); - funix = socket(AF_UNIX, SOCK_DGRAM, 0); - if (funix < 0 || - bind(funix, (struct sockaddr *)&sunx, SUN_LEN(&sunx)) < 0 || - chmod(LogName, 0666) < 0) { - (void) snprintf(line, sizeof line, "cannot create %s", LogName); - logerror(line); - dprintf("cannot create %s (%d)\n", LogName, errno); - die(0); - } else - created_lsock = 1; - - inetm = 0; + for (i = 0; i < nfunix; i++) { + memset(&sunx, 0, sizeof(sunx)); + sunx.sun_family = AF_UNIX; + (void)strncpy(sunx.sun_path, funixn[i], sizeof(sunx.sun_path)); + funix[i] = socket(AF_UNIX, SOCK_DGRAM, 0); + if (funix[i] < 0 || + bind(funix[i], (struct sockaddr *)&sunx, + SUN_LEN(&sunx)) < 0 || + chmod(funixn[i], 0666) < 0) { + (void) snprintf(line, sizeof line, + "cannot create %s", funixn[i]); + logerror(line); + dprintf("cannot create %s (%d)\n", funixn[i], errno); + if (i == 0) + die(0); + } + } finet = socket(AF_INET, SOCK_DGRAM, 0); if (finet >= 0) { struct servent *sp; @@ -385,16 +396,11 @@ main(argc, argv) logerror("bind"); if (!Debug) die(0); - } else - inetm = FDMASK(finet); + } } - if ((fklog = open(_PATH_KLOG, O_RDONLY, 0)) >= 0) - klogm = FDMASK(fklog); - else { + if ((fklog = open(_PATH_KLOG, O_RDONLY, 0)) < 0) dprintf("can't open %s (%d)\n", _PATH_KLOG, errno); - klogm = 0; - } /* tuck my process id away */ fp = fopen(PidFile, "w"); @@ -412,11 +418,31 @@ main(argc, argv) tv.tv_sec = tv.tv_usec = 0; for (;;) { - int nfds, readfds = FDMASK(funix) | inetm | klogm; + fd_set readfds; + int nfds = 0; - dprintf("readfds = %#x\n", readfds); - nfds = select(20, (fd_set *)&readfds, (fd_set *)NULL, - (fd_set *)NULL, tvp); + FD_ZERO(&readfds); + if (fklog != -1) { + FD_SET(fklog, &readfds); + if (fklog > nfds) + nfds = fklog; + } + if (finet != -1) { + FD_SET(finet, &readfds); + if (finet > nfds) + nfds = finet; + } + for (i = 0; i < nfunix; i++) { + if (funix[i] != -1) { + FD_SET(funix[i], &readfds); + if (funix[i] > nfds) + nfds = funix[i]; + } + } + + /*dprintf("readfds = %#x\n", readfds);*/ + nfds = select(nfds, &readfds, (fd_set *)NULL, + (fd_set *)NULL, tvp); if (nfds == 0) { if (tvp) { tvp = NULL; @@ -430,8 +456,8 @@ main(argc, argv) logerror("select"); continue; } - dprintf("got a message (%d, %#x)\n", nfds, readfds); - if (readfds & klogm) { + /*dprintf("got a message (%d, %#x)\n", nfds, readfds);*/ + if (fklog != -1 && FD_ISSET(fklog, &readfds)) { i = read(fklog, line, MAXLINE - 1); if (i > 0) { line[i] = '\0'; @@ -439,22 +465,11 @@ main(argc, argv) } else if (i < 0 && errno != EINTR) { logerror("klog"); fklog = -1; - klogm = 0; } } - if (readfds & FDMASK(funix)) { - len = sizeof(fromunix); - i = recvfrom(funix, line, MAXLINE, 0, - (struct sockaddr *)&fromunix, &len); - if (i > 0) { - line[i] = '\0'; - printline(LocalHostName, line); - } else if (i < 0 && errno != EINTR) - logerror("recvfrom unix"); - } - if (readfds & inetm) { + if (finet != -1 && FD_ISSET(finet, &readfds)) { len = sizeof(frominet); - i = recvfrom(finet, line, MAXLINE, 0, + l = recvfrom(finet, line, MAXLINE, 0, (struct sockaddr *)&frominet, &len); if (SecureMode) { Vogons++; @@ -464,14 +479,26 @@ main(argc, argv) logmsg(LOG_SYSLOG|LOG_AUTH, line, LocalHostName, ADDDATE); } - } else if (i > 0) { - line[i] = '\0'; + } else if (l > 0) { + line[l] = '\0'; hname = cvthname(&frominet); if (validate(&frominet, hname)) printline(hname, line); - } else if (i < 0 && errno != EINTR) + } else if (l < 0 && errno != EINTR) logerror("recvfrom inet"); } + for (i = 0; i < nfunix; i++) { + if (funix[i] != -1 && FD_ISSET(funix[i], &readfds)) { + len = sizeof(fromunix); + l = recvfrom(funix[i], line, MAXLINE, 0, + (struct sockaddr *)&fromunix, &len); + if (l > 0) { + line[l] = '\0'; + printline(LocalHostName, line); + } else if (l < 0 && errno != EINTR) + logerror("recvfrom unix"); + } + } } } @@ -479,9 +506,10 @@ static void usage() { - fprintf(stderr, "%s\n%s\n", + fprintf(stderr, "%s\n%s\n%s\n", "usage: syslogd [-ds] [-a allowed_peer] [-f config_file]", - " [-m mark_interval] [-p log_socket]"); + " [-m mark_interval] [-p log_socket]", + " [-l log_socket]"); exit(1); } @@ -1063,6 +1091,7 @@ die(signo) struct filed *f; int was_initialized; char buf[100]; + int i; was_initialized = Initialized; Initialized = 0; /* Don't log SIGCHLDs. */ @@ -1080,8 +1109,9 @@ die(signo) errno = 0; logerror(buf); } - if (created_lsock) - (void)unlink(LogName); + for (i = 0; i < nfunix; i++) + if (funixn[i] && funix[i] != -1) + (void)unlink(funixn[i]); exit(1); } |
