* Copyright (c) 1983, 1988 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, 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'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)syslog.c 5.16 (Berkeley) %G%";
#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.
* 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 IMPORTANT LOG_ERR
static char logname
[] = "/dev/log";
static char ctty
[] = "/dev/console";
static int LogFile
= -1; /* fd for log */
static int connected
; /* have done connect */
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 struct sockaddr SyslogAddr
; /* AF_UNIX address of local logger */
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 ((unsigned) LOG_FAC(pri
) >= LOG_NFACILITIES
||
LOG_MASK(LOG_PRI(pri
)) == 0 ||
(pri
&~ (LOG_PRIMASK
|LOG_FACMASK
)) != 0)
if (LogFile
< 0 || !connected
)
openlog(LogTag
, LogStat
| LOG_NDELAY
, 0);
/* set default facility if none specified */
if ((pri
& LOG_FACMASK
) == 0)
(void)sprintf(o
, "<%d>", pri
);
(void)sprintf(o
, "%.15s ", ctime(&now
) + 4);
(void)sprintf(o
, "[%d]", getpid());
while ((c
= *f
++) != '\0' && c
!= '\n' && b
< &buf
[MAXLINE
]) {
if ((unsigned)olderrno
> sys_nerr
)
(void)sprintf(b
, "error %d", olderrno
);
strcpy(b
, sys_errlist
[olderrno
]);
(void)sprintf(o
, buf
, p0
, p1
, p2
, p3
, p4
);
/* output the message to the local logger */
if (send(LogFile
, outline
, c
, 0) >= 0)
if (!(LogStat
& LOG_CONS
))
/* output the message to the console */
signal(SIGALRM
, SIG_DFL
);
sigsetmask(sigblock(0L) & ~sigmask(SIGALRM
));
fd
= open(ctty
, O_WRONLY
);
o
= index(outline
, '>') + 1;
write(fd
, o
, c
+ 1 - (o
- outline
));
if (!(LogStat
& LOG_NOWAIT
))
while ((c
= wait((int *)0)) > 0 && c
!= pid
)
* OPENLOG -- open system log
openlog(ident
, logstat
, logfac
)
if (logfac
!= 0 && (logfac
&~ LOG_FACMASK
) == 0)
SyslogAddr
.sa_family
= AF_UNIX
;
strncpy(SyslogAddr
.sa_data
, logname
, sizeof SyslogAddr
.sa_data
);
if (LogStat
& LOG_NDELAY
) {
LogFile
= socket(AF_UNIX
, SOCK_DGRAM
, 0);
fcntl(LogFile
, F_SETFD
, 1);
if (LogFile
!= -1 && !connected
&&
connect(LogFile
, &SyslogAddr
, sizeof(SyslogAddr
)) != -1)
* CLOSELOG -- close the system log
* SETLOGMASK -- set the log mask level