Date: Fri, 23 Apr 1999 13:09:02 -0400 (EDT) From: Mikhail Teterin <mi@aldan.algebra.com> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/11294: direct logging to other hosts (no local syslogd) Message-ID: <199904231709.NAA00535@rtfm.newton>
index | next in thread | raw e-mail
>Number: 11294
>Category: bin
>Synopsis: direct logging to other hosts (no local syslogd)
>Confidential: no
>Severity: non-critical
>Priority: medium
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Fri Apr 23 10:10:01 PDT 1999
>Closed-Date:
>Last-Modified:
>Originator: Mikhail Teterin
>Release: FreeBSD 3.1-STABLE i386
>Organization:
Virtual Estates, Inc,
>Environment:
>Description:
Currently, there is no easy way to have a working logging
functionality without syslogd running on the local machine.
Which may require some more resources on a machine sends
everything out to a log server anyway.
Also, a user may want to log something on another machine
without accessing the local /etc/syslog.conf
The patches below add two more calls to the syslog(3) family
and add the `-h' option to logger(1) to take advantage of the
feature:
logger -h logserver "This is a test"
>How-To-Repeat:
>Fix:
This patches are against the latest -stable:
--- usr.bin/logger/logger.c.orig Tue Jul 22 03:33:48 1997
+++ usr.bin/logger/logger.c Mon Apr 12 00:40:33 1999
@@ -72,11 +72,12 @@
{
int ch, logflags, pri;
- char *tag, buf[1024];
+ char *tag, *host, buf[1024];
tag = NULL;
+ host = NULL;
pri = LOG_NOTICE;
logflags = 0;
unsetenv("TZ");
- while ((ch = getopt(argc, argv, "f:ip:st:")) != -1)
+ while ((ch = getopt(argc, argv, "f:ip:st:h:")) != -1)
switch((char)ch) {
case 'f': /* file to log */
@@ -96,4 +97,7 @@
tag = optarg;
break;
+ case 'h':
+ host = optarg;
+ break;
case '?':
default:
@@ -128,8 +132,8 @@
}
if (p != buf)
- syslog(pri, "%s", buf);
+ syslogh(pri, host, "%s", buf);
} else
while (fgets(buf, sizeof(buf), stdin) != NULL)
- syslog(pri, "%s", buf);
+ syslogh(pri, host, "%s", buf);
exit(0);
}
--- usr.bin/logger/logger.1.orig Tue Jul 22 03:33:47 1997
+++ usr.bin/logger/logger.1 Mon Apr 12 01:01:33 1999
@@ -72,2 +72,5 @@
The default is ``user.notice.''
+.It Fl h Ar host
+Send the message directly to the specified host. This allows you to use
+logger on a machine with no syslogd running, for example.
.It Fl t Ar tag
--- lib/libc/gen/syslog.3.orig Fri Jun 5 05:20:19 1998
+++ lib/libc/gen/syslog.3 Mon Apr 12 01:12:57 1999
@@ -39,2 +39,4 @@
.Nm vsyslog ,
+.Nm syslogh ,
+.Nm vsyslogh ,
.Nm openlog ,
@@ -51,2 +53,6 @@
.Ft void
+.Fn syslogh "int priority" "const char *host" "const char *message" "..."
+.Ft void
+.Fn vsyslogh "int priority" "const char *host" "const char *message" "va_list args"
+.Ft void
.Fn openlog "const char *ident" "int logopt" "int facility"
@@ -84,2 +90,13 @@
.Xr varargs 3 .
+.Pp
+.Fn syslogh
+and
+.Fn vsyslogh
+send the message directly to the specified
+.Fa host ,
+allowing you to bypass
+the local syslog-daemon. If the sending fails, it will still be attempted
+to log the message locally, as if
+.Fa host
+was NULL.
.Pp
--- /usr/src/lib/libc/gen/syslog.c.orig Fri May 1 15:41:12 1998
+++ /usr/src/lib/libc/gen/syslog.c Mon Apr 12 00:46:59 1999
@@ -47,2 +47,3 @@
#include <netdb.h>
+#include <netinet/in.h>
@@ -108,25 +109,38 @@
-/*
- * syslog, vsyslog --
- * print message on log file; output is intended for syslogd(8).
- */
-void
-#if __STDC__
-syslog(int pri, const char *fmt, ...)
-#else
-syslog(pri, fmt, va_alist)
- int pri;
- char *fmt;
- va_dcl
-#endif
+static const char * logtohost(host, tbuf, cnt)
+ const char *host;
+ char *tbuf;
+ int cnt;
{
- va_list ap;
+ struct hostent *hp;
+ static int finet;
+ static struct sockaddr_in addr;
+
+ /* initialize */
+ if(!finet) {
+ finet = socket(AF_INET, SOCK_DGRAM, 0);
+ if(finet == -1) {
+ finet = 0;
+ return strerror(errno);
+ }
+ }
+ if(!addr.sin_family) {
+ struct servent *sp;
+ sp = getservbyname("syslog", "udp");
+ if(sp == NULL)
+ return "syslog/udp: unknown service";
+ addr.sin_port = sp->s_port;
+ addr.sin_family = AF_INET;
+ }
-#if __STDC__
- va_start(ap, fmt);
-#else
- va_start(ap);
-#endif
- vsyslog(pri, fmt, ap);
- va_end(ap);
+ hp = gethostbyname(host);
+ if(hp == NULL)
+ return hstrerror(h_errno);
+ memmove(&addr.sin_addr, hp->h_addr, hp->h_length);
+
+ if(sendto(finet, tbuf, cnt, 0, (struct sockaddr *)&addr,
+ sizeof(addr)) != cnt)
+ return strerror(errno);
+
+ return NULL; /* success */
}
@@ -134,5 +148,6 @@
void
-vsyslog(pri, fmt, ap)
+vsyslogh(pri, host, fmt, ap)
int pri;
register const char *fmt;
+ const char *host;
va_list ap;
@@ -240,2 +255,24 @@
+ /* If host is specified, try sending the message to it */
+ if(host) {
+ const char *err;
+ err = logtohost(host, tbuf, cnt);
+ if(err == NULL)
+ return; /* sent successfully */
+ else if(sizeof(tbuf) - cnt > 5) {
+ /* if there is any room in tbuf, append the */
+ /* hostname and the error message from the */
+ /* logtohost, for it to be logged locally */
+ strncat(tbuf + cnt++ - 1, " ", 1);
+ strncat(tbuf + cnt - 1, host, sizeof(tbuf) - cnt);
+ cnt += strlen(host);
+ if(sizeof(tbuf) - cnt > 3) {
+ strncat(tbuf + cnt++ - 1, ":", 1);
+ strncat(tbuf + cnt - 1, err,
+ sizeof(tbuf) - cnt);
+ cnt += strlen(err);
+ }
+ }
+ }
+
/* Get connected, output the message to the local logger. */
@@ -258,3 +295,3 @@
* Output the message to the console; don't worry about blocking,
- * if console blocks everything will. Make sure the error reported
+ * if console blocks, everything will. Make sure the error reported
* is the one from the syslogd failure.
@@ -276,2 +313,63 @@
}
+
+/*
+ * syslog, vsyslog --
+ * print message on log file; output is intended for syslogd(8).
+ */
+void
+#if __STDC__
+syslogh(int pri, const char *host, const char *fmt, ...)
+#else
+syslogh(pri, host, fmt, va_alist)
+ int pri;
+ char *fmt;
+ const char *host;
+ va_dcl
+#endif
+{
+ va_list ap;
+
+#if __STDC__
+ va_start(ap, fmt);
+#else
+ va_start(ap);
+#endif
+ vsyslogh(pri, host, fmt, ap);
+ va_end(ap);
+}
+
+/*
+ * syslog, vsyslog --
+ * print message on log file; output is intended for syslogd(8).
+ */
+void
+#if __STDC__
+syslog(int pri, const char *fmt, ...)
+#else
+syslog(pri, fmt, va_alist)
+ int pri;
+ char *fmt;
+ va_dcl
+#endif
+{
+ va_list ap;
+
+#if __STDC__
+ va_start(ap, fmt);
+#else
+ va_start(ap);
+#endif
+ vsyslogh(pri, NULL, fmt, ap);
+ va_end(ap);
+}
+
+void
+vsyslog(pri, fmt, ap)
+ int pri;
+ register const char *fmt;
+ va_list ap;
+{
+ vsyslogh(pri, NULL, fmt, ap);
+}
+
static void
--- sys/sys/syslog.h.orig Mon Jul 13 02:45:17 1998
+++ sys/sys/syslog.h Mon Apr 12 00:44:25 1999
@@ -195,4 +195,7 @@
void syslog __P((int, const char *, ...)) __printflike(2, 3);
void vsyslog __P((int, const char *, _BSD_VA_LIST_)) __printflike(2, 0);
+void syslogh __P((int, const char *, const char *, ...)) __printflike(3, 4);
+void vsyslogh __P((int, const char *, const char *, _BSD_VA_LIST_))
+ __printflike(3, 0);
__END_DECLS
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199904231709.NAA00535>
