--- syslogd.c-2.4.1.1 Fri Dec 7 12:42:36 2001 +++ syslogd.c Fri Dec 7 12:42:29 2001 @@ -783,7 +783,7 @@ const char *cvthname(struct sockaddr_in *f); void domark(); void debug_switch(); -void logerror(char *type); +void logerror(int errno, char *fmt, ...); void die(int sig); #ifndef TESTING void doexit(int sig); @@ -1036,7 +1036,7 @@ if ( (parts = (char **) malloc(num_fds * sizeof(char *))) == \ (char **) 0 ) { - logerror("Cannot allocate memory for message parts table."); + logerror(0, "Cannot allocate memory for message parts table."); die(0); } for(i= 0; i < num_fds; ++i) @@ -1121,7 +1121,7 @@ } if (nfds < 0) { if (errno != EINTR) - logerror("select"); + logerror(errno, "select"); dprintf("Select interrupted.\n"); continue; } @@ -1149,7 +1149,7 @@ } else if (i < 0 && errno != EINTR) { dprintf("UNIX socket error: %d = %s.\n", \ errno, strerror(errno)); - logerror("recvfrom UNIX"); + logerror(errno, "recvfrom UNIX"); } } } @@ -1180,7 +1180,7 @@ } else if (i < 0 && errno != EINTR) { dprintf("INET socket error: %d = %s.\n", \ errno, strerror(errno)); - logerror("recvfrom inet"); + logerror(errno, "recvfrom inet"); /* should be harmless now that we set * BSDCOMPAT on the socket */ sleep(10); @@ -1198,7 +1198,7 @@ printchopped(LocalHostName, line, i+1, fileno(stdin)); } else if (i < 0) { if (errno != EINTR) { - logerror("stdin"); + logerror(errno, "stdin"); } } FD_CLR(fileno(stdin), &readfds); @@ -1220,7 +1220,6 @@ { struct sockaddr_un sunx; int fd; - char line[MAXLINE +1]; if (path[0] == '\0') return -1; @@ -1234,9 +1233,7 @@ if (fd < 0 || bind(fd, (struct sockaddr *) &sunx, sizeof(sunx.sun_family)+strlen(sunx.sun_path)) < 0 || chmod(path, 0666) < 0) { - (void) snprintf(line, sizeof(line), "cannot create %s", path); - logerror(line); - dprintf("cannot create %s (%d).\n", path, errno); + logerror (errno, "cannot create %s", path); close(fd); #ifndef SYSV die(0); @@ -1255,7 +1252,8 @@ fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { - logerror("syslog: Unknown protocol, suspending inet service."); + logerror(errno, + "syslog: Unknown protocol, suspending inet service."); return fd; } @@ -1264,7 +1262,7 @@ sin.sin_port = LogPort; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, \ (char *) &on, sizeof(on)) < 0 ) { - logerror("setsockopt(REUSEADDR), suspending inet"); + logerror(errno, "setsockopt(REUSEADDR), suspending inet"); close(fd); return -1; } @@ -1274,13 +1272,13 @@ #ifdef SO_BSDCOMPAT if (setsockopt(fd, SOL_SOCKET, SO_BSDCOMPAT, \ (char *) &on, sizeof(on)) < 0) { - logerror("setsockopt(BSDCOMPAT), suspending inet"); + logerror(errno, "setsockopt(BSDCOMPAT), suspending inet"); close(fd); return -1; } #endif if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) < 0) { - logerror("bind, suspending inet"); + logerror(errno, "bind, suspending inet"); close(fd); return -1; } @@ -1404,7 +1402,7 @@ parts[fd] = (char *) 0; if ( (strlen(msg) + strlen(tmpline)) > MAXLINE ) { - logerror("Cannot glue message parts together"); + logerror(0, "Cannot glue message parts together"); printline(hname, tmpline); start = msg; } @@ -1429,7 +1427,7 @@ if(*p == '\0') p++; ptlngth = strlen(p); if ( (parts[fd] = malloc(ptlngth + 1)) == (char *) 0 ) - logerror("Cannot allocate memory for message part."); + logerror(0,"Cannot allocate memory for message part."); else { strcpy(parts[fd], p); @@ -1809,7 +1807,7 @@ e, strerror(e)); f->f_type = F_FORW_SUSP; errno = e; - logerror("sendto"); + logerror(errno, "sendto"); } } break; @@ -1862,7 +1860,7 @@ f->f_file = open(f->f_un.f_fname, O_WRONLY|O_APPEND|O_NOCTTY); if (f->f_file < 0) { f->f_type = F_UNUSED; - logerror(f->f_un.f_fname); + logerror(errno, f->f_un.f_fname); } else { untty(); goto again; @@ -1870,7 +1868,7 @@ } else { f->f_type = F_UNUSED; errno = e; - logerror(f->f_un.f_fname); + logerror(errno, f->f_un.f_fname); } } else if (f->f_flags & SYNC_FILE) (void) fsync(f->f_file); @@ -2114,19 +2112,27 @@ /* * Print syslogd errors some place. */ -void logerror(type) - char *type; +void logerror (int error, char *fmt, ...) { - char buf[100]; + char buf [MAXLINE]; - dprintf("Called logerr, msg: %s\n", type); + va_list ap; - if (errno == 0) - (void) snprintf(buf, sizeof(buf), "syslogd: %s", type); - else - (void) snprintf(buf, sizeof(buf), "syslogd: %s: %s", type, strerror(errno)); - errno = 0; - logmsg(LOG_SYSLOG|LOG_ERR, buf, LocalHostName, ADDDATE); + va_start (ap, fmt); + + vsnprintf (buf, sizeof buf, fmt, ap); + + va_end (ap); + + if (error) { + strncat (buf, ": ", sizeof buf); + strncat (buf, strerror (error), sizeof buf); + } + + dprintf ("logerror (%s)\n", buf); + + logmsg(LOG_SYSLOG|LOG_ERR, buf, LocalHostName, ADDDATE|SYNC_FILE); + return; } @@ -2208,8 +2214,8 @@ sp = getservbyname("syslog", "udp"); if (sp == NULL) { errno = 0; - logerror("network logging disabled (syslog/udp service unknown)."); - logerror("see syslogd(8) for details of whether and how to enable it."); + logerror(0, "network logging disabled (syslog/udp service unknown)."); + logerror(0, "see syslogd(8) for details of whether and how to enable it."); return; } LogPort = sp->s_port; @@ -2476,12 +2482,9 @@ struct hostent *hp; #endif char buf[MAXLINE]; - char xbuf[200]; dprintf("cfline(%s)\n", line); - errno = 0; /* keep strerror() stuff out of logerror messages */ - /* clear out file entry */ memset((char *) f, 0, sizeof(*f)); @@ -2544,8 +2547,7 @@ else { pri = decode(buf, prioritynames); if (pri < 0) { - (void) snprintf(xbuf, sizeof(xbuf), "unknown priority name \"%s\"", buf); - logerror(xbuf); + logerror (0, "unknown priority name \"%s\"", buf); return; } } @@ -2563,8 +2565,7 @@ else { i = decode(buf, facilitynames); if (i < 0) { - (void) snprintf(xbuf, sizeof(xbuf), "unknown facility name \"%s\"", buf); - logerror(xbuf); + logerror (0, "unknown facility name \"%s\"", buf); return; } from = to = LOG_FAC (i); @@ -2644,8 +2645,7 @@ if ( f->f_file < 0 ){ f->f_type = F_UNUSED; - dprintf("Error opening log file: %s\n", p); - logerror(p); + logerror (errno, "Error opening log file: %s\n", p); break; } if (isatty(f->f_file)) {