[Toybox] Add new toy - logger
Georgi Chorbadzhiyski
gf at unixsol.org
Fri Mar 9 06:24:18 PST 2012
Attached is a new toy - logger.
--
Georgi Chorbadzhiyski
http://georgi.unixsol.org/
-------------- next part --------------
/* 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();
}
More information about the Toybox
mailing list