summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authorguido <guido@FreeBSD.org>1998-06-25 19:39:19 +0000
committerguido <guido@FreeBSD.org>1998-06-25 19:39:19 +0000
commitc18356075281bd45361256bb8e520a36eb9d3dd4 (patch)
tree7fe222ac8f7f8f55744cb7e40e972773ce552bc5 /usr.sbin
parentbf3ddf370de2e66b091a53016b595372edd2e6de (diff)
downloadFreeBSD-src-c18356075281bd45361256bb8e520a36eb9d3dd4.zip
FreeBSD-src-c18356075281bd45361256bb8e520a36eb9d3dd4.tar.gz
Implement new argument -l (OpenBSD has -a but we already use that).
This allows one to specify additional sockets in the unix domain that syslogd listens to. Its primary use is to create log sockets in chroot environments. Obtained from:OpenBSD (with a bug fixed d
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/syslogd/syslogd.813
-rw-r--r--usr.sbin/syslogd/syslogd.c144
2 files changed, 98 insertions, 59 deletions
diff --git a/usr.sbin/syslogd/syslogd.8 b/usr.sbin/syslogd/syslogd.8
index 2ce370d..d3ee321 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 5c3420a..e2fa9af 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;
+
+ 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(20, (fd_set *)&readfds, (fd_set *)NULL,
- (fd_set *)NULL, tvp);
+ /*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);
}
OpenPOWER on IntegriCloud