summaryrefslogtreecommitdiffstats
path: root/usr.sbin/syslogd
diff options
context:
space:
mode:
authorwollman <wollman@FreeBSD.org>1994-12-29 22:02:25 +0000
committerwollman <wollman@FreeBSD.org>1994-12-29 22:02:25 +0000
commitbd143034a7c6da8a8e5ab1b385c95202043510ab (patch)
treee77a4ca489576a8f506656fc4e2d3896c7543fc4 /usr.sbin/syslogd
parente7f0ff7369c0a0e5800ad6dbaaa7a44bd2b60641 (diff)
downloadFreeBSD-src-bd143034a7c6da8a8e5ab1b385c95202043510ab.zip
FreeBSD-src-bd143034a7c6da8a8e5ab1b385c95202043510ab.tar.gz
Extend syslogd to allow selection of log destinations by program.
Use getbootfile() to determine the kernel name. Submitted by: Peter da Silva
Diffstat (limited to 'usr.sbin/syslogd')
-rw-r--r--usr.sbin/syslogd/syslogd.c81
1 files changed, 72 insertions, 9 deletions
diff --git a/usr.sbin/syslogd/syslogd.c b/usr.sbin/syslogd/syslogd.c
index 47592d5..d1a79d7 100644
--- a/usr.sbin/syslogd/syslogd.c
+++ b/usr.sbin/syslogd/syslogd.c
@@ -61,6 +61,8 @@ static char sccsid[] = "@(#)syslogd.c 8.3 (Berkeley) 4/4/94";
* Author: Eric Allman
* extensive changes by Ralph Campbell
* more extensive changes by Eric Allman (again)
+ * Extension to log by program name as well as facility and priority
+ * by Peter da Silva.
*/
#define MAXLINE 1024 /* maximum line length */
@@ -79,6 +81,8 @@ static char sccsid[] = "@(#)syslogd.c 8.3 (Berkeley) 4/4/94";
#include <sys/un.h>
#include <sys/time.h>
#include <sys/resource.h>
+#include <sys/syslimits.h>
+#include <paths.h>
#include <netinet/in.h>
#include <netdb.h>
@@ -130,6 +134,7 @@ struct filed {
short f_file; /* file descriptor */
time_t f_time; /* time this was last written */
u_char f_pmask[LOG_NFACILITIES+1]; /* priority mask */
+ char *f_program; /* program this applies to */
union {
char f_uname[MAXUNAMES][UT_NAMESIZE+1];
struct {
@@ -186,7 +191,7 @@ int Initialized = 0; /* set when we have initialized ourselves */
int MarkInterval = 20 * 60; /* interval between marks in seconds */
int MarkSeq = 0; /* mark sequence number */
-void cfline __P((char *, struct filed *));
+void cfline __P((char *, struct filed *, char *));
char *cvthname __P((struct sockaddr_in *));
int decode __P((const char *, CODE *));
void die __P((int));
@@ -428,7 +433,8 @@ printsys(msg)
int c, pri, flags;
char *lp, *p, *q, line[MAXLINE + 1];
- (void)strcpy(line, "kernel: ");
+ (void)strcpy(line, getbootfile());
+ (void)strcat(line, ": ");
lp = line + strlen(line);
for (p = msg; *p != '\0'; ) {
flags = SYNC_FILE | ADDDATE; /* fsync file after write */
@@ -469,6 +475,8 @@ logmsg(pri, msg, from, flags)
struct filed *f;
int fac, msglen, omask, prilev;
char *timestamp;
+ char prog[NAME_MAX+1];
+ int i;
dprintf("logmsg: pri %o, flags %x, from %s, msg %s\n",
pri, flags, from, msg);
@@ -492,6 +500,12 @@ logmsg(pri, msg, from, flags)
msglen -= 16;
}
+ /* skip leading blanks */
+ while(isspace(*msg)) {
+ msg++;
+ msglen--;
+ }
+
/* extract facility and priority level */
if (flags & MARK)
fac = LOG_NFACILITIES;
@@ -499,6 +513,14 @@ logmsg(pri, msg, from, flags)
fac = LOG_FAC(pri);
prilev = LOG_PRI(pri);
+ /* extract program name */
+ for(i = 0; i < NAME_MAX; i++) {
+ if(!isalnum(msg[i]))
+ break;
+ prog[i] = msg[i];
+ }
+ prog[i] = 0;
+
/* log the message to the particular outputs */
if (!Initialized) {
f = &consfile;
@@ -516,6 +538,10 @@ logmsg(pri, msg, from, flags)
if (f->f_pmask[fac] < prilev ||
f->f_pmask[fac] == INTERNAL_NOPRI)
continue;
+ /* skip messages with the incorrect program name */
+ if(f->f_program)
+ if(strcmp(prog, f->f_program) != 0)
+ continue;
if (f->f_type == F_CONSOLE && (flags & IGN_CONS))
continue;
@@ -866,6 +892,7 @@ init(signo)
struct filed *f, *next, **nextp;
char *p;
char cline[LINE_MAX];
+ char prog[NAME_MAX+1];
dprintf("init\n");
@@ -887,6 +914,7 @@ init(signo)
break;
}
next = f->f_next;
+ if(f->f_program) free(f->f_program);
free((char *)f);
}
Files = NULL;
@@ -896,9 +924,9 @@ init(signo)
if ((cf = fopen(ConfFile, "r")) == NULL) {
dprintf("cannot open %s\n", ConfFile);
*nextp = (struct filed *)calloc(1, sizeof(*f));
- cfline("*.ERR\t/dev/console", *nextp);
+ cfline("*.ERR\t/dev/console", *nextp, "*");
(*nextp)->f_next = (struct filed *)calloc(1, sizeof(*f));
- cfline("*.PANIC\t*", (*nextp)->f_next);
+ cfline("*.PANIC\t*", (*nextp)->f_next, "*");
Initialized = 1;
return;
}
@@ -907,22 +935,44 @@ init(signo)
* Foreach line in the conf table, open that file.
*/
f = NULL;
+ strcpy(prog, "*");
while (fgets(cline, sizeof(cline), cf) != NULL) {
/*
* check for end-of-section, comments, strip off trailing
- * spaces and newline character.
+ * spaces and newline character. #!prog is treated specially:
+ * following lines apply only to that program.
*/
for (p = cline; isspace(*p); ++p)
continue;
- if (*p == NULL || *p == '#')
+ if (*p == 0)
+ continue;
+ if(*p == '#') {
+ p++;
+ if(*p!='!')
+ continue;
+ }
+ if(*p=='!') {
+ p++;
+ while(isspace(*p)) p++;
+ if(!*p) {
+ strcpy(prog, "*");
+ continue;
+ }
+ for(i = 0; i < NAME_MAX; i++) {
+ if(!isalnum(p[i]))
+ break;
+ prog[i] = p[i];
+ }
+ prog[i] = 0;
continue;
+ }
for (p = strchr(cline, '\0'); isspace(*--p);)
continue;
*++p = '\0';
f = (struct filed *)calloc(1, sizeof(*f));
*nextp = f;
nextp = &f->f_next;
- cfline(cline, f);
+ cfline(cline, f, prog);
}
/* close the configuration file */
@@ -954,6 +1004,9 @@ init(signo)
printf("%s, ", f->f_un.f_uname[i]);
break;
}
+ if(f->f_program) {
+ printf(" (%s)", f->f_program);
+ }
printf("\n");
}
}
@@ -966,16 +1019,17 @@ init(signo)
* Crack a configuration file line
*/
void
-cfline(line, f)
+cfline(line, f, prog)
char *line;
struct filed *f;
+ char *prog;
{
struct hostent *hp;
int i, pri;
char *bp, *p, *q;
char buf[MAXLINE], ebuf[100];
- dprintf("cfline(%s)\n", line);
+ dprintf("cfline(\"%s\", f, \"%s\")\n", line, prog);
errno = 0; /* keep strerror() stuff out of logerror messages */
@@ -984,6 +1038,15 @@ cfline(line, f)
for (i = 0; i <= LOG_NFACILITIES; i++)
f->f_pmask[i] = INTERNAL_NOPRI;
+ /* save program name if any */
+ if(prog && *prog=='*') prog = NULL;
+ if(prog) {
+ f->f_program = calloc(1, strlen(prog)+1);
+ if(f->f_program) {
+ strcpy(f->f_program, prog);
+ }
+ }
+
/* scan through the list of selectors */
for (p = line; *p && *p != '\t';) {
OpenPOWER on IntegriCloud