|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: char copyright[] = ! 20: "@(#) Copyright (c) 1983 Regents of the University of California.\n\ ! 21: All rights reserved.\n"; ! 22: #endif /* not lint */ ! 23: ! 24: #ifndef lint ! 25: static char sccsid[] = "@(#)logger.c 6.8 (Berkeley) 6/29/88"; ! 26: #endif /* not lint */ ! 27: ! 28: #include <stdio.h> ! 29: #include <syslog.h> ! 30: #include <ctype.h> ! 31: ! 32: /* ! 33: ** LOGGER -- read and log utility ! 34: ** ! 35: ** This routine reads from an input and arranges to write the ! 36: ** result on the system log, along with a useful tag. ! 37: */ ! 38: ! 39: main(argc, argv) ! 40: int argc; ! 41: char **argv; ! 42: { ! 43: extern char *optarg; ! 44: extern int optind; ! 45: int pri = LOG_NOTICE; ! 46: int ch, logflags = 0; ! 47: char *tag, buf[200], *getlogin(); ! 48: ! 49: tag = NULL; ! 50: while ((ch = getopt(argc, argv, "f:ip:t:")) != EOF) ! 51: switch((char)ch) { ! 52: case 'f': /* file to log */ ! 53: if (freopen(optarg, "r", stdin) == NULL) { ! 54: fprintf("logger: "); ! 55: perror(optarg); ! 56: exit(1); ! 57: } ! 58: break; ! 59: case 'i': /* log process id also */ ! 60: logflags |= LOG_PID; ! 61: break; ! 62: case 'p': /* priority */ ! 63: pri = pencode(optarg); ! 64: break; ! 65: case 't': /* tag */ ! 66: tag = optarg; ! 67: break; ! 68: case '?': ! 69: default: ! 70: usage(); ! 71: } ! 72: argc -= optind; ! 73: argv += optind; ! 74: ! 75: /* setup for logging */ ! 76: openlog(tag ? tag : getlogin(), logflags, 0); ! 77: (void) fclose(stdout); ! 78: ! 79: /* log input line if appropriate */ ! 80: if (argc > 0) { ! 81: register char *p, *endp; ! 82: int len; ! 83: ! 84: for (p = buf, endp = buf + sizeof(buf) - 1;;) { ! 85: len = strlen(*argv); ! 86: if (p + len < endp && p > buf) { ! 87: *--p = '\0'; ! 88: syslog(pri, buf); ! 89: p = buf; ! 90: } ! 91: if (len > sizeof(buf) - 1) { ! 92: syslog(pri, *argv++); ! 93: if (!--argc) ! 94: break; ! 95: } else { ! 96: bcopy(*argv++, p, len); ! 97: p += len; ! 98: if (!--argc) ! 99: break; ! 100: *p++ = ' '; ! 101: *--p = '\0'; ! 102: } ! 103: } ! 104: if (p != buf) { ! 105: *p = '\0'; ! 106: syslog(pri, buf); ! 107: } ! 108: exit(0); ! 109: } ! 110: ! 111: /* main loop */ ! 112: while (fgets(buf, sizeof(buf), stdin) != NULL) ! 113: syslog(pri, buf); ! 114: ! 115: exit(0); ! 116: } ! 117: ! 118: ! 119: struct code { ! 120: char *c_name; ! 121: int c_val; ! 122: }; ! 123: ! 124: struct code PriNames[] = { ! 125: "panic", LOG_EMERG, ! 126: "emerg", LOG_EMERG, ! 127: "alert", LOG_ALERT, ! 128: "crit", LOG_CRIT, ! 129: "err", LOG_ERR, ! 130: "error", LOG_ERR, ! 131: "warn", LOG_WARNING, ! 132: "warning", LOG_WARNING, ! 133: "notice", LOG_NOTICE, ! 134: "info", LOG_INFO, ! 135: "debug", LOG_DEBUG, ! 136: NULL, -1 ! 137: }; ! 138: ! 139: struct code FacNames[] = { ! 140: "kern", LOG_KERN, ! 141: "user", LOG_USER, ! 142: "mail", LOG_MAIL, ! 143: "daemon", LOG_DAEMON, ! 144: "auth", LOG_AUTH, ! 145: "security", LOG_AUTH, ! 146: "syslog", LOG_SYSLOG, ! 147: "lpr", LOG_LPR, ! 148: "news", LOG_NEWS, ! 149: "uucp", LOG_UUCP, ! 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: char *save; ! 170: int fac, lev; ! 171: ! 172: for (save = s; *s && *s != '.'; ++s); ! 173: if (*s) { ! 174: *s = '\0'; ! 175: fac = decode(save, FacNames); ! 176: if (fac < 0) ! 177: bailout("unknown facility name: ", save); ! 178: *s++ = '.'; ! 179: } ! 180: else { ! 181: fac = 0; ! 182: s = save; ! 183: } ! 184: lev = decode(s, PriNames); ! 185: if (lev < 0) ! 186: bailout("unknown priority name: ", save); ! 187: return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK)); ! 188: } ! 189: ! 190: ! 191: decode(name, codetab) ! 192: char *name; ! 193: struct code *codetab; ! 194: { ! 195: register struct code *c; ! 196: ! 197: if (isdigit(*name)) ! 198: return (atoi(name)); ! 199: ! 200: for (c = codetab; c->c_name; c++) ! 201: if (!strcasecmp(name, c->c_name)) ! 202: return (c->c_val); ! 203: ! 204: return (-1); ! 205: } ! 206: ! 207: bailout(msg, arg) ! 208: char *msg, *arg; ! 209: { ! 210: fprintf(stderr, "logger: %s%s\n", msg, arg); ! 211: exit(1); ! 212: } ! 213: ! 214: usage() ! 215: { ! 216: fputs("logger: [-i] [-f file] [-p pri] [-t tag] [ message ... ]\n", ! 217: stderr); ! 218: exit(1); ! 219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.