|
|
1.1 ! root 1: #include <syslog.h> ! 2: #include <sys/types.h> ! 3: #include <sys/stat.h> ! 4: #include <sgtty.h> ! 5: #ifdef LOG_IPC ! 6: #include <sys/socket.h> ! 7: #include <netinet/in.h> ! 8: #include <netdb.h> ! 9: #endif LOG_IPC ! 10: ! 11: static char SccsId[] = "%W% %Y% %G%"; ! 12: ! 13: ! 14: /* ! 15: ** SYSLOG -- print message on log file ! 16: ** ! 17: ** This routine looks a lot like printf, except that it ! 18: ** outputs to the log file instead of the standard output. ! 19: ** Also, it prints the module name in front of lines, ! 20: ** and has some other formatting types (or will sometime). ! 21: ** Also, it adds a newline on the end of messages. ! 22: ** ! 23: ** The output of this routine is intended to be read by ! 24: ** /etc/syslog, which will add timestamps. ! 25: ** ! 26: ** Parameters: ! 27: ** pri -- the message priority. ! 28: ** fmt -- the format string. ! 29: ** p0 -- the first of many parameters. ! 30: ** ! 31: ** Returns: ! 32: ** none ! 33: ** ! 34: ** Side Effects: ! 35: ** output to log. ! 36: */ ! 37: ! 38: #define MAXLINE 1000 /* maximum line length */ ! 39: #define BUFSLOP 20 /* space to allow for "extra stuff" */ ! 40: #define NULL 0 /* manifest */ ! 41: ! 42: static int SyslogFile = -1; /* fd for log */ ! 43: static int SyslogStat = 0; /* status bits; see below */ ! 44: static char *SyslogTag = NULL; /* tag for each entry */ ! 45: static int SyslogMask = LOG_DEBUG; /* lowest priority logged */ ! 46: #ifdef LOG_IPC ! 47: static struct sockaddr_in SyslogAddr; /* address of syslog daemon */ ! 48: static char *SyslogHost = LOG_HOST; /* name of this host */ ! 49: #endif LOG_IPC ! 50: ! 51: syslog(pri, fmt, p0, p1, p2, p3, p4) ! 52: int pri; ! 53: char *fmt; ! 54: { ! 55: char buf[MAXLINE+BUFSLOP]; ! 56: register char *b; ! 57: char *f; ! 58: int prec; ! 59: int len; ! 60: register char c; ! 61: register char *p; ! 62: int i; ! 63: extern int errno; ! 64: extern int sys_nerr; ! 65: extern char *sys_errlist[]; ! 66: extern char *logcvt(); ! 67: char outline[MAXLINE + 1]; ! 68: ! 69: /* if we have no log, open it */ ! 70: if (SyslogFile < 0) ! 71: openlog(0, 0); ! 72: ! 73: /* see if we should just throw out this message */ ! 74: if (pri > SyslogMask) ! 75: return; ! 76: ! 77: f = fmt; ! 78: ! 79: while (*f != '\0') ! 80: { ! 81: /* beginning of line */ ! 82: b = buf; ! 83: ! 84: /* insert priority code */ ! 85: if (pri > 0 && (SyslogStat & LOG_COOLIT) == 0) ! 86: { ! 87: *b++ = '<'; ! 88: *b++ = pri + '0'; ! 89: *b++ = '>'; ! 90: } ! 91: ! 92: /* output current process ID */ ! 93: if ((SyslogStat & LOG_PID) != 0) ! 94: { ! 95: sprintf(b, "%d ", getpid()); ! 96: b += strlen(b); ! 97: } ! 98: ! 99: /* and module name */ ! 100: if (SyslogTag != 0) ! 101: { ! 102: for (p = SyslogTag; *p != '\0'; ) ! 103: *b++ = *p++; ! 104: *b++ = ':'; ! 105: *b++ = ' '; ! 106: } ! 107: while ((c = *f++) != '\0' && c != '\n') ! 108: { ! 109: /* output character directly if not interpolated */ ! 110: if (c != '%') ! 111: { ! 112: *b++ = c; ! 113: continue; ! 114: } ! 115: c = *f++; ! 116: switch (c) ! 117: { ! 118: case 'm': /* output error code */ ! 119: if (errno < 0 || errno > sys_nerr) ! 120: sprintf(b, "error %d", errno); ! 121: else ! 122: sprintf(b, "%s", sys_errlist[errno]); ! 123: break; ! 124: ! 125: default: ! 126: *b++ = '%'; ! 127: *b++ = c; ! 128: *b = '\0'; ! 129: break; ! 130: } ! 131: b += strlen(b); ! 132: if (b >= &buf[MAXLINE]) ! 133: break; ! 134: } ! 135: if (c == '\0') ! 136: f--; ! 137: ! 138: /* add trailing newline */ ! 139: *b++ = '\n'; ! 140: *b = '\0'; ! 141: ! 142: /* output string */ ! 143: sprintf(outline, buf, p0, p1, p2, p3, p4); ! 144: #ifdef LOG_IPC ! 145: if (SyslogStat & LOG_DGRAM) ! 146: { ! 147: register int r; ! 148: ! 149: r = sendto(SyslogFile, outline, strlen(outline), 0, ! 150: &SyslogAddr, sizeof SyslogAddr); ! 151: #ifdef DEBUG ! 152: if (r < 0) ! 153: perror("syslog: send"); ! 154: #endif DEBUG ! 155: } ! 156: else ! 157: #endif LOG_IPC ! 158: write(SyslogFile, outline, strlen(outline)); ! 159: } ! 160: } ! 161: /* ! 162: ** OPENLOG -- open system log ! 163: ** ! 164: ** This happens automatically with reasonable defaults if you ! 165: ** do nothing. ! 166: ** ! 167: ** Parameters: ! 168: ** ident -- the name to be printed as a header for ! 169: ** all messages. ! 170: ** logstat -- a status word, interpreted as follows: ! 171: ** LOG_PID -- log the pid with each message. ! 172: ** ! 173: ** Returns: ! 174: ** 0 -- success. ! 175: ** -1 -- failure; logging on /dev/console instead. ! 176: ** ! 177: ** Side Effects: ! 178: ** Several global variables get set. ! 179: */ ! 180: ! 181: openlog(ident, logstat) ! 182: char *ident; ! 183: int logstat; ! 184: { ! 185: register int i; ! 186: register int fd; ! 187: struct stat st; ! 188: #ifdef LOG_IPC ! 189: struct servent *sp; ! 190: struct hostent *hp; ! 191: #endif LOG_IPC ! 192: ! 193: SyslogTag = ident; ! 194: SyslogStat = logstat; ! 195: ! 196: if (SyslogFile >= 0) ! 197: return; ! 198: #ifdef LOG_IPC ! 199: sp = getservbyname("syslog", "udp"); ! 200: hp = gethostbyname(SyslogHost); ! 201: if (sp != NULL && hp != NULL) ! 202: { ! 203: bzero(&SyslogAddr, sizeof SyslogAddr); ! 204: SyslogAddr.sin_family = AF_INET; ! 205: SyslogFile = socket(AF_INET, SOCK_DGRAM, 0, 0); ! 206: if (SyslogFile >= 0 && bind(SyslogFile, &SyslogAddr, sizeof SyslogAddr, 0) < 0) ! 207: { ! 208: close(SyslogFile); ! 209: SyslogFile = -1; ! 210: } ! 211: #ifdef DEBUG ! 212: if (SyslogFile < 0) ! 213: perror("syslog: socket"); ! 214: #endif DEBUG ! 215: SyslogAddr.sin_port = sp->s_port; ! 216: bcopy(hp->h_addr, (char *) &SyslogAddr.sin_addr, hp->h_length); ! 217: SyslogStat |= LOG_DGRAM; ! 218: } ! 219: #else LOG_IPC ! 220: SyslogFile = open("/dev/log", 1); ! 221: #endif LOG_IPC ! 222: if (SyslogFile < 0) ! 223: { ! 224: nolog: ! 225: SyslogStat |= LOG_COOLIT; ! 226: SyslogStat &= ~LOG_DGRAM; ! 227: SyslogMask = LOG_CRIT; ! 228: SyslogFile = open("/dev/console", 1); ! 229: if (SyslogFile < 0) ! 230: { ! 231: perror("syslog: cannot open /dev/console"); ! 232: SyslogFile = 2; ! 233: } ! 234: } ! 235: #ifndef LOG_IPC ! 236: if (fstat(SyslogFile, &st) < 0) ! 237: goto nolog; ! 238: switch (st.st_mode & S_IFMT) ! 239: { ! 240: case S_IFREG: ! 241: case S_IFDIR: ! 242: (void) close(SyslogFile); ! 243: goto nolog; ! 244: } ! 245: ! 246: #ifdef FIOCLEX ! 247: /* have it close automatically on exec */ ! 248: ioctl(SyslogFile, FIOCLEX, NULL); ! 249: #endif FIOCLEX ! 250: #endif LOG_IPC ! 251: } ! 252: /* ! 253: ** CLOSELOG -- close the system log ! 254: ** ! 255: ** Parameters: ! 256: ** none. ! 257: ** ! 258: ** Returns: ! 259: ** none. ! 260: ** ! 261: ** Side Effects: ! 262: ** The system log is closed. ! 263: */ ! 264: ! 265: closelog() ! 266: { ! 267: (void) close(SyslogFile); ! 268: SyslogFile = -1; ! 269: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.