Index: /tags/SYSLOG_MIX/src/emx/include/sys/syslog.h
===================================================================
--- /tags/SYSLOG_MIX/src/emx/include/sys/syslog.h	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/include/sys/syslog.h	(revision 1198)
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 1998-2000 Carnegie Mellon University.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The name "Carnegie Mellon University" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For permission or any other legal
+ *    details, please contact  
+ *      Office of Technology Transfer
+ *      Carnegie Mellon University
+ *      5000 Forbes Avenue
+ *      Pittsburgh, PA  15213-3890
+ *      (412) 268-4387, fax: (412) 268-7395
+ *      tech-transfer@andrew.cmu.edu
+ *
+ * 4. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by Computing Services
+ *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+ *
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+/* $Revision: 1.2 $
+ * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution is only permitted until one year after the first shipment
+ * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
+ * binary forms are permitted provided that: (1) source distributions retain
+ * this entire copyright notice and comment, and (2) distributions including
+ * binaries display the following acknowledgement:  This product includes
+ * software developed by the University of California, Berkeley and its
+ * contributors'' in the documentation or other materials provided with the
+ * distribution and in all advertising materials mentioning features or use
+ * of this software.  Neither the name of the University nor the names of
+ * its contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *	@(#)syslog.h	7.16 (Berkeley) 6/28/90
+ */
+
+/*
+ * priorities/facilities are encoded into a single 32-bit quantity, where the
+ * bottom 3 bits are the priority (0-7) and the top 28 bits are the facility
+ * (0-big number).  Both the priorities and the facilities map roughly
+ * one-to-one to strings in the syslogd(8) source code.  This mapping is
+ * included in this file.
+ *
+ * priorities (these are ordered)
+ */
+#define	LOG_EMERG	0	/* system is unusable */
+#define	LOG_ALERT	1	/* action must be taken immediately */
+#define	LOG_CRIT	2	/* critical conditions */
+#define	LOG_ERR		3	/* error conditions */
+#define	LOG_WARNING	4	/* warning conditions */
+#define	LOG_NOTICE	5	/* normal but significant condition */
+#define	LOG_INFO	6	/* informational */
+#define	LOG_DEBUG	7	/* debug-level messages */
+
+#define	LOG_PRIMASK	0x007	/* mask to extract priority part (internal) */
+				/* extract priority */
+#define	LOG_PRI(p)	((p) & LOG_PRIMASK)
+#define	LOG_MAKEPRI(fac, pri)	(((fac) << 3) | (pri))
+
+#ifdef SYSLOG_NAMES
+#define	INTERNAL_NOPRI	0x10	/* the "no priority" priority */
+				/* mark "facility" */
+#define	INTERNAL_MARK	LOG_MAKEPRI(LOG_NFACILITIES, 0)
+typedef struct _code {
+	char	*c_name;
+	int	c_val;
+} CODE;
+
+CODE prioritynames[] = {
+	"alert",	LOG_ALERT,
+	"crit",		LOG_CRIT,
+	"debug",	LOG_DEBUG,
+	"emerg",	LOG_EMERG,
+	"err",		LOG_ERR,
+	"error",	LOG_ERR,		/* DEPRECATED */
+	"info",		LOG_INFO,
+	"none",		INTERNAL_NOPRI,		/* INTERNAL */
+	"notice",	LOG_NOTICE,
+	"panic", 	LOG_EMERG,		/* DEPRECATED */
+	"warn",		LOG_WARNING,		/* DEPRECATED */
+	"warning",	LOG_WARNING,
+	NULL,		-1,
+};
+#endif
+
+/* facility codes */
+#define	LOG_KERN	(0<<3)	/* kernel messages */
+#define	LOG_USER	(1<<3)	/* random user-level messages */
+#define	LOG_MAIL	(2<<3)	/* mail system */
+#define	LOG_DAEMON	(3<<3)	/* system daemons */
+#define	LOG_AUTH	(4<<3)	/* security/authorization messages */
+#define	LOG_SYSLOG	(5<<3)	/* messages generated internally by syslogd */
+#define	LOG_LPR		(6<<3)	/* line printer subsystem */
+#define	LOG_NEWS	(7<<3)	/* network news subsystem */
+#define	LOG_UUCP	(8<<3)	/* UUCP subsystem */
+#define	LOG_CRON	(15<<3)	/* clock daemon */
+	/* other codes through 15 reserved for system use */
+#define	LOG_LOCAL0	(16<<3)	/* reserved for local use */
+#define	LOG_LOCAL1	(17<<3)	/* reserved for local use */
+#define	LOG_LOCAL2	(18<<3)	/* reserved for local use */
+#define	LOG_LOCAL3	(19<<3)	/* reserved for local use */
+#define	LOG_LOCAL4	(20<<3)	/* reserved for local use */
+#define	LOG_LOCAL5	(21<<3)	/* reserved for local use */
+#define	LOG_LOCAL6	(22<<3)	/* reserved for local use */
+#define	LOG_LOCAL7	(23<<3)	/* reserved for local use */
+
+#define	LOG_NFACILITIES	24	/* current number of facilities */
+#define	LOG_FACMASK	0x03f8	/* mask to extract facility part */
+				/* facility of pri */
+#define	LOG_FAC(p)	(((p) & LOG_FACMASK) >> 3)
+
+#ifdef SYSLOG_NAMES
+CODE facilitynames[] = {
+	"auth",		LOG_AUTH,
+	"cron", 	LOG_CRON,
+	"daemon",	LOG_DAEMON,
+	"kern",		LOG_KERN,
+	"lpr",		LOG_LPR,
+	"mail",		LOG_MAIL,
+	"mark", 	INTERNAL_MARK,		/* INTERNAL */
+	"news",		LOG_NEWS,
+	"security",	LOG_AUTH,		/* DEPRECATED */
+	"syslog",	LOG_SYSLOG,
+	"user",		LOG_USER,
+	"uucp",		LOG_UUCP,
+	"local0",	LOG_LOCAL0,
+	"local1",	LOG_LOCAL1,
+	"local2",	LOG_LOCAL2,
+	"local3",	LOG_LOCAL3,
+	"local4",	LOG_LOCAL4,
+	"local5",	LOG_LOCAL5,
+	"local6",	LOG_LOCAL6,
+	"local7",	LOG_LOCAL7,
+	NULL,		-1,
+};
+#endif
+
+#ifdef KERNEL
+#define	LOG_PRINTF	-1	/* pseudo-priority to indicate use of printf */
+#endif
+
+/*
+ * arguments to setlogmask.
+ */
+#define	LOG_MASK(pri)	(1 << (pri))		/* mask for one priority */
+#define	LOG_UPTO(pri)	((1 << ((pri)+1)) - 1)	/* all priorities through pri */
+
+/*
+ * Option flags for openlog.
+ *
+ * LOG_ODELAY no longer does anything.
+ * LOG_NDELAY is the inverse of what it used to be.
+ */
+#define	LOG_PID		0x01	/* log the pid with each message */
+#define	LOG_CONS	0x02	/* log on the console if errors in sending */
+#define	LOG_ODELAY	0x04	/* delay open until first syslog() (default) */
+#define	LOG_NDELAY	0x08	/* don't delay open */
+#define	LOG_NOWAIT	0x10	/* don't wait for console forks: DEPRECATED */
+#define	LOG_PERROR	0x20	/* log to stderr as well */
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/Makefile.in
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/Makefile.in	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/Makefile.in	(revision 1198)
@@ -0,0 +1,89 @@
+# Makefile for syslog replacement
+#
+# @configure_input@
+#
+# Copyright (c) 1998-2000 Carnegie Mellon University.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer. 
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+#
+# 3. The name "Carnegie Mellon University" must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission. For permission or any other legal
+#    details, please contact  
+#      Office of Technology Transfer
+#      Carnegie Mellon University
+#      5000 Forbes Avenue
+#      Pittsburgh, PA  15213-3890
+#      (412) 268-4387, fax: (412) 268-7395
+#      tech-transfer@andrew.cmu.edu
+#
+# 4. Redistributions of any form whatsoever must retain the following
+#    acknowledgment:
+#    "This product includes software developed by Computing Services
+#     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+#
+# CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+# FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+# AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+# OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+# 
+
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+CC = @CC@
+
+INSTALL = @INSTALL@
+RANLIB = @RANLIB@
+
+DEFS = @DEFS@
+CPPFLAGS = @CPPFLAGS@
+LIBS = @LIBS@
+
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+
+SHELL = /bin/sh
+MAKEDEPEND = @MAKEDEPEND@
+
+all: libsyslog.a syslogd
+
+install:
+	@echo "Install syslogd and syslog.conf as appropriate"
+
+.c.o:
+	$(CC) -c $(CPPFLAGS) $(DEFS) -I$(srcdir) $(CFLAGS) $<
+
+libsyslog.a: syslog.o
+	ar cr libsyslog.a syslog.o
+	$(RANLIB) libsyslog.a
+
+syslogd: syslogd.o
+	$(CC) $(LDFLAGS) -o syslogd syslogd.o $(LIBS)
+
+clean:
+	rm -f *.o *.a Makefile.bak
+
+distclean: clean
+	rm -f Makefile
+
+depend:
+	${MAKEDEPEND} $(CPPFLAGS) $(DEFS) -I$(srcdir) $(CFLAGS) *.c $(srcdir)/*.c 1>makedepend.log 2>&1
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/logger.1
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/logger.1	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/logger.1	(revision 1198)
@@ -0,0 +1,133 @@
+.\" 
+.\" Copyright (c) 2000 Carnegie Mellon University.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\"
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer. 
+.\"
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\"
+.\" 3. The name "Carnegie Mellon University" must not be used to
+.\"    endorse or promote products derived from this software without
+.\"    prior written permission. For permission or any other legal
+.\"    details, please contact  
+.\"      Office of Technology Transfer
+.\"      Carnegie Mellon University
+.\"      5000 Forbes Avenue
+.\"      Pittsburgh, PA  15213-3890
+.\"      (412) 268-4387, fax: (412) 268-7395
+.\"      tech-transfer@andrew.cmu.edu
+.\"
+.\" 4. Redistributions of any form whatsoever must retain the following
+.\"    acknowledgment:
+.\"    "This product includes software developed by Computing Services
+.\"     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+.\"
+.\" CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+.\" THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+.\" FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+.\" AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\" 
+.\" $Revision: 1.2 $
+.\"  Modified by Rich $alz <rsalz@osf.org> to be more portable to older
+.\"  systems.
+.\" Copyright (c) 1983, 1990 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms are permitted provided
+.\" that: (1) source distributions retain this entire copyright notice and
+.\" comment, and (2) distributions including binaries display the following
+.\" acknowledgement:  ``This product includes software developed by the
+.\" University of California, Berkeley and its contributors'' in the
+.\" documentation or other materials provided with the distribution and in
+.\" all advertising materials mentioning features or use of this software.
+.\" Neither the name of the University nor the names of its contributors may
+.\" be used to endorse or promote products derived from this software without
+.\" specific prior written permission.
+.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+.\"
+.\"     @(#)logger.1	6.6 (Berkeley) 7/24/90
+.\"
+.TH LOGGER 1 "July 24, 1990"
+.SH NAME
+logger \- make entries in the system log
+.SH SYNOPSIS
+.B logger
+[
+.B \-i
+]
+[
+.B \-s
+]
+[
+.BI \-f file
+]
+[
+.BI \-p pri
+]
+[
+.BI \-t tag
+]
+.I message...
+.SH DESCRIPTION
+.I Logger
+provides a shell command interface to the
+.IR syslog (3)
+system log module.
+.PP
+Options:
+.TP
+.B \-i
+Log the process id of the logger process with each line.
+.TP
+.B \-s
+Log the message to standard error, as well as the system log.
+.TP
+.BI \-f file
+Log the specified file.
+.TP
+.BI \-p pri
+Enter the message with the specified priority.
+The priority may be specified numerically or as a ``facility.level'' pair.
+For example, ``\-p local3.info'' logs the message(s) as
+.IR info rmational
+level in the
+.I local3
+facility.
+The default is ``user.notice.''
+.TP
+.BI \-t tag
+Mark every line in the log with the specified
+.IR tag  .
+.TP
+.I message
+Write the message to log; if not specified, and the ``\-f'' flag is not
+provided, standard input is logged.
+.PP
+The
+.I logger
+utility exits 0 on success, and >0 if an error occurs.
+.SH EXAMPLES
+.RS
+.nf
+logger System rebooted
+
+logger \-p local0.notice \-t HOSTIDM \-f /dev/idmc
+.fi
+.DE
+.SH "SEE ALSO"
+.syslog(3),
+syslogd(8)
+.SH STANDARDS
+The logger function is expected to be POSIX 1003.2 compatible.
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/logger.c
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/logger.c	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/logger.c	(revision 1198)
@@ -0,0 +1,240 @@
+/*  $Revision: 1.2 $
+**  Modified by Rich $alz <rsalz@osf.org> to be more portable to older
+**  systems.
+*/
+/*
+ * Copyright (c) 1998-2000 Carnegie Mellon University.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The name "Carnegie Mellon University" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For permission or any other legal
+ *    details, please contact  
+ *      Office of Technology Transfer
+ *      Carnegie Mellon University
+ *      5000 Forbes Avenue
+ *      Pittsburgh, PA  15213-3890
+ *      (412) 268-4387, fax: (412) 268-7395
+ *      tech-transfer@andrew.cmu.edu
+ *
+ * 4. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by Computing Services
+ *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+ *
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1983 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)logger.c	6.14 (Berkeley) 6/1/90";
+#endif /* not lint */
+
+#include <stdio.h>
+#ifdef __EMX__
+#include <stdlib.h>
+#endif
+#define SYSLOG_NAMES
+#include "syslog.h"
+#include <ctype.h>
+
+/*
+**  LOGGER -- read and log utility
+**
+**	This routine reads from an input and arranges to write the
+**	result on the system log, along with a useful tag.
+*/
+
+/*
+**  Return a string representation of errno.
+*/
+static char *
+xstrerror(e)
+    int		e;
+{
+#ifndef __EMX__
+    extern int	sys_nerr;
+    extern char	*sys_errlist[];
+#endif
+    static char	buff[30];
+
+    if (e >= 0 && e < sys_nerr)
+	return sys_errlist[e];
+    (void)sprintf(buff, "Error code %d\n", e);
+    return buff;
+}
+
+main(argc, argv)
+	int argc;
+	char **argv;
+{
+	extern char *optarg;
+	extern int errno, optind;
+	int pri = LOG_NOTICE;
+	int ch, logflags = 0;
+	char *tag, buf[1024], *getlogin();
+
+	tag = NULL;
+	while ((ch = getopt(argc, argv, "f:ip:st:")) != EOF)
+		switch((char)ch) {
+		case 'f':		/* file to log */
+			if (freopen(optarg, "r", stdin) == NULL) {
+				(void)fprintf(stderr, "logger: %s: %s.\n",
+				    optarg, xstrerror(errno));
+				exit(1);
+			}
+			break;
+		case 'i':		/* log process id also */
+			logflags |= LOG_PID;
+			break;
+		case 'p':		/* priority */
+			pri = pencode(optarg);
+			break;
+		case 's':		/* log to standard error */
+			logflags |= LOG_PERROR;
+			break;
+		case 't':		/* tag */
+			tag = optarg;
+			break;
+		case '?':
+		default:
+			usage();
+		}
+	argc -= optind;
+	argv += optind;
+
+	/* setup for logging */
+	openlog(tag ? tag : getlogin(), logflags, 0);
+	(void) fclose(stdout);
+
+	/* log input line if appropriate */
+	if (argc > 0) {
+		register char *p, *endp;
+		int len;
+
+		for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) {
+			len = strlen(*argv);
+			if (p + len > endp && p > buf) {
+				syslog(pri, "%s", buf);
+				p = buf;
+			}
+			if (len > sizeof(buf) - 1)
+				syslog(pri, "%s", *argv++);
+			else {
+				if (p != buf)
+					*p++ = ' ';
+				bcopy(*argv++, p, len);
+				*(p += len) = '\0';
+			}
+		}
+		if (p != buf)
+			syslog(pri, "%s", buf);
+		exit(0);
+	}
+
+	/* main loop */
+	while (fgets(buf, sizeof(buf), stdin) != NULL)
+		syslog(pri, "%s", buf);
+
+	exit(0);
+}
+
+
+/*
+ *  Decode a symbolic name to a numeric value
+ */
+pencode(s)
+	register char *s;
+{
+	char *save;
+	int fac, lev;
+
+	for (save = s; *s && *s != '.'; ++s);
+	if (*s) {
+		*s = '\0';
+		fac = decode(save, facilitynames);
+		if (fac < 0)
+			bailout("unknown facility name: ", save);
+		*s++ = '.';
+	}
+	else {
+		fac = 0;
+		s = save;
+	}
+	lev = decode(s, prioritynames);
+	if (lev < 0)
+		bailout("unknown priority name: ", save);
+	return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
+}
+
+
+decode(name, codetab)
+	char *name;
+	CODE *codetab;
+{
+	register CODE *c;
+
+	if (isdigit(*name))
+		return (atoi(name));
+
+	for (c = codetab; c->c_name; c++)
+		if (!strcasecmp(name, c->c_name))
+			return (c->c_val);
+
+	return (-1);
+}
+
+bailout(msg, arg)
+	char *msg, *arg;
+{
+	fprintf(stderr, "logger: %s%s\n", msg, arg);
+	exit(1);
+}
+
+usage()
+{
+	fputs("logger: [-i] [-f file] [-p pri] [-t tag] [ message ... ]\n",
+	    stderr);
+	exit(1);
+}
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/makefile
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/makefile	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/makefile	(revision 1198)
@@ -0,0 +1,92 @@
+# Makefile for syslog replacement
+#
+# @configure_input@
+#
+# Copyright (c) 1998-2000 Carnegie Mellon University.  All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer. 
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in
+#    the documentation and/or other materials provided with the
+#    distribution.
+#
+# 3. The name "Carnegie Mellon University" must not be used to
+#    endorse or promote products derived from this software without
+#    prior written permission. For permission or any other legal
+#    details, please contact  
+#      Office of Technology Transfer
+#      Carnegie Mellon University
+#      5000 Forbes Avenue
+#      Pittsburgh, PA  15213-3890
+#      (412) 268-4387, fax: (412) 268-7395
+#      tech-transfer@andrew.cmu.edu
+#
+# 4. Redistributions of any form whatsoever must retain the following
+#    acknowledgment:
+#    "This product includes software developed by Computing Services
+#     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+#
+# CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+# AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+# FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+# AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+# OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+# 
+
+srcdir = .
+VPATH = @srcdir@
+
+#CC = @CC@
+
+INSTALL = @INSTALL@
+RANLIB = echo
+
+DEFS =
+CPPFLAGS = 
+LIBS = -lsyslog -lsocket
+
+CFLAGS = -g -Zomf
+LDFLAGS = -Zexe -g -Zomf
+
+SHELL = /bin/sh
+MAKEDEPEND = @MAKEDEPEND@
+
+all: libsyslog.a logger
+
+install:
+	@echo "Install syslogd and syslog.conf as appropriate"
+
+.c.o:
+	$(CC) -c $(CPPFLAGS) $(DEFS) -I$(srcdir) $(CFLAGS) $<
+
+libsyslog.a: syslog.o
+	emxomfar cr libsyslog.a syslog.o
+	$(RANLIB) libsyslog.a
+
+syslogd: syslogd.o
+	$(CC) $(LDFLAGS) -o syslogd syslogd.o $(LIBS)
+
+logger: logger.o libsyslog.a
+	$(CC) $(LDFLAGS) -o logger logger.o $(LIBS)
+
+clean:
+	rm -f *.o *.a Makefile.bak
+
+distclean: clean
+	rm -f Makefile
+
+depend:
+	${MAKEDEPEND} $(CPPFLAGS) $(DEFS) -I$(srcdir) $(CFLAGS) *.c $(srcdir)/*.c 1>makedepend.log 2>&1
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.3
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.3	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.3	(revision 1198)
@@ -0,0 +1,278 @@
+.\" 
+.\" Copyright (c) 2000 Carnegie Mellon University.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\"
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer. 
+.\"
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\"
+.\" 3. The name "Carnegie Mellon University" must not be used to
+.\"    endorse or promote products derived from this software without
+.\"    prior written permission. For permission or any other legal
+.\"    details, please contact  
+.\"      Office of Technology Transfer
+.\"      Carnegie Mellon University
+.\"      5000 Forbes Avenue
+.\"      Pittsburgh, PA  15213-3890
+.\"      (412) 268-4387, fax: (412) 268-7395
+.\"      tech-transfer@andrew.cmu.edu
+.\"
+.\" 4. Redistributions of any form whatsoever must retain the following
+.\"    acknowledgment:
+.\"    "This product includes software developed by Computing Services
+.\"     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+.\"
+.\" CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+.\" THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+.\" FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+.\" AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\" 
+.\" $Revision: 1.2 $
+.\" Copyright (c) 1985 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms are permitted provided
+.\" that: (1) source distributions retain this entire copyright notice and
+.\" comment, and (2) distributions including binaries display the following
+.\" acknowledgement:  ``This product includes software developed by the
+.\" University of California, Berkeley and its contributors'' in the
+.\" documentation or other materials provided with the distribution and in
+.\" all advertising materials mentioning features or use of this software.
+.\" Neither the name of the University nor the names of its contributors may
+.\" be used to endorse or promote products derived from this software without
+.\" specific prior written permission.
+.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+.\"
+.\"	@(#)syslog.3	6.13 (Berkeley) 6/23/90
+.\"
+.TH SYSLOG 3 "June 23, 1990"
+.UC 5
+.SH NAME
+syslog, openlog, closelog, setlogmask, vsyslog \- control system log
+.SH SYNOPSIS
+.B "#include <syslog.h>
+.PP
+.B "openlog(ident, logopt, facility)
+.br
+.B "char *ident;
+.PP
+.B "syslog(priority, message, parameters ... )
+.br
+.B "int priority;
+.br
+.B "char *message;
+.PP
+.B "#include <varargs.h>
+.br
+.B "vsyslog(priority, message, args)
+.br
+.B "int priority;
+.br
+.B "char *message;
+.br
+.B "va_list args;
+.PP
+.B "closelog()
+.PP
+.B "setlogmask(maskpri)
+.SH DESCRIPTION
+.I Syslog
+arranges to write
+.I message
+onto the system log maintained by
+.IR syslogd (8).
+The message is tagged with
+.IR priority .
+The message looks like a
+.IR printf (3)
+string except that
+.B %m
+is replaced by the current error message (as referenced by
+.IR errno ).
+A trailing newline is added if needed.
+An alternate form, in which the arguments have already been captured
+using the variable-length argument facilities of
+.IR varargs (3),
+is available under the name
+.IR vsyslog .
+.PP
+This message will be read by
+.IR syslogd (8)
+and written to the system console, log files, or forwarded to
+.I syslogd
+on another host as appropriate.
+.PP
+Priorities are encoded as a
+.I facility
+and a
+.IR level .
+The facility describes the part of the system
+generating the message.
+The level is selected from an ordered list:
+.TP
+LOG_ALERT
+A condition that should be corrected immediately,
+such as a corrupted system database.
+.TP
+LOG_CRIT
+Critical conditions,
+e.g., hard device errors.
+.TP
+LOG_DEBUG
+Messages that contain information
+normally of use only when debugging a program.
+.TP
+LOG_EMERG
+A panic condition.
+This is normally broadcast to all users.
+.TP
+LOG_ERR
+Errors.
+.TP
+LOG_INFO
+Informational messages.
+.TP
+LOG_NOTICE
+Conditions that are not error conditions,
+but should possibly be handled specially.
+.TP
+LOG_WARNING
+Warning messages.
+.PP
+If
+.I syslog
+cannot pass the message to
+.IR syslogd ,
+it will attempt to write the message to the console (``/dev/console'')
+if the LOG_CONS option is set (see below).
+.PP
+If special processing is needed,
+.I openlog
+can be called to initialize the log file.
+The parameter
+.I ident
+is a string that is prepended to every message.
+.I Logopt
+is a bit field indicating logging options.
+Current values for
+.I logopt
+are:
+.TP
+LOG_CONS
+If unable to send the message to
+.IR syslogd ,
+write it to the console.
+.TP
+LOG_NDELAY 
+Open the connection to
+.I syslogd
+immediately.
+Normally the open is delayed
+until the first message is logged.
+Useful for programs that need to manage the
+order in which file descriptors are allocated.
+.TP
+LOG_PERROR
+Write the message to stderr as well to the system log.
+.TP
+LOG_PID
+Log the process id with each message:
+useful for identifying instantiations of daemons.
+.PP
+The
+.I facility
+parameter encodes a default facility to be assigned to all messages
+that do not have an explicit facility encoded:
+.TP
+LOG_AUTH
+The authorization system:
+.IR login (1),
+.IR su (1),
+.IR getty (8),
+etc.
+.TP
+LOG_CRON
+The clock daemon.
+.TP
+LOG_DAEMON
+System daemons, such as
+.IR ftpd (8),
+.IR routed (8),
+etc, that are not provided for explicitly by other facilities.
+.TP
+LOG_KERN
+Messages generated by the kernel.
+These cannot be generated by any user processes.
+.TP
+LOG_LPR
+The line printer spooling system:
+.IR lpr (1),
+.IR lpc (8),
+.IR lpd (8),
+etc.
+.TP
+LOG_MAIL
+The mail system.
+.TP
+LOG_NEWS
+The network news system.
+.TP
+LOG_SYSLOG
+Messages generated internally by
+.IR syslogd (8).
+.TP
+LOG_USER
+Messages generated by random user processes.
+This is the default facility identifier if none is specified.
+.TP
+LOG_UUCP
+The uucp system.
+.TP
+LOG_LOCAL0
+Reserved for local use.
+Similarly for LOG_LOCAL1 through LOG_LOCAL7.
+.PP
+.I Closelog
+can be used to close the log file.
+.PP
+.I Setlogmask
+sets the log priority mask to
+.I maskpri
+and returns the previous mask.
+Calls to
+.I syslog
+with a priority not set in
+.I maskpri
+are rejected.
+The mask for an individual priority
+.I pri
+is calculated by the macro LOG_MASK(\fIpri\fP);
+the mask for all priorities up to and including
+.I toppri
+is given by the macro LOG_UPTO(\fItoppri\fP).
+The default allows all priorities to be logged.
+.SH EXAMPLES
+.nf
+syslog(LOG_ALERT, "who: internal error 23");
+
+openlog("ftpd", LOG_PID, LOG_DAEMON);
+setlogmask(LOG_UPTO(LOG_ERR));
+syslog(LOG_INFO, "Connection from host %d", CallingHost);
+
+syslog(LOG_INFO|LOG_LOCAL2, "foobar error: %m");
+.fi
+.SH "SEE ALSO"
+logger(1),
+syslogd(8)
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.3.html
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.3.html	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.3.html	(revision 1198)
@@ -0,0 +1,228 @@
+<HTML>
+<BODY>
+<PRE>
+<!-- Manpage converted by man2html 3.0.1 -->
+       syslog,  openlog,  closelog, setlogmask, vsyslog - control
+       system log
+
+
+</PRE>
+<H2>SYNOPSIS</H2><PRE>
+       <B>#include</B> <B>&lt;syslog.h&gt;</B>
+
+       <B>openlog(ident,</B> <B>logopt,</B> <B>facility)</B>
+       <B>char</B> <B>*ident;</B>
+
+       <B>syslog(priority,</B> <B>message,</B> <B>parameters</B> <B>...</B> <B>)</B>
+       <B>int</B> <B>priority;</B>
+       <B>char</B> <B>*message;</B>
+
+       <B>#include</B> <B>&lt;varargs.h&gt;</B>
+       <B>vsyslog(priority,</B> <B>message,</B> <B>args)</B>
+       <B>int</B> <B>priority;</B>
+       <B>char</B> <B>*message;</B>
+       <B>va_list</B> <B>args;</B>
+
+       <B>closelog()</B>
+
+       <B>setlogmask(maskpri)</B>
+
+
+</PRE>
+<H2>DESCRIPTION</H2><PRE>
+       <I>Syslog</I> arranges to write <I>message</I> onto the system log main-
+       tained  by  <B>syslogd(8)</B>.  The message is tagged with <I>prior-</I>
+       <I>ity</I>.  The message looks like  a  <B>printf(3)</B>  string  except
+       that  <B>%m</B> is replaced by the current error message (as ref-
+       erenced by <I>errno</I>).  A trailing newline is added if needed.
+       An  alternate  form,  in  which the arguments have already
+       been captured using the variable-length  argument  facili-
+       ties of <B>varargs(3)</B>, is available under the name <I>vsyslog</I>.
+
+       This message will be read by <B>syslogd(8)</B> and written to the
+       system console, log files,  or  forwarded  to  <I>syslogd</I>  on
+       another host as appropriate.
+
+       Priorities  are  encoded  as  a <I>facility</I> and a <I>level</I>.  The
+       facility describes the part of the system  generating  the
+       message.  The level is selected from an ordered list:
+
+       LOG_ALERT
+              A  condition  that should be corrected immediately,
+              such as a corrupted system database.
+
+       LOG_CRIT
+              Critical conditions, e.g., hard device errors.
+
+       LOG_DEBUG
+              Messages that contain information normally  of  use
+              only when debugging a program.
+
+              A  panic  condition.  This is normally broadcast to
+              all users.
+
+       LOG_ERR
+              Errors.
+
+       LOG_INFO
+              Informational messages.
+
+       LOG_NOTICE
+              Conditions  that  are  not  error  conditions,  but
+              should possibly be handled specially.
+
+       LOG_WARNING
+              Warning messages.
+
+       If  <I>syslog</I>  cannot  pass  the  message to <I>syslogd</I>, it will
+       attempt to write the message to the  console  (``/dev/con-
+       sole'') if the LOG_CONS option is set (see below).
+
+       If  special processing is needed, <I>openlog</I> can be called to
+       initialize the log file.  The parameter <I>ident</I> is a  string
+       that is prepended to every message.  <I>Logopt</I> is a bit field
+       indicating logging options.   Current  values  for  <I>logopt</I>
+       are:
+
+       LOG_CONS
+              If  unable to send the message to <I>syslogd</I>, write it
+              to the console.
+
+       LOG_NDELAY
+              Open the connection to <I>syslogd</I>  immediately.   Nor-
+              mally  the  open is delayed until the first message
+              is logged.  Useful for programs that need to manage
+              the  order in which file descriptors are allocated.
+
+       LOG_PERROR
+              Write the message to stderr as well to  the  system
+              log.
+
+       LOG_PID
+              Log  the  process  id with each message: useful for
+              identifying instantiations of daemons.
+
+       The <I>facility</I> parameter encodes a default  facility  to  be
+       assigned  to  all  messages  that  do not have an explicit
+       facility encoded:
+
+       LOG_AUTH
+              The   authorization   system:   <B>login(1)</B>,    <B>su(1)</B>,
+              <B>getty(8)</B>, etc.
+
+              The clock daemon.
+
+       LOG_DAEMON
+              System  daemons,  such  as <B>ftpd(8)</B>, <B>routed(8)</B>, etc,
+              that are  not  provided  for  explicitly  by  other
+              facilities.
+
+       LOG_KERN
+              Messages  generated by the kernel.  These cannot be
+              generated by any user processes.
+
+       LOG_LPR
+              The line printer spooling system:  <B>lpr(1)</B>,  <B>lpc(8)</B>,
+              <B>lpd(8)</B>, etc.
+
+       LOG_MAIL
+              The mail system.
+
+       LOG_NEWS
+              The network news system.
+
+       LOG_SYSLOG
+              Messages generated internally by <B>syslogd(8)</B>.
+
+       LOG_USER
+              Messages  generated by random user processes.  This
+              is the default facility identifier if none is spec-
+              ified.
+
+       LOG_UUCP
+              The uucp system.
+
+       LOG_LOCAL0
+              Reserved  for  local use.  Similarly for LOG_LOCAL1
+              through LOG_LOCAL7.
+
+       <I>Closelog</I> can be used to close the log file.
+
+       <I>Setlogmask</I> sets the  log  priority  mask  to  <I>maskpri</I>  and
+       returns  the previous mask.  Calls to <I>syslog</I> with a prior-
+       ity not set in <I>maskpri</I> are  rejected.   The  mask  for  an
+       individual   priority  <I>pri</I>  is  calculated  by  the  macro
+       LOG_MASK(<I>pri</I>); the mask  for  all  priorities  up  to  and
+       including  <I>toppri</I>  is given by the macro LOG_UPTO(<I>toppri</I>).
+       The default allows all priorities to be logged.
+
+
+</PRE>
+<H2>EXAMPLES</H2><PRE>
+       syslog(LOG_ALERT, "who: internal error 23");
+
+       openlog("ftpd", LOG_PID, LOG_DAEMON);
+       setlogmask(LOG_UPTO(LOG_ERR));
+       syslog(LOG_INFO, "Connection from host %d", CallingHost);
+
+
+</PRE>
+<H2>SEE ALSO</H2><PRE>
+       <B>logger(1)</B>, <B>syslogd(8)</B>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</PRE>
+<HR>
+<ADDRESS>
+Man(1) output converted with
+<a href="http://www.oac.uci.edu/indiv/ehood/man2html.html">man2html</a>
+</ADDRESS>
+</BODY>
+</HTML>
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.c
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.c	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.c	(revision 1198)
@@ -0,0 +1,341 @@
+/*
+ * Copyright (c) 1983, 1988, 1993
+ *      The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)syslog.c    8.8 (Berkeley) 8/30/95";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
+#include <syslog.h>
+#include <netdb.h>
+#ifdef __EMX__
+#include <netinet/in.h>
+#endif
+
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#if defined(BSD4_4) && !defined(__EMX__)
+# include <paths.h>
+#else
+# if defined(__EMX__)
+#  define _PATH_CONSOLE "con"
+# endif
+
+# ifndef _PATH_CONSOLE
+#  define _PATH_CONSOLE "/dev/console"
+# endif
+# ifndef _PATH_LOG
+#  define _PATH_LOG     "/dev/log"
+# endif
+#endif
+
+#if __STDC__
+# include <stdarg.h>
+#else
+# include <varargs.h>
+# define const  /* */
+#endif
+
+#ifndef USESNPRINTF
+# if defined(BSD4_4) || defined(__EMX__)
+#  define USESNPRINTF   1       /* has snprintf(3), vsnprintf(3), etc. */
+# else
+#  define USESNPRINTF   0       /* cheesy old C library */
+# endif
+#endif
+
+#ifndef LOG_PRI
+# define LOG_PRI(p)     ((p) & LOG_PRIMASK)
+#endif
+
+#ifndef LOG_PERROR
+# define LOG_PERROR     0
+#endif
+
+#define BUFSLOP         1024    /* overflow space */
+
+static int      LogFile = -1;           /* fd for log */
+static int      connected;              /* have done connect */
+static int      LogStat = 0;            /* status bits, set by openlog() */
+static const char *LogTag = NULL;       /* string to tag the entry with */
+static int      LogFacility = LOG_USER; /* default facility code */
+static int      LogMask = 0xff;         /* mask of priorities to be logged */
+#if defined(BSD4_4) && !defined(__EMX__)
+extern char     *__progname;            /* Program name, from crt0. */
+#else
+char            *__progname = NULL;
+#endif
+
+/*
+ * syslog, vsyslog --
+ *      print message on log file; output is intended for syslogd(8).
+ */
+void
+#if __STDC__
+syslog(int pri, const char *fmt, ...)
+#else
+syslog(pri, fmt, va_alist)
+        int pri;
+        char *fmt;
+        va_dcl
+#endif
+{
+        va_list ap;
+        extern void vsyslog();
+
+#if __STDC__
+        va_start(ap, fmt);
+#else
+        va_start(ap);
+#endif
+        vsyslog(pri, fmt, ap);
+        va_end(ap);
+}
+
+void
+vsyslog(pri, fmt, ap)
+        int pri;
+        register const char *fmt;
+        va_list ap;
+{
+        register int cnt;
+        register char ch, *p, *t;
+        time_t now;
+        int fd, saved_errno;
+        int panic = 0;
+        static int maxsend = BUFSIZ;
+        char *stdp, fmt_cpy[1024], tbuf[BUFSIZ + BUFSLOP];
+        extern void openlog();
+
+#define INTERNALLOG     LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID
+        /* Check for invalid bits. */
+        if (pri & ~(LOG_PRIMASK|LOG_FACMASK)) {
+                syslog(INTERNALLOG,
+                    "syslog: unknown facility/priority: %x", pri);
+                pri &= LOG_PRIMASK|LOG_FACMASK;
+        }
+
+        /* Check priority against setlogmask values. */
+        if (!(LOG_MASK(LOG_PRI(pri)) & LogMask))
+                return;
+
+        saved_errno = errno;
+
+        /* Set default facility if none specified. */
+        if ((pri & LOG_FACMASK) == 0)
+                pri |= LogFacility;
+
+        /* Get connected. */
+        if (!connected)
+                openlog(LogTag, LogStat | LOG_NDELAY, 0);
+
+        /* Build the message. */
+        (void)time(&now);
+        sprintf(tbuf, "<%d>", pri);
+        p = tbuf + strlen(tbuf);
+        strftime(p, sizeof (tbuf) - (p - tbuf), "%h %d %T ", localtime(&now));
+        p += strlen(p);
+        stdp = p;
+        if (LogTag == NULL)
+                LogTag = __progname;
+        if (LogTag != NULL) {
+                sprintf(p, "%s", LogTag);
+                p += strlen(p);
+        }
+        if (LogStat & LOG_PID) {
+                sprintf(p, "[%d]", getpid());
+                p += strlen(p);
+        }
+        if (LogTag != NULL) {
+                *p++ = ':';
+                *p++ = ' ';
+        }
+
+        /* Substitute error message for %m. */
+        for (t = fmt_cpy; ch = *fmt; ++fmt)
+                if (ch == '%' && fmt[1] == 'm') {
+                        ++fmt;
+                        sprintf(t, "%s", strerror(saved_errno));
+                        t += strlen(t);
+                } else
+                        *t++ = ch;
+        *t = '\0';
+
+#if USESNPRINTF
+        cnt = maxsend - (p - tbuf) + 1;
+        p += vsnprintf(p, cnt, fmt_cpy, ap);
+        cnt = p - tbuf;
+#else
+        vsprintf(p, fmt_cpy, ap);
+        p += strlen(p);
+        cnt = p - tbuf;
+        if (cnt > sizeof tbuf) {
+                /* Panic condition. */
+                panic = 1;
+        }
+        if (cnt > maxsend)
+                cnt = maxsend;
+#endif
+
+        /* Output to stderr if requested. */
+        if (LogStat & LOG_PERROR) {
+                struct iovec iov[2];
+                register struct iovec *v = iov;
+
+                v->iov_base = stdp;
+                v->iov_len = cnt - (stdp - tbuf);
+                ++v;
+                v->iov_base = "\n";
+                v->iov_len = 1;
+                (void)writev(STDERR_FILENO, iov, 2);
+        }
+
+        /* Output the message to the local logger. */
+        for (;;) {
+                if (send(LogFile, tbuf, cnt, 0) >= 0)
+                        goto done;
+                if (errno != EMSGSIZE || maxsend <= 256)
+                        break;
+
+                /* Message was too large -- back it off. */
+                do {
+                        maxsend -= 128;
+                } while (cnt < maxsend && maxsend > 256);
+                cnt = maxsend;
+        }
+
+        /*
+         * Output the message to the console; don't worry about blocking,
+         * if console blocks everything will.  Make sure the error reported
+         * is the one from the syslogd failure.
+         */
+        if (LogStat & LOG_CONS &&
+            (fd = open(_PATH_CONSOLE, O_WRONLY, 0)) >= 0) {
+                (void)strcat(tbuf, "\r\n");
+                cnt += 2;
+                p = strchr(tbuf, '>') + 1;
+                (void)write(fd, p, cnt - (p - tbuf));
+                (void)close(fd);
+        }
+
+  done:
+#if !USESNPRINTF
+        /*
+         * If we had a buffer overrun, log a panic and abort.
+         * We can't return because our stack is probably toast.
+         */
+        if (panic) {
+                syslog(LOG_EMERG, "SYSLOG BUFFER OVERRUN -- EXITING");
+                abort();
+        }
+#endif
+}
+
+#ifdef __EMX__
+static struct sockaddr_in SyslogAddr;   /* AF_INET address of local logger */
+#else
+static struct sockaddr SyslogAddr;      /* AF_UNIX address of local logger */
+#endif
+
+void
+openlog(ident, logstat, logfac)
+        const char *ident;
+        int logstat, logfac;
+{
+        if (ident != NULL)
+                LogTag = ident;
+        LogStat = logstat;
+        if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
+                LogFacility = logfac;
+
+        if (LogFile == -1) {
+#ifdef __EMX__
+                memset(&SyslogAddr, 0, sizeof(SyslogAddr));
+                SyslogAddr.sin_len = sizeof(SyslogAddr);
+                SyslogAddr.sin_family = AF_INET;
+                SyslogAddr.sin_port = htons(514);
+                SyslogAddr.sin_addr.s_addr = INADDR_ANY;
+#else
+                SyslogAddr.sa_family = AF_UNIX;
+                (void)strncpy(SyslogAddr.sa_data, _PATH_LOG,
+                    sizeof(SyslogAddr.sa_data));
+#endif
+                if (LogStat & LOG_NDELAY) {
+#ifdef __EMX__
+                        if ((LogFile = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+#else
+                        if ((LogFile = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1)
+#endif
+                                return;
+#ifndef __EMX__
+                        (void)fcntl(LogFile, F_SETFD, 1);
+#endif
+                }
+        }
+        if (LogFile != -1 && !connected)
+                if (connect(LogFile, (struct sockaddr*) &SyslogAddr, sizeof(SyslogAddr)) == -1) {
+                        (void)close(LogFile);
+                        LogFile = -1;
+                } else
+                        connected = 1;
+}
+
+void
+closelog()
+{
+        (void)close(LogFile);
+        LogFile = -1;
+        connected = 0;
+}
+
+/* setlogmask -- set the log mask level */
+int
+setlogmask(pmask)
+        int pmask;
+{
+        int omask;
+
+        omask = LogMask;
+        if (pmask != 0)
+                LogMask = pmask;
+        return (omask);
+}
+
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.conf
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.conf	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslog.conf	(revision 1198)
@@ -0,0 +1,10 @@
+##  Sample syslog.conf file for folks not used to the new syslog.
+##
+
+##  This matches typical old-style config.  Log everything to a
+##  file and send warnings or worse to root.
+*.notice;news.err	/usr/adm/syslog
+*.alert			root
+
+local6.debug		/usr/adm/imapd.log
+
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslogd.8
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslogd.8	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslogd.8	(revision 1198)
@@ -0,0 +1,237 @@
+.\" 
+.\" Copyright (c) 2000 Carnegie Mellon University.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\"
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer. 
+.\"
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in
+.\"    the documentation and/or other materials provided with the
+.\"    distribution.
+.\"
+.\" 3. The name "Carnegie Mellon University" must not be used to
+.\"    endorse or promote products derived from this software without
+.\"    prior written permission. For permission or any other legal
+.\"    details, please contact  
+.\"      Office of Technology Transfer
+.\"      Carnegie Mellon University
+.\"      5000 Forbes Avenue
+.\"      Pittsburgh, PA  15213-3890
+.\"      (412) 268-4387, fax: (412) 268-7395
+.\"      tech-transfer@andrew.cmu.edu
+.\"
+.\" 4. Redistributions of any form whatsoever must retain the following
+.\"    acknowledgment:
+.\"    "This product includes software developed by Computing Services
+.\"     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+.\"
+.\" CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+.\" THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+.\" AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+.\" FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+.\" AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+.\" OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.\" 
+.\" $Revision: 1.2 $
+.\" Copyright (c) 1983, 1986 The Regents of the University of California.
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms are permitted provided
+.\" that: (1) source distributions retain this entire copyright notice and
+.\" comment, and (2) distributions including binaries display the following
+.\" acknowledgement:  ``This product includes software developed by the
+.\" University of California, Berkeley and its contributors'' in the
+.\" documentation or other materials provided with the distribution and in
+.\" all advertising materials mentioning features or use of this software.
+.\" Neither the name of the University nor the names of its contributors may
+.\" be used to endorse or promote products derived from this software without
+.\" specific prior written permission.
+.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+.\"
+.\"	@(#)syslogd.8	6.8 (Berkeley) 6/27/90
+.\"
+.TH SYSLOGD 8 "June 27, 1990"
+.UC 5
+.SH NAME
+syslogd \- log systems messages
+.SH SYNOPSIS
+.B syslogd
+[
+.BI \-f configfile
+] [
+.BI \-m markinterval
+] [
+.B \-d
+]
+.SH DESCRIPTION
+.I Syslogd
+reads and logs messages into a set of files
+described by the configuration file
+/etc/syslog.conf.
+Each message is one line.
+A message can contain a priority code,
+marked by a number in angle braces
+at the beginning of the line.
+Priorities are defined in
+.RI < sys/syslog.h >.
+.I Syslogd
+reads from the UNIX domain socket
+.IR /dev/log ,
+from an Internet domain socket specified in
+.IR /etc/services ,
+and from the special device
+.I /dev/klog
+(to read kernel messages).
+.PP
+.I Syslogd
+configures when it starts up
+and whenever it receives a hangup signal.
+Lines in the configuration file have a
+.I selector
+to determine the message priorities to which the line applies
+and an
+.IR action .
+The
+.I action
+field are separated from the selector by one or more tabs.
+.PP
+Selectors are semicolon separated lists of priority specifiers.
+Each priority has a
+.I facility
+describing the part of the system that generated the message,
+a dot,
+and a
+.I level
+indicating the severity of the message.
+Symbolic names may be used.
+An asterisk selects all facilities.
+All messages of the specified level or higher (greater severity)
+are selected.
+More than one facility may be selected using commas to separate them.
+For example:
+.PP
+.ti +5
+*.emerg;mail,daemon.crit
+.PP
+Selects all facilities at the
+.I emerg
+level and the
+.I mail
+and
+.I daemon
+facilities at the
+.I crit
+level.
+.PP
+Known facilities and levels
+recognized by
+.I syslogd
+are those listed in
+.IR syslog (3)
+without the leading ``LOG_''.
+The additional facility
+``mark'' has a message at priority LOG_INFO sent to it every
+20 minutes
+(this may be changed with the
+.B \-m
+flag).
+The ``mark'' facility is not enabled by a facility field containing an asterisk.
+The level ``none'' may be used to disable a particular facility.
+For example,
+.PP
+.ti +5
+*.debug;mail.none
+.PP
+Sends all messages
+.I except
+mail messages to the selected file.
+.PP
+The second part of each line describes where the message is to be logged
+if this line is selected.
+There are four forms:
+.IP \(bu 3n
+A filename (beginning with a leading slash).
+The file will be opened in append mode.
+.IP \(bu 3n
+A hostname preceeded by an at sign (``@'').
+Selected messages are forwarded to the
+.I syslogd
+on the named host.
+.IP \(bu 3n
+A comma separated list of users.
+Selected messages are written to those users
+if they are logged in.
+.IP \(bu 3n
+An asterisk.
+Selected messages are written to all logged-in users.
+.PP
+Blank lines and lines beginning with `#' are ignored.
+.PP
+For example, the configuration file:
+.PP
+.nf
+.ta 4m +\w'*.alert,auth.warning'u+3
+	kern,mark.debug	/dev/console
+	*.notice;mail.info	/var/log/maillog
+	*.crit	/var/log/critical
+	kern.err	@ucbarpa
+	*.emerg	*
+	*.alert	eric,kridle
+	*.alert;auth.warning	ralph
+.fi
+.PP
+logs all kernel messages
+and 20 minute marks onto the system console,
+all notice (or higher) level messages and all mail system messages
+except debug messages
+into the file /var/log/maillog,
+and all critical messages
+into /var/log/critical;
+kernel messages of error severity or higher are forwarded
+to ucbarpa.
+All users will be informed of any emergency messages,
+the users ``eric'' and ``kridle''
+will be informed of any alert messages,
+and the user ``ralph''
+will be informed of any alert message,
+or any warning message (or higher)
+from the authorization system.
+.PP
+The flags are:
+.TP 0.5i
+.B \-f
+Specify an alternate configuration file.
+.TP
+.B \-m
+Select the number of minutes between mark messages.
+.TP
+.B \-d
+Turn on debugging.
+.PP
+.I Syslogd
+creates the file /var/run/syslog.pid, if possible,
+containing a single line with its process id.
+This can be used to kill or reconfigure
+.I syslogd.
+.PP
+To bring
+.I syslogd
+down,
+it should be sent a terminate signal (e.g. kill \`cat /var/run/syslog.pid\`).
+.SH FILES
+.ta \w'/etc/syslog.conf    'u
+.nf
+/etc/syslog.conf	the configuration file
+/var/run/syslog.pid	the process id
+/dev/log	Name of the UNIX domain datagram log socket
+/dev/klog	The kernel log device
+.fi
+.SH SEE ALSO
+logger(1), syslog(3)
Index: /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslogd.c
===================================================================
--- /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslogd.c	(revision 1198)
+++ /tags/SYSLOG_MIX/src/emx/src/libsyslog/syslogd.c	(revision 1198)
@@ -0,0 +1,1438 @@
+/*
+ * Copyright (c) 1998-2000 Carnegie Mellon University.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The name "Carnegie Mellon University" must not be used to
+ *    endorse or promote products derived from this software without
+ *    prior written permission. For permission or any other legal
+ *    details, please contact  
+ *      Office of Technology Transfer
+ *      Carnegie Mellon University
+ *      5000 Forbes Avenue
+ *      Pittsburgh, PA  15213-3890
+ *      (412) 268-4387, fax: (412) 268-7395
+ *      tech-transfer@andrew.cmu.edu
+ *
+ * 4. Redistributions of any form whatsoever must retain the following
+ *    acknowledgment:
+ *    "This product includes software developed by Computing Services
+ *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
+ *
+ * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
+ * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/*  $Revision: 1.2 $
+**  This file has been modified to get it to compile more easily
+**  on pre-4.4BSD (e.g., SysVr4 :-) systems.  Rich $alz, June 1991.
+*/
+
+    /* change these three if you must keep running an old syslog. */
+#define	_PATH_LOGFILE	"/dev/log"
+#define	_PATH_LOGCONF	"/etc/syslog.conf"
+#define	_PATH_LOGPID	"/etc/syslog.pid"
+
+    /* #define this to enable verbose debugging of all messages. */
+#undef VERBOSE_DEBUG
+    /* #define this to line to listen on the INET port. */
+#undef DO_INET_SOCKET
+    /* #undef this to not read kernel syslog messages. */
+#define	_PATH_KLOG	"/dev/klog"
+#undef _PATH_KLOG
+    /* set this depending on what your sighandler is. */
+    /* =()<#define SIGHANDLER	@<SIGHANDLER>@>()= */
+#define SIGHANDLER	void
+    /* if you need various BSD functions, set  this. */
+#ifndef __EMX__
+#define NEED_BZERO_ETC
+#endif
+
+    /* Use "union wait" instead of int? */
+    /* =()<#define @<USE_UNION_WAIT>@_USE_UNION_WAIT>()= */
+#define DO_USE_UNION_WAIT
+#if	defined(DO_USE_UNION_WAIT)
+#define WAITVALUE	union wait
+#else
+#define WAITVALUE	int
+#endif	/* defined(DO_USE_UNION_WAIT) */
+
+/*
+ * 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: (1) source distributions retain this entire copyright notice and
+ * comment, and (2) distributions including binaries display the following
+ * acknowledgement:  ``This product includes software developed by the
+ * University of California, Berkeley and its contributors'' in the
+ * documentation or other materials provided with the distribution and in
+ * all advertising materials mentioning features or use of this software.
+ * Neither the name of the University nor the names of its contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#ifndef lint
+char copyright[] =
+"@(#) Copyright (c) 1983, 1988 Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)syslogd.c	5.42 (Berkeley) 6/29/90";
+#endif /* not lint */
+
+/*
+ *  syslogd -- log system messages
+ *
+ * This program implements a system log. It takes a series of lines.
+ * Each line may have a priority, signified as "<n>" as
+ * the first characters of the line.  If this is
+ * not present, a default priority is used.
+ *
+ * To kill syslogd, send a signal 15 (terminate).  A signal 1 (hup) will
+ * cause it to reread its configuration file.
+ *
+ * Defined Constants:
+ *
+ * MAXLINE -- the maximimum line length that can be handled.
+ * DEFUPRI -- the default priority for user messages
+ * DEFSPRI -- the default priority for kernel messages
+ *
+ * Author: Eric Allman
+ * extensive changes by Ralph Campbell
+ * more extensive changes by Eric Allman (again)
+ */
+
+#define	MAXLINE		1024		/* maximum line length */
+#define	MAXSVLINE	120		/* maximum saved line length */
+#define DEFUPRI		(LOG_USER|LOG_NOTICE)
+#define DEFSPRI		(LOG_KERN|LOG_CRIT)
+#define TIMERINTVL	30		/* interval for checking flush, mark */
+
+#include <sys/param.h>
+#include <sys/errno.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <sys/socket.h>
+#include <sys/file.h>
+#include <sys/uio.h>
+#include <sys/un.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/signal.h>
+
+#ifdef	MSG_BSIZE
+#undef	MSG_BSIZE
+#endif
+#define MSG_BSIZE	4096
+
+#include <netinet/in.h>
+#include <netdb.h>
+
+#ifndef __EMX__
+#include <utmp.h>
+#endif
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#define SYSLOG_NAMES
+#include "syslog.h"
+
+#define UT_NAMESIZE	8
+#define	_PATH_UTMP	"/etc/utmp"
+#define	_PATH_DEV	"/dev/"
+#define	_PATH_CONSOLE	"/dev/console"
+
+#ifndef sigmask
+#define sigmask(m)      (1 << ((m)-1))
+#endif
+char	*LogName = _PATH_LOGFILE;
+char	*ConfFile = _PATH_LOGCONF;
+char	*PidFile = _PATH_LOGPID;
+char	ctty[] = _PATH_CONSOLE;
+
+#define FDMASK(fd)	(1 << (fd))
+
+#define	dprintf		if (Debug) printf
+
+#define MAXUNAMES	20	/* maximum number of user names */
+
+#ifdef NEED_BZERO_ETC
+#include <fcntl.h>
+bzero(b, length)
+    char *b;
+    int length;
+{
+    while (--length >= 0)
+	*b++ = '\0';
+}
+bcopy(b1, b2, length)
+    char *b1;
+    char *b2;
+    int length;
+{
+    while (--length >= 0)
+	*b2++ = *b1++;
+}
+setlinebuf(f)
+    FILE *f;
+{
+    setbuf(f, (char *)NULL);
+}
+wait3(status, flags, np)
+    WAITVALUE *status;
+    int flags;
+    struct rusage *np;
+{
+    return waitpid(-1, status, WNOHANG);
+}
+
+/* Not a general mask handler -- it know what we call, below. */
+SIGHANDLER (*oldhup)(), (*oldalrm)();
+int
+sigsetmask(omask)
+    int omask;
+{
+    if (omask & sigmask(SIGHUP))
+	(void) signal(SIGHUP, oldhup);
+    if (omask & sigmask(SIGALRM))
+	(void) signal(SIGALRM, oldalrm);
+}
+int
+sigblock(mask)
+    int mask;
+{
+    if (mask & sigmask(SIGHUP))
+	oldhup = signal(SIGHUP, SIG_IGN);
+    if (mask & sigmask(SIGALRM))
+	oldhup = signal(SIGALRM, SIG_IGN);
+}
+#endif
+
+/*
+ * Flags to logmsg().
+ */
+
+#define IGN_CONS	0x001	/* don't print on console */
+#define SYNC_FILE	0x002	/* do fsync on file after printing */
+#define ADDDATE		0x004	/* add a date to the message */
+#define MARK		0x008	/* this message is a mark */
+
+/*
+ * This structure represents the files that will have log
+ * copies printed.
+ */
+
+struct filed {
+	struct	filed *f_nextone;	/* next in linked list */
+	short	f_type;			/* entry type, see below */
+	short	f_file;			/* file descriptor */
+	time_t	f_time;			/* time this was last written */
+	u_char	f_pmask[LOG_NFACILITIES+1];	/* priority mask */
+	union {
+		char	f_uname[MAXUNAMES][UT_NAMESIZE+1];
+		struct {
+			char	f_hname[MAXHOSTNAMELEN+1];
+			struct sockaddr_in	f_addr;
+		} f_forw;		/* forwarding address */
+		char	f_fname[MAXPATHLEN];
+	} f_un;
+	char	f_prevline[MAXSVLINE];		/* last message logged */
+	char	f_lasttime[16];			/* time of last occurrence */
+	char	f_prevhost[MAXHOSTNAMELEN+1];	/* host from which recd. */
+	int	f_prevpri;			/* pri of f_prevline */
+	int	f_prevlen;			/* length of f_prevline */
+	int	f_prevcount;			/* repetition cnt of prevline */
+	int	f_repeatcount;			/* number of "repeated" msgs */
+};
+
+/*
+ * Intervals at which we flush out "message repeated" messages,
+ * in seconds after previous message is logged.  After each flush,
+ * we move to the next interval until we reach the largest.
+ */
+int	repeatinterval[] = { 30, 120, 600 };	/* # of secs before flush */
+#define	MAXREPEAT ((sizeof(repeatinterval) / sizeof(repeatinterval[0])) - 1)
+#define	REPEATTIME(f)	((f)->f_time + repeatinterval[(f)->f_repeatcount])
+#define	BACKOFF(f)	{ if (++(f)->f_repeatcount > MAXREPEAT) \
+				 (f)->f_repeatcount = MAXREPEAT; \
+			}
+
+/* values for f_type */
+#define F_UNUSED	0		/* unused entry */
+#define F_FILE		1		/* regular file */
+#define F_TTY		2		/* terminal */
+#define F_CONSOLE	3		/* console terminal */
+#define F_FORW		4		/* remote machine */
+#define F_USERS		5		/* list of users */
+#define F_WALL		6		/* everyone logged on */
+
+char	*TypeNames[7] = {
+	"UNUSED",	"FILE",		"TTY",		"CONSOLE",
+	"FORW",		"USERS",	"WALL"
+};
+
+struct	filed *Files;
+struct	filed consfile;
+
+int	Debug;			/* debug flag */
+char	LocalHostName[MAXHOSTNAMELEN+1];	/* our hostname */
+char	*LocalDomain;		/* our local domain name */
+int	InetInuse = 0;		/* non-zero if INET sockets are being used */
+int	finet;			/* Internet datagram socket */
+int	LogPort;		/* port number for INET connections */
+int	Initialized = 0;	/* set when we have initialized ourselves */
+int	MarkInterval = 20 * 60;	/* interval between marks in seconds */
+int	MarkSeq = 0;		/* mark sequence number */
+
+extern	int errno;
+extern	char *ctime(), *strchr(), *malloc();
+SIGHANDLER die(), domark(), init(), reapchild();
+
+int
+main(argc, argv)
+	int argc;
+	char **argv;
+{
+	register int i;
+	register char *p;
+	int funix, inetm, fklog, klogm, len;
+	struct sockaddr_un sunx, fromunix;
+	struct sockaddr_in sin, frominet;
+	FILE *fp;
+	int ch;
+	char line[MSG_BSIZE + 1];
+	extern int optind;
+	extern char *optarg;
+
+	while ((ch = getopt(argc, argv, "df:m:p:")) != EOF)
+		switch((char)ch) {
+		case 'd':		/* debug */
+			Debug++;
+			break;
+		case 'f':		/* configuration file */
+			ConfFile = optarg;
+			break;
+		case 'm':		/* mark interval */
+			MarkInterval = atoi(optarg) * 60;
+			break;
+		case 'p':		/* path */
+			LogName = optarg;
+			break;
+		case '?':
+		default:
+			usage();
+		}
+	if (argc -= optind)
+		usage();
+
+	if (!Debug)
+		daemon(0, 0);
+	else
+		setlinebuf(stdout);
+
+	consfile.f_type = F_CONSOLE;
+	(void) strcpy(consfile.f_un.f_fname, ctty);
+	(void) gethostname(LocalHostName, sizeof LocalHostName);
+	if (p = strchr(LocalHostName, '.')) {
+		*p++ = '\0';
+		LocalDomain = p;
+	}
+	else
+		LocalDomain = "";
+	(void) signal(SIGTERM, die);
+	if (Debug) {
+	    (void) signal(SIGINT, die);
+	    (void) signal(SIGQUIT, die);
+	}
+	else {
+	    (void) signal(SIGINT, SIG_IGN);
+	    (void) signal(SIGQUIT, SIG_IGN);
+	}
+	(void) signal(SIGCHLD, reapchild);
+	(void) signal(SIGALRM, domark);
+	(void) alarm(TIMERINTVL);
+	(void) unlink(LogName);
+
+	bzero((char *)&sunx, sizeof(sunx));
+	sunx.sun_family = AF_UNIX;
+	(void) strncpy(sunx.sun_path, LogName, sizeof sunx.sun_path);
+	funix = socket(AF_UNIX, SOCK_DGRAM, 0);
+	if (funix < 0 || bind(funix, (struct sockaddr *) &sunx,
+	    sizeof(sunx)) < 0 ||
+	    chmod(LogName, 0666) < 0) {
+		(void) sprintf(line, "cannot create %s", LogName);
+		logerror(line);
+		dprintf("cannot create %s (%d)\n", LogName, errno);
+		die(0);
+	}
+#ifdef	DO_INET_SOCKET
+	finet = socket(AF_INET, SOCK_DGRAM, 0);
+	if (finet >= 0) {
+		struct servent *sp;
+
+		sp = getservbyname("syslog", "udp");
+		if (sp == NULL) {
+			errno = 0;
+			logerror("syslog/udp: unknown service");
+			die(0);
+		}
+		bzero((char *)&sin, sizeof(sin)); /* added uunet!rbj */
+		sin.sin_family = AF_INET;
+		sin.sin_addr.s_addr = INADDR_ANY;
+		sin.sin_port = LogPort = htons(sp->s_port);
+		if (bind(finet, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+			logerror("bind");
+			if (!Debug)
+				die(0);
+		} else {
+			inetm = FDMASK(finet);
+			InetInuse = 1;
+		}
+	}
+#else
+	finet = -1;
+	inetm = 0;
+#endif	/* DO_INET_SOCKET */
+#ifdef	_PATH_KLOG
+	if ((fklog = open(_PATH_KLOG, O_RDONLY, 0)) >= 0)
+		klogm = FDMASK(fklog);
+	else {
+		dprintf("can't open %s (%d)\n", _PATH_KLOG, errno);
+		klogm = 0;
+	}
+#else
+	fklog = -1;
+	klogm = 0;
+#endif	/* _PATH_KLOG */
+
+	/* tuck my process id away */
+	fp = fopen(PidFile, "w");
+	if (fp != NULL) {
+		fprintf(fp, "%d\n", getpid());
+		(void) fclose(fp);
+	}
+
+	dprintf("off & running....\n");
+
+	init();
+	(void) signal(SIGHUP, init);
+
+	for (;;) {
+		int nfds, readfds = FDMASK(funix) | inetm | klogm;
+
+		errno = 0;
+		dprintf("readfds = %#x\n", readfds);
+		nfds = select(20, (fd_set *) &readfds, (fd_set *) NULL,
+		    (fd_set *) NULL, (struct timeval *) NULL);
+		if (nfds == 0)
+			continue;
+		if (nfds < 0) {
+			if (errno != EINTR)
+				logerror("select");
+			continue;
+		}
+		dprintf("got a message (%d, %#x)\n", nfds, readfds);
+		if (readfds & klogm) {
+			i = read(fklog, line, sizeof(line) - 1);
+			if (i > 0) {
+				line[i] = '\0';
+				printsys(line);
+			} else if (i < 0 && errno != EINTR) {
+				logerror("klog");
+				fklog = -1;
+				klogm = 0;
+			}
+		}
+		if (readfds & FDMASK(funix)) {
+			len = sizeof fromunix;
+			i = recvfrom(funix, line, MAXLINE, 0,
+			    (struct sockaddr *) &fromunix, &len);
+			if (i > 0) {
+				line[i] = '\0';
+				printline(LocalHostName, line);
+			} else if (i < 0 && errno != EINTR)
+				logerror("recvfrom unix");
+		}
+		if (readfds & inetm) {
+			len = sizeof frominet;
+			i = recvfrom(finet, line, MAXLINE, 0,
+			    (struct sockaddr *) &frominet, &len);
+			if (i > 0) {
+				extern char *cvthname();
+
+				line[i] = '\0';
+				printline(cvthname(&frominet), line);
+			} else if (i < 0 && errno != EINTR)
+				logerror("recvfrom inet");
+		}
+	}
+}
+
+usage()
+{
+	(void) fprintf(stderr,
+	    "usage: syslogd [-d] [-f conffile] [-m markinterval] [-p path]\n");
+	exit(1);
+}
+
+/*
+ * Take a raw input line, decode the message, and print the message
+ * on the appropriate log files.
+ */
+
+printline(hname, msg)
+	char *hname;
+	char *msg;
+{
+	register char *p, *q;
+	register int c;
+	char line[MAXLINE + 1];
+	int pri;
+
+	/* test for special codes */
+	pri = DEFUPRI;
+	p = msg;
+	if (*p == '<') {
+		pri = 0;
+		while (isdigit(*++p))
+			pri = 10 * pri + (*p - '0');
+		if (*p == '>')
+			++p;
+	}
+	if (pri &~ (LOG_FACMASK|LOG_PRIMASK))
+		pri = DEFUPRI;
+
+	/* don't allow users to log kernel messages */
+	if (LOG_FAC(pri) == LOG_KERN)
+		pri = LOG_MAKEPRI(LOG_USER, LOG_PRI(pri));
+
+	q = line;
+
+	while ((c = *p++ & 0177) != '\0' &&
+	    q < &line[sizeof(line) - 1])
+		if (iscntrl(c))
+			if (c == '\n')
+				*q++ = ' ';
+			else if (c == '\t')
+				*q++ = '\t';
+			else {
+				*q++ = '^';
+				*q++ = c ^ 0100;
+			}
+		else
+			*q++ = c;
+	*q = '\0';
+
+	logmsg(pri, line, hname, 0);
+}
+
+/*
+ * Take a raw input line from /dev/klog, split and format similar to syslog().
+ */
+
+printsys(msg)
+	char *msg;
+{
+	register char *p, *q;
+	register int c;
+	char line[MAXLINE + 1];
+	int pri, flags;
+	char *lp;
+
+	(void) strcpy(line, "vmunix: ");
+	lp = line + strlen(line);
+	for (p = msg; *p != '\0'; ) {
+		flags = SYNC_FILE | ADDDATE;	/* fsync file after write */
+		pri = DEFSPRI;
+		if (*p == '<') {
+			pri = 0;
+			while (isdigit(*++p))
+				pri = 10 * pri + (*p - '0');
+			if (*p == '>')
+				++p;
+		} else {
+			/* kernel printf's come out on console */
+			flags |= IGN_CONS;
+		}
+		if (pri &~ (LOG_FACMASK|LOG_PRIMASK))
+			pri = DEFSPRI;
+		q = lp;
+		while (*p != '\0' && (c = *p++) != '\n' &&
+		    q < &line[MAXLINE])
+			*q++ = c;
+		*q = '\0';
+		logmsg(pri, line, LocalHostName, flags);
+	}
+}
+
+
+#ifdef	VERBOSE_DEBUG
+/*
+ *  Decode a numeric value to a symbolic name
+ */
+char *
+edoced(val, codetab)
+	int val;
+	CODE *codetab;
+{
+	register CODE *c;
+
+	if (val >= 0)
+		for (c = codetab; c->c_val != -1; c++)
+			if (c->c_val == val)
+				return (c->c_name);
+	return ("???");
+}
+#endif
+
+time_t	now;
+
+/*
+ * Log a message to the appropriate log files, users, etc. based on
+ * the priority.
+ */
+
+logmsg(pri, msg, from, flags)
+	int pri;
+	char *msg, *from;
+	int flags;
+{
+	register struct filed *f;
+	int fac, prilev;
+	int omask, msglen;
+	char *timestamp;
+	time_t time();
+
+#ifdef	VERBOSE_DEBUG
+	if (Debug) {
+		int pfac = (flags & MARK) ? INTERNAL_MARK : (pri & LOG_FACMASK);
+		printf("logmsg: {%s.%s} pri %o, flags %x, from %s, msg %s\n",
+		    edoced(pfac, facilitynames),
+		    edoced(LOG_PRI(pri), prioritynames),
+		    pri, flags, from, msg);
+ 	}
+#else
+	dprintf("logmsg: pri %o, flags %x, from %s, msg %s\n",
+	    pri, flags, from, msg);
+#endif
+
+	omask = sigblock(sigmask(SIGHUP)|sigmask(SIGALRM));
+
+	/*
+	 * Check to see if msg looks non-standard.
+	 */
+	msglen = strlen(msg);
+	if (msglen < 16 || msg[3] != ' ' || msg[6] != ' ' ||
+	    msg[9] != ':' || msg[12] != ':' || msg[15] != ' ')
+		flags |= ADDDATE;
+
+	(void) time(&now);
+	if (flags & ADDDATE)
+		timestamp = ctime(&now) + 4;
+	else {
+		timestamp = msg;
+		msg += 16;
+		msglen -= 16;
+	}
+
+	/* extract facility and priority level */
+	if (flags & MARK)
+		fac = LOG_NFACILITIES;
+	else
+		fac = LOG_FAC(pri);
+	prilev = LOG_PRI(pri);
+
+	/* log the message to the particular outputs */
+	if (!Initialized) {
+		f = &consfile;
+		f->f_file = open(ctty, O_WRONLY, 0);
+
+		if (f->f_file >= 0) {
+			fprintlog(f, flags, msg);
+			(void) close(f->f_file);
+		}
+		(void) sigsetmask(omask);
+		return;
+	}
+	for (f = Files; f; f = f->f_nextone) {
+		/* skip messages that are incorrect priority */
+		if ((int)f->f_pmask[fac] < prilev ||
+		    f->f_pmask[fac] == INTERNAL_NOPRI)
+			continue;
+
+		if (f->f_type == F_CONSOLE && (flags & IGN_CONS))
+			continue;
+
+		/* don't output marks to recently written files */
+		if ((flags & MARK) && (now - f->f_time) < MarkInterval / 2)
+			continue;
+
+		/*
+		 * suppress duplicate lines to this file
+		 */
+		if ((flags & MARK) == 0 && msglen == f->f_prevlen &&
+		    !strcmp(msg, f->f_prevline) &&
+		    !strcmp(from, f->f_prevhost)) {
+			(void) strncpy(f->f_lasttime, timestamp, 15);
+			f->f_prevcount++;
+			dprintf("msg repeated %d times, %ld sec of %d\n",
+			    f->f_prevcount, now - f->f_time,
+			    repeatinterval[f->f_repeatcount]);
+			/*
+			 * If domark would have logged this by now,
+			 * flush it now (so we don't hold isolated messages),
+			 * but back off so we'll flush less often
+			 * in the future.
+			 */
+			if (now > REPEATTIME(f)) {
+				fprintlog(f, flags, (char *)NULL);
+				BACKOFF(f);
+			}
+		} else {
+			/* new line, save it */
+			if (f->f_prevcount)
+				fprintlog(f, 0, (char *)NULL);
+			f->f_repeatcount = 0;
+			(void) strncpy(f->f_lasttime, timestamp, 15);
+			(void) strncpy(f->f_prevhost, from,
+					sizeof(f->f_prevhost));
+			if (msglen < MAXSVLINE) {
+				f->f_prevlen = msglen;
+				f->f_prevpri = pri;
+				(void) strcpy(f->f_prevline, msg);
+				fprintlog(f, flags, (char *)NULL);
+			} else {
+				f->f_prevline[0] = 0;
+				f->f_prevlen = 0;
+				fprintlog(f, flags, msg);
+			}
+		}
+	}
+	(void) sigsetmask(omask);
+}
+
+fprintlog(f, flags, msg)
+	register struct filed *f;
+	int flags;
+	char *msg;
+{
+	struct iovec iov[6];
+	register struct iovec *v;
+	register int l;
+	char line[MAXLINE + 1], repbuf[80], greetings[200];
+
+	v = iov;
+	if (f->f_type == F_WALL) {
+		v->iov_base = greetings;
+		sprintf(greetings,
+		    "\r\n\7Message from syslogd@%s at %.24s ...\r\n",
+		    f->f_prevhost, ctime(&now));
+		v->iov_len = strlen(greetings);
+		v++;
+		v->iov_base = "";
+		v->iov_len = 0;
+		v++;
+	} else {
+		v->iov_base = f->f_lasttime;
+		v->iov_len = 15;
+		v++;
+		v->iov_base = " ";
+		v->iov_len = 1;
+		v++;
+	}
+	v->iov_base = f->f_prevhost;
+	v->iov_len = strlen(v->iov_base);
+	v++;
+	v->iov_base = " ";
+	v->iov_len = 1;
+	v++;
+
+	if (msg) {
+		v->iov_base = msg;
+		v->iov_len = strlen(msg);
+	} else if (f->f_prevcount > 1) {
+		v->iov_base = repbuf;
+		sprintf(repbuf, "last message repeated %d times",
+		    f->f_prevcount);
+		v->iov_len = strlen(repbuf);
+	} else {
+		v->iov_base = f->f_prevline;
+		v->iov_len = f->f_prevlen;
+	}
+	v++;
+
+	dprintf("Logging to %s", TypeNames[f->f_type]);
+	f->f_time = now;
+
+	switch (f->f_type) {
+	case F_UNUSED:
+		dprintf("\n");
+		break;
+
+	case F_FORW:
+		dprintf(" %s\n", f->f_un.f_forw.f_hname);
+		sprintf(line, "<%d>%.15s %s", f->f_prevpri,
+		    iov[0].iov_base, iov[4].iov_base);
+		l = strlen(line);
+		if (l > MAXLINE)
+			l = MAXLINE;
+		if (sendto(finet, line, l, 0, &f->f_un.f_forw.f_addr,
+		    sizeof f->f_un.f_forw.f_addr) != l) {
+			int e = errno;
+			(void) close(f->f_file);
+			f->f_type = F_UNUSED;
+			errno = e;
+			logerror("sendto");
+		}
+		break;
+
+	case F_CONSOLE:
+		if (flags & IGN_CONS) {
+			dprintf(" (ignored)\n");
+			break;
+		}
+		/* FALLTHROUGH */
+
+	case F_TTY:
+	case F_FILE:
+		dprintf(" %s\n", f->f_un.f_fname);
+		if (f->f_type != F_FILE) {
+			v->iov_base = "\r\n";
+			v->iov_len = 2;
+		} else {
+			v->iov_base = "\n";
+			v->iov_len = 1;
+		}
+	again:
+		if (writev(f->f_file, iov, 6) < 0) {
+			int e = errno;
+			(void) close(f->f_file);
+			/*
+			 * Check for errors on TTY's due to loss of tty
+			 */
+			if ((e == EIO || e == EBADF) && f->f_type != F_FILE) {
+				f->f_file = open(f->f_un.f_fname,
+				    O_WRONLY|O_APPEND, 0);
+				if (f->f_file < 0) {
+					f->f_type = F_UNUSED;
+					logerror(f->f_un.f_fname);
+				} else
+					goto again;
+			} else {
+				f->f_type = F_UNUSED;
+				errno = e;
+				logerror(f->f_un.f_fname);
+			}
+		} else if (flags & SYNC_FILE)
+			(void) fsync(f->f_file);
+		break;
+
+	case F_USERS:
+	case F_WALL:
+		dprintf("\n");
+		v->iov_base = "\r\n";
+		v->iov_len = 2;
+		wallmsg(f, iov);
+		break;
+	}
+	f->f_prevcount = 0;
+}
+
+/*
+ *  WALLMSG -- Write a message to the world at large
+ *
+ *	Write the specified message to either the entire
+ *	world, or a list of approved users.
+ */
+
+wallmsg(f, iov)
+	register struct filed *f;
+	struct iovec *iov;
+{
+#ifndef __EMX__
+	static int reenter;			/* avoid calling ourselves */
+	register FILE *uf;
+	register int i;
+	struct utmp ut;
+	char *p, *ttymsg();
+
+	if (reenter++)
+		return;
+	if ((uf = fopen(_PATH_UTMP, "r")) == NULL) {
+		logerror(_PATH_UTMP);
+		reenter = 0;
+		return;
+	}
+	/* NOSTRICT */
+	while (fread((char *) &ut, sizeof ut, 1, uf) == 1) {
+		if (ut.ut_name[0] == '\0')
+			continue;
+		if (f->f_type == F_WALL) {
+			if (p = ttymsg(iov, 6, ut.ut_line, 1)) {
+				errno = 0;	/* already in msg */
+				logerror(p);
+			}
+			continue;
+		}
+		/* should we send the message to this user? */
+		for (i = 0; i < MAXUNAMES; i++) {
+			if (!f->f_un.f_uname[i][0])
+				break;
+			if (!strncmp(f->f_un.f_uname[i], ut.ut_name,
+			    UT_NAMESIZE)) {
+				if (p = ttymsg(iov, 6, ut.ut_line, 1)) {
+					errno = 0;	/* already in msg */
+					logerror(p);
+				}
+				break;
+			}
+		}
+	}
+	(void) fclose(uf);
+	reenter = 0;
+#endif
+}
+
+SIGHANDLER
+reapchild()
+{
+#ifndef __EMX__
+	WAITVALUE status;
+
+	while (wait3(&status, WNOHANG, (struct rusage *) NULL) > 0)
+		continue;
+#endif
+}
+
+/*
+ * Return a printable representation of a host address.
+ */
+char *
+cvthname(f)
+	struct sockaddr_in *f;
+{
+	struct hostent *hp;
+	register char *p;
+	extern char *inet_ntoa();
+
+	dprintf("cvthname(%s)\n", inet_ntoa(f->sin_addr));
+
+	if (f->sin_family != AF_INET) {
+		dprintf("Malformed from address\n");
+		return ("???");
+	}
+	hp = gethostbyaddr(&f->sin_addr, sizeof(struct in_addr), f->sin_family);
+	if (hp == 0) {
+		dprintf("Host name for your address (%s) unknown\n",
+			inet_ntoa(f->sin_addr));
+		return (inet_ntoa(f->sin_addr));
+	}
+	if ((p = strchr(hp->h_name, '.')) && strcmp(p + 1, LocalDomain) == 0)
+		*p = '\0';
+	return (hp->h_name);
+}
+
+SIGHANDLER
+domark()
+{
+	register struct filed *f;
+	time_t time();
+
+	now = time((time_t *)NULL);
+	MarkSeq += TIMERINTVL;
+	if (MarkSeq >= MarkInterval) {
+		logmsg(LOG_INFO, "-- MARK --", LocalHostName, ADDDATE|MARK);
+		MarkSeq = 0;
+	}
+
+	for (f = Files; f; f = f->f_nextone) {
+		if (f->f_prevcount && now >= REPEATTIME(f)) {
+			dprintf("flush %s: repeated %d times, %d sec.\n",
+			    TypeNames[f->f_type], f->f_prevcount,
+			    repeatinterval[f->f_repeatcount]);
+			fprintlog(f, 0, (char *)NULL);
+			BACKOFF(f);
+		}
+	}
+	(void) alarm(TIMERINTVL);
+}
+
+static char *
+xstrerror()
+{
+#ifndef __EMX__
+    extern int	sys_nerr;
+    extern char	*sys_errlist[];
+    extern int	errno;
+#endif
+    static char	buff[30];
+
+    if (errno >= 0 && errno < sys_nerr)
+	return sys_errlist[errno];
+    (void)sprintf(buff, "Error code %d\n", errno);
+    return buff;
+}
+
+/*
+ * Print syslogd errors some place.
+ */
+logerror(type)
+	char *type;
+{
+	char buf[100];
+
+	if (errno)
+		(void) sprintf(buf, "syslogd: %s: %s", type, xstrerror(errno));
+	else
+		(void) sprintf(buf, "syslogd: %s", type);
+	errno = 0;
+	dprintf("%s\n", buf);
+	logmsg(LOG_SYSLOG|LOG_ERR, buf, LocalHostName, ADDDATE);
+}
+
+SIGHANDLER
+die(sig)
+{
+	register struct filed *f;
+	char buf[100];
+
+	for (f = Files; f != NULL; f = f->f_nextone) {
+		/* flush any pending output */
+		if (f->f_prevcount)
+			fprintlog(f, 0, (char *)NULL);
+	}
+	if (sig) {
+		dprintf("syslogd: exiting on signal %d\n", sig);
+		(void) sprintf(buf, "exiting on signal %d", sig);
+		errno = 0;
+		logerror(buf);
+	}
+	(void) unlink(LogName);
+	exit(0);
+}
+
+/*
+ *  INIT -- Initialize syslogd from configuration table
+ */
+
+SIGHANDLER
+init()
+{
+	register int i;
+	register FILE *cf;
+	register struct filed *f, *next, **nextp;
+	register char *p;
+	char cline[BUFSIZ];
+
+	dprintf("init\n");
+
+	/*
+	 *  Close all open log files.
+	 */
+	Initialized = 0;
+	for (f = Files; f != NULL; f = next) {
+		/* flush any pending output */
+		if (f->f_prevcount)
+			fprintlog(f, 0, (char *)NULL);
+
+		switch (f->f_type) {
+		  case F_FILE:
+		  case F_TTY:
+		  case F_CONSOLE:
+		  case F_FORW:
+			(void) close(f->f_file);
+			break;
+		}
+		next = f->f_nextone;
+		free((char *) f);
+	}
+	Files = NULL;
+	nextp = &Files;
+
+	/* open the configuration file */
+	if ((cf = fopen(ConfFile, "r")) == NULL) {
+		dprintf("cannot open %s\n", ConfFile);
+		*nextp = (struct filed *)malloc(sizeof(*f));
+		cfline("*.ERR\t/dev/console", *nextp);
+		(*nextp)->f_nextone = (struct filed *)malloc(sizeof(*f));
+		cfline("*.PANIC\t*", (*nextp)->f_nextone);
+		Initialized = 1;
+		return;
+	}
+
+	/*
+	 *  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 = strchr(cline, '\0'); isspace(*--p););
+		*++p = '\0';
+		f = (struct filed *)malloc(sizeof(*f));
+		*nextp = f;
+		nextp = &f->f_nextone;
+		cfline(cline, f);
+	}
+
+	/* close the configuration file */
+	(void) fclose(cf);
+
+	Initialized = 1;
+
+	if (Debug) {
+		for (f = Files; f; f = f->f_nextone) {
+			for (i = 0; i <= LOG_NFACILITIES; i++)
+				if (f->f_pmask[i] == INTERNAL_NOPRI)
+					printf("X ");
+				else
+					printf("%d ", f->f_pmask[i]);
+			printf("%s: ", TypeNames[f->f_type]);
+			switch (f->f_type) {
+			case F_FILE:
+			case F_TTY:
+			case F_CONSOLE:
+				printf("%s", f->f_un.f_fname);
+				break;
+
+			case F_FORW:
+				printf("%s", f->f_un.f_forw.f_hname);
+				break;
+
+			case F_USERS:
+				for (i = 0; i < MAXUNAMES && *f->f_un.f_uname[i]; i++)
+					printf("%s, ", f->f_un.f_uname[i]);
+				break;
+			}
+			printf("\n");
+		}
+	}
+
+	logmsg(LOG_SYSLOG|LOG_INFO, "syslogd: restart", LocalHostName, ADDDATE);
+	dprintf("syslogd: restarted\n");
+}
+
+/*
+ * Crack a configuration file line
+ */
+
+cfline(line, f)
+	char *line;
+	register struct filed *f;
+{
+	register char *p;
+	register char *q;
+	register int i;
+	char *bp;
+	int pri;
+	struct hostent *hp;
+	char buf[MAXLINE];
+
+	dprintf("cfline(%s)\n", line);
+
+	errno = 0;	/* keep strerror() stuff out of logerror messages */
+
+	/* clear out file entry */
+	bzero((char *) f, sizeof *f);
+	for (i = 0; i <= LOG_NFACILITIES; i++)
+		f->f_pmask[i] = INTERNAL_NOPRI;
+
+	/* scan through the list of selectors */
+	for (p = line; *p && *p != '\t';) {
+
+		/* find the end of this facility name list */
+		for (q = p; *q && *q != '\t' && *q++ != '.'; )
+			continue;
+
+		/* collect priority name */
+		for (bp = buf; *q && !strchr("\t,;", *q); )
+			*bp++ = *q++;
+		*bp = '\0';
+
+		/* skip cruft */
+		while (strchr(", ;", *q))
+			q++;
+
+		/* decode priority name */
+		pri = decode(buf, prioritynames);
+		if (pri < 0) {
+			char xbuf[200];
+
+			(void) sprintf(xbuf, "unknown priority name \"%s\"",
+			    buf);
+			logerror(xbuf);
+			return;
+		}
+
+		/* scan facilities */
+		while (*p && !strchr("\t.;", *p)) {
+			for (bp = buf; *p && !strchr("\t,;.", *p); )
+				*bp++ = *p++;
+			*bp = '\0';
+			if (*buf == '*')
+				for (i = 0; i < LOG_NFACILITIES; i++)
+					f->f_pmask[i] = pri;
+			else {
+				i = decode(buf, facilitynames);
+				if (i < 0) {
+					char xbuf[200];
+
+					(void) sprintf(xbuf,
+					    "unknown facility name \"%s\"",
+					    buf);
+					logerror(xbuf);
+					return;
+				}
+				f->f_pmask[i >> 3] = pri;
+			}
+			while (*p == ',' || *p == ' ')
+				p++;
+		}
+
+		p = q;
+	}
+
+	/* skip to action part */
+	while (*p == '\t')
+		p++;
+
+	switch (*p)
+	{
+	case '@':
+		if (!InetInuse)
+			break;
+		(void) strcpy(f->f_un.f_forw.f_hname, ++p);
+		hp = gethostbyname(p);
+		if (hp == NULL) {
+			logerror("hostname lookup error");
+			break;
+		}
+		bzero((char *) &f->f_un.f_forw.f_addr,
+			 sizeof f->f_un.f_forw.f_addr);
+		f->f_un.f_forw.f_addr.sin_family = AF_INET;
+		f->f_un.f_forw.f_addr.sin_port = LogPort;
+		bcopy(hp->h_addr, (char *) &f->f_un.f_forw.f_addr.sin_addr, hp->h_length);
+		f->f_type = F_FORW;
+		break;
+
+	case '/':
+		(void) strcpy(f->f_un.f_fname, p);
+		if ((f->f_file = open(p, O_WRONLY|O_APPEND, 0)) < 0) {
+			f->f_file = F_UNUSED;
+			logerror(p);
+			break;
+		}
+		if (isatty(f->f_file))
+			f->f_type = F_TTY;
+		else
+			f->f_type = F_FILE;
+		if (strcmp(p, ctty) == 0)
+			f->f_type = F_CONSOLE;
+		break;
+
+	case '*':
+		f->f_type = F_WALL;
+		break;
+
+	default:
+		for (i = 0; i < MAXUNAMES && *p; i++) {
+			for (q = p; *q && *q != ','; )
+				q++;
+			(void) strncpy(f->f_un.f_uname[i], p, UT_NAMESIZE);
+			if ((q - p) > UT_NAMESIZE)
+				f->f_un.f_uname[i][UT_NAMESIZE] = '\0';
+			else
+				f->f_un.f_uname[i][q - p] = '\0';
+			while (*q == ',' || *q == ' ')
+				q++;
+			p = q;
+		}
+		f->f_type = F_USERS;
+		break;
+	}
+}
+
+
+/*
+ *  Decode a symbolic name to a numeric value
+ */
+
+decode(name, codetab)
+	char *name;
+	CODE *codetab;
+{
+	register CODE *c;
+	register char *p;
+	char buf[40];
+
+	if (isdigit(*name))
+		return (atoi(name));
+
+	(void) strcpy(buf, name);
+	for (p = buf; *p; p++)
+		if (isupper(*p))
+			*p = tolower(*p);
+	for (c = codetab; c->c_name; c++)
+		if (!strcmp(buf, c->c_name))
+			return (c->c_val);
+
+	return (-1);
+}
+
+daemon(nochdir, noclose)
+        int nochdir, noclose;
+{
+        int cpid;
+
+        if ((cpid = fork()) == -1)
+                return (-1);
+        if (cpid)
+                exit(0);
+        (void) setsid();
+        if (!nochdir)
+                (void) chdir("/");
+        if (!noclose) {
+                int devnull = open("/dev/null", O_RDWR, 0);
+
+                if (devnull != -1) {
+                        (void) dup2(devnull, 0);
+                        (void) dup2(devnull, 1);
+                        (void) dup2(devnull, 2);
+                        if (devnull > 2)
+                                (void) close(devnull);
+                }
+        }
+}
+
+
+/*
+ * Display the contents of a uio structure on a terminal.  Used by wall(1)
+ * and syslogd(8).  Forks and finishes in child if write would block, waiting
+ * at most five minutes.  Returns pointer to error string on unexpected error;
+ * string is not newline-terminated.  Various "normal" errors are ignored
+ * (exclusive-use, lack of permission, etc.).
+ */
+char *
+ttymsg(iov, iovcnt, line)
+	struct iovec *iov;
+	int iovcnt;
+	char *line;
+{
+	static char device[64] = _PATH_DEV;
+	static char errbuf[1024];
+	register int cnt, fd, left, wret;
+	struct iovec localiov[6];
+	int forked = 0;
+
+	if (iovcnt > 6)
+		return ("too many iov's");
+	/*
+	 * open will fail on slip lines or exclusive-use lines
+	 * if not running as root; not an error.
+	 */
+	(void) strcpy(device + sizeof(_PATH_DEV) - 1, line);
+	if ((fd = open(device, O_WRONLY|O_NONBLOCK, 0)) < 0) {
+		if (errno == EBUSY || errno == EACCES)
+			return (NULL);
+		(void) sprintf(errbuf, "%s: error %d", device, errno);
+		return (errbuf);
+	}
+
+	for (cnt = left = 0; cnt < iovcnt; ++cnt)
+		left += iov[cnt].iov_len;
+
+	for (;;) {
+		wret = writev(fd, iov, iovcnt);
+		if (wret >= left)
+			break;
+		if (wret >= 0) {
+			left -= wret;
+			if (iov != localiov) {
+				bcopy(iov, localiov,
+				    iovcnt * sizeof(struct iovec));
+				iov = localiov;
+			}
+			for (cnt = 0; wret >= iov->iov_len; ++cnt) {
+				wret -= iov->iov_len;
+				++iov;
+				--iovcnt;
+			}
+			if (wret) {
+				iov->iov_base += wret;
+				iov->iov_len -= wret;
+			}
+			continue;
+		}
+		if (errno == EWOULDBLOCK) {
+			int cpid, off = 0;
+
+			if (forked) {
+				(void) close(fd);
+				_exit(1);
+			}
+			cpid = fork();
+			if (cpid < 0) {
+				(void) sprintf(errbuf,
+				    "fork: error %d", errno);
+				(void) close(fd);
+				return (errbuf);
+			}
+			if (cpid) {	/* parent */
+				(void) close(fd);
+				return (NULL);
+			}
+			forked++;
+			/* wait at most 5 minutes */
+			(void) signal(SIGALRM, SIG_DFL);
+			(void) signal(SIGTERM, SIG_DFL); /* XXX */
+			(void) sigsetmask(0);
+			(void) alarm((u_int)(60 * 5));
+			(void) fcntl(fd, FNDELAY, &off);
+			continue;
+		}
+		/*
+		 * We get ENODEV on a slip line if we're running as root,
+		 * and EIO if the line just went away.
+		 */
+		if (errno == ENODEV || errno == EIO)
+			break;
+		(void) close(fd);
+		if (forked)
+			_exit(1);
+		(void) sprintf(errbuf, "%s: error %d", errno);
+		return (errbuf);
+	}
+
+	(void) close(fd);
+	if (forked)
+		_exit(0);
+	return (NULL);
+}
