static char sccsid
[] = "@(#)syslog.c 4.6 (Berkeley) %G%";
* 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.
* 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.
* Modified to use UNIX domain IPC by Ralph Campbell
#define MAXLINE 1024 /* max message size */
#define NULL 0 /* manifest */
#define mask(p) (1 << (p))
#define IMPORTANT (mask(KERN_EMERG)|mask(KERN_ALERT)|mask(KERN_ERR)|mask(KERN_FAIL)\
|mask(KERN_RECOV)|mask(KERN_INFO)|mask(LOG_EMERG)|mask(LOG_ALERT)\
|mask(LOG_CRIT)|mask(LOG_ERR)|mask(LOG_FAIL))
static char logname
[] = "/dev/log";
static char ctty
[] = "/dev/console";
static int LogFile
= -1; /* fd for log */
static int LogStat
= 0; /* status bits, set by openlog() */
static char *LogTag
= NULL
; /* string to tag the entry with */
static int LogMask
= 0xffffffff; /* mask of priorities to be logged */
static struct sockaddr SyslogAddr
;
extern int errno
, sys_nerr
;
extern char *sys_errlist
[];
syslog(pri
, fmt
, p0
, p1
, p2
, p3
, p4
)
char buf
[MAXLINE
+ 1], outline
[MAXLINE
+ 1];
register char *b
, *f
, *o
;
int pid
, olderrno
= errno
;
/* see if we should just throw out this message */
if (pri
<= 0 || pri
>= 32 || (mask(pri
) & LogMask
) == 0)
openlog(LogTag
, LogStat
& ~LOG_ODELAY
, 0);
sprintf(o
, "[%d]", getpid());
sprintf(o
, ": %.15s-- ", ctime(&now
) + 4);
while ((c
= *f
++) != '\0' && c
!= '\n' && b
< &buf
[MAXLINE
]) {
if ((unsigned)olderrno
> sys_nerr
)
sprintf(b
, "error %d", olderrno
);
strcpy(b
, sys_errlist
[olderrno
]);
sprintf(o
, buf
, p0
, p1
, p2
, p3
, p4
);
if (sendto(LogFile
, outline
, c
, 0, &SyslogAddr
, sizeof SyslogAddr
) >= 0)
if (!(LogStat
& LOG_CONS
) && !(mask(pri
) & IMPORTANT
))
LogFile
= open(ctty
, O_RDWR
);
write(LogFile
, outline
, c
+1);
while ((c
= wait((int *)0)) > 0 && c
!= pid
)
* OPENLOG -- open system log
openlog(ident
, logstat
, logmask
)
LogTag
= (ident
!= NULL
) ? ident
: "syslog";
SyslogAddr
.sa_family
= AF_UNIX
;
strncpy(SyslogAddr
.sa_data
, logname
, sizeof SyslogAddr
.sa_data
);
if (!(LogStat
& LOG_ODELAY
)) {
LogFile
= socket(AF_UNIX
, SOCK_DGRAM
, 0);
fcntl(LogFile
, F_SETFD
, 1);
* CLOSELOG -- close the system log
* SETLOGMASK -- set the log mask level