[Toybox] [PATCH 6/8] Add new toy - logger

Georgi Chorbadzhiyski gf at unixsol.org
Tue Apr 24 02:20:49 PDT 2012


---
 toys/logger.c |  161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 161 insertions(+), 0 deletions(-)
 create mode 100644 toys/logger.c

diff --git a/toys/logger.c b/toys/logger.c
new file mode 100644
index 0000000..dfac491
--- /dev/null
+++ b/toys/logger.c
@@ -0,0 +1,161 @@
+/* vi: set sw=4 ts=4:
+ *
+ * logger.c - log messages.
+ *
+ * Copyright 2012 Georgi Chorbadzhiyski <georgi at unixsol.org>
+ *
+ * See http://www.opengroup.org/onlinepubs/009695399/utilities/logger.html
+ *
+
+USE_LOGGER(NEWTOY(logger, "p:t:f:is", TOYFLAG_BIN))
+
+config LOGGER
+	bool "logger"
+	default y
+	help
+	  usage: logger [-is] [-p prio] [-t tag] [-f file] message
+
+	  Logger adds entries to system log.
+
+	  -i	Log program PID along with program name.
+	  -s	Log messages to stderr, as well as the system log.
+	  -p	Specify priority. The format is facility.level
+	  -t	Set program name.
+	  -f	Log each line from file.
+*/
+
+#include "toys.h"
+
+#include <syslog.h>
+
+#define FLAG_s	1
+#define FLAG_i	2
+
+DEFINE_GLOBALS(
+	char *file;
+	char *tag;
+	char *prio;
+	int facility;
+	int level;
+)
+
+#define TT this.logger
+
+struct syslog_txt {
+	const char *text;
+	int value;
+};
+
+static struct syslog_txt syslog_facilities[] = {
+	{ "auth",		LOG_AUTH },
+	{ "security",	LOG_AUTH },
+	{ "authpriv",	LOG_AUTHPRIV },
+	{ "cron",		LOG_CRON },
+	{ "daemon",		LOG_DAEMON },
+	{ "ftp",		LOG_FTP },
+	{ "kern",		LOG_KERN },
+	{ "local0",		LOG_LOCAL0 },
+	{ "local1",		LOG_LOCAL1 },
+	{ "local2",		LOG_LOCAL2 },
+	{ "local3",		LOG_LOCAL3 },
+	{ "local4",		LOG_LOCAL4 },
+	{ "local5",		LOG_LOCAL5 },
+	{ "local6",		LOG_LOCAL6 },
+	{ "local7",		LOG_LOCAL7 },
+	{ "lpr",		LOG_LPR },
+	{ "mail",		LOG_MAIL },
+	{ "news",		LOG_NEWS },
+	{ "syslog",		LOG_SYSLOG },
+	{ "user",		LOG_USER },
+	{ "uucp",		LOG_UUCP },
+	{ NULL, 0 },
+};
+
+static struct syslog_txt syslog_levels[] = {
+	{ "emerg",		LOG_EMERG },
+	{ "panic",		LOG_EMERG },
+	{ "alert",		LOG_ALERT },
+	{ "crit",		LOG_CRIT },
+	{ "err",		LOG_ERR },
+	{ "error",		LOG_ERR },
+	{ "warn",		LOG_WARNING },
+	{ "warning",	LOG_WARNING },
+	{ "notice",		LOG_NOTICE },
+	{ "info",		LOG_INFO },
+	{ "debug",		LOG_DEBUG },
+	{ NULL, 0 }
+};
+
+static void parse_priority() {
+	int i;
+	struct syslog_txt *opt;
+	char *facility_txt = TT.prio;
+	char *level_txt = strchr(facility_txt, '.');
+
+	if (level_txt) {
+		level_txt[0] = '\0';
+		level_txt++;
+	}
+
+	for (i=0 ; ; i++) {
+		opt = &syslog_facilities[i];
+		if (!opt->text) break;
+		if (strcmp(facility_txt, opt->text) == 0) {
+			TT.facility = opt->value;
+			break;
+		}
+	}
+
+	if (level_txt) {
+		for (i=0 ; ; i++) {
+			opt = &syslog_levels[i];
+			if (!opt->text) break;
+			if (strcmp(level_txt, opt->text) == 0) {
+				TT.level = opt->value;
+				break;
+			}
+		}
+	}
+}
+
+void logger_main(void)
+{
+	char **arg;
+	int log_opts = 0;
+
+	TT.facility = LOG_USER;
+	TT.level = LOG_INFO;
+
+	if (TT.prio)
+		parse_priority();
+
+	if (!TT.tag)
+		TT.tag = "logger";
+
+	if (toys.optflags & FLAG_s)
+		log_opts |= LOG_PERROR;
+
+	if (toys.optflags & FLAG_i)
+		log_opts |= LOG_PID;
+
+	openlog(TT.tag, log_opts, TT.facility);
+
+	if (TT.file || !*toys.optargs) {
+		int f = 1; // stdin
+		char *line;
+		if (TT.file) {
+			f = open(TT.file, O_RDONLY);
+			if (f < 0)
+				perror_exit(TT.file);
+		}
+		while ((line = get_line(f))) {
+			syslog(TT.level, "%s", line);
+		}
+	} else {
+		for (arg = toys.optargs; *arg; arg++) {
+			syslog(TT.level, "%s", *arg);
+		}
+	}
+
+	closelog();
+}
-- 
1.7.5.1



More information about the Toybox mailing list