1/* logger.c - Log messages.
2 *
3 * Copyright 2013 Ilya Kuzmich <ilya.kuzmich@gmail.com>
4 *
5 * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/logger.html
6
7USE_LOGGER(NEWTOY(logger, "st:p:", TOYFLAG_USR|TOYFLAG_BIN))
8
9config LOGGER
10  bool "logger"
11  depends on SYSLOGD
12  default n
13  help
14    usage: logger [-s] [-t tag] [-p [facility.]priority] [message]
15
16    Log message (or stdin) to syslog.
17*/
18
19#define FOR_logger
20#include "toys.h"
21
22GLOBALS(
23  char *priority_arg;
24  char *ident;
25)
26
27extern int logger_lookup(int where, char *key);
28
29void logger_main(void)
30{
31  int facility = LOG_USER, priority = LOG_NOTICE;
32  char *message = NULL;
33
34  if (toys.optflags & FLAG_p) {
35    char *sep = strchr(TT.priority_arg, '.');
36
37    if (sep) {
38      *sep = '\0';
39      if ((facility = logger_lookup(0, TT.priority_arg)) == -1)
40        error_exit("bad facility: %s", TT.priority_arg);
41      TT.priority_arg = sep+1;
42    }
43
44    if ((priority = logger_lookup(1, TT.priority_arg)) == -1)
45      error_exit("bad priority: %s", TT.priority_arg);
46  }
47
48  if (!(toys.optflags & FLAG_t)) {
49    struct passwd *pw = getpwuid(geteuid());
50
51    if (!pw) perror_exit("getpwuid");
52    TT.ident = xstrdup(pw->pw_name);
53  }
54
55  if (toys.optc) {
56    int length = 0, pos = 0;
57
58    for (;*toys.optargs; toys.optargs++) {
59      length += strlen(*(toys.optargs)) + 1; // plus one for the args spacing
60      message = xrealloc(message, length + 1); // another one for the null byte
61
62      sprintf(message + pos, "%s ", *toys.optargs);
63      pos = length;
64    }
65  } else {
66    toybuf[readall(0, toybuf, 4096-1)] = '\0';
67    message = toybuf;
68  }
69
70  openlog(TT.ident, (toys.optflags & FLAG_s ? LOG_PERROR : 0) , facility);
71  syslog(priority, "%s", message);
72  closelog();
73}
74