Date: Mon, 10 Jul 2000 14:01:24 +0100 (IST) From: nick@iol.ie To: FreeBSD-gnats-submit@freebsd.org Subject: bin/19821: extra "-h" option for logger(1) to log to a remote host Message-ID: <200007101301.OAA24927@pancake.earlsfort.iol.ie>
next in thread | raw e-mail | index | archive | help
>Number: 19821
>Category: bin
>Synopsis: logger(1) does not log messages to a remote host.
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Mon Jul 10 06:10:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: Nick Hilliard
>Release: FreeBSD 2.2.6-RELEASE i386 and onwards
>Organization:
Ireland On-Line
>Environment:
(not relevant)
>Description:
There are a bunch of circumstances where the ability to send
syslog messages to a remote host is convenience. This patch
adds a new option to logger(1), "-h", which specifies the host
to send the syslog message to.
>How-To-Repeat:
(not relevant)
>Fix:
Apply the following patch.
--- logger.c.old Wed Jun 30 12:04:32 1999
+++ logger.c Wed Jun 30 12:37:40 1999
@@ -42,9 +42,15 @@
static char sccsid[] = "@(#)logger.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
- "$Id: logger.c,v 1.2.2.3 1997/09/15 08:32:18 jkh Exp $";
+ "$Id: logger.c,v 1.2 1998/01/29 17:28:54 nick Exp $";
#endif /* not lint */
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <netdb.h>
+
#include <ctype.h>
#include <err.h>
#include <stdio.h>
@@ -57,8 +63,11 @@
int decode __P((char *, CODE *));
int pencode __P((char *));
+void logmessage __P((int, char *, char *));
static void usage __P((void));
+#define MAXBUF 1024
+
/*
* logger -- read and log utility
*
@@ -71,13 +80,13 @@
char *argv[];
{
int ch, logflags, pri;
- char *tag, buf[1024];
+ char *tag, *host, buf[MAXBUF];
- tag = NULL;
+ host = tag = NULL;
pri = LOG_NOTICE;
logflags = 0;
unsetenv("TZ");
- while ((ch = getopt(argc, argv, "f:ip:st:")) != -1)
+ while ((ch = getopt(argc, argv, "f:h:ip:st:")) != -1)
switch((char)ch) {
case 'f': /* file to log */
if (freopen(optarg, "r", stdin) == NULL)
@@ -95,6 +104,9 @@
case 't': /* tag */
tag = optarg;
break;
+ case 'h':
+ host = optarg; /* hostname to deliver to */
+ break;
case '?':
default:
usage();
@@ -114,11 +126,11 @@
for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) {
len = strlen(*argv);
if (p + len > endp && p > buf) {
- syslog(pri, "%s", buf);
+ logmessage(pri, host, buf);
p = buf;
}
if (len > sizeof(buf) - 1)
- syslog(pri, "%s", *argv++);
+ logmessage(pri, host, *argv++);
else {
if (p != buf)
*p++ = ' ';
@@ -127,14 +139,76 @@
}
}
if (p != buf)
- syslog(pri, "%s", buf);
+ logmessage(pri, host, buf);
} else
while (fgets(buf, sizeof(buf), stdin) != NULL)
- syslog(pri, "%s", buf);
+ logmessage(pri, host, buf);
exit(0);
}
/*
+ * Send the message to syslog, either on the local host, or on a remote host
+ */
+void
+logmessage(int pri, char *host, char *buf)
+{
+ static int sock = -1;
+ static struct sockaddr_in sin;
+
+ struct msghdr msg;
+ struct iovec iov[1];
+ ssize_t size;
+ struct in_addr in;
+ struct servent *sp;
+ struct hostent *hp = NULL;
+ char line[MAXBUF + sizeof("<nnnnnnnnnnn>")]; /* int is always < 11 chars */
+
+ if (host == NULL) {
+ syslog(pri, "%s", buf);
+ return;
+ }
+
+ if (sock == -1) { /* set up socket stuff */
+ if ((sp = getservbyname("syslog", "udp")) == NULL)
+ warnx ("syslog/udp: unknown service"); /* not fatal */
+
+ /* resolve hostname */
+ if (!(inet_aton (host, &in)) && !(hp = gethostbyname(host))) {
+ errx (1, "unknown host: %s", host);
+ }
+ if (hp != NULL)
+ memcpy ((void *)&in.s_addr, hp->h_addr,
+ sizeof(struct in_addr));
+
+ /* set up struct sockaddr_in */
+ sin.sin_family = AF_INET;
+ sin.sin_port = (sp == NULL ? 514 : sp->s_port);
+ memcpy ((void *)&sin.sin_addr, (void *)&in.s_addr,
+ sizeof(struct in_addr));
+
+ sock = socket (PF_INET, SOCK_DGRAM, 0);
+ if (sock < 0)
+ errx(1, "socket");
+ }
+
+ msg.msg_name = (void *)&sin;
+ msg.msg_namelen = sizeof sin;
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 0;
+ msg.msg_control = 0;
+ msg.msg_controllen = 0;
+ msg.msg_flags = 0;
+
+ snprintf (line, sizeof (line) - 1, "<%d>%s", pri, buf);
+
+ iov[msg.msg_iovlen].iov_base = line;
+ iov[msg.msg_iovlen++].iov_len = strlen(line);
+
+ if (sendmsg (sock, &msg, 0) < strlen(line))
+ warnx ("sendmsg");
+}
+
+/*
* Decode a symbolic name to a numeric value
*/
int
@@ -183,6 +257,6 @@
usage()
{
(void)fprintf(stderr,
- "usage: logger [-is] [-f file] [-p pri] [-t tag] [message ...]\n");
+ "usage: logger [-is] [-f file] [-p pri] [-t tag] [-h host] [message ...]\n");
exit(1);
}
--- logger.1.old Wed Jun 30 12:38:27 1999
+++ logger.1 Wed Jun 30 12:42:48 1999
@@ -43,6 +43,7 @@
.Op Fl f Ar file
.Op Fl p Ar pri
.Op Fl t Ar tag
+.Op Fl h Ar host
.Op Ar message ...
.Sh DESCRIPTION
.Nm Logger
@@ -73,6 +74,10 @@
.It Fl t Ar tag
Mark every line in the log with the specified
.Ar tag .
+.It Fl h Ar host
+Send the message to the remote system
+.Ar host
+instead of logging it locally.
.It Ar message
Write the message to log; if not specified, and the
.Fl f
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200007101301.OAA24927>
