|
|
1.1 ! root 1: #ifndef BSD43 ! 2: #ifndef lint ! 3: static char SccsId[] = "@(#)syslog.c 4.1 (Berkeley) 5/27/83"; ! 4: #endif ! 5: ! 6: /* ! 7: * SYSLOG -- print message on log file ! 8: * ! 9: * This routine looks a lot like printf, except that it ! 10: * outputs to the log file instead of the standard output. ! 11: * Also, it prints the module name in front of lines, ! 12: * and has some other formatting types (or will sometime). ! 13: * Also, it adds a newline on the end of messages. ! 14: * ! 15: * The output of this routine is intended to be read by ! 16: * /etc/syslog, which will add timestamps. ! 17: */ ! 18: #include <sys/types.h> ! 19: #include <sys/socket.h> ! 20: #include <netinet/in.h> ! 21: ! 22: #include <syslog.h> ! 23: #include <netdb.h> ! 24: ! 25: #define MAXLINE 1024 /* max message size */ ! 26: #define BUFSLOP 20 /* space to allow for "extra stuff" */ ! 27: #define NULL 0 /* manifest */ ! 28: ! 29: int LogFile = -1; /* fd for log */ ! 30: int LogStat = 0; /* status bits, set by initlog */ ! 31: char *LogTag = NULL; /* string to tag the entry with */ ! 32: int LogMask = LOG_DEBUG; /* lowest priority to be logged */ ! 33: ! 34: struct sockaddr_in SyslogAddr; ! 35: static char *SyslogHost = LOG_HOST; ! 36: ! 37: extern int errno, sys_nerr; ! 38: extern char *sys_errlist[]; ! 39: ! 40: syslog(pri, fmt, p0, p1, p2, p3, p4) ! 41: int pri; ! 42: char *fmt; ! 43: { ! 44: char buf[MAXLINE+BUFSLOP], outline[MAXLINE + 1]; ! 45: register char *b, *f; ! 46: ! 47: if (LogFile < 0) ! 48: openlog(0, 0); ! 49: /* see if we should just throw out this message */ ! 50: if (pri > LogMask) ! 51: return; ! 52: for (b = buf, f = fmt; f && *f; b = buf) { ! 53: register char c; ! 54: ! 55: if (pri > 0 && (LogStat & LOG_COOLIT) == 0) { ! 56: sprintf(b, "<%d>", pri); ! 57: b += strlen(b); ! 58: } ! 59: if (LogStat & LOG_PID) { ! 60: sprintf(b, "%d ", getpid()); ! 61: b += strlen(b); ! 62: } ! 63: if (LogTag) { ! 64: sprintf(b, "%s: ", LogTag); ! 65: b += strlen(b); ! 66: } ! 67: while ((c = *f++) != '\0' && c != '\n' && b < buf + MAXLINE) { ! 68: if (c != '%') { ! 69: *b++ = c; ! 70: continue; ! 71: } ! 72: c = *f++; ! 73: if (c != 'm') { ! 74: #ifndef UCI ! 75: *b++ = '%', *b++ = c, *b++ = '\0'; ! 76: #else UCI ! 77: *b++ = '%', *b++ = c; ! 78: #endif UCI ! 79: continue; ! 80: } ! 81: if ((unsigned)errno > sys_nerr) ! 82: sprintf(b, "error %d", errno); ! 83: else ! 84: strcat(b, sys_errlist[errno]); ! 85: b += strlen(b); ! 86: } ! 87: if (c == '\0') ! 88: f--; ! 89: *b++ = '\n', *b = '\0'; ! 90: sprintf(outline, buf, p0, p1, p2, p3, p4); ! 91: errno = 0; ! 92: if (LogStat & LOG_DGRAM) ! 93: (void) sendto(LogFile, outline, strlen(outline), 0, ! 94: &SyslogAddr, sizeof SyslogAddr); ! 95: else ! 96: (void) write(LogFile, outline, strlen(outline)); ! 97: if (errno) ! 98: perror("syslog: sendto"); ! 99: } ! 100: } ! 101: ! 102: /* ! 103: * OPENLOG -- open system log ! 104: */ ! 105: openlog(ident, logstat) ! 106: char *ident; ! 107: int logstat; ! 108: { ! 109: struct servent *sp; ! 110: struct hostent *hp; ! 111: ! 112: LogTag = ident; ! 113: LogStat = logstat; ! 114: if (LogFile >= 0) ! 115: return; ! 116: sp = getservbyname("syslog", "udp"); ! 117: hp = gethostbyname(SyslogHost); ! 118: if (sp == NULL || hp == NULL) ! 119: goto bad; ! 120: LogFile = socket(AF_INET, SOCK_DGRAM, 0); ! 121: if (LogFile < 0) { ! 122: perror("syslog: socket"); ! 123: goto bad; ! 124: } ! 125: bzero(&SyslogAddr, sizeof SyslogAddr); ! 126: SyslogAddr.sin_family = hp->h_addrtype; ! 127: bcopy(hp->h_addr, (char *)&SyslogAddr.sin_addr, hp->h_length); ! 128: SyslogAddr.sin_port = sp->s_port; ! 129: LogStat |= LOG_DGRAM; ! 130: return; ! 131: bad: ! 132: LogStat |= LOG_COOLIT; ! 133: LogStat &= ~LOG_DGRAM; ! 134: LogMask = LOG_CRIT; ! 135: LogFile = open("/dev/console", 1); ! 136: if (LogFile < 0) { ! 137: perror("syslog: /dev/console"); ! 138: LogFile = 2; ! 139: } ! 140: } ! 141: ! 142: /* ! 143: * CLOSELOG -- close the system log ! 144: */ ! 145: closelog() ! 146: { ! 147: ! 148: (void) close(LogFile); ! 149: LogFile = -1; ! 150: } ! 151: #endif not BSD43
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.