jtkohl@MIT.EDU (John T Kohl) (02/01/91)
Attached is a shar file with some brief instructions and a makefile to convert the syslogd on ftp.uu.net to work with old 4.2-style syslog() programs, such as those found on Ultrix 3.1. I've not tested this stuff on Ultrix 4.x, since I don't have such a beast to play with. Shar and enjoy! #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of shell archive." # Contents: README Makefile ultrix.syslogd.patches nsyslog.conf # Wrapped by jtkohl@quicksilver on Thu Jan 31 13:57:30 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(1156 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' XHow to get a 4.3-Tahoe+ syslogd to work on an Ultrix 3.1 system, and Xthrow out the old ultrix 4.2 syslog: X X1. pick up the following files from ftp.uu.net, and put them into a Xsource directory: X X/bsd-sources/sys/sys/syslog.h X/bsd-sources/include/paths.h X/bsd-sources/lib/libutil/daemon.c X/bsd-sources/lib/libc/string/strerror.c X/bsd-sources/lib/libc/net/herror.c X/bsd-sources/usr.bin/wall/ttymsg.c X/bsd-sources/lib/libc/gen/syslog.c X/bsd-sources/usr.sbin/syslogd/syslogd.c X/bsd-sources/usr.sbin/syslogd/pathnames.h X X2. symlink sys to point to .: X ln -s . sys X X3. apply the enclosed patches: X patch <ultrix.syslogd.patches X X4. edit Makefile, turning on or off Zephyr(*) as appropriate for your site. X X5. type 'make' X X6. look at nsyslog.conf and edit as appropriate. Install into X/etc/nsyslog.conf. Put syslogd wherever you want to. X X7. If you want to write or port programs using the 4.3BSD syslogging Xfunctions, make sure it gets this version of syslog.h and compiles in Xthe new syslog.c. X X8. beware of pathnames if you turn off COMPAT42 X X[*. If you want to pick up Zephyr sources or read about it, anonymous FTP to X athena-dist.mit.edu:/pub/zephyr/ ] X END_OF_FILE if test 1156 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'Makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Makefile'\" else echo shar: Extracting \"'Makefile'\" \(934 characters\) sed "s/^X//" >'Makefile' <<'END_OF_FILE' XCFLAGS= $(DBG) $(INCLUDES) $(DEFINES) XDBG=-O XINCLUDES=-I. X# use these lines if you have zephyr XDEFINES=-YPOSIX -DNO_KLOG -DCOMPAT42 -DZEPHYR XZLIBS=-lzephyr -lcom_err -lkrb X X#use these if you don't X# you can nuke ZLIBS if you don't turn on ZEPHYR X#DEFINES=-YPOSIX -DNO_KLOG -DCOMPAT42 -DZEPHYR X#ZLIBS= X X XOFILES=syslogd.o herror.o daemon.o strerror.o ttymsg.o X Xsyslogd: $(OFILES) X $(CC) $(CFLAGS) -o syslogd $(OFILES) $(ZLIBS) X X# X# -YPOSIX (on ultrix means) set -DPOSIX X# -DPOSIX means you have <unistd.h> X# -DNO_KLOG means you don't have /dev/klog (kernel syslogging) X# -DCOMPAT42 means you want to be compatible with programs using X# 4.2 syslog() calls X# -DZEPHYR means you want to enable forwarding of syslog stuff via Zephyr X# [if you turn this on, target entries like "!user" go via wall/write X# style, and entries like "user" go via Zephyr] X# -DTAHOE_SOCKETS means you have the type and length fields in your socket X# structures. END_OF_FILE if test 934 -ne `wc -c <'Makefile'`; then echo shar: \"'Makefile'\" unpacked with wrong size! fi # end of 'Makefile' fi if test -f 'ultrix.syslogd.patches' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'ultrix.syslogd.patches'\" else echo shar: Extracting \"'ultrix.syslogd.patches'\" \(26306 characters\) sed "s/^X//" >'ultrix.syslogd.patches' <<'END_OF_FILE' X*** pristine-syslogd.c Thu Jan 31 11:58:58 1991 X--- syslogd.c Thu Jan 31 13:29:47 1991 X*************** X*** 24,30 **** X #endif /* not lint */ X X #ifndef lint X! static char sccsid[] = "@(#)syslogd.c 5.42 (Berkeley) 6/29/90"; X #endif /* not lint */ X X /* X--- 24,30 ---- X #endif /* not lint */ X X #ifndef lint X! static char sccsid[] = "@(#)syslogd.c 5.42 (Berkeley) 6/29/90, with ultrix/zephyr/COMPAT42 mods"; X #endif /* not lint */ X X /* X*************** X*** 47,52 **** X--- 47,57 ---- X * Author: Eric Allman X * extensive changes by Ralph Campbell X * more extensive changes by Eric Allman (again) X+ #ifdef ZEPHYR X+ * changes for Zephyr and a little dynamic allocation X+ * by Jon Rochlis (MIT), July 1987 X+ #endif X+ * COMPAT42 changes by John Kohl (MIT/DEC), December 1990 X */ X X #define MAXLINE 1024 /* maximum line length */ X*************** X*** 62,68 **** X--- 67,75 ---- X #include <sys/wait.h> X #include <sys/socket.h> X #include <sys/file.h> X+ #ifndef NO_KLOG X #include <sys/msgbuf.h> X+ #endif X #include <sys/uio.h> X #include <sys/un.h> X #include <sys/time.h> X*************** X*** 69,83 **** X--- 76,101 ---- X #include <sys/resource.h> X #include <sys/signal.h> X X+ #ifdef ZEPHYR X+ #include <zephyr/zephyr.h> X+ #else X #include <netinet/in.h> X+ #endif /* ZEPHYR */ X #include <netdb.h> X X+ #ifdef macII X+ #include <sys/types.h> X+ #include <time.h> X+ #endif X+ X #include <utmp.h> X #include <setjmp.h> X #include <stdio.h> X #include <ctype.h> X #include <string.h> X+ #ifdef POSIX X #include <unistd.h> X+ #endif X #include "pathnames.h" X X #define SYSLOG_NAMES X*************** X*** 88,97 **** X--- 106,132 ---- X char *PidFile = _PATH_LOGPID; X char ctty[] = _PATH_CONSOLE; X X+ #ifdef COMPAT42 X+ struct in_addr localhostaddr; X+ #endif X+ X #define FDMASK(fd) (1 << (fd)) X X #define dprintf if (Debug) printf X X+ #ifndef UT_NAMESIZE X+ #define UT_NAMESIZE 8 X+ #endif X+ #ifndef _PATH_UTMP X+ #define _PATH_UTMP UTMP_FILE X+ #endif X+ X+ #ifdef ZEPHYR X+ #define UNAMESIZE ANAME_SZ+INST_SZ+REALM_SZ /* 8 isn't good enough anymore */ X+ #else X+ #define UNAMESIZE UT_NAMESIZE X+ #endif X+ X #define MAXUNAMES 20 /* maximum number of user names */ X X /* X*************** X*** 115,121 **** X time_t f_time; /* time this was last written */ X u_char f_pmask[LOG_NFACILITIES+1]; /* priority mask */ X union { X! char f_uname[MAXUNAMES][UT_NAMESIZE+1]; X struct { X char f_hname[MAXHOSTNAMELEN+1]; X struct sockaddr_in f_addr; X--- 150,156 ---- X time_t f_time; /* time this was last written */ X u_char f_pmask[LOG_NFACILITIES+1]; /* priority mask */ X union { X! char f_uname[MAXUNAMES][UNAMESIZE+1]; X struct { X char f_hname[MAXHOSTNAMELEN+1]; X struct sockaddr_in f_addr; X*************** X*** 126,131 **** X--- 161,167 ---- X char f_lasttime[16]; /* time of last occurrence */ X char f_prevhost[MAXHOSTNAMELEN+1]; /* host from which recd. */ X int f_prevpri; /* pri of f_prevline */ X+ int f_prevfac; /* fac of f_prevline */ X int f_prevlen; /* length of f_prevline */ X int f_prevcount; /* repetition cnt of prevline */ X int f_repeatcount; /* number of "repeated" msgs */ X*************** X*** 151,160 **** X #define F_FORW 4 /* remote machine */ X #define F_USERS 5 /* list of users */ X #define F_WALL 6 /* everyone logged on */ X X! char *TypeNames[7] = { X "UNUSED", "FILE", "TTY", "CONSOLE", X "FORW", "USERS", "WALL" X }; X X struct filed *Files; X--- 187,202 ---- X #define F_FORW 4 /* remote machine */ X #define F_USERS 5 /* list of users */ X #define F_WALL 6 /* everyone logged on */ X+ #define F_ZEPHYR 7 /* use zephyr notification system */ X X! char *TypeNames[8] = { X "UNUSED", "FILE", "TTY", "CONSOLE", X "FORW", "USERS", "WALL" X+ #ifdef ZEPHYR X+ ,"ZEPHYR" X+ #else X+ ,0 X+ #endif X }; X X struct filed *Files; X*************** X*** 170,178 **** X--- 212,276 ---- X int MarkInterval = 20 * 60; /* interval between marks in seconds */ X int MarkSeq = 0; /* mark sequence number */ X X+ #ifdef ZEPHYR X+ ZNotice_t znotice; /* for zephyr notices */ X+ #endif X+ X+ extern int sys_nerr; X+ extern char *sys_errlist[]; X+ X extern int errno; X extern char *ctime(), *index(), *calloc(); X X+ #ifndef max X+ #define max(a,b) ((a) > (b) ? (a) : (b)) X+ #endif X+ X+ #ifdef ZEPHYR X+ X+ /* private copies here, since the facility/priority names in the header file X+ are not in numerical order, and we need a no-gap table */ X+ X+ CODE FacNames[] = { X+ "kern", LOG_KERN, X+ "user", LOG_USER, X+ "mail", LOG_MAIL, X+ "daemon", LOG_DAEMON, X+ "auth", LOG_AUTH, X+ "syslog", LOG_SYSLOG, X+ "lpr", LOG_LPR, X+ "news", LOG_NEWS, X+ "uucp", LOG_UUCP, X+ "cron", LOG_CRON, X+ "reserved", -1, X+ "reserved", -1, X+ "reserved", -1, X+ "reserved", -1, X+ "reserved", -1, X+ "compat", LOG_COMPAT, X+ "local0", LOG_LOCAL0, X+ "local1", LOG_LOCAL1, X+ "local2", LOG_LOCAL2, X+ "local3", LOG_LOCAL3, X+ "local4", LOG_LOCAL4, X+ "local5", LOG_LOCAL5, X+ "local6", LOG_LOCAL6, X+ "local7", LOG_LOCAL7, X+ NULL, -1, X+ }; X+ CODE PriNames[] = { X+ "emerg", LOG_EMERG, X+ "alert", LOG_ALERT, X+ "crit", LOG_CRIT, X+ "err", LOG_ERR, X+ "warning", LOG_WARNING, X+ "notice", LOG_NOTICE, X+ "info", LOG_INFO, X+ "debug", LOG_DEBUG, X+ NULL, -1, X+ }; X+ #endif X+ X main(argc, argv) X int argc; X char **argv; X*************** X*** 184,193 **** X struct sockaddr_in sin, frominet; X FILE *fp; X int ch; X! char line[MSG_BSIZE + 1]; X extern int optind; X extern char *optarg; X void die(), domark(), init(), reapchild(); X X while ((ch = getopt(argc, argv, "df:m:p:")) != EOF) X switch((char)ch) { X--- 282,298 ---- X struct sockaddr_in sin, frominet; X FILE *fp; X int ch; X! #ifdef MSG_BSIZE X! char line[max(MSG_BSIZE,BUFSIZ) + 1]; X! #else X! char line[BUFSIZ + 1]; X! #endif X extern int optind; X extern char *optarg; X void die(), domark(), init(), reapchild(); X+ #ifdef COMPAT42 X+ localhostaddr.s_addr = htonl(0x7f000001L); /* 127.0.0.1 */ X+ #endif X X while ((ch = getopt(argc, argv, "df:m:p:")) != EOF) X switch((char)ch) { X*************** X*** 212,219 **** X X if (!Debug) X daemon(0, 0); X! else X! setlinebuf(stdout); X X consfile.f_type = F_CONSOLE; X (void) strcpy(consfile.f_un.f_fname, ctty); X--- 317,330 ---- X X if (!Debug) X daemon(0, 0); X! else { X! #ifndef macII X! setlinebuf(stdout); X! #else X! static char buf[BUFSIZ]; X! setvbuf (stdout, buf, _IOLBF, BUFSIZ); X! #endif X! } X X consfile.f_type = F_CONSOLE; X (void) strcpy(consfile.f_un.f_fname, ctty); X*************** X*** 225,232 **** X--- 336,354 ---- X else X LocalDomain = ""; X (void) signal(SIGTERM, die); X+ #ifdef ultrix X+ /* compiler otherwise chokes on the ? : */ X+ if (Debug) { X+ (void) signal(SIGINT, die); X+ (void) signal(SIGQUIT, die); X+ } else { X+ (void) signal(SIGINT, SIG_IGN); X+ (void) signal(SIGQUIT, SIG_IGN); X+ } X+ #else X (void) signal(SIGINT, Debug ? die : SIG_IGN); X (void) signal(SIGQUIT, Debug ? die : SIG_IGN); X+ #endif X (void) signal(SIGCHLD, reapchild); X (void) signal(SIGALRM, domark); X (void) alarm(TIMERINTVL); X*************** X*** 237,243 **** X (void) strncpy(sunx.sun_path, LogName, sizeof sunx.sun_path); X funix = socket(AF_UNIX, SOCK_DGRAM, 0); X if (funix < 0 || bind(funix, (struct sockaddr *) &sunx, X! sizeof(sunx.sun_family)+sizeof(sunx.sun_len)+ X strlen(sunx.sun_path)) < 0 || X chmod(LogName, 0666) < 0) { X (void) sprintf(line, "cannot create %s", LogName); X--- 359,368 ---- X (void) strncpy(sunx.sun_path, LogName, sizeof sunx.sun_path); X funix = socket(AF_UNIX, SOCK_DGRAM, 0); X if (funix < 0 || bind(funix, (struct sockaddr *) &sunx, X! sizeof(sunx.sun_family)+ X! #ifdef TAHOE_SOCKETS X! sizeof(sunx.sun_len)+ X! #endif X strlen(sunx.sun_path)) < 0 || X chmod(LogName, 0666) < 0) { X (void) sprintf(line, "cannot create %s", LogName); X*************** X*** 266,271 **** X--- 391,400 ---- X InetInuse = 1; X } X } X+ #ifdef NO_KLOG X+ klogm = 0; X+ fklog = 0; X+ #else X if ((fklog = open(_PATH_KLOG, O_RDONLY, 0)) >= 0) X klogm = FDMASK(fklog); X else { X*************** X*** 272,277 **** X--- 401,407 ---- X dprintf("can't open %s (%d)\n", _PATH_KLOG, errno); X klogm = 0; X } X+ #endif X X /* tuck my process id away */ X fp = fopen(PidFile, "w"); X*************** X*** 282,287 **** X--- 412,427 ---- X X dprintf("off & running....\n"); X X+ #ifdef ZEPHYR X+ /* initialize zephyr stuff */ X+ bzero (&znotice, sizeof (znotice)); X+ znotice.z_kind = UNSAFE; X+ znotice.z_class = "SYSLOG"; X+ znotice.z_class_inst = LocalHostName; X+ znotice.z_default_format = "Syslog message from $instance, level $opcode:\n$message"; X+ (void) ZInitialize (); X+ #endif X+ X init(); X (void) signal(SIGHUP, init); X X*************** X*** 317,323 **** X (struct sockaddr *) &fromunix, &len); X if (i > 0) { X line[i] = '\0'; X! printline(LocalHostName, line); X } else if (i < 0 && errno != EINTR) X logerror("recvfrom unix"); X } X--- 457,463 ---- X (struct sockaddr *) &fromunix, &len); X if (i > 0) { X line[i] = '\0'; X! printline(LocalHostName, line, 0); X } else if (i < 0 && errno != EINTR) X logerror("recvfrom unix"); X } X*************** X*** 329,335 **** X extern char *cvthname(); X X line[i] = '\0'; X! printline(cvthname(&frominet), line); X } else if (i < 0 && errno != EINTR) X logerror("recvfrom inet"); X } X--- 469,483 ---- X extern char *cvthname(); X X line[i] = '\0'; X! #ifdef COMPAT42 X! /* if it matches the localhost loopback, X! this is an old client, so humor him. */ X! if (frominet.sin_addr.s_addr == X! localhostaddr.s_addr) X! printline(cvthname(&frominet), line, 1); X! else X! #endif X! printline(cvthname(&frominet), line, 0); X } else if (i < 0 && errno != EINTR) X logerror("recvfrom inet"); X } X*************** X*** 343,356 **** X exit(1); X } X X /* X * Take a raw input line, decode the message, and print the message X * on the appropriate log files. X */ X X! printline(hname, msg) X char *hname; X char *msg; X { X register char *p, *q; X register int c; X--- 491,522 ---- X exit(1); X } X X+ #ifdef COMPAT42 X+ int convert_oldpri[] = { X+ LOG_COMPAT|LOG_EMERG, /* there is no 0 */ X+ LOG_COMPAT|LOG_ALERT, /* old LOG_ALERT */ X+ LOG_COMPAT|LOG_ALERT, /* old LOG_SALERT */ X+ LOG_COMPAT|LOG_CRIT, /* old LOG_EMERG */ X+ LOG_COMPAT|LOG_ERR, /* old LOG_ERROR */ X+ LOG_COMPAT|LOG_WARNING, /* old LOG_CRIT */ X+ LOG_COMPAT|LOG_WARNING, /* old LOG_WARNING */ X+ LOG_COMPAT|LOG_NOTICE, /* old LOG_NOTICE */ X+ LOG_COMPAT|LOG_INFO, /* old LOG_INFO */ X+ LOG_COMPAT|LOG_DEBUG, /* old LOG_DEBUG */ X+ }; X+ int noldpri = sizeof(convert_oldpri)/sizeof(convert_oldpri[0]); X+ #endif X+ X+ X /* X * Take a raw input line, decode the message, and print the message X * on the appropriate log files. X */ X X! printline(hname, msg, oldcompat) X char *hname; X char *msg; X+ int oldcompat; X { X register char *p, *q; X register int c; X*************** X*** 367,372 **** X--- 533,546 ---- X if (*p == '>') X ++p; X } X+ #ifdef COMPAT42 X+ if (oldcompat) { X+ if (pri > 0 && pri < noldpri) X+ pri = convert_oldpri[pri]; X+ else X+ pri = LOG_MAKEPRI(LOG_COMPAT, LOG_ERR); X+ } X+ #endif X if (pri &~ (LOG_FACMASK|LOG_PRIMASK)) X pri = DEFUPRI; X X*************** X*** 435,440 **** X--- 609,630 ---- X X time_t now; X X+ #ifndef O_NOCTTY X+ void X+ untty() X+ { X+ int i; X+ X+ if (!Debug) { X+ i = open("/dev/tty", O_RDWR); X+ if (i >= 0) { X+ (void) ioctl(i, (int) TIOCNOTTY, (char *)0); X+ (void) close(i); X+ } X+ } X+ } X+ #endif X+ X /* X * Log a message to the appropriate log files, users, etc. based on X * the priority. X*************** X*** 483,492 **** X /* log the message to the particular outputs */ X if (!Initialized) { X f = &consfile; X f->f_file = open(ctty, O_WRONLY, 0); X X if (f->f_file >= 0) { X! fprintlog(f, flags, msg); X (void) close(f->f_file); X } X (void) sigsetmask(omask); X--- 673,689 ---- X /* log the message to the particular outputs */ X if (!Initialized) { X f = &consfile; X+ #ifdef O_NOCTTY X+ f->f_file = open(ctty, O_WRONLY|O_NOCTTY, 0); X+ #else X f->f_file = open(ctty, O_WRONLY, 0); X+ #endif X X if (f->f_file >= 0) { X! #ifndef O_NOCTTY X! untty(); X! #endif X! fprintlog(f, flags, msg, fac, prilev); X (void) close(f->f_file); X } X (void) sigsetmask(omask); X*************** X*** 523,535 **** X * in the future. X */ X if (now > REPEATTIME(f)) { X! fprintlog(f, flags, (char *)NULL); X BACKOFF(f); X } X } else { X /* new line, save it */ X if (f->f_prevcount) X! fprintlog(f, 0, (char *)NULL); X f->f_repeatcount = 0; X (void) strncpy(f->f_lasttime, timestamp, 15); X (void) strncpy(f->f_prevhost, from, X--- 720,732 ---- X * in the future. X */ X if (now > REPEATTIME(f)) { X! fprintlog(f, flags, (char *)NULL, fac, prilev); X BACKOFF(f); X } X } else { X /* new line, save it */ X if (f->f_prevcount) X! fprintlog(f, 0, (char *)NULL, fac, prilev); X f->f_repeatcount = 0; X (void) strncpy(f->f_lasttime, timestamp, 15); X (void) strncpy(f->f_prevhost, from, X*************** X*** 537,548 **** X if (msglen < MAXSVLINE) { X f->f_prevlen = msglen; X f->f_prevpri = pri; X (void) strcpy(f->f_prevline, msg); X! fprintlog(f, flags, (char *)NULL); X } else { X f->f_prevline[0] = 0; X f->f_prevlen = 0; X! fprintlog(f, flags, msg); X } X } X } X--- 734,746 ---- X if (msglen < MAXSVLINE) { X f->f_prevlen = msglen; X f->f_prevpri = pri; X+ f->f_prevfac = fac; X (void) strcpy(f->f_prevline, msg); X! fprintlog(f, flags, (char *)NULL, fac, prilev); X } else { X f->f_prevline[0] = 0; X f->f_prevlen = 0; X! fprintlog(f, flags, msg, fac, prilev); X } X } X } X*************** X*** 549,570 **** X (void) sigsetmask(omask); X } X X! fprintlog(f, flags, msg) X register struct filed *f; X int flags; X char *msg; X { X struct iovec iov[6]; X register struct iovec *v; X register int l; X char line[MAXLINE + 1], repbuf[80], greetings[200]; X X v = iov; X if (f->f_type == F_WALL) { X v->iov_base = greetings; X! v->iov_len = sprintf(greetings, X "\r\n\7Message from syslogd@%s at %.24s ...\r\n", X f->f_prevhost, ctime(&now)); X v++; X v->iov_base = ""; X v->iov_len = 0; X--- 747,776 ---- X (void) sigsetmask(omask); X } X X! fprintlog(f, flags, msg, fac, prilev) X register struct filed *f; X int flags; X char *msg; X+ int fac; X+ int prilev; X { X struct iovec iov[6]; X register struct iovec *v; X register int l; X char line[MAXLINE + 1], repbuf[80], greetings[200]; X+ #ifdef ZEPHYR X+ char pri_fac_str[MAXLINE]; X+ int zcode; X+ register int i; X+ #endif X X v = iov; X if (f->f_type == F_WALL) { X v->iov_base = greetings; X! (void) sprintf(greetings, X "\r\n\7Message from syslogd@%s at %.24s ...\r\n", X f->f_prevhost, ctime(&now)); X+ v->iov_len = strlen(greetings); X v++; X v->iov_base = ""; X v->iov_len = 0; X*************** X*** 589,596 **** X v->iov_len = strlen(msg); X } else if (f->f_prevcount > 1) { X v->iov_base = repbuf; X! v->iov_len = sprintf(repbuf, "last message repeated %d times", X f->f_prevcount); X } else { X v->iov_base = f->f_prevline; X v->iov_len = f->f_prevlen; X--- 795,803 ---- X v->iov_len = strlen(msg); X } else if (f->f_prevcount > 1) { X v->iov_base = repbuf; X! (void) sprintf(repbuf, "last message repeated %d times", X f->f_prevcount); X+ v->iov_len = strlen(repbuf); X } else { X v->iov_base = f->f_prevline; X v->iov_len = f->f_prevlen; X*************** X*** 607,614 **** X X case F_FORW: X dprintf(" %s\n", f->f_un.f_forw.f_hname); X! l = sprintf(line, "<%d>%.15s %s", f->f_prevpri, X iov[0].iov_base, iov[4].iov_base); X if (l > MAXLINE) X l = MAXLINE; X if (sendto(finet, line, l, 0, &f->f_un.f_forw.f_addr, X--- 814,822 ---- X X case F_FORW: X dprintf(" %s\n", f->f_un.f_forw.f_hname); X! (void) sprintf(line, "<%d>%.15s %s", f->f_prevpri, X iov[0].iov_base, iov[4].iov_base); X+ l = strlen(line); X if (l > MAXLINE) X l = MAXLINE; X if (sendto(finet, line, l, 0, &f->f_un.f_forw.f_addr, X*************** X*** 662,667 **** X--- 870,905 ---- X (void) fsync(f->f_file); X break; X X+ #ifdef ZEPHYR X+ case F_ZEPHYR: X+ (void) sprintf(line, "%.15s [%s] %s", X+ iov[0].iov_base, X+ iov[2].iov_base, X+ iov[4].iov_base); X+ (void) sprintf(pri_fac_str, "%s.%s", X+ FacNames[fac].c_name, X+ PriNames[(prilev & LOG_PRIMASK)].c_name); X+ znotice.z_message = line; X+ /* include the null just in case */ X+ znotice.z_message_len = strlen (line) + 1; X+ znotice.z_opcode = pri_fac_str; X+ dprintf (" z_opcode %s\n", pri_fac_str); X+ for (i = 0; i < MAXUNAMES; i++) { X+ if (!f->f_un.f_uname[i][0]) X+ break; X+ /* map "*" into null recipient and therefore X+ anybody who is listening */ X+ if (strcmp (f->f_un.f_uname[i], "*") == 0) X+ znotice.z_recipient = ""; X+ else X+ znotice.z_recipient = f->f_un.f_uname[i]; X+ zcode = ZSendNotice (&znotice, ZNOAUTH); X+ if (zcode != 0) X+ logerror (error_message (zcode)); X+ } X+ break; X+ #endif X+ X case F_USERS: X case F_WALL: X dprintf("\n"); X*************** X*** 752,757 **** X--- 990,1000 ---- X dprintf("Malformed from address\n"); X return ("???"); X } X+ #ifdef COMPAT42 X+ /* don't bother looking up 127.0.0.1, it's us. */ X+ if (f->sin_addr.s_addr == localhostaddr.s_addr) X+ return(LocalHostName); X+ #endif X hp = gethostbyaddr(&f->sin_addr, sizeof(struct in_addr), f->sin_family); X if (hp == 0) { X dprintf("Host name for your address (%s) unknown\n", X*************** X*** 781,787 **** X dprintf("flush %s: repeated %d times, %d sec.\n", X TypeNames[f->f_type], f->f_prevcount, X repeatinterval[f->f_repeatcount]); X! fprintlog(f, 0, (char *)NULL); X BACKOFF(f); X } X } X--- 1024,1030 ---- X dprintf("flush %s: repeated %d times, %d sec.\n", X TypeNames[f->f_type], f->f_prevcount, X repeatinterval[f->f_repeatcount]); X! fprintlog(f, 0, (char *)NULL, f->f_prevfac, f->f_prevpri); X BACKOFF(f); X } X } X*************** X*** 814,820 **** X for (f = Files; f != NULL; f = f->f_next) { X /* flush any pending output */ X if (f->f_prevcount) X! fprintlog(f, 0, (char *)NULL); X } X if (sig) { X dprintf("syslogd: exiting on signal %d\n", sig); X--- 1057,1063 ---- X for (f = Files; f != NULL; f = f->f_next) { X /* flush any pending output */ X if (f->f_prevcount) X! fprintlog(f, 0, (char *)NULL, f->f_prevfac, f->f_prevpri); X } X if (sig) { X dprintf("syslogd: exiting on signal %d\n", sig); X*************** X*** 848,860 **** X for (f = Files; f != NULL; f = next) { X /* flush any pending output */ X if (f->f_prevcount) X! fprintlog(f, 0, (char *)NULL); X X switch (f->f_type) { X case F_FILE: X case F_TTY: X case F_CONSOLE: X- case F_FORW: X (void) close(f->f_file); X break; X } X--- 1091,1102 ---- X for (f = Files; f != NULL; f = next) { X /* flush any pending output */ X if (f->f_prevcount) X! fprintlog(f, 0, (char *)NULL, f->f_prevfac, f->f_prevpri); X X switch (f->f_type) { X case F_FILE: X case F_TTY: X case F_CONSOLE: X (void) close(f->f_file); X break; X } X*************** X*** 920,925 **** X--- 1162,1168 ---- X break; X X case F_USERS: X+ case F_ZEPHYR: X for (i = 0; i < MAXUNAMES && *f->f_un.f_uname[i]; i++) X printf("%s, ", f->f_un.f_uname[i]); X break; X*************** X*** 1025,1031 **** X hp = gethostbyname(p); X if (hp == NULL) { X extern int h_errno, h_nerr; X! extern char **h_errlist; X X logerror((u_int)h_errno < h_nerr ? X h_errlist[h_errno] : "Unknown error"); X--- 1268,1274 ---- X hp = gethostbyname(p); X if (hp == NULL) { X extern int h_errno, h_nerr; X! extern char *h_errlist[]; X X logerror((u_int)h_errno < h_nerr ? X h_errlist[h_errno] : "Unknown error"); X*************** X*** 1041,1064 **** X X case '/': X (void) strcpy(f->f_un.f_fname, p); X! if ((f->f_file = open(p, O_WRONLY|O_APPEND, 0)) < 0) { X f->f_file = F_UNUSED; X logerror(p); X break; X } X! if (isatty(f->f_file)) X f->f_type = F_TTY; X! else X f->f_type = F_FILE; X if (strcmp(p, ctty) == 0) X f->f_type = F_CONSOLE; X break; X X case '*': X f->f_type = F_WALL; X break; X! X! default: X for (i = 0; i < MAXUNAMES && *p; i++) { X for (q = p; *q && *q != ','; ) X q++; X--- 1284,1322 ---- X X case '/': X (void) strcpy(f->f_un.f_fname, p); X! #ifdef O_NOCTTY X! #define FLAGS O_WRONLY|O_APPEND|O_NOCTTY X! #else X! #define FLAGS O_WRONLY|O_APPEND X! #endif X! if ((f->f_file = open(p, FLAGS, 0)) < 0) { X! #undef FLAGS X f->f_file = F_UNUSED; X logerror(p); X break; X } X! if (isatty(f->f_file)) { X f->f_type = F_TTY; X! #ifndef O_NOCTTY X! untty(); X! #endif X! } else X f->f_type = F_FILE; X if (strcmp(p, ctty) == 0) X f->f_type = F_CONSOLE; X break; X X+ #ifndef ZEPHYR X case '*': X f->f_type = F_WALL; X break; X! #else X! case '!': X! p++; X! if (*p == '*') { X! f->f_type = F_WALL; X! break; X! } X for (i = 0; i < MAXUNAMES && *p; i++) { X for (q = p; *q && *q != ','; ) X q++; X*************** X*** 1072,1077 **** X--- 1330,1356 ---- X p = q; X } X f->f_type = F_USERS; X+ break; X+ #endif X+ X+ default: X+ for (i = 0; i < MAXUNAMES && *p; i++) { X+ for (q = p; *q && *q != ','; ) X+ q++; X+ (void) strncpy(f->f_un.f_uname[i], p, UNAMESIZE); X+ if ((q - p) > UNAMESIZE) X+ f->f_un.f_uname[i][UNAMESIZE] = '\0'; X+ else X+ f->f_un.f_uname[i][q - p] = '\0'; X+ while (*q == ',' || *q == ' ') X+ q++; X+ p = q; X+ } X+ #ifdef ZEPHYR X+ f->f_type = F_ZEPHYR; X+ #else X+ f->f_type = F_USERS; X+ #endif X break; X } X } X*** pristine-syslog.h Thu Jan 31 12:18:55 1991 X--- syslog.h Thu Jan 31 13:26:30 1991 X*************** X*** 17,23 **** X * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF X * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. X * X! * @(#)syslog.h 7.16 (Berkeley) 6/28/90 X */ X X /* X--- 17,23 ---- X * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF X * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. X * X! * @(#)syslog.h 7.16 (Berkeley) 6/28/90, with COMPAT42 mods X */ X X /* X*************** X*** 80,85 **** X--- 80,86 ---- X #define LOG_NEWS (7<<3) /* network news subsystem */ X #define LOG_UUCP (8<<3) /* UUCP subsystem */ X #define LOG_CRON (9<<3) /* clock daemon */ X+ #define LOG_COMPAT (15<<3) /* compatibility with 4.2 syslog */ X /* other codes through 15 reserved for system use */ X #define LOG_LOCAL0 (16<<3) /* reserved for local use */ X #define LOG_LOCAL1 (17<<3) /* reserved for local use */ X*************** X*** 98,103 **** X--- 99,105 ---- X #ifdef SYSLOG_NAMES X CODE facilitynames[] = { X "auth", LOG_AUTH, X+ "compat", LOG_COMPAT, X "cron", LOG_CRON, X "daemon", LOG_DAEMON, X "kern", LOG_KERN, X*** pristine-pathnames.h Thu Jan 31 13:20:23 1991 X--- pathnames.h Thu Jan 31 13:21:00 1991 X*************** X*** 16,22 **** X * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF X * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. X * X! * @(#)pathnames.h 5.3 (Berkeley) 6/1/90 X */ X X #include <paths.h> X--- 16,22 ---- X * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF X * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. X * X! * @(#)pathnames.h 5.3 (Berkeley) 6/1/90, with COMPAT42 mods X */ X X #include <paths.h> X*************** X*** 23,27 **** X--- 23,32 ---- X X #define _PATH_KLOG "/dev/klog" X #define _PATH_LOG "/dev/log" X+ #ifdef COMPAT42 X+ #define _PATH_LOGCONF "/etc/nsyslog.conf" X+ #define _PATH_LOGPID "/etc/nsyslog.pid" X+ #else X #define _PATH_LOGCONF "/etc/syslog.conf" X #define _PATH_LOGPID "/var/run/syslog.pid" X+ #endif X*** pristine-syslog.c Thu Jan 31 13:49:38 1991 X--- syslog.c Thu Jan 31 13:56:42 1991 X*************** X*** 18,24 **** X */ X X #if defined(LIBC_SCCS) && !defined(lint) X! static char sccsid[] = "@(#)syslog.c 5.28 (Berkeley) 6/27/90"; X #endif /* LIBC_SCCS and not lint */ X X /* X--- 18,24 ---- X */ X X #if defined(LIBC_SCCS) && !defined(lint) X! static char sccsid[] = "@(#)syslog.c 5.28 (Berkeley) 6/27/90, with varags changes"; X #endif /* LIBC_SCCS and not lint */ X X /* X*************** X*** 37,42 **** X--- 37,48 ---- X * Modified to use UNIX domain IPC by Ralph Campbell X */ X X+ #ifdef __STDC__ X+ #include <stdarg.h> X+ #else X+ #include <varargs.h> X+ #endif X+ X #include <sys/types.h> X #include <sys/socket.h> X #include <sys/file.h> X*************** X*** 46,52 **** X #include <sys/wait.h> X #include <netdb.h> X #include <string.h> X- #include <varargs.h> X #include <paths.h> X #include <stdio.h> X X--- 52,57 ---- X*************** X*** 58,68 **** X static char *LogTag = "syslog"; /* string to tag the entry with */ X static int LogFacility = LOG_USER; /* default facility code */ X X! syslog(pri, fmt, args) X! int pri, args; X! char *fmt; X { X! vsyslog(pri, fmt, &args); X } X X vsyslog(pri, fmt, ap) X--- 63,85 ---- X static char *LogTag = "syslog"; /* string to tag the entry with */ X static int LogFacility = LOG_USER; /* default facility code */ X X! #ifdef __STDC__ X! syslog(int pri, const char *fmt, ...) X! #else X! syslog(pri, fmt, va_alist) X! int pri; X! char *fmt; X! va_dcl X! #endif X { X! va_list pvar; X! #ifdef __STDC__ X! va_start(pvar, fmt); X! #else X! va_start(pvar); X! #endif X! vsyslog(pri, fmt, pvar); X! va_end(pvar); X } X X vsyslog(pri, fmt, ap) X*************** X*** 149,156 **** X--- 166,178 ---- X * output the message to the console; don't worry about X * blocking, if console blocks everything will. X */ X+ #ifdef O_NOCTTY X+ if ((fd = open(_PATH_CONSOLE, O_NOCTTY|O_WRONLY, 0)) < 0) X+ return; X+ #else X if ((fd = open(_PATH_CONSOLE, O_WRONLY, 0)) < 0) X return; X+ #endif X (void)strcat(tbuf, "\r\n"); X cnt += 2; X p = index(tbuf, '>') + 1; END_OF_FILE if test 26306 -ne `wc -c <'ultrix.syslogd.patches'`; then echo shar: \"'ultrix.syslogd.patches'\" unpacked with wrong size! fi # end of 'ultrix.syslogd.patches' fi if test -f 'nsyslog.conf' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'nsyslog.conf'\" else echo shar: Extracting \"'nsyslog.conf'\" \(299 characters\) sed "s/^X//" >'nsyslog.conf' <<'END_OF_FILE' X# Syslog daemon configuration file X# X# WARNING: Due to a bug in syslogd, the *.level messages must appear X# first on the line. X# X*.panic !* X*.alert;auth.notice /dev/console X*.warning;kern.debug /usr/adm/messages Xauth.notice /usr/adm/sulog Xmail.info;compat.info /usr/spool/mqueue/syslog END_OF_FILE if test 299 -ne `wc -c <'nsyslog.conf'`; then echo shar: \"'nsyslog.conf'\" unpacked with wrong size! fi # end of 'nsyslog.conf' fi echo shar: End of shell archive. exit 0 -- John Kohl <jtkohl@ATHENA.MIT.EDU> or <jtkohl@MIT.EDU> Digital Equipment Corporation/Project Athena (The above opinions are MINE. Don't put my words in somebody else's mouth!)