1*cf5a6c84SAndroid Build Coastguard Worker /* logger.c - Log messages.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2013 Ilya Kuzmich <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker *
5*cf5a6c84SAndroid Build Coastguard Worker * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/logger.html
6*cf5a6c84SAndroid Build Coastguard Worker *
7*cf5a6c84SAndroid Build Coastguard Worker * Deviations from posix: specified manner and format, defined implementation.
8*cf5a6c84SAndroid Build Coastguard Worker
9*cf5a6c84SAndroid Build Coastguard Worker USE_LOGGER(NEWTOY(logger, "t:p:s", TOYFLAG_USR|TOYFLAG_BIN))
10*cf5a6c84SAndroid Build Coastguard Worker
11*cf5a6c84SAndroid Build Coastguard Worker config LOGGER
12*cf5a6c84SAndroid Build Coastguard Worker bool "logger"
13*cf5a6c84SAndroid Build Coastguard Worker default y
14*cf5a6c84SAndroid Build Coastguard Worker help
15*cf5a6c84SAndroid Build Coastguard Worker usage: logger [-s] [-t TAG] [-p [FACILITY.]PRIORITY] [MESSAGE...]
16*cf5a6c84SAndroid Build Coastguard Worker
17*cf5a6c84SAndroid Build Coastguard Worker Log message (or stdin) to syslog.
18*cf5a6c84SAndroid Build Coastguard Worker
19*cf5a6c84SAndroid Build Coastguard Worker -s Also write message to stderr
20*cf5a6c84SAndroid Build Coastguard Worker -t Use TAG instead of username to identify message source
21*cf5a6c84SAndroid Build Coastguard Worker -p Specify PRIORITY with optional FACILITY. Default is "user.notice"
22*cf5a6c84SAndroid Build Coastguard Worker */
23*cf5a6c84SAndroid Build Coastguard Worker
24*cf5a6c84SAndroid Build Coastguard Worker #define FOR_logger
25*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
26*cf5a6c84SAndroid Build Coastguard Worker
27*cf5a6c84SAndroid Build Coastguard Worker GLOBALS(
28*cf5a6c84SAndroid Build Coastguard Worker char *p, *t;
29*cf5a6c84SAndroid Build Coastguard Worker
30*cf5a6c84SAndroid Build Coastguard Worker int priority;
31*cf5a6c84SAndroid Build Coastguard Worker )
32*cf5a6c84SAndroid Build Coastguard Worker
33*cf5a6c84SAndroid Build Coastguard Worker // find str in names[], accepting unambiguous short matches
34*cf5a6c84SAndroid Build Coastguard Worker // returns offset into array of match, or -1 if no match
35*cf5a6c84SAndroid Build Coastguard Worker // TODO: move to lib?
arrayfind(char * str,char * names[],int len)36*cf5a6c84SAndroid Build Coastguard Worker static int arrayfind(char *str, char *names[], int len)
37*cf5a6c84SAndroid Build Coastguard Worker {
38*cf5a6c84SAndroid Build Coastguard Worker int j, i, ll = 0, maybe = -1;
39*cf5a6c84SAndroid Build Coastguard Worker
40*cf5a6c84SAndroid Build Coastguard Worker for (j = 0; j<len; j++) for (i=0; ; i++) {
41*cf5a6c84SAndroid Build Coastguard Worker if (!str[i]) {
42*cf5a6c84SAndroid Build Coastguard Worker if (!names[j][i]) return j;
43*cf5a6c84SAndroid Build Coastguard Worker if (i>ll) maybe = j;
44*cf5a6c84SAndroid Build Coastguard Worker else if (i==ll) maybe = -1;
45*cf5a6c84SAndroid Build Coastguard Worker break;
46*cf5a6c84SAndroid Build Coastguard Worker }
47*cf5a6c84SAndroid Build Coastguard Worker if (!names[j][i] || toupper(str[i])!=toupper(names[j][i])) break;
48*cf5a6c84SAndroid Build Coastguard Worker }
49*cf5a6c84SAndroid Build Coastguard Worker
50*cf5a6c84SAndroid Build Coastguard Worker return maybe;
51*cf5a6c84SAndroid Build Coastguard Worker }
52*cf5a6c84SAndroid Build Coastguard Worker
syslog_line(char ** pline,long len)53*cf5a6c84SAndroid Build Coastguard Worker static void syslog_line(char **pline, long len)
54*cf5a6c84SAndroid Build Coastguard Worker {
55*cf5a6c84SAndroid Build Coastguard Worker if (!pline) return;
56*cf5a6c84SAndroid Build Coastguard Worker syslog(TT.priority, "%s", *pline);
57*cf5a6c84SAndroid Build Coastguard Worker }
58*cf5a6c84SAndroid Build Coastguard Worker
logger_main(void)59*cf5a6c84SAndroid Build Coastguard Worker void logger_main(void)
60*cf5a6c84SAndroid Build Coastguard Worker {
61*cf5a6c84SAndroid Build Coastguard Worker int facility = LOG_USER, len = 0;
62*cf5a6c84SAndroid Build Coastguard Worker char *s1, *s2, **arg,
63*cf5a6c84SAndroid Build Coastguard Worker *priorities[] = {"emerg", "alert", "crit", "error", "warning", "notice",
64*cf5a6c84SAndroid Build Coastguard Worker "info", "debug"},
65*cf5a6c84SAndroid Build Coastguard Worker *facilities[] = {"kern", "user", "mail", "daemon", "auth", "syslog",
66*cf5a6c84SAndroid Build Coastguard Worker "lpr", "news", "uucp", "cron", "authpriv", "ftp"};
67*cf5a6c84SAndroid Build Coastguard Worker
68*cf5a6c84SAndroid Build Coastguard Worker if (!TT.t) TT.t = xgetpwuid(geteuid())->pw_name;
69*cf5a6c84SAndroid Build Coastguard Worker TT.priority = LOG_NOTICE;
70*cf5a6c84SAndroid Build Coastguard Worker if (TT.p) {
71*cf5a6c84SAndroid Build Coastguard Worker if (!(s1 = strchr(TT.p, '.'))) s1 = TT.p;
72*cf5a6c84SAndroid Build Coastguard Worker else {
73*cf5a6c84SAndroid Build Coastguard Worker *s1++ = 0;
74*cf5a6c84SAndroid Build Coastguard Worker facility = arrayfind(TT.p, facilities, ARRAY_LEN(facilities));
75*cf5a6c84SAndroid Build Coastguard Worker if (facility<0) {
76*cf5a6c84SAndroid Build Coastguard Worker if (sscanf(TT.p, "local%d", &facility)>0 && !(facility&~7))
77*cf5a6c84SAndroid Build Coastguard Worker facility += 16;
78*cf5a6c84SAndroid Build Coastguard Worker else error_exit("bad facility: %s", TT.p);
79*cf5a6c84SAndroid Build Coastguard Worker }
80*cf5a6c84SAndroid Build Coastguard Worker facility *= 8;
81*cf5a6c84SAndroid Build Coastguard Worker }
82*cf5a6c84SAndroid Build Coastguard Worker
83*cf5a6c84SAndroid Build Coastguard Worker TT.priority = arrayfind(s1, priorities, ARRAY_LEN(priorities));
84*cf5a6c84SAndroid Build Coastguard Worker if (TT.priority<0) error_exit("bad priority: %s", s1);
85*cf5a6c84SAndroid Build Coastguard Worker }
86*cf5a6c84SAndroid Build Coastguard Worker
87*cf5a6c84SAndroid Build Coastguard Worker openlog(TT.t, LOG_PERROR*FLAG(s), facility);
88*cf5a6c84SAndroid Build Coastguard Worker if (toys.optc) {
89*cf5a6c84SAndroid Build Coastguard Worker for (arg = toys.optargs; *arg; arg++) len += strlen(*arg)+1;
90*cf5a6c84SAndroid Build Coastguard Worker s1 = s2 = xmalloc(len);
91*cf5a6c84SAndroid Build Coastguard Worker for (arg = toys.optargs; *arg; arg++) {
92*cf5a6c84SAndroid Build Coastguard Worker if (arg != toys.optargs) *s2++ = ' ';
93*cf5a6c84SAndroid Build Coastguard Worker s2 = stpcpy(s2, *arg);
94*cf5a6c84SAndroid Build Coastguard Worker }
95*cf5a6c84SAndroid Build Coastguard Worker syslog(TT.priority, "%s", s1);
96*cf5a6c84SAndroid Build Coastguard Worker } else do_lines(0, '\n', syslog_line);
97*cf5a6c84SAndroid Build Coastguard Worker closelog();
98*cf5a6c84SAndroid Build Coastguard Worker }
99