[comp.sources.unix] v11i022: Development version of syslog

rs@uunet.UU.NET (Rich Salz) (08/28/87)

Submitted-by: emory!arnold (Arnold D. Robbins {EUCC})
Posting-number: Volume 11, Issue 22
Archive-name: syslog

Here is a version of the BSD syslog(3) routines that write their info
to stderr, instead of to the syslogd daemon. They are useful if you are
developing code that will eventually use the real syslog, but you want
to see the output in the meantime. The file is coded in such a way as
that it may be compiled separately and loaded as a .o file, or it may
be #include'd directly. One possibility is to make it into a library
that could be loaded -lsyslog.

There are no comments in the code; see the syslog and printf man pages to
figure out what's going on.

There is no makefile since it is just one short piece of source, and no
man page since systems which support syslog (only BSD systems do) already
have man pages that describe the facility.

Enjoy,

Arnold Robbins

[  Actually...  I wrote Makefile, manpage, and header file because I think
   this would be a worthwhile interface for non-BSD Unices to support...
   Sorry Arnold, I got carried away.
   This is also a good example of varargs-coding.  --r$ ]

#! /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:  Makefile syslog.3 syslog.c syslog.h
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(185 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X## syslog routine makefile
XCFLAGS=-O
Xall:	syslog.c
X	$(CC) $(CFLAGS) -c syslog.c
X	ar c libsyslog.a syslog.o
X	@rm -f syslog.o
X
Xinstall:	all
X	@echo install according to local conventions.
END_OF_FILE
if test 185 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'syslog.3' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'syslog.3'\"
else
echo shar: Extracting \"'syslog.3'\" \(1246 characters\)
sed "s/^X//" >'syslog.3' <<'END_OF_FILE'
X.TH SYSLOG 3 LOCAL
X.SH NAME
Xsyslog, openlog, closelog \- logging routines
X.SH SYNOPSIS
X.nf
X#include <syslog.h>
X.sp
Xopenlog(ident, arg1, arg2)
X	char *ident;
X	int arg1;
X	int arg2;
X.sp
Xsyslog(priority, message, parameters ... )
X	char *message;
X.sp
Xcloselog()
X.fi
X.SH DESCRIPTION
X.I Syslog
Xis intended to provide a standard error and general notification interface.
XThis version sends errors to the standard error; versions on other system
Xuse IPC mechanisms to talk to a logging daemon.
X.PP
XEach log message is tagged with a
X.IR priority ,
Xdefined in the header file.
XVarious filtering mechanisms are used on other systems to direct the
Xdifferent levels to different destinations.
X.PP
XThe message looks like a
X.IR printf (3)
Xstring except that
X.B %m
Xis replaced by the current error message (collected from
X.IR errno ).
XA newline will be output if the the format string doesn't end with one.
X.PP
XThe
X.I openlog
Xroutine can be called to initialize the logger.
XThis routine takes three parameters.
XThe first is a text string to be output before each message; it is
Xconventionally the program name.
XThe other two parameters are currently ignored, and should be supplied
Xfor compatibility.
X.PP
XThe
X.I closelog
Xroutine can be used to close the log file.
END_OF_FILE
if test 1246 -ne `wc -c <'syslog.3'`; then
    echo shar: \"'syslog.3'\" unpacked with wrong size!
fi
# end of 'syslog.3'
fi
if test -f 'syslog.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'syslog.c'\"
else
echo shar: Extracting \"'syslog.c'\" \(2405 characters\)
sed "s/^X//" >'syslog.c' <<'END_OF_FILE'
X/*
X * syslog.c
X *
X * Dummy version of syslog routines that use stdio to stderr.
X * Designed for debugging during development.
X *
X * Arnold Robbins
X * Emory University Computing Center
X * 7/87
X */
X
Xextern int errno;
Xextern int sys_nerr;
Xextern char *sys_errlist[];
X
X/*
X * Surround each header with an ifdef so that
X * the whole file may be included if desired.
X */
X
X#ifndef NULL	
X#include <stdio.h>
X#endif
X
X#ifndef LOG_EMERG
X#include <syslog.h>
X#endif
X
X#ifndef va_dcl
X#include <varargs.h>
X#endif
X
Xstatic char *str;
X
Xint openlog (s, i, j)
Xchar *s;
Xint i, j;
X{
X	str = s;
X#ifdef lint
X	i = i;
X	j = j;
X#endif
X	return(0);
X}
X
Xcloselog () { }
X
Xsetlogmask (mask)
Xint mask;
X{
X#ifdef lint
X	mask = mask;
X#endif
X}
X
Xsyslog (va_alist)
Xva_dcl
X{
X	va_list ap;
X	char *format, c, form[30];
X	int i, j;
X	double d;
X	char *cp, *x;
X	int err = errno, pri;
X	static char *level[] = {
X		"emergency",
X		"alert",
X		"critical",
X		"error",
X		"warning",
X		"notice",
X		"info",
X		"debug"
X	};
X
X	va_start(ap);
X	pri = va_arg(ap, int);
X
X	x = "unknown";
X	if (pri >= LOG_EMERG && pri <= LOG_DEBUG)
X		x = level[pri];
X
X	fprintf (stderr, "%s: %s: ", str, x);
X
X	format = va_arg(ap, char *);
X	while (c = *format++)
X	{
X		int done;
X
X		if (c != '%')
X		{
X			putc (c, stderr);
X			continue;
X		}
X		j = 0;
X		form[j++] = c;
X		done = 0;
X		while (! done)
X		{
X			c = *format++;
X			switch (c) {
X			default:	/* XXX */
X			case 'o': case 'c': case 'd': case 's': case 'u':
X			case 'e': case 'E': case 'f': case 'g': case 'G':
X			case 'x': case 'X':
X				done++;
X				/* fall thru */
X			case ' ': case '+': case '-': case '.': case '#':
X			case '0': case '1': case '2': case '3': case '4':
X			case '5': case '6': case '7': case '8': case '9':
X			case 'l':
X				form[j++] = c;
X				break;
X			case 'm':
X				errno = err;
X				if (errno < sys_nerr)
X					fputs (sys_errlist[errno], stderr);
X				else
X					fprintf (stderr, "error %d", errno);
X				goto out;
X			case '%':
X				putc ('%', stderr);
X				goto out;
X			}
X		}
X		form[j] = '\0';
X		switch (form[j-1]) {
X		case 'x':
X		case 'X':
X		case 'o':
X		case 'c':
X		case 'd':
X		case 'u':
X			i = va_arg(ap, int);
X			fprintf (stderr, form, i);
X			break;
X		case 'e':
X		case 'E':
X		case 'f':
X		case 'g':
X		case 'G':
X			d = va_arg(ap, double);
X			fprintf (stderr, form, d);
X			break;
X		case 's':
X			cp = va_arg(ap, char *);
X			fprintf (stderr, form, cp);
X			break;
X		}
X	out: ;
X	}
X	if (format[-1] != '\n')
X		putc ('\n', stderr);
X
X	va_end(ap);
X}
END_OF_FILE
if test 2405 -ne `wc -c <'syslog.c'`; then
    echo shar: \"'syslog.c'\" unpacked with wrong size!
fi
# end of 'syslog.c'
fi
if test -f 'syslog.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'syslog.h'\"
else
echo shar: Extracting \"'syslog.h'\" \(673 characters\)
sed "s/^X//" >'syslog.h' <<'END_OF_FILE'
X/*
X**  SYSLOG HEADER FILE
X*/
X
X/*
X**  These are #define's for the various levels, and representative
X**  messages that might indicate their class.
X*/
X#define LOG_ALERT	1	/* The disk is on fire			*/
X#define LOG_SALERT	2	/* /bin/rmail is filling up /usr/spool	*/
X#define LOG_EMERG	3	/* ??Like SALERT, but send to a file??	*/
X#define LOG_ERR		4	/* Network was unreachable, is back	*/
X#define LOG_CRIT	5	/* Can't read /usr/lib/news/history	*/
X#define LOG_WARNING	6	/* Rnews just dropped an article	*/
X#define LOG_NOTICE	7	/* /usr/spool/news is filling up	*/
X#define LOG_INFO	8	/* Have 100 new articles in talk.foo	*/
X#define LOG_DEBUG	9	/* Expired article <34@site.uucp>	*/
END_OF_FILE
if test 669 -ne `wc -c <'syslog.h'`; then
    echo shar: \"'syslog.h'\" unpacked with wrong size!
fi
# end of 'syslog.h'
fi
echo shar: End of shell archive.
exit 0
-- 

Rich $alz
Cronus Project, BBN Labs			rsalz@bbn.com
Moderator, comp.sources.unix			sourcew'gragrag