|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: char copyright[] = ! 9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif not lint ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)logger.c 6.2 (Berkeley) 9/19/85"; ! 15: #endif not lint ! 16: ! 17: #include <stdio.h> ! 18: #include <syslog.h> ! 19: #include <ctype.h> ! 20: ! 21: /* ! 22: ** LOGGER -- read and log utility ! 23: ** ! 24: ** This routine reads from an input and arranges to write the ! 25: ** result on the system log, along with a useful tag. ! 26: */ ! 27: ! 28: main(argc, argv) ! 29: int argc; ! 30: char **argv; ! 31: { ! 32: char buf[200]; ! 33: char *tag; ! 34: register char *p; ! 35: int pri = LOG_NOTICE; ! 36: int logflags = 0; ! 37: extern char *getlogin(); ! 38: ! 39: /* initialize */ ! 40: tag = getlogin(); ! 41: ! 42: /* crack arguments */ ! 43: while (--argc > 0) ! 44: { ! 45: p = *++argv; ! 46: if (*p != '-') ! 47: break; ! 48: ! 49: switch (*++p) ! 50: { ! 51: case '\0': /* dummy */ ! 52: /* this can be used to give null parameters */ ! 53: break; ! 54: ! 55: case 't': /* tag */ ! 56: if (argc > 1 && argv[1][0] != '-') ! 57: { ! 58: argc--; ! 59: tag = *++argv; ! 60: } ! 61: else ! 62: tag = NULL; ! 63: break; ! 64: ! 65: case 'p': /* priority */ ! 66: if (argc > 1 && argv[1][0] != '-') ! 67: { ! 68: argc--; ! 69: pri = pencode(*++argv); ! 70: } ! 71: break; ! 72: ! 73: case 'i': /* log process id also */ ! 74: logflags |= LOG_PID; ! 75: break; ! 76: ! 77: case 'f': /* file to log */ ! 78: if (argc > 1 && argv[1][0] != '-') ! 79: { ! 80: argc--; ! 81: if (freopen(*++argv, "r", stdin) == NULL) ! 82: { ! 83: fprintf("logger: "); ! 84: perror(*argv); ! 85: exit(1); ! 86: } ! 87: } ! 88: break; ! 89: ! 90: default: ! 91: fprintf(stderr, "logger: unknown flag -%s\n", p); ! 92: break; ! 93: } ! 94: } ! 95: ! 96: /* setup for logging */ ! 97: openlog(tag, logflags, 0); ! 98: (void) fclose(stdout); ! 99: ! 100: /* log input line if appropriate */ ! 101: if (argc > 0) ! 102: { ! 103: char buf[120]; ! 104: ! 105: buf[0] = '\0'; ! 106: while (argc-- > 0) ! 107: { ! 108: strcat(buf, " "); ! 109: strcat(buf, *argv++); ! 110: } ! 111: syslog(pri, buf + 1); ! 112: exit(0); ! 113: } ! 114: ! 115: /* main loop */ ! 116: while (fgets(buf, sizeof buf, stdin) != NULL) ! 117: syslog(pri, buf); ! 118: ! 119: exit(0); ! 120: } ! 121: ! 122: ! 123: struct code { ! 124: char *c_name; ! 125: int c_val; ! 126: }; ! 127: ! 128: struct code PriNames[] = { ! 129: "panic", LOG_EMERG, ! 130: "emerg", LOG_EMERG, ! 131: "alert", LOG_ALERT, ! 132: "crit", LOG_CRIT, ! 133: "err", LOG_ERR, ! 134: "error", LOG_ERR, ! 135: "warn", LOG_WARNING, ! 136: "warning", LOG_WARNING, ! 137: "notice", LOG_NOTICE, ! 138: "info", LOG_INFO, ! 139: "debug", LOG_DEBUG, ! 140: NULL, -1 ! 141: }; ! 142: ! 143: struct code FacNames[] = { ! 144: "kern", LOG_KERN, ! 145: "user", LOG_USER, ! 146: "mail", LOG_MAIL, ! 147: "daemon", LOG_DAEMON, ! 148: "auth", LOG_AUTH, ! 149: "security", LOG_AUTH, ! 150: "local0", LOG_LOCAL0, ! 151: "local1", LOG_LOCAL1, ! 152: "local2", LOG_LOCAL2, ! 153: "local3", LOG_LOCAL3, ! 154: "local4", LOG_LOCAL4, ! 155: "local5", LOG_LOCAL5, ! 156: "local6", LOG_LOCAL6, ! 157: "local7", LOG_LOCAL7, ! 158: NULL, -1 ! 159: }; ! 160: ! 161: ! 162: /* ! 163: * Decode a symbolic name to a numeric value ! 164: */ ! 165: ! 166: pencode(s) ! 167: register char *s; ! 168: { ! 169: register char *p; ! 170: int lev; ! 171: int fac; ! 172: char buf[100]; ! 173: ! 174: for (p = buf; *s && *s != '.'; ) ! 175: *p++ = *s++; ! 176: *p = '\0'; ! 177: if (*s++) { ! 178: fac = decode(buf, FacNames); ! 179: if (fac < 0) ! 180: bailout("unknown facility name: ", buf); ! 181: for (p = buf; *p++ = *s++; ) ! 182: continue; ! 183: } else ! 184: fac = 0; ! 185: lev = decode(buf, PriNames); ! 186: if (lev < 0) ! 187: bailout("unknown priority name: ", buf); ! 188: ! 189: return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK)); ! 190: } ! 191: ! 192: ! 193: decode(name, codetab) ! 194: char *name; ! 195: struct code *codetab; ! 196: { ! 197: register struct code *c; ! 198: register char *p; ! 199: char buf[40]; ! 200: ! 201: if (isdigit(*name)) ! 202: return (atoi(name)); ! 203: ! 204: (void) strcpy(buf, name); ! 205: for (p = buf; *p; p++) ! 206: if (isupper(*p)) ! 207: *p = tolower(*p); ! 208: for (c = codetab; c->c_name; c++) ! 209: if (!strcmp(buf, c->c_name)) ! 210: return (c->c_val); ! 211: ! 212: return (-1); ! 213: } ! 214: ! 215: bailout(a, b) ! 216: char *a, *b; ! 217: { ! 218: fprintf(stderr, "logger: %s%s\n", a, b); ! 219: exit(1); ! 220: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.