annotate toys/pending/logger.c @ 1005:03f72b57a092

DHCP client and server, from Ashwini Sharma.
author Rob Landley <rob@landley.net>
date Wed, 14 Aug 2013 19:09:33 -0500
parents d1768175ce1d
children f9271a80fedc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* logger.c - Log messages.
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2013 Ilya Kuzmich <ilya.kuzmich@gmail.com>
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 *
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
5 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/logger.html
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
6
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
7 USE_LOGGER(NEWTOY(logger, "st:p:", TOYFLAG_USR|TOYFLAG_BIN))
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
8
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
9 config LOGGER
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 bool "logger"
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 default n
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 help
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 usage: hello [-s] [-t tag] [-p [facility.]priority] [message]
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
14
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
15 Log message (or stdin) to syslog.
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 */
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
17
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
18 #define FOR_logger
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
19 #include "toys.h"
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
20 #include <syslog.h>
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
21
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
22 GLOBALS(
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 char *priority_arg;
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 char *ident;
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 )
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
26
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
27 struct mapping {
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
28 char *key;
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
29 int value;
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 };
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
31
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
32 static struct mapping facilities[] = {
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 {"user", LOG_USER}, {"main", LOG_MAIL}, {"news", LOG_NEWS},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
34 {"uucp", LOG_UUCP}, {"daemon", LOG_DAEMON}, {"auth", LOG_AUTH},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 {"cron", LOG_CRON}, {"lpr", LOG_LPR}, {"local0", LOG_LOCAL0},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 {"local1", LOG_LOCAL1}, {"local2", LOG_LOCAL2}, {"local3", LOG_LOCAL3},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 {"local4", LOG_LOCAL4}, {"local5", LOG_LOCAL5}, {"local6", LOG_LOCAL6},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
38 {"local7", LOG_LOCAL7},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
39 {NULL, 0}
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
40 };
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
41
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
42 static struct mapping priorities[] = {
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
43 {"emerg", LOG_EMERG}, {"alert", LOG_ALERT}, {"crit", LOG_CRIT},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
44 {"err", LOG_ERR}, {"warning", LOG_WARNING}, {"notice", LOG_NOTICE},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
45 {"info", LOG_INFO}, {"debug", LOG_DEBUG},
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
46 {NULL, 0}
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 };
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
48
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
49 static int lookup(struct mapping *where, char *key)
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 {
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
51 for (; where->key; where++)
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
52 if (!strcasecmp(key, where->key)) return where->value;
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
53
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 return -1;
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
55 }
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
56
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
57 void logger_main(void)
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 {
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
59 int facility = LOG_USER, priority = LOG_NOTICE;
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
60 char *message = NULL;
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
61
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
62 if (toys.optflags & FLAG_p) {
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
63 char *sep = strchr(TT.priority_arg, '.');
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
64
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
65 if (sep) {
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
66 *sep = '\0';
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
67 if ((facility = lookup(facilities, TT.priority_arg)) == -1)
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
68 error_exit("bad facility: %s", TT.priority_arg);
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
69 TT.priority_arg = sep+1;
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
70 }
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
71
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
72 if ((priority = lookup(priorities, TT.priority_arg)) == -1)
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
73 error_exit("bad priority: %s", TT.priority_arg);
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
74 }
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
75
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
76 if (!(toys.optflags & FLAG_t)) {
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
77 struct passwd *pw = getpwuid(geteuid());
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
78
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
79 if (!pw) perror_exit("getpwuid");
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
80 TT.ident = xstrdup(pw->pw_name);
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
81 }
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
82
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
83 if (toys.optc) {
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
84 int length = 0, pos = 0;
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
85
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
86 for (;*toys.optargs; toys.optargs++) {
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
87 length += strlen(*(toys.optargs)) + 1; // plus one for the args spacing
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
88 message = xrealloc(message, length + 1); // another one for the null byte
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
89
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
90 sprintf(message + pos, "%s ", *toys.optargs);
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
91 pos = length;
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
92 }
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
93 } else {
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
94 toybuf[readall(0, toybuf, 4096-1)] = '\0';
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
95 message = toybuf;
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
96 }
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
97
973
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
98 openlog(TT.ident, (toys.optflags & FLAG_s ? LOG_PERROR : 0) , facility);
d1768175ce1d logger: Some cleanup
Felix Janda <felix.janda@posteo.de>
parents: 829
diff changeset
99 syslog(priority, "%s", message);
829
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
100 closelog();
792d510b8fef Logger, by Ilya Kuzmich.
Rob Landley <rob@landley.net>
parents:
diff changeset
101 }