⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syslog.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#if !defined(lint) && defined(SCCSIDS)static	char sccsid[] = "@(#)syslog.c 1.1 92/07/30 SMI"; /* from UCB 5.9 5/7/86 */#endif/* * Copyright (c) 1983 Regents of the University of California. * All rights reserved.  The Berkeley software License Agreement * specifies the terms and conditions for redistribution. *//* * SYSLOG -- print message on log file * * This routine looks a lot like printf, except that it * outputs to the log file instead of the standard output. * Also: *	adds a timestamp, *	prints the module name in front of the message, *	has some other formatting types (or will sometime), *	adds a newline on the end of the message. * * The output of this routine is intended to be read by /etc/syslogd. * * Author: Eric Allman * Modified to use UNIX domain IPC by Ralph Campbell */#include <sys/types.h>#include <sys/socket.h>#include <sys/file.h>#include <sys/signal.h>#include <sys/syslog.h>#include <sys/time.h>#include <netdb.h>#include <strings.h>#include <varargs.h>#include <vfork.h>#define	MAXLINE	1024			/* max message size */#define	NULL	0			/* manifest */#define	PRIMASK(p)	(1 << ((p) & LOG_PRIMASK))#define	PRIFAC(p)	(((p) & LOG_FACMASK) >> 3)#define	IMPORTANT 	LOG_ERRstatic char	*logname = "/dev/log";static char	*ctty = "/dev/console";static struct _syslog {	int	_LogFile;	int	_LogStat;	char	*_LogTag;	int	_LogMask;	struct 	sockaddr _SyslogAddr;	char	*_SyslogHost;	int	_LogFacility;} *_syslog;#define	LogFile (_syslog->_LogFile)#define	LogStat (_syslog->_LogStat)#define	LogTag (_syslog->_LogTag)#define	LogMask (_syslog->_LogMask)#define	SyslogAddr (_syslog->_SyslogAddr)#define	SyslogHost (_syslog->_SyslogHost)#define	LogFacility (_syslog->_LogFacility)extern	int errno, sys_nerr;extern	char *sys_errlist[];extern char *calloc();extern time_t time();extern unsigned int alarm();static intallocstatic(){	_syslog = (struct _syslog *)calloc(1, sizeof (struct _syslog));	if (_syslog == 0)		return (0);	/* can't do it */	LogFile = -1;		/* fd for log */	LogStat	= 0;		/* status bits, set by openlog() */	LogTag = "syslog";	/* string to tag the entry with */	LogMask = 0xff;		/* mask of priorities to be logged */	LogFacility = LOG_USER;	/* default facility code */	return (1);}/*VARARGS2*/syslog(pri, fmt, va_alist)	int pri;	char *fmt;	va_dcl{	va_list ap;	va_start(ap);	vsyslog(pri, fmt, ap);	va_end(ap);}vsyslog(pri, fmt, ap)	int pri;	char *fmt;	va_list ap;{	char buf[MAXLINE + 1], outline[MAXLINE + 1];	register char *b, *f, *o;	register int c;	long now;	int pid, olderrno = errno;	if (_syslog == 0 && !allocstatic())		return;	/* see if we should just throw out this message */	if (pri <= 0 || PRIFAC(pri) >= LOG_NFACILITIES ||	    (PRIMASK(pri) & LogMask) == 0)		return;	if (LogFile < 0)		openlog(LogTag, LogStat | LOG_NDELAY, 0);	/* set default facility if none specified */	if ((pri & LOG_FACMASK) == 0)		pri |= LogFacility;	/* build the message */	o = outline;	(void)sprintf(o, "<%d>", pri);	o += strlen(o);	(void)time(&now);	(void)sprintf(o, "%.15s ", ctime(&now) + 4);	o += strlen(o);	if (LogTag) {		(void)strcpy(o, LogTag);		o += strlen(o);	}	if (LogStat & LOG_PID) {		(void)sprintf(o, "[%d]", getpid());		o += strlen(o);	}	if (LogTag) {		(void)strcpy(o, ": ");		o += 2;	}	b = buf;	f = fmt;	while ((c = *f++) != '\0' && c != '\n' && b < &buf[MAXLINE]) {		if (c != '%') {			*b++ = c;			continue;		}		if ((c = *f++) != 'm') {			*b++ = '%';			*b++ = c;			continue;		}		if ((unsigned)olderrno > sys_nerr)			(void)sprintf(b, "error %d", olderrno);		else			(void)strcpy(b, sys_errlist[olderrno]);		b += strlen(b);	}	*b++ = '\n';	*b = '\0';	(void)vsprintf(o, buf, ap);	c = strlen(outline);	if (c > MAXLINE)		c = MAXLINE;	/* output the message to the local logger */	if (sendto(LogFile, outline, c, 0, &SyslogAddr, sizeof SyslogAddr) >= 0)		return;	if (!(LogStat & LOG_CONS))		return;	/* output the message to the console */	pid = vfork();	if (pid == -1)		return;	if (pid == 0) {		int fd;		(void)signal(SIGALRM, SIG_DFL);		(void)sigsetmask(sigblock(0) & ~sigmask(SIGALRM));		(void)alarm(5);		fd = open(ctty, O_WRONLY);		(void)alarm(0);		(void)strcat(o, "\r");		o = index(outline, '>') + 1;		(void)write(fd, o, c + 1 - (o - outline));		(void)close(fd);		_exit(0);	}	if (!(LogStat & LOG_NOWAIT))		while ((c = wait((int *)0)) > 0 && c != pid)			;}/* * OPENLOG -- open system log */openlog(ident, logstat, logfac)	char *ident;	int logstat, logfac;{	if (_syslog == 0 && !allocstatic())		return;	if (ident != NULL)		LogTag = ident;	LogStat = logstat;	if (logfac != 0)		LogFacility = logfac & LOG_FACMASK;	if (LogFile >= 0)		return;	SyslogAddr.sa_family = AF_UNIX;	(void)strncpy(SyslogAddr.sa_data, logname, sizeof SyslogAddr.sa_data);	if (LogStat & LOG_NDELAY) {		LogFile = socket(AF_UNIX, SOCK_DGRAM, 0);		(void)fcntl(LogFile, F_SETFD, 1);	}}/* * CLOSELOG -- close the system log */closelog(){	if (_syslog == 0)		return;	(void) close(LogFile);	LogFile = -1;}/* * SETLOGMASK -- set the log mask level */setlogmask(pmask)	int pmask;{	int omask;	if (_syslog == 0 && !allocstatic())		return (-1);	omask = LogMask;	if (pmask != 0)		LogMask = pmask;	return (omask);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -