* Copyright (c) 1983, 1988 Regents of the University of California.
* %sccs.include.redist.c%
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid
[] = "@(#)syslog.c 5.32 (Berkeley) %G%";
#endif /* LIBC_SCCS and not lint */
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 LogFacility
= LOG_USER
; /* default facility code */
* print message on log file; output is intended for syslogd(8).
vsyslog(pri
, fmt
, &args
);
char tbuf
[2048], fmt_cpy
[1024], *stdp
, *ctime();
/* check for invalid bits or no priority set */
if (!LOG_PRI(pri
) || (pri
&~ (LOG_PRIMASK
|LOG_FACMASK
)))
/* set default facility if none specified */
if ((pri
& LOG_FACMASK
) == 0)
(void)sprintf(tbuf
, "<%d>%.15s ", pri
, ctime(&now
) + 4);
if (LogStat
& LOG_PERROR
)
(void)sprintf(p
, "[%d]", getpid());
/* substitute error message for %m */
register char ch
, *t1
, *t2
;
for (t1
= fmt_cpy
; ch
= *fmt
; ++fmt
)
if (ch
== '%' && fmt
[1] == 'm') {
for (t2
= strerror(saved_errno
);
(void)vsprintf(p
, fmt_cpy
, ap
);
/* output to stderr if requested */
if (LogStat
& LOG_PERROR
) {
register struct iovec
*v
= iov
;
v
->iov_len
= cnt
- (stdp
- tbuf
);
(void)writev(STDERR_FILENO
, iov
, 2);
/* get connected, output the message to the local logger */
if ((connected
|| !openlog(LogTag
, LogStat
| LOG_NDELAY
, 0)) &&
send(LogFile
, tbuf
, cnt
, 0) >= 0)
/* see if should attempt the console */
* 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 ((fd
= open(_PATH_CONSOLE
, O_WRONLY
, 0)) >= 0) {
(void)strcat(tbuf
, "\r\n");
p
= index(tbuf
, '>') + 1;
(void)write(fd
, p
, cnt
- (p
- tbuf
));
static struct sockaddr SyslogAddr
; /* AF_UNIX address of local logger */
openlog(ident
, logstat
, logfac
)
if (logfac
!= 0 && (logfac
&~ LOG_FACMASK
) == 0)
SyslogAddr
.sa_family
= AF_UNIX
;
(void)strncpy(SyslogAddr
.sa_data
, _PATH_LOG
,
sizeof(SyslogAddr
.sa_data
));
if (LogStat
& LOG_NDELAY
) {
if ((LogFile
= socket(AF_UNIX
, SOCK_DGRAM
, 0)) == -1)
(void)fcntl(LogFile
, F_SETFD
, 1);
if (LogFile
!= -1 && !connected
)
if (connect(LogFile
, &SyslogAddr
, sizeof(SyslogAddr
)) == -1) {
static int LogMask
= 0xff; /* mask of priorities to be logged */
/* setlogmask -- set the log mask level */