[497] in Pthreads mailing list archive

home help back first fref pref prev next nref lref last post

syslog for pthreads

daemon@ATHENA.MIT.EDU (Stewart Gebbie)
Wed Nov 13 02:42:30 1996

Date: Wed, 13 Nov 1996 09:13:52 -0200 (GMT)
From: Stewart Gebbie <stewart@lin01.global.co.za>
To: pthreads@MIT.EDU

  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--_=XFMail.0.5-beta.p0.Linux:961113091607:746=_
Content-Type: TEXT/PLAIN; CHARSET=us-ascii
Content-ID: <Pine.SOL.3.91.961113091222.3167C@lin01.global.co.za>

Hi,

I had problems getting syslog to work. But I have now fixed the problem.
It appears that syslogd listens to /dev/log and to port 514. For some or
other reason things don't always seem to work if one connects to /dev/log.
(I am still not sure why, if anyone knows I would appreciate to find out). 
But if one  defaults to port 514 then on my machine (Linux 2.0.0) syslog 
now works.

Attached is the fix for the pthread syslog.

stewart 
 
/**************************************************************************
  Stewart Gebbie         
  (H)+27 11 4323196          ``Only the ignorant man becomes angry.
  (W)+27 11 6821895                 The wise man understands.''
  stewart@global.co.za
**************************************************************************/
--_=XFMail.0.5-beta.p0.Linux:961113091607:746=_
Content-Type: TEXT/PLAIN; CHARSET=us-ascii; NAME="syslog.c"; SIZEONDISK=5785
Content-ID: <Pine.SOL.3.91.961113091222.3167D@lin01.global.co.za>
Content-Description: syslog.c

/*
 * Copyright (c) 1983, 1988 Regents of the University of California.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms are permitted
 * provided that this notice is preserved and that due credit is given
 * to the University of California at Berkeley. The name of the University
 * may not be used to endorse or promote products derived from this
 * software without specific prior written permission. This software
 * is provided ``as is'' without express or implied warranty.
 */

#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)syslog.c	5.14 (Berkeley) 5/20/88";
#endif /* LIBC_SCCS and not lint */


/*
 * SYSLOG -- print message on log file
 *
 * This routine looks a lot like printf, except that it
 * outputs to the log file instead of the standard output.
 * Also:
 *	adds a timestamp,
 *	prints the module name in front of the message,
 *	has some other formatting types (or will sometime),
 *	adds a newline on the end of the message.
 *
 * The output of this routine is intended to be read by /etc/syslogd.
 *
 * Author: Eric Allman
 * Modified to use UNIX domain IPC by Ralph Campbell
 * Modified for pthreads and made more POSIX-compliant by Greg Hudson
 * Modified to use INET domain by Stewart Gebbie (13/11/96)
 */

#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <signal.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <fcntl.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <syslog.h>

int socket();
char *strerror(int);		/* For systems that don't prototype it */

#define	MAXLINE	1024		/* max message size */

#define PRIFAC(p)	(((p) & LOG_FACMASK) >> 3)
					/* XXX should be in <syslog.h> */
#define IMPORTANT 	LOG_ERR

static void basic_init(void);

static char	_log_name[] = "/dev/log";
static char	ctty[] = "/dev/console";
static int      _port_syslog = 514;

static int	LogFile = -1;		/* fd for log */
static int	LogStat	= 0;		/* status bits, set by openlog() */
static char	*LogTag = "syslog";	/* string to tag the entry with */
static int	LogMask = 0xff;		/* mask of priorities to be logged */
static int	LogFacility = LOG_USER;	/* default facility code */

static pthread_mutex_t basic_init_lock = PTHREAD_MUTEX_INITIALIZER;

static struct sockaddr SyslogAddr;	/* AF_UNIX address of local logger */

static void basic_init()
{
    pthread_mutex_lock(&basic_init_lock);
    if (LogFile < 0)
	openlog(LogTag, LogStat | LOG_NDELAY, 0);
    pthread_mutex_unlock(&basic_init_lock);
}

void syslog(int pri, char *fmt, ...)
{
	va_list args;

	va_start(args, fmt);
	vsyslog(pri, fmt, args);
	va_end(args);
}

void vsyslog(int pri, char *fmt, va_list args)
{
	char buf[MAXLINE + 1], outline[MAXLINE + 1];
	register char *b, *f, *o;
	register int c;
	time_t now;
	int olderrno = errno, fd;

	/* Do a basic initialization if user didn't call openlog(). */
	if (LogFile < 0)
	    basic_init();

	/* see if we should just throw out this message */
	if ((unsigned) PRIFAC(pri) >= LOG_NFACILITIES ||
	    (LOG_MASK(pri & LOG_PRIMASK) & LogMask) == 0 ||
	    (pri &~ (LOG_PRIMASK|LOG_FACMASK)) != 0)
		return;

	/* set default facility if none specified */
	if ((pri & LOG_FACMASK) == 0)
		pri |= LogFacility;

	/* build the message */
	o = outline;
	(void)sprintf(o, "<%d>", pri);
	o += strlen(o);
	time(&now);
	(void)sprintf(o, "%.15s ", ctime(&now) + 4);
	o += strlen(o);
	if (LogTag) {
		strcpy(o, LogTag);
		o += strlen(o);
	}
	if (LogStat & LOG_PID) {
		(void)sprintf(o, "[%d]", getpid());
		o += strlen(o);
	}
	if (LogTag) {
		strcpy(o, ": ");
		o += 2;
	}

	b = buf;
	f = fmt;
	while ((c = *f++) != '\0' && c != '\n' && b < &buf[MAXLINE]) {
	        char *strerror();

		if (c != '%') {
			*b++ = c;
			continue;
		}
		if ((c = *f++) != 'm') {
			*b++ = '%';
			*b++ = c;
			continue;
		}
		strcpy(b, strerror(olderrno));
		b += strlen(b);
	}
	*b++ = '\n';
	*b = '\0';
	vsprintf(o, buf, args);
	c = strlen(outline);
	if (c > MAXLINE)
		c = MAXLINE;

	/* output the message to the local logger */
	if (sendto(LogFile, outline, c, 0, &SyslogAddr, sizeof SyslogAddr) >= 0)
		return;
	if (!(LogStat & LOG_CONS))
		return;

	/* output the message to the console */
	fd = open(ctty, O_WRONLY);
	alarm(0);
	strcat(o, "\r");
	o = strchr(outline, '>') + 1;
	write(fd, o, c + 1 - (o - outline));
	close(fd);
}

/*
 * OPENLOG -- open system log
 */

void openlog(char *ident, int logstat, int logfac)
{
	int flags;

	if (ident != NULL)
		LogTag = ident;
	LogStat = logstat;
	if (logfac != 0 && (logfac &~ LOG_FACMASK) == 0)
		LogFacility = logfac;
	if (LogFile >= 0)
		return;
   

#ifdef AF_INET
			if (LogFile <0 ) {
	      		    if (LogStat & LOG_NDELAY) 
			     {

				struct servent* sp =
				    getservbyname("syslog", "udp");
				struct sockaddr_in* sin =
				    (struct sockaddr_in*) &SyslogAddr;

				sin->sin_family = AF_INET;
				if (sp)
					sin->sin_port = sp->s_port;
				else
					sin->sin_port = htons(_port_syslog);
				sin->sin_addr.s_addr = htonl(INADDR_ANY);
				LogFile = socket(AF_INET, SOCK_DGRAM, 0);
			     }
			}
#endif

#ifdef AF_UNIX
			if (LogFile <0 ) {
				SyslogAddr.sa_family = AF_UNIX;
				(void) strncpy(SyslogAddr.sa_data, _log_name,
				    sizeof(SyslogAddr.sa_data));
			   
			    if (LogStat & LOG_NDELAY) 
			     {
				LogFile = socket(AF_UNIX, SOCK_DGRAM, 0);
			     }
			   
			}
#endif
			if(LogFile>=0)
     			 {	
		           flags = fcntl(LogFile, F_GETFD);
		           fcntl(LogFile, F_SETFD, flags & O_NONBLOCK);
			 }
   
}

/*
 * CLOSELOG -- close the system log
 */

void closelog()
{
	(void) close(LogFile);
	LogFile = -1;
}

/*
 * SETLOGMASK -- set the log mask level
 */
int setlogmask(int pmask)
{
	int omask;

	omask = LogMask;
	if (pmask != 0)
		LogMask = pmask;
	return (omask);
}

--_=XFMail.0.5-beta.p0.Linux:961113091607:746=_--

home help back first fref pref prev next nref lref last post