void __libc_closelog(void) { closelog_intern(); LogTag[0]=0; LogType = SOCK_DGRAM; }
/* * CLOSELOG -- close the system log */ void closelog( void ) { closelog_intern(1); }
void vsyslog( int pri, const char *fmt, va_list ap ) { register char *p; char *last_chr, *head_end, *end, *stdp; time_t now; int fd, saved_errno; int rc; char tbuf[1024]; /* syslogd is unable to handle longer messages */ struct sigaction action, oldaction; int sigpipe; memset (&action, 0, sizeof (action)); action.sa_handler = sigpipe_handler; sigemptyset (&action.sa_mask); sigpipe = sigaction (SIGPIPE, &action, &oldaction); saved_errno = errno; LOCK; /* See if we should just throw out this message. */ if (!(LogMask & LOG_MASK(LOG_PRI(pri))) || (pri &~ (LOG_PRIMASK|LOG_FACMASK))) goto getout; if (LogFile < 0 || !connected) openlog(LogTag, LogStat | LOG_NDELAY, 0); /* Build the message. We know the starting part of the message can take * no longer than 64 characters plus length of the LogTag. So it's * safe to test only LogTag and use normal sprintf everywhere else. */ (void)time(&now); stdp = p = tbuf + sprintf(tbuf, "<%d>%.15s ", pri, ctime(&now) + 4); if (LogTag) { if (strlen(LogTag) < sizeof(tbuf) - 64) p += sprintf(p, "%s", LogTag); else p += sprintf(p, "<BUFFER OVERRUN ATTEMPT>"); } if (LogStat & LOG_PID) p += sprintf(p, "[%d]", getpid()); if (LogTag) { *p++ = ':'; *p++ = ' '; } head_end = p; /* We format the rest of the message. If the buffer becomes full, we mark * the message as truncated. Note that we require at least 2 free bytes * in the buffer as we might want to add "\r\n" there. */ end = tbuf + sizeof(tbuf) - 1; __set_errno(saved_errno); p += vsnprintf(p, end - p, fmt, ap); if (p >= end || p < head_end) { /* Returned -1 in case of error... */ static const char truncate_msg[12] = "[truncated] "; memmove(head_end + sizeof(truncate_msg), head_end, end - head_end - sizeof(truncate_msg)); memcpy(head_end, truncate_msg, sizeof(truncate_msg)); if (p < head_end) { while (p < end && *p) { p++; } } else { p = end - 1; } } last_chr = p; /* Output to stderr if requested. */ if (LogStat & LOG_PERROR) { *last_chr = '\n'; (void)write(STDERR_FILENO, stdp, last_chr - stdp + 1); } /* Output the message to the local logger using NUL as a message delimiter. */ p = tbuf; *last_chr = 0; do { rc = write(LogFile, p, last_chr + 1 - p); if (rc < 0) { if ((errno==EAGAIN) || (errno==EINTR)) rc=0; else { closelog_intern(0); break; } } p+=rc; } while (p <= last_chr); if (rc >= 0) goto getout; /* * 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. */ /* should mode be `O_WRONLY | O_NOCTTY' ? -- Uli */ if (LogStat & LOG_CONS && (fd = open(_PATH_CONSOLE, O_WRONLY, 0)) >= 0) { p = index(tbuf, '>') + 1; last_chr[0] = '\r'; last_chr[1] = '\n'; (void)write(fd, p, last_chr - p + 2); (void)close(fd); } getout: UNLOCK; if (sigpipe == 0) sigaction (SIGPIPE, &oldaction, (struct sigaction *) NULL); }
static void sigpipe_handler (int sig) { closelog_intern (0); }
static void sigpipe_handler (attribute_unused int sig) { closelog_intern (0); }
void __libc_vsyslog(int priority, const char *format, va_list arg_ptr) { char buffer[BUF_SIZE]; char time_buf[20]; int buflen, headerlen; time_t now; struct tm now_tm; pid_t pid; int fd; int sigpipe; struct sigaction action, oldaction; int saved_errno = errno; /* check for invalid priority/facility bits */ if (priority & ~(LOG_PRIMASK|LOG_FACMASK)) { syslog(LOG_ERR|LOG_CONS|LOG_PERROR|LOG_PID, "syslog: unknown facility/priorityority: %x", priority); priority &= LOG_PRIMASK|LOG_FACMASK; } /* check priority against setlogmask */ if ((LOG_MASK(LOG_PRI(priority)) && LogMask) == 0) return; /* Set default facility if none specified. */ if ((priority & LOG_FACMASK) == 0) priority |= LogFacility; pid = getpid(); time(&now); strftime(time_buf, 20, "%h %e %T", localtime_r (&now, &now_tm)); if (LogStat & LOG_PID) headerlen = snprintf(buffer, 130, "<%d>%s %s[%ld]: ", priority, time_buf, LogTag, (long) pid); else headerlen = snprintf(buffer, 130, "<%d>%s %s: ", priority, time_buf, LogTag); if (!LogTag[0]) { if ((LogStat & LOG_PID) != LOG_PID) headerlen = snprintf(buffer, 130, "<%d>%s (unknown)[%ld]: ", priority, time_buf, (long) pid); strcat(buffer+headerlen, "syslog without openlog w/ ident, please check code!"); buflen = 41; } else { errno=saved_errno; buflen = vsnprintf(buffer+headerlen, BUF_SIZE - headerlen, format, arg_ptr); } if (LogStat & LOG_PERROR) { __libc_write(1, buffer+headerlen, buflen); if (buffer[headerlen+buflen] != '\n') __libc_write(1,"\n", 1); } /* prepare for broken connection */ memset(&action, 0, sizeof(action)); action.sa_handler = SIG_IGN; sigemptyset(&action.sa_mask); sigpipe = sigaction (SIGPIPE, &action, &oldaction); if (!connected) openlog_intern(LogStat | LOG_NDELAY, 0); /* If we have a SOCK_STREAM connection, also send ASCII NUL as a * record terminator. */ if (LogType == SOCK_STREAM) buflen++; if (!connected || (send(LogFile, buffer, buflen+headerlen, 0) != buflen+headerlen)) { if (LogType == SOCK_STREAM) buflen--; closelog_intern(); /* * 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 ((LogStat & LOG_CONS) && ((fd = __libc_open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0)) { __libc_write(fd, buffer, buflen+headerlen); __libc_write(fd, "\r\n", 2); __libc_close(fd); } } if (sigpipe == 0) sigaction(SIGPIPE, &oldaction, (struct sigaction *) NULL); }