BSD 4_3_Tahoe release
[unix-history] / usr / src / ucb / logger.c
index bd3c62c..8e7dac4 100644 (file)
@@ -1,18 +1,29 @@
 /*
  * Copyright (c) 1983 Regents of the University of California.
 /*
  * Copyright (c) 1983 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
 char copyright[] =
 "@(#) Copyright (c) 1983 Regents of the University of California.\n\
  All rights reserved.\n";
  */
 
 #ifndef lint
 char copyright[] =
 "@(#) Copyright (c) 1983 Regents of the University of California.\n\
  All rights reserved.\n";
-#endif not lint
+#endif /* not lint */
 
 #ifndef lint
 
 #ifndef lint
-static char sccsid[] = "@(#)logger.c   6.2 (Berkeley) 9/19/85";
-#endif not lint
+static char sccsid[] = "@(#)logger.c   6.8 (Berkeley) 6/29/88";
+#endif /* not lint */
 
 #include <stdio.h>
 #include <syslog.h>
 
 #include <stdio.h>
 #include <syslog.h>
@@ -29,91 +40,76 @@ main(argc, argv)
        int argc;
        char **argv;
 {
        int argc;
        char **argv;
 {
-       char buf[200];
-       char *tag;
-       register char *p;
+       extern char *optarg;
+       extern int optind;
        int pri = LOG_NOTICE;
        int pri = LOG_NOTICE;
-       int logflags = 0;
-       extern char *getlogin();
-
-       /* initialize */
-       tag = getlogin();
-
-       /* crack arguments */
-       while (--argc > 0)
-       {
-               p = *++argv;
-               if (*p != '-')
-                       break;
-
-               switch (*++p)
-               {
-                 case '\0':            /* dummy */
-                       /* this can be used to give null parameters */
-                       break;
-
-                 case 't':             /* tag */
-                       if (argc > 1 && argv[1][0] != '-')
-                       {
-                               argc--;
-                               tag = *++argv;
+       int ch, logflags = 0;
+       char *tag, buf[200], *getlogin();
+
+       tag = NULL;
+       while ((ch = getopt(argc, argv, "f:ip:t:")) != EOF)
+               switch((char)ch) {
+               case 'f':               /* file to log */
+                       if (freopen(optarg, "r", stdin) == NULL) {
+                               fprintf("logger: ");
+                               perror(optarg);
+                               exit(1);
                        }
                        }
-                       else
-                               tag = NULL;
                        break;
                        break;
-
-                 case 'p':             /* priority */
-                       if (argc > 1 && argv[1][0] != '-')
-                       {
-                               argc--;
-                               pri = pencode(*++argv);
-                       }
-                       break;
-
-                 case 'i':             /* log process id also */
+               case 'i':               /* log process id also */
                        logflags |= LOG_PID;
                        break;
                        logflags |= LOG_PID;
                        break;
-
-                 case 'f':             /* file to log */
-                       if (argc > 1 && argv[1][0] != '-')
-                       {
-                               argc--;
-                               if (freopen(*++argv, "r", stdin) == NULL)
-                               {
-                                       fprintf("logger: ");
-                                       perror(*argv);
-                                       exit(1);
-                               }
-                       }
+               case 'p':               /* priority */
+                       pri = pencode(optarg);
                        break;
                        break;
-
-                 default:
-                       fprintf(stderr, "logger: unknown flag -%s\n", p);
+               case 't':               /* tag */
+                       tag = optarg;
                        break;
                        break;
+               case '?':
+               default:
+                       usage();
                }
                }
-       }
+       argc -= optind;
+       argv += optind;
 
        /* setup for logging */
 
        /* setup for logging */
-       openlog(tag, logflags, 0);
+       openlog(tag ? tag : getlogin(), logflags, 0);
        (void) fclose(stdout);
 
        /* log input line if appropriate */
        (void) fclose(stdout);
 
        /* log input line if appropriate */
-       if (argc > 0)
-       {
-               char buf[120];
-
-               buf[0] = '\0';
-               while (argc-- > 0)
-               {
-                       strcat(buf, " ");
-                       strcat(buf, *argv++);
+       if (argc > 0) {
+               register char *p, *endp;
+               int len;
+
+               for (p = buf, endp = buf + sizeof(buf) - 1;;) {
+                       len = strlen(*argv);
+                       if (p + len < endp && p > buf) {
+                               *--p = '\0';
+                               syslog(pri, buf);
+                               p = buf;
+                       }
+                       if (len > sizeof(buf) - 1) {
+                               syslog(pri, *argv++);
+                               if (!--argc)
+                                       break;
+                       } else {
+                               bcopy(*argv++, p, len);
+                               p += len;
+                               if (!--argc)
+                                       break;
+                               *p++ = ' ';
+                               *--p = '\0';
+                       }
+               }
+               if (p != buf) {
+                       *p = '\0';
+                       syslog(pri, buf);
                }
                }
-               syslog(pri, buf + 1);
                exit(0);
        }
 
        /* main loop */
                exit(0);
        }
 
        /* main loop */
-       while (fgets(buf, sizeof buf, stdin) != NULL)
+       while (fgets(buf, sizeof(buf), stdin) != NULL)
                syslog(pri, buf);
 
        exit(0);
                syslog(pri, buf);
 
        exit(0);
@@ -147,6 +143,10 @@ struct code        FacNames[] = {
        "daemon",       LOG_DAEMON,
        "auth",         LOG_AUTH,
        "security",     LOG_AUTH,
        "daemon",       LOG_DAEMON,
        "auth",         LOG_AUTH,
        "security",     LOG_AUTH,
+       "syslog",       LOG_SYSLOG,
+       "lpr",          LOG_LPR,
+       "news",         LOG_NEWS,
+       "uucp",         LOG_UUCP,
        "local0",       LOG_LOCAL0,
        "local1",       LOG_LOCAL1,
        "local2",       LOG_LOCAL2,
        "local0",       LOG_LOCAL0,
        "local1",       LOG_LOCAL1,
        "local2",       LOG_LOCAL2,
@@ -166,26 +166,24 @@ struct code       FacNames[] = {
 pencode(s)
        register char *s;
 {
 pencode(s)
        register char *s;
 {
-       register char *p;
-       int lev;
-       int fac;
-       char buf[100];
-
-       for (p = buf; *s && *s != '.'; )
-               *p++ = *s++;
-       *p = '\0';
-       if (*s++) {
-               fac = decode(buf, FacNames);
+       char *save;
+       int fac, lev;
+
+       for (save = s; *s && *s != '.'; ++s);
+       if (*s) {
+               *s = '\0';
+               fac = decode(save, FacNames);
                if (fac < 0)
                if (fac < 0)
-                       bailout("unknown facility name: ", buf);
-               for (p = buf; *p++ = *s++; )
-                       continue;
-       } else
+                       bailout("unknown facility name: ", save);
+               *s++ = '.';
+       }
+       else {
                fac = 0;
                fac = 0;
-       lev = decode(buf, PriNames);
+               s = save;
+       }
+       lev = decode(s, PriNames);
        if (lev < 0)
        if (lev < 0)
-               bailout("unknown priority name: ", buf);
-
+               bailout("unknown priority name: ", save);
        return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
 }
 
        return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
 }
 
@@ -195,26 +193,27 @@ decode(name, codetab)
        struct code *codetab;
 {
        register struct code *c;
        struct code *codetab;
 {
        register struct code *c;
-       register char *p;
-       char buf[40];
 
        if (isdigit(*name))
                return (atoi(name));
 
 
        if (isdigit(*name))
                return (atoi(name));
 
-       (void) strcpy(buf, name);
-       for (p = buf; *p; p++)
-               if (isupper(*p))
-                       *p = tolower(*p);
        for (c = codetab; c->c_name; c++)
        for (c = codetab; c->c_name; c++)
-               if (!strcmp(buf, c->c_name))
+               if (!strcasecmp(name, c->c_name))
                        return (c->c_val);
 
        return (-1);
 }
 
                        return (c->c_val);
 
        return (-1);
 }
 
-bailout(a, b)
-       char *a, *b;
+bailout(msg, arg)
+       char *msg, *arg;
+{
+       fprintf(stderr, "logger: %s%s\n", msg, arg);
+       exit(1);
+}
+
+usage()
 {
 {
-       fprintf(stderr, "logger: %s%s\n", a, b);
+       fputs("logger: [-i] [-f file] [-p pri] [-t tag] [ message ... ]\n",
+           stderr);
        exit(1);
 }
        exit(1);
 }