/*
* 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";
-#endif not lint
+#endif /* not 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>
int argc;
char **argv;
{
- char buf[200];
- char *tag;
- register char *p;
+ extern char *optarg;
+ extern int optind;
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;
-
- 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;
-
- 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;
-
- default:
- fprintf(stderr, "logger: unknown flag -%s\n", p);
+ case 't': /* tag */
+ tag = optarg;
break;
+ case '?':
+ default:
+ usage();
}
- }
+ argc -= optind;
+ argv += optind;
/* setup for logging */
- openlog(tag, logflags, 0);
+ openlog(tag ? tag : getlogin(), logflags, 0);
(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 */
- while (fgets(buf, sizeof buf, stdin) != NULL)
+ while (fgets(buf, sizeof(buf), stdin) != NULL)
syslog(pri, buf);
exit(0);
"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,
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)
- bailout("unknown facility name: ", buf);
- for (p = buf; *p++ = *s++; )
- continue;
- } else
+ bailout("unknown facility name: ", save);
+ *s++ = '.';
+ }
+ else {
fac = 0;
- lev = decode(buf, PriNames);
+ s = save;
+ }
+ lev = decode(s, PriNames);
if (lev < 0)
- bailout("unknown priority name: ", buf);
-
+ bailout("unknown priority name: ", save);
return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
}
struct code *codetab;
{
register struct code *c;
- register char *p;
- char buf[40];
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++)
- if (!strcmp(buf, c->c_name))
+ if (!strcasecmp(name, c->c_name))
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);
}