mirror of
https://github.com/pygos/usyslog.git
synced 2024-11-16 18:07:09 +01:00
Import syslog utility program
Signed-off-by: David Oberhollenzer <david.oberhollenzer@tele2.at>
This commit is contained in:
parent
49f52b1571
commit
200daf7dbb
6 changed files with 260 additions and 4 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -17,3 +17,4 @@ config.h
|
||||||
*~
|
*~
|
||||||
klogd
|
klogd
|
||||||
usyslogd
|
usyslogd
|
||||||
|
syslog
|
||||||
|
|
|
@ -5,7 +5,9 @@ AM_CFLAGS = $(WARN_CFLAGS)
|
||||||
|
|
||||||
usyslogd_SOURCES = syslogd.c syslogd.h proto.c logfile.c mksock.c protomap.c
|
usyslogd_SOURCES = syslogd.c syslogd.h proto.c logfile.c mksock.c protomap.c
|
||||||
klogd_SOURCES = klogd.c
|
klogd_SOURCES = klogd.c
|
||||||
|
syslog_SOURCES = syslog.c protomap.c
|
||||||
|
|
||||||
bin_PROGRAMS =
|
dist_man1_MANS = syslog.1
|
||||||
|
bin_PROGRAMS = syslog
|
||||||
sbin_PROGRAMS = usyslogd klogd
|
sbin_PROGRAMS = usyslogd klogd
|
||||||
EXTRA_DIST = LICENSE
|
EXTRA_DIST = LICENSE
|
||||||
|
|
24
protomap.c
24
protomap.c
|
@ -1,6 +1,8 @@
|
||||||
/* SPDX-License-Identifier: ISC */
|
/* SPDX-License-Identifier: ISC */
|
||||||
#include "syslogd.h"
|
#include "syslogd.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
int id;
|
int id;
|
||||||
|
@ -54,12 +56,30 @@ static const char *enum_to_name(const enum_map_t *map, int id)
|
||||||
return map->name;
|
return map->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int enum_by_name(const enum_map_t *map, const char *name)
|
||||||
|
{
|
||||||
|
while (map->name != NULL && strcmp(map->name, name) != 0)
|
||||||
|
++map;
|
||||||
|
|
||||||
|
return map->name == NULL ? -1 : map->id;
|
||||||
|
}
|
||||||
|
|
||||||
const char *level_id_to_string(int level)
|
const char *level_id_to_string(int level)
|
||||||
{
|
{
|
||||||
return enum_to_name(levels, level);
|
return enum_to_name(levels, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *facility_id_to_string(int level)
|
const char *facility_id_to_string(int id)
|
||||||
{
|
{
|
||||||
return enum_to_name(facilities, level);
|
return enum_to_name(facilities, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int level_id_from_string(const char *level)
|
||||||
|
{
|
||||||
|
return enum_by_name(levels, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
int facility_id_from_string(const char *fac)
|
||||||
|
{
|
||||||
|
return enum_by_name(facilities, fac);
|
||||||
}
|
}
|
||||||
|
|
45
syslog.1
Normal file
45
syslog.1
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
.TH syslog 1 "August 2018" "usyslog"
|
||||||
|
.SH NAME
|
||||||
|
syslog \- send a log message to the syslog daemon
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B syslog
|
||||||
|
[options] message..
|
||||||
|
.SH DESCRIPTION
|
||||||
|
The syslog command concatenates all non option arguments to a single message
|
||||||
|
that it sends to the syslog daemon.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.BR \-h , " \-\-help"
|
||||||
|
Display a brief help text, a list of available facilities, log levels, all the
|
||||||
|
default setting and exit.
|
||||||
|
.TP
|
||||||
|
.BR \-V , " \-\-version"
|
||||||
|
Print version information and exit.
|
||||||
|
.TP
|
||||||
|
.BR \-f , " \-\-facility " \fIfacility\fP
|
||||||
|
Logging facility name or numeric identifier. Use
|
||||||
|
.B \-\-help
|
||||||
|
to get a list of all available facility names.
|
||||||
|
.TP
|
||||||
|
.BR \-l , " \-\-level " \fIlevel\fP
|
||||||
|
A log level number from 0 to 8 with 8 being most severe, or a name from
|
||||||
|
.I debug
|
||||||
|
to
|
||||||
|
.I emergency.
|
||||||
|
Use
|
||||||
|
.B \-\-help
|
||||||
|
to get a list of all available log level names.
|
||||||
|
.TP
|
||||||
|
.BR \-i , " \-\-ident " \fIname\fP
|
||||||
|
Program name to specify to syslog. If not set, "(shell)" is used as sensible
|
||||||
|
default to indicate that the message came from the command line.
|
||||||
|
.TP
|
||||||
|
.BR \-c , " \-\-console"
|
||||||
|
Try to write directly to the console if opening the syslog socket fails.
|
||||||
|
.SH AVAILABILITY
|
||||||
|
This program is part of the Pygos init system.
|
||||||
|
.SH COPYRIGHT
|
||||||
|
Copyright \(co 2018 David Oberhollenzer
|
||||||
|
.br
|
||||||
|
This is free software: you are free to change and redistribute it.
|
||||||
|
There is NO WARRANTY, to the extent permitted by law.
|
184
syslog.c
Normal file
184
syslog.c
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
/* SPDX-License-Identifier: ISC */
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#include "syslogd.h"
|
||||||
|
|
||||||
|
static int facility = 1;
|
||||||
|
static int level = LOG_INFO;
|
||||||
|
static int flags = LOG_NDELAY | LOG_NOWAIT;
|
||||||
|
static const char *ident = "(shell)";
|
||||||
|
|
||||||
|
static const struct option options[] = {
|
||||||
|
{ "help", no_argument, NULL, 'h' },
|
||||||
|
{ "version", no_argument, NULL, 'V' },
|
||||||
|
{ "console", required_argument, NULL, 'c' },
|
||||||
|
{ "facility", required_argument, NULL, 'f' },
|
||||||
|
{ "level", required_argument, NULL, 'l' },
|
||||||
|
{ "ident", required_argument, NULL, 'i' },
|
||||||
|
{ NULL, 0, NULL, 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *shortopt = "hVcf:l:i:";
|
||||||
|
|
||||||
|
static const char *helptext =
|
||||||
|
"Usage: syslog [OPTION]... [STRING]...\n\n"
|
||||||
|
"Concatenate the given STRINGs and send a log message to the syslog daemon.\n"
|
||||||
|
"\n"
|
||||||
|
"The following OPTIONSs can be used:\n"
|
||||||
|
" -f, --facility <facility> Logging facilty name or numeric identifier.\n"
|
||||||
|
" -l, --level <level> Log level name or numeric identifier.\n"
|
||||||
|
" -i, --ident <name> Program name for log syslog message.\n"
|
||||||
|
" Default is \"%s\".\n\n"
|
||||||
|
" -c, --console Write to the console if opening the syslog\n"
|
||||||
|
" socket fails.\n\n"
|
||||||
|
" -h, --help Print this help text and exit\n"
|
||||||
|
" -V, --version Print version information and exit\n\n";
|
||||||
|
|
||||||
|
static const char *version_string =
|
||||||
|
"syslog (usyslog) " PACKAGE_VERSION "\n"
|
||||||
|
"Copyright (C) 2018 David Oberhollenzer\n\n"
|
||||||
|
"This is free software: you are free to change and redistribute it.\n"
|
||||||
|
"There is NO WARRANTY, to the extent permitted by law.\n";
|
||||||
|
|
||||||
|
static void usage(int status)
|
||||||
|
{
|
||||||
|
const char *str;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (status != EXIT_SUCCESS) {
|
||||||
|
fputs("Try `syslog --help' for more information\n", stderr);
|
||||||
|
} else {
|
||||||
|
printf(helptext, ident);
|
||||||
|
|
||||||
|
fputs("The following values can be used for --level:\n",
|
||||||
|
stdout);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while ((str = level_id_to_string(i)) != NULL) {
|
||||||
|
printf(" %s (=%d)%s\n", str, i,
|
||||||
|
i == level ? ", set as default" : "");
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
|
||||||
|
fputs("\nThe following values can be used for --facility:\n",
|
||||||
|
stdout);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while ((str = facility_id_to_string(i)) != NULL) {
|
||||||
|
printf(" %s (=%d)%s\n", str, i,
|
||||||
|
i == facility ? ", set as default" : "");
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int readint(const char *str)
|
||||||
|
{
|
||||||
|
int x = 0;
|
||||||
|
|
||||||
|
if (!isdigit(*str))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
while (isdigit(*str))
|
||||||
|
x = x * 10 + (*(str++)) - '0';
|
||||||
|
|
||||||
|
return (*str == '\0') ? x : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void process_options(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
c = getopt_long(argc, argv, shortopt, options, NULL);
|
||||||
|
if (c == -1)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case 'f':
|
||||||
|
facility = readint(optarg);
|
||||||
|
if (facility >= 0)
|
||||||
|
break;
|
||||||
|
facility = facility_id_from_string(optarg);
|
||||||
|
if (facility < 0) {
|
||||||
|
fprintf(stderr, "Unknown facility name '%s'\n",
|
||||||
|
optarg);
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
level = readint(optarg);
|
||||||
|
if (level >= 0)
|
||||||
|
break;
|
||||||
|
level = level_id_from_string(optarg);
|
||||||
|
if (level < 0) {
|
||||||
|
fprintf(stderr, "Unknown log level '%s'\n",
|
||||||
|
optarg);
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'i':
|
||||||
|
ident = optarg;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
flags |= LOG_CONS;
|
||||||
|
break;
|
||||||
|
case 'V':
|
||||||
|
fputs(version_string, stdout);
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
usage(EXIT_SUCCESS);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
size_t len = 0;
|
||||||
|
char *str;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
process_options(argc, argv);
|
||||||
|
|
||||||
|
if (optind >= argc) {
|
||||||
|
fputs("Error: no log string provided.\n", stderr);
|
||||||
|
usage(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = optind; i < argc; ++i)
|
||||||
|
len += strlen(argv[i]);
|
||||||
|
|
||||||
|
len += argc - optind - 1;
|
||||||
|
|
||||||
|
str = calloc(1, len + 1);
|
||||||
|
if (str == NULL) {
|
||||||
|
fputs("syslog: out of memory\n", stderr);
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = optind; i < argc; ++i) {
|
||||||
|
if (i > optind)
|
||||||
|
strcat(str, " ");
|
||||||
|
strcat(str, argv[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
openlog(ident, flags, facility << 3);
|
||||||
|
syslog(level, "%s", str);
|
||||||
|
closelog();
|
||||||
|
|
||||||
|
free(str);
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
}
|
|
@ -76,6 +76,10 @@ int mksock(const char *path);
|
||||||
|
|
||||||
const char *level_id_to_string(int level);
|
const char *level_id_to_string(int level);
|
||||||
|
|
||||||
const char *facility_id_to_string(int level);
|
const char *facility_id_to_string(int id);
|
||||||
|
|
||||||
|
int level_id_from_string(const char *level);
|
||||||
|
|
||||||
|
int facility_id_from_string(const char *fac);
|
||||||
|
|
||||||
#endif /* LOGFILE_H */
|
#endif /* LOGFILE_H */
|
||||||
|
|
Loading…
Reference in a new issue