diff options
author | djm <djm@openbsd.org> | 2004-01-04 08:30:21 +0000 |
---|---|---|
committer | djm <djm@openbsd.org> | 2004-01-04 08:30:21 +0000 |
commit | ffb9ed4e90b64bb430a8652798f12b2c4baf96b0 (patch) | |
tree | bc664651f454b71ef6ff7e568f44545037b06765 /usr.sbin/syslogc | |
parent | Buffered logging for syslogd. Logs may be stored in memory buffers and (diff) | |
download | wireguard-openbsd-ffb9ed4e90b64bb430a8652798f12b2c4baf96b0.tar.xz wireguard-openbsd-ffb9ed4e90b64bb430a8652798f12b2c4baf96b0.zip |
syslogc - client to read memory buffered logs from syslogd;
manpage nits jmc@, fixes jose@; ok deraadt@
Diffstat (limited to 'usr.sbin/syslogc')
-rw-r--r-- | usr.sbin/syslogc/Makefile | 7 | ||||
-rw-r--r-- | usr.sbin/syslogc/syslogc.8 | 75 | ||||
-rw-r--r-- | usr.sbin/syslogc/syslogc.c | 129 |
3 files changed, 211 insertions, 0 deletions
diff --git a/usr.sbin/syslogc/Makefile b/usr.sbin/syslogc/Makefile new file mode 100644 index 00000000000..e4d7b86bfbc --- /dev/null +++ b/usr.sbin/syslogc/Makefile @@ -0,0 +1,7 @@ +# $OpenBSD: Makefile,v 1.1 2004/01/04 08:30:21 djm Exp $ + +PROG= syslogc +SRCS= syslogc.c +MAN= syslogc.8 + +.include <bsd.prog.mk> diff --git a/usr.sbin/syslogc/syslogc.8 b/usr.sbin/syslogc/syslogc.8 new file mode 100644 index 00000000000..2d8972a50d8 --- /dev/null +++ b/usr.sbin/syslogc/syslogc.8 @@ -0,0 +1,75 @@ +.\" $OpenBSD: syslogc.8,v 1.1 2004/01/04 08:30:21 djm Exp $ +.\" +.\" Copyright (c) 2004 Damien Miller +.\" +.\" Permission to use, copy, modify, and distribute this software for any +.\" purpose with or without fee is hereby granted, provided that the above +.\" copyright notice and this permission notice appear in all copies. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +.Dd November 2, 2003 +.Dt SYSLOGC 8 +.Os +.Sh NAME +.Nm syslogc +.Nd collect messages from syslog memory buffer +.Sh SYNOPSIS +.Nm syslogc +.Op Fl Ccq +.Op Fl s Ar reporting_socket +.Ar logname +.Nm syslogc +.Op Fl Cc +.Ar logname +.Nm syslogc +.Fl q +.Sh DESCRIPTION +.Nm +collects messages from the +.Xr syslogd 8 +memory buffer specified by the +.Ar logname +argument. +.Pp +For +.Nm +to work, +.Xr syslogd 8 +must be configured with one or more memory buffer logs (see +.Xr syslog.conf 5 +for details) and have a reporting socket location specified on the +commandline (using the +.Fl s +option to +.Xr syslogd 8 ) . +.Pp +By default, +.Nm +will query the specified log and return it to standard output. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl C +Request that the log buffer be cleared without reading it. +.It Fl c +Request that the log buffer be cleared once it has been read. +.It Fl q +Request a list of available logs. +.It Fl s Ar reporting_socket +Specify alternate reporting socket location (the default is +.Pa /var/run/syslogd.sock ) . +.El +.Sh SEE ALSO +.Xr syslog 3 , +.Xr syslog.conf 5 +.Sh HISTORY +The +.Nm +command first appeared in +.Ox 3.5 . diff --git a/usr.sbin/syslogc/syslogc.c b/usr.sbin/syslogc/syslogc.c new file mode 100644 index 00000000000..41d28093292 --- /dev/null +++ b/usr.sbin/syslogc/syslogc.c @@ -0,0 +1,129 @@ +/* $OpenBSD: syslogc.c,v 1.1 2004/01/04 08:30:21 djm Exp $ */ + +/* + * Copyright (c) 2004 Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <sys/socket.h> +#include <sys/un.h> + +#include <err.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define DEFAULT_CTLSOCK "/var/run/syslogd.sock" + +#define MAX_MEMBUF_NAME 64 /* Max length of membuf log name */ +struct ctl_cmd { +#define CMD_READ 1 /* Read out log */ +#define CMD_READ_CLEAR 2 /* Read and clear log */ +#define CMD_CLEAR 3 /* Clear log */ +#define CMD_LIST 4 /* List available logs */ + int cmd; + char logname[MAX_MEMBUF_NAME]; +}; + +static void +usage(void) +{ + extern char *__progname; + + fprintf(stderr, "Usage: %s [-Ccq] [-s ctlsock] logname\n", __progname); + exit(1); +} + +int +main(int argc, char **argv) +{ + const char *ctlsock_path; + char buf[8192]; + struct sockaddr_un ctl; + socklen_t ctllen; + int ctlsock, ch; + FILE *ctlf; + extern char *optarg; + extern int optind; + struct ctl_cmd cc; + + memset(&cc, '\0', sizeof(cc)); + + ctlsock_path = DEFAULT_CTLSOCK; + while ((ch = getopt(argc, argv, "Cchqs:")) != -1) { + switch (ch) { + case 'h': + usage(); + break; + case 'q': + cc.cmd = CMD_LIST; + break; + case 'c': + cc.cmd = CMD_READ_CLEAR; + break; + case 'C': + cc.cmd = CMD_CLEAR; + break; + case 's': + ctlsock_path = optarg; + break; + default: + fprintf(stderr, "Invalid commandline option.\n"); + usage(); + break; + } + } + + if (cc.cmd == 0) + cc.cmd = CMD_READ; + + if ((cc.cmd != CMD_LIST && optind != argc - 1) || + (cc.cmd == CMD_LIST && optind != argc)) + usage(); + + if (cc.cmd != CMD_LIST) { + if (strlcpy(cc.logname, argv[optind], sizeof(cc.logname)) > + sizeof(cc.logname)) + errx(1, "Specified log name is too long"); + } + + strlcpy(ctl.sun_path, ctlsock_path, sizeof(ctl.sun_path)); + ctl.sun_path[sizeof(ctl.sun_path) - 1] = '\0'; + ctl.sun_family = AF_UNIX; + + if ((ctlsock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) + err(1, "ctl socket() error"); + if (connect(ctlsock, (struct sockaddr*)&ctl, sizeof(ctl)) == -1) + err(1, "ctl connect(\"%s\") error", ctl.sun_path); + if ((ctlf = fdopen(ctlsock, "r+")) == NULL) + err(1, "fdopen"); + /* Send command */ + if (fwrite(&cc, sizeof(cc), 1, ctlf) <= 0) + err(1, "fwrite"); + + fflush(ctlf); + setlinebuf(ctlf); + + /* Write out reply */ + while((fgets(buf, sizeof(buf), ctlf)) != NULL) + fputs(buf, stdout); + + fclose(ctlf); + close(ctlsock); + + exit(0); +} |