diff options
author | John Kohl <jtkohl@mit.edu> | 1989-03-23 06:12:15 +0000 |
---|---|---|
committer | John Kohl <jtkohl@mit.edu> | 1989-03-23 06:12:15 +0000 |
commit | 03e2b513dba7ab3430d885423dfb9e2ff42860dc (patch) | |
tree | 4ecdd0f2f0f6f4b606d548bdce89a74db8af9569 /clients/syslogd | |
parent | 0b4177aa3075a9fda1639be6ef7fdb17a9b2cc8d (diff) |
Initial revision
Diffstat (limited to 'clients/syslogd')
-rw-r--r-- | clients/syslogd/syslog.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/clients/syslogd/syslog.c b/clients/syslogd/syslog.c new file mode 100644 index 0000000..3bcc194 --- /dev/null +++ b/clients/syslogd/syslog.c @@ -0,0 +1,206 @@ +/* + * Copyright (c) 1983, 1988 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of California at Berkeley. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)syslog.c 5.14 (Berkeley) 5/20/88"; +#endif /* LIBC_SCCS and not lint */ + + +/* + * SYSLOG -- print message on log file + * + * This routine looks a lot like printf, except that it + * outputs to the log file instead of the standard output. + * Also: + * adds a timestamp, + * prints the module name in front of the message, + * has some other formatting types (or will sometime), + * adds a newline on the end of the message. + * + * The output of this routine is intended to be read by /etc/syslogd. + * + * Author: Eric Allman + * Modified to use UNIX domain IPC by Ralph Campbell + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/file.h> +#include <sys/signal.h> +#include <sys/syslog.h> +#include <netdb.h> +#include <strings.h> + +#define MAXLINE 1024 /* max message size */ +#define NULL 0 /* manifest */ + +#define PRIFAC(p) (((p) & LOG_FACMASK) >> 3) + /* XXX should be in <syslog.h> */ +#define IMPORTANT LOG_ERR + +static char logname[] = "/dev/log"; +static char ctty[] = "/dev/console"; + +static int LogFile = -1; /* fd for log */ +static int LogStat = 0; /* status bits, set by openlog() */ +static char *LogTag = "syslog"; /* string to tag the entry with */ +static int LogMask = 0xff; /* mask of priorities to be logged */ +static int LogFacility = LOG_USER; /* default facility code */ + +static struct sockaddr SyslogAddr; /* AF_UNIX address of local logger */ + +extern int errno, sys_nerr; +extern char *sys_errlist[]; + +syslog(pri, fmt, p0, p1, p2, p3, p4) + int pri; + char *fmt; +{ + char buf[MAXLINE + 1], outline[MAXLINE + 1]; + register char *b, *f, *o; + register int c; + long now; + int pid, olderrno = errno; + + /* see if we should just throw out this message */ + if ((unsigned) PRIFAC(pri) >= LOG_NFACILITIES || + (LOG_MASK(pri & LOG_PRIMASK) & LogMask) == 0 || + (pri &~ (LOG_PRIMASK|LOG_FACMASK)) != 0) + return; + if (LogFile < 0) + openlog(LogTag, LogStat | LOG_NDELAY, 0); + + /* set default facility if none specified */ + if ((pri & LOG_FACMASK) == 0) + pri |= LogFacility; + + /* build the message */ + o = outline; + (void)sprintf(o, "<%d>", pri); + o += strlen(o); + time(&now); + (void)sprintf(o, "%.15s ", ctime(&now) + 4); + o += strlen(o); + if (LogTag) { + strcpy(o, LogTag); + o += strlen(o); + } + if (LogStat & LOG_PID) { + (void)sprintf(o, "[%d]", getpid()); + o += strlen(o); + } + if (LogTag) { + strcpy(o, ": "); + o += 2; + } + + b = buf; + f = fmt; + while ((c = *f++) != '\0' && c != '\n' && b < &buf[MAXLINE]) { + if (c != '%') { + *b++ = c; + continue; + } + if ((c = *f++) != 'm') { + *b++ = '%'; + *b++ = c; + continue; + } + if ((unsigned)olderrno > sys_nerr) + (void)sprintf(b, "error %d", olderrno); + else + strcpy(b, sys_errlist[olderrno]); + b += strlen(b); + } + *b++ = '\n'; + *b = '\0'; + (void)sprintf(o, buf, p0, p1, p2, p3, p4); + c = strlen(outline); + if (c > MAXLINE) + c = MAXLINE; + + /* output the message to the local logger */ + if (sendto(LogFile, outline, c, 0, &SyslogAddr, sizeof SyslogAddr) >= 0) + return; + if (!(LogStat & LOG_CONS)) + return; + + /* output the message to the console */ + pid = vfork(); + if (pid == -1) + return; + if (pid == 0) { + int fd; + + signal(SIGALRM, SIG_DFL); + sigsetmask(sigblock(0L) & ~sigmask(SIGALRM)); + alarm(5); + fd = open(ctty, O_WRONLY); + alarm(0); + strcat(o, "\r"); + o = index(outline, '>') + 1; + write(fd, o, c + 1 - (o - outline)); + close(fd); + _exit(0); + } + if (!(LogStat & LOG_NOWAIT)) + while ((c = wait((int *)0)) > 0 && c != pid) + ; +} + +/* + * OPENLOG -- open system log + */ + +openlog(ident, logstat, logfac) + char *ident; + int logstat, logfac; +{ + if (ident != NULL) + LogTag = ident; + LogStat = logstat; + if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0) + LogFacility = logfac; + if (LogFile >= 0) + return; + SyslogAddr.sa_family = AF_UNIX; + strncpy(SyslogAddr.sa_data, logname, sizeof SyslogAddr.sa_data); + if (LogStat & LOG_NDELAY) { + LogFile = socket(AF_UNIX, SOCK_DGRAM, 0); + fcntl(LogFile, F_SETFD, 1); + } +} + +/* + * CLOSELOG -- close the system log + */ + +closelog() +{ + + (void) close(LogFile); + LogFile = -1; +} + +/* + * SETLOGMASK -- set the log mask level + */ +setlogmask(pmask) + int pmask; +{ + int omask; + + omask = LogMask; + if (pmask != 0) + LogMask = pmask; + return (omask); +} |