blob: 16262c9f447a30b7fc671afd46fe1f152bcc4c57 [file] [log] [blame]
/* logger.c - Log messages.
*
* Copyright 2013 Ilya Kuzmich <ilya.kuzmich@gmail.com>
*
* See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/logger.html
*
* Deviations from posix: specified manner and format, defined implementation.
USE_LOGGER(NEWTOY(logger, "st:p:", TOYFLAG_USR|TOYFLAG_BIN))
config LOGGER
bool "logger"
default y
help
usage: logger [-s] [-t TAG] [-p [FACILITY.]PRIORITY] [message...]
Log message (or stdin) to syslog.
-s Also write message to stderr
-t Use TAG instead of username to identify message source
-p Specify PRIORITY with optional FACILITY. Default is "user.notice"
*/
#define FOR_logger
#include "toys.h"
GLOBALS(
char *priority;
char *ident;
)
void logger_main(void)
{
int facility = LOG_USER, priority = LOG_NOTICE, len;
char *s1, *s2, **arg;
CODE *code;
if (!TT.ident) TT.ident = xstrdup(xgetpwuid(geteuid())->pw_name);
if (toys.optflags & FLAG_p) {
if (!(s1 = strchr(TT.priority, '.'))) s1 = TT.priority;
else {
*s1++ = 0;
for (code = facilitynames; code->c_name; code++)
if (!strcasecmp(TT.priority, code->c_name)) break;
if (!code->c_name) error_exit("bad facility: %s", TT.priority);
facility = code->c_val;
}
for (code = prioritynames; code->c_name; code++)
if (!strcasecmp(s1, code->c_name)) break;
if (!code->c_name) error_exit("bad priority: %s", s1);
}
if (toys.optc) {
for (len = 0, arg = toys.optargs; *arg; arg++) len += strlen(*arg)+1;
s1 = s2 = xmalloc(len);
for (arg = toys.optargs; *arg; arg++) {
if (arg != toys.optargs) *s2++ = ' ';
s2 = stpcpy(s2, *arg);
}
} else {
toybuf[readall(0, toybuf, sizeof(toybuf)-1)] = 0;
s1 = toybuf;
}
openlog(TT.ident, LOG_PERROR*!!(toys.optflags&FLAG_s), facility);
syslog(priority, "%s", s1);
closelog();
}