From owner-freebsd-hackers Wed Dec 28 15:27:17 1994 Return-Path: hackers-owner Received: (from root@localhost) by freefall.cdrom.com (8.6.9/8.6.6) id PAA10860 for hackers-outgoing; Wed, 28 Dec 1994 15:27:17 -0800 Received: from UUCP-GW.CC.UH.EDU (root@UUCP-GW.CC.UH.EDU [129.7.1.11]) by freefall.cdrom.com (8.6.9/8.6.6) with SMTP id PAA10854 for ; Wed, 28 Dec 1994 15:27:12 -0800 Received: from Taronga.COM by UUCP-GW.CC.UH.EDU with UUCP id AA25034 (5.67a/IDA-1.5 for freebsd.org!hackers); Wed, 28 Dec 1994 17:10:04 -0600 Received: by bonkers.taronga.com (smail2.5p) id AA07960; 28 Dec 94 16:50:16 CST (Wed) Received: (from peter@localhost) by bonkers.taronga.com (8.6.8/8.6.6) id QAA07957 for hackers@freebsd.org; Wed, 28 Dec 1994 16:50:15 -0600 From: Peter da Silva Message-Id: <199412282250.QAA07957@bonkers.taronga.com> Subject: syslogd changes, first cut To: hackers@freebsd.org Date: Wed, 28 Dec 1994 16:50:14 -0600 (CST) X-Mailer: ELM [version 2.4 PL23] Content-Type: text Content-Length: 8803 Sender: hackers-owner@freebsd.org Precedence: bulk To minimize the impact of changing syslog, I use: #!progname syslog lines that only apply to progname This keeps syslog from blowing up if you give the new syslog format to old syslogd, or confuse the new syslogd with old files. The worst that will happen is you will log more info than you expected. Relative to 1.1.5.1 syslogd. I can't imagine the new one is significantly different. *** syslog.conf.5.orig Wed Dec 28 16:42:44 1994 --- syslog.conf.5 Wed Dec 28 16:38:12 1994 *************** *** 45,51 **** file is the configuration file for the .Xr syslogd 8 program. ! It consists of lines with two fields: the .Em selector field which specifies the types of messages and priorities to which the line applies, and an --- 45,53 ---- file is the configuration file for the .Xr syslogd 8 program. ! It consists of ! blocks of lines separated by #! comments ! lines with two fields: the .Em selector field which specifies the types of messages and priorities to which the line applies, and an *************** *** 99,104 **** --- 101,112 ---- .Xr syslog library routine. .Pp + Each block of lines is separated from the previous block by a tag. The tag + is a line beginning with + .Em #!prog + and each block will be associated with calls to syslog from that specific + program. + .Pp See .Xr syslog 3 for a further descriptions of both the *************** *** 112,117 **** --- 120,127 ---- and is of the specified .Em level .Em (or a higher level) , + and the first word in the message after the date matches the + .Em program , the action specified in the .Em action field will be taken. *************** *** 133,140 **** .Pp An asterisk (``*'') can be used to specify all .Em facilities or all ! .Em levels . .Pp The special .Em facility --- 143,152 ---- .Pp An asterisk (``*'') can be used to specify all .Em facilities + all + .Em levels or all ! .Em programs . .Pp The special .Em facility *************** *** 207,212 **** --- 219,227 ---- # Save mail and news errors of level err and higher in a # special file. uucp,news.crit /var/log/spoolerr + + #!ftpd Log FTP transactions as well + daemon /var/log/spoolerr .Ed .Sh FILES .Bl -tag -width /etc/syslog.conf -compact *** syslogd.c.orig Wed Dec 28 16:08:54 1994 --- syslogd.c Wed Dec 28 16:22:48 1994 *************** *** 58,67 **** --- 58,70 ---- * MAXLINE -- the maximimum line length that can be handled. * DEFUPRI -- the default priority for user messages * DEFSPRI -- the default priority for kernel messages + * MAXPROGNAMELEN -- maximum length for a program tag * * 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 */ *************** *** 69,74 **** --- 72,78 ---- #define DEFUPRI (LOG_USER|LOG_NOTICE) #define DEFSPRI (LOG_KERN|LOG_CRIT) #define TIMERINTVL 30 /* interval for checking flush, mark */ + #define MAXPROGNAMELEN 256 #include #include *************** *** 129,134 **** --- 133,139 ---- 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 { *************** *** 467,472 **** --- 472,479 ---- int omask, msglen; char *timestamp; time_t time(); + char prog[MAXPROGNAMELEN+1]; + int i; dprintf("logmsg: pri %o, flags %x, from %s, msg %s\n", pri, flags, from, msg); *************** *** 490,495 **** --- 497,508 ---- msglen -= 16; } + /* skip leading blanks */ + while(isspace(*msg)) { + msg++; + msglen--; + } + /* extract facility and priority level */ if (flags & MARK) fac = LOG_NFACILITIES; *************** *** 497,502 **** --- 510,524 ---- fac = LOG_FAC(pri); prilev = LOG_PRI(pri); + /* extract program name */ + for(i = 0; i < MAXPROGNAMELEN; i++) { + if(isalnum(msg[i])) + prog[i] = msg[i]; + else + break; + } + prog[i] = 0; + /* log the message to the particular outputs */ if (!Initialized) { f = &consfile; *************** *** 514,519 **** --- 536,545 ---- 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; *************** *** 857,862 **** --- 883,889 ---- register struct filed *f, *next, **nextp; register char *p; char cline[BUFSIZ]; + char prog[MAXPROGNAMELEN]; dprintf("init\n"); *************** *** 878,883 **** --- 905,911 ---- break; } next = f->f_next; + if(f->f_program) free(f->f_program); free((char *) f); } Files = NULL; *************** *** 887,895 **** 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); (*nextp)->f_next = (struct filed *)calloc(1, sizeof(*f)); ! cfline("*.PANIC\t*", (*nextp)->f_next); Initialized = 1; return; } --- 915,923 ---- 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, "*"); (*nextp)->f_next = (struct filed *)calloc(1, sizeof(*f)); ! cfline("*.PANIC\t*", (*nextp)->f_next, "*"); Initialized = 1; return; } *************** *** 898,917 **** * Foreach line in the conf table, open that file. */ f = NULL; while (fgets(cline, sizeof cline, cf) != NULL) { /* * check for end-of-section, comments, strip off trailing ! * spaces and newline character. */ for (p = cline; isspace(*p); ++p); ! if (*p == NULL || *p == '#') ! continue; for (p = index(cline, '\0'); isspace(*--p);); *++p = '\0'; f = (struct filed *)calloc(1, sizeof(*f)); *nextp = f; nextp = &f->f_next; ! cfline(cline, f); } /* close the configuration file */ --- 926,963 ---- * 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. #!prog is treated specially: ! * following lines apply only to that program. */ for (p = cline; isspace(*p); ++p); ! if (*p == NULL || *p == '#') { ! p++; ! if(*p=='!') { ! p++; ! while(isspace(*p)) p++; ! if(!*p) { ! strcpy(prog, "*"); ! continue; ! } ! for(i = 0; i < MAXPROGNAMELEN; i++) { ! if(!isalnum(p[i])) ! break; ! prog[i] = p[i]; ! } ! prog[i] = 0; ! continue; ! } ! } for (p = index(cline, '\0'); isspace(*--p);); *++p = '\0'; f = (struct filed *)calloc(1, sizeof(*f)); *nextp = f; nextp = &f->f_next; ! cfline(cline, f, prog); } /* close the configuration file */ *************** *** 943,948 **** --- 989,997 ---- printf("%s, ", f->f_un.f_uname[i]); break; } + if(f->f_program) { + printf(" (%s)", f->f_program); + } printf("\n"); } } *************** *** 955,963 **** * Crack a configuration file line */ ! cfline(line, f) char *line; register struct filed *f; { register char *p; register char *q; --- 1004,1013 ---- * Crack a configuration file line */ ! cfline(line, f, prog) char *line; register struct filed *f; + char *prog; { register char *p; register char *q; *************** *** 967,973 **** struct hostent *hp; char buf[MAXLINE], ebuf[100]; ! dprintf("cfline(%s)\n", line); errno = 0; /* keep strerror() stuff out of logerror messages */ --- 1017,1023 ---- struct hostent *hp; char buf[MAXLINE], ebuf[100]; ! dprintf("cfline(\"%s\", f, \"%s\")\n", line, prog); errno = 0; /* keep strerror() stuff out of logerror messages */ *************** *** 975,980 **** --- 1025,1039 ---- bzero((char *) f, sizeof *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';) {