aboutsummaryrefslogtreecommitdiff
path: root/toys/posix
diff options
context:
space:
mode:
Diffstat (limited to 'toys/posix')
-rw-r--r--toys/posix/logger.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/toys/posix/logger.c b/toys/posix/logger.c
new file mode 100644
index 00000000..16262c9f
--- /dev/null
+++ b/toys/posix/logger.c
@@ -0,0 +1,70 @@
+/* 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();
+}