From owner-freebsd-hackers Wed Dec 28 18:59:36 1994 Return-Path: hackers-owner Received: (from root@localhost) by freefall.cdrom.com (8.6.9/8.6.6) id SAA19292 for hackers-outgoing; Wed, 28 Dec 1994 18:59:36 -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 SAA19285 for ; Wed, 28 Dec 1994 18:59:31 -0800 Received: from Taronga.COM by UUCP-GW.CC.UH.EDU with UUCP id AA26389 (5.67a/IDA-1.5 for freebsd.org!hackers); Wed, 28 Dec 1994 20:42:55 -0600 Received: by bonkers.taronga.com (smail2.5p) id AA13031; 28 Dec 94 20:23:13 CST (Wed) Received: (from peter@localhost) by bonkers.taronga.com (8.6.8/8.6.6) id UAA13028 for hackers@freebsd.org; Wed, 28 Dec 1994 20:23:12 -0600 From: Peter da Silva Message-Id: <199412290223.UAA13028@bonkers.taronga.com> Subject: Re: syslogd changes, second cut To: hackers@freebsd.org Date: Wed, 28 Dec 1994 20:23:11 -0600 (CST) In-Reply-To: <199412290157.RAA02273@gndrsh.aac.dev.com> from "Rodney W. Grimes" at Dec 28, 94 05:57:40 pm X-Mailer: ELM [version 2.4 PL23] Content-Type: text Content-Length: 9253 Sender: hackers-owner@freebsd.org Precedence: bulk Rod Grimes sent me a few nitpicks, and I eyeballed the sources and found some more problems, including a file parsing bug (running off the end of a string) so I've rewrapped the whole thing... *** syslogd.c.orig Wed Dec 28 16:08:54 1994 --- syslogd.c Wed Dec 28 20:03:09 1994 *************** *** 62,67 **** --- 62,69 ---- * 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 */ *************** *** 83,88 **** --- 85,91 ---- #include #include #include + #include #include #include *************** *** 129,134 **** --- 132,138 ---- 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 **** --- 471,478 ---- int omask, msglen; char *timestamp; time_t time(); + char prog[NAME_MAX+1]; + int i; dprintf("logmsg: pri %o, flags %x, from %s, msg %s\n", pri, flags, from, msg); *************** *** 490,495 **** --- 496,507 ---- msglen -= 16; } + /* skip leading blanks */ + while(isspace(*msg)) { + msg++; + msglen--; + } + /* extract facility and priority level */ if (flags & MARK) fac = LOG_NFACILITIES; *************** *** 497,502 **** --- 509,522 ---- 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; *************** *** 514,519 **** --- 534,543 ---- 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 **** --- 881,887 ---- register struct filed *f, *next, **nextp; register char *p; char cline[BUFSIZ]; + char prog[NAME_MAX]; dprintf("init\n"); *************** *** 878,883 **** --- 903,909 ---- 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; } --- 913,921 ---- 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 */ --- 924,965 ---- * 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 == 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 = 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 **** --- 991,999 ---- 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; --- 1006,1015 ---- * 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 */ --- 1019,1025 ---- 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 **** --- 1027,1041 ---- 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';) { *** syslog.conf.5.orig Wed Dec 28 16:42:44 1994 --- syslog.conf.5 Wed Dec 28 20:18:06 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,55 ---- file is the configuration file for the .Xr syslogd 8 program. ! It consists of ! blocks of lines separated by ! .Em program ! specifications, ! with each line containing two fields: the .Em selector field which specifies the types of messages and priorities to which the line applies, and an *************** *** 99,117 **** .Xr syslog library routine. .Pp See .Xr syslog 3 for a further descriptions of both the .Em facility and .Em level ! keywords and their significance. .Pp If a received message matches the specified .Em facility and is of the specified .Em level .Em (or a higher level) , the action specified in the .Em action field will be taken. --- 103,142 ---- .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 + or + .Em !prog + (the former is for compatibility with the previous syslogd, if one is sharing + syslog.conf files, for example) + 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 .Em facility and .Em level ! keywords and their significance. It's preferred that selections be made on ! .Em facility ! rather than ! .Em program , ! since the latter can easily vary in a networked environment. In some cases, ! though, an appropriate ! .Em facility ! simply doesn't exist (for example, ! .Em ftpd ! logs under LOG_DAEMON along with a myriad other programs). .Pp If a received message matches the specified .Em facility 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 --- 158,167 ---- .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 **** --- 234,243 ---- # Save mail and news errors of level err and higher in a # special file. uucp,news.crit /var/log/spoolerr + + # Save ftpd transactions along with mail and news + !ftpd + *.* /var/log/spoolerr .Ed .Sh FILES .Bl -tag -width /etc/syslog.conf -compact