diff --git a/AUTHORS b/AUTHORS index c155b802d..64114a5fc 100644 --- a/AUTHORS +++ b/AUTHORS @@ -46,6 +46,9 @@ Bruce Perens Pavel Roskin Lots of bugs fixes and patches. +Gyepi Sam + Remote logging feature for syslogd + Linus Torvalds mkswap, fsck.minix, mkfs.minix diff --git a/Changelog b/Changelog index 92139bca3..212574678 100644 --- a/Changelog +++ b/Changelog @@ -1,3 +1,14 @@ +0.47 + + * 'make install' now creates relative symlinks, and added a new + 'make install-hardlinks' target to (tada) install hardlinks. + * syslogd can now log messages to a remote host -- patch thanks + to Gyepi Sam + + + -Erik Andersen + + 0.46 * Better portability. Now should compile cleanly with libc5, diff --git a/applets/usage.c b/applets/usage.c index 58f9820ba..b86df330c 100644 --- a/applets/usage.c +++ b/applets/usage.c @@ -998,6 +998,9 @@ const char syslogd_usage[] = "\t-K\t\tDo not start up the klogd process\n" #endif "\t-O FILE\t\tUse an alternate log file (default=/var/log/messages)\n" +#ifdef BB_FEATURE_REMOTE_LOG + "\t-R HOST[:PORT]\t\tLog remotely to IP or hostname on PORT (default PORT=514/UDP)\n" +#endif #endif ; #endif diff --git a/busybox.def.h b/busybox.def.h index 7acfb2822..2c98af40d 100644 --- a/busybox.def.h +++ b/busybox.def.h @@ -186,6 +186,9 @@ //Should syslogd also provide klogd support? #define BB_FEATURE_KLOGD // +// enable syslogd -R remotehost +#define BB_FEATURE_REMOTE_LOG +// //Simple tail implementation (2k vs 6k for the full one). Still //provides 'tail -f' support -- but for only one file at a time. #define BB_FEATURE_SIMPLE_TAIL diff --git a/docs/busybox.pod b/docs/busybox.pod index 0e611deef..ca241433f 100644 --- a/docs/busybox.pod +++ b/docs/busybox.pod @@ -1577,6 +1577,12 @@ Options: -n Run as a foreground process -K Do not start up the klogd process -O FILE Use an alternate log file (default=/var/log/messages) + -R HOST[:PORT] Log messages to HOST on PORT (default=514) over UDP. + +Example: + + $ syslogd -R masterlog:514 + $ syslogd -R 192.168.1.1:601 ------------------------------- @@ -2028,4 +2034,4 @@ Enrique Zanardi =cut -# $Id: busybox.pod,v 1.56 2000/07/11 17:29:36 andersen Exp $ +# $Id: busybox.pod,v 1.57 2000/07/20 23:41:24 andersen Exp $ diff --git a/docs/busybox.sgml b/docs/busybox.sgml index 92b02c9ee..f0dd3bf62 100644 --- a/docs/busybox.sgml +++ b/docs/busybox.sgml @@ -2804,6 +2804,7 @@ -n Run as a foreground process -K Do not start up the klogd process -O FILE Use an alternate log file (default=/var/log/messages) + -R HOST[:PORT] Log messages to HOST on PORT (default=514) over UDP. @@ -2813,6 +2814,8 @@ + $ syslogd -R masterlog:514 + $ syslogd -R 192.168.1.1:601 diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index 264d899f3..508a6572b 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -61,6 +61,7 @@ static inline _syscall3(int, klogctl, int, type, char *, b, int, len); /* SYSLOG_NAMES defined to pull some extra junk from syslog.h */ #define SYSLOG_NAMES #include +#include /* Path for the file where all log messages are written */ #define __LOG_FILE "/var/log/messages" @@ -76,6 +77,18 @@ static int MarkInterval = 20 * 60; /* localhost's name */ static char LocalHostName[32]; +#ifdef BB_FEATURE_REMOTE_LOG +#include +/* udp socket for logging to remote host */ +static int remotefd = -1; +/* where do we log? */ +static char *RemoteHost; +/* what port to log to? */ +static int RemotePort = 514; +/* To remote log or not to remote log, that is the question. */ +static int doRemoteLog = FALSE; +#endif + /* Note: There is also a function called "message()" in init.c */ /* Print a message to the log file. */ static void message (char *fmt, ...) __attribute__ ((format (printf, 1, 2))); @@ -151,6 +164,30 @@ static void logMessage (int pri, char *msg) /* now spew out the message to wherever it is supposed to go */ message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); + +#ifdef BB_FEATURE_REMOTE_LOG + /* send message to remote logger */ + if ( -1 != remotefd){ +#define IOV_COUNT 2 + struct iovec iov[IOV_COUNT]; + struct iovec *v = iov; + + bzero(&res, sizeof(res)); + snprintf(res, sizeof(res), "<%d>", pri); + v->iov_base = res ; + v->iov_len = strlen(res); + v++; + + v->iov_base = msg; + v->iov_len = strlen(msg); + + if ( -1 == writev(remotefd,iov, IOV_COUNT)){ + fatalError("syslogd: cannot write to remote file handle on" + "%s:%d\n",RemoteHost,RemotePort); + } + } +#endif + } static void quit_signal(int sig) @@ -191,8 +228,9 @@ static int serveConnection (int conn) while (isdigit (*(++p))) { pri = 10 * pri + (*p - '0'); } - if (pri & ~(LOG_FACMASK | LOG_PRIMASK)) + if (pri & ~(LOG_FACMASK | LOG_PRIMASK)){ pri = (LOG_USER | LOG_NOTICE); + } } else if (c == '\n') { *q++ = ' '; } else if (iscntrl (c) && (c < 0177)) { @@ -210,6 +248,43 @@ static int serveConnection (int conn) return (0); } + +#ifdef BB_FEATURE_REMOTE_LOG +static void init_RemoteLog (void){ + + struct sockaddr_in remoteaddr; + struct hostent *hostinfo; + int len = sizeof(remoteaddr); + + bzero(&remoteaddr, len); + + remotefd = socket(AF_INET, SOCK_DGRAM, 0); + + if (remotefd < 0) { + fatalError("syslogd: cannot create socket\n"); + } + + hostinfo = (struct hostent *) gethostbyname(RemoteHost); + + if (!hostinfo) { + fatalError("syslogd: cannot resolve remote host name [%s]\n", RemoteHost); + } + + remoteaddr.sin_family = AF_INET; + remoteaddr.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list; + remoteaddr.sin_port = htons(RemotePort); + + /* + Since we are using UDP sockets, connect just sets the default host and port + for future operations + */ + if ( 0 != (connect(remotefd, (struct sockaddr *) &remoteaddr, len))){ + fatalError("syslogd: cannot connect to remote host %s:%d\n", RemoteHost, RemotePort); + } + +} +#endif + static void doSyslogd (void) __attribute__ ((noreturn)); static void doSyslogd (void) { @@ -254,6 +329,12 @@ static void doSyslogd (void) FD_ZERO (&fds); FD_SET (sock_fd, &fds); + #ifdef BB_FEATURE_REMOTE_LOG + if (doRemoteLog == TRUE){ + init_RemoteLog(); + } + #endif + logMessage (0, "syslogd started: BusyBox v" BB_VER " (" BB_BT ")"); for (;;) { @@ -322,6 +403,13 @@ static void doKlogd (void) signal(SIGKILL, klogd_signal); signal(SIGTERM, klogd_signal); signal(SIGHUP, SIG_IGN); + +#ifdef BB_FEATURE_REMOTE_LOG + if (doRemoteLog == TRUE){ + init_RemoteLog(); + } +#endif + logMessage(0, "klogd started: " "BusyBox v" BB_VER " (" BB_BT ")"); @@ -423,6 +511,20 @@ extern int syslogd_main(int argc, char **argv) logFilePath = *(++argv1); stopDoingThat = TRUE; break; +#ifdef BB_FEATURE_REMOTE_LOG + case 'R': + if (--argc == 0) { + usage(syslogd_usage); + } + RemoteHost = *(++argv1); + if ( (p = strchr(RemoteHost, ':'))){ + RemotePort = atoi(p+1); + *p = '\0'; + } + doRemoteLog = TRUE; + stopDoingThat = TRUE; + break; +#endif default: usage(syslogd_usage); } diff --git a/syslogd.c b/syslogd.c index 264d899f3..508a6572b 100644 --- a/syslogd.c +++ b/syslogd.c @@ -61,6 +61,7 @@ static inline _syscall3(int, klogctl, int, type, char *, b, int, len); /* SYSLOG_NAMES defined to pull some extra junk from syslog.h */ #define SYSLOG_NAMES #include +#include /* Path for the file where all log messages are written */ #define __LOG_FILE "/var/log/messages" @@ -76,6 +77,18 @@ static int MarkInterval = 20 * 60; /* localhost's name */ static char LocalHostName[32]; +#ifdef BB_FEATURE_REMOTE_LOG +#include +/* udp socket for logging to remote host */ +static int remotefd = -1; +/* where do we log? */ +static char *RemoteHost; +/* what port to log to? */ +static int RemotePort = 514; +/* To remote log or not to remote log, that is the question. */ +static int doRemoteLog = FALSE; +#endif + /* Note: There is also a function called "message()" in init.c */ /* Print a message to the log file. */ static void message (char *fmt, ...) __attribute__ ((format (printf, 1, 2))); @@ -151,6 +164,30 @@ static void logMessage (int pri, char *msg) /* now spew out the message to wherever it is supposed to go */ message("%s %s %s %s\n", timestamp, LocalHostName, res, msg); + +#ifdef BB_FEATURE_REMOTE_LOG + /* send message to remote logger */ + if ( -1 != remotefd){ +#define IOV_COUNT 2 + struct iovec iov[IOV_COUNT]; + struct iovec *v = iov; + + bzero(&res, sizeof(res)); + snprintf(res, sizeof(res), "<%d>", pri); + v->iov_base = res ; + v->iov_len = strlen(res); + v++; + + v->iov_base = msg; + v->iov_len = strlen(msg); + + if ( -1 == writev(remotefd,iov, IOV_COUNT)){ + fatalError("syslogd: cannot write to remote file handle on" + "%s:%d\n",RemoteHost,RemotePort); + } + } +#endif + } static void quit_signal(int sig) @@ -191,8 +228,9 @@ static int serveConnection (int conn) while (isdigit (*(++p))) { pri = 10 * pri + (*p - '0'); } - if (pri & ~(LOG_FACMASK | LOG_PRIMASK)) + if (pri & ~(LOG_FACMASK | LOG_PRIMASK)){ pri = (LOG_USER | LOG_NOTICE); + } } else if (c == '\n') { *q++ = ' '; } else if (iscntrl (c) && (c < 0177)) { @@ -210,6 +248,43 @@ static int serveConnection (int conn) return (0); } + +#ifdef BB_FEATURE_REMOTE_LOG +static void init_RemoteLog (void){ + + struct sockaddr_in remoteaddr; + struct hostent *hostinfo; + int len = sizeof(remoteaddr); + + bzero(&remoteaddr, len); + + remotefd = socket(AF_INET, SOCK_DGRAM, 0); + + if (remotefd < 0) { + fatalError("syslogd: cannot create socket\n"); + } + + hostinfo = (struct hostent *) gethostbyname(RemoteHost); + + if (!hostinfo) { + fatalError("syslogd: cannot resolve remote host name [%s]\n", RemoteHost); + } + + remoteaddr.sin_family = AF_INET; + remoteaddr.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list; + remoteaddr.sin_port = htons(RemotePort); + + /* + Since we are using UDP sockets, connect just sets the default host and port + for future operations + */ + if ( 0 != (connect(remotefd, (struct sockaddr *) &remoteaddr, len))){ + fatalError("syslogd: cannot connect to remote host %s:%d\n", RemoteHost, RemotePort); + } + +} +#endif + static void doSyslogd (void) __attribute__ ((noreturn)); static void doSyslogd (void) { @@ -254,6 +329,12 @@ static void doSyslogd (void) FD_ZERO (&fds); FD_SET (sock_fd, &fds); + #ifdef BB_FEATURE_REMOTE_LOG + if (doRemoteLog == TRUE){ + init_RemoteLog(); + } + #endif + logMessage (0, "syslogd started: BusyBox v" BB_VER " (" BB_BT ")"); for (;;) { @@ -322,6 +403,13 @@ static void doKlogd (void) signal(SIGKILL, klogd_signal); signal(SIGTERM, klogd_signal); signal(SIGHUP, SIG_IGN); + +#ifdef BB_FEATURE_REMOTE_LOG + if (doRemoteLog == TRUE){ + init_RemoteLog(); + } +#endif + logMessage(0, "klogd started: " "BusyBox v" BB_VER " (" BB_BT ")"); @@ -423,6 +511,20 @@ extern int syslogd_main(int argc, char **argv) logFilePath = *(++argv1); stopDoingThat = TRUE; break; +#ifdef BB_FEATURE_REMOTE_LOG + case 'R': + if (--argc == 0) { + usage(syslogd_usage); + } + RemoteHost = *(++argv1); + if ( (p = strchr(RemoteHost, ':'))){ + RemotePort = atoi(p+1); + *p = '\0'; + } + doRemoteLog = TRUE; + stopDoingThat = TRUE; + break; +#endif default: usage(syslogd_usage); } diff --git a/usage.c b/usage.c index 58f9820ba..b86df330c 100644 --- a/usage.c +++ b/usage.c @@ -998,6 +998,9 @@ const char syslogd_usage[] = "\t-K\t\tDo not start up the klogd process\n" #endif "\t-O FILE\t\tUse an alternate log file (default=/var/log/messages)\n" +#ifdef BB_FEATURE_REMOTE_LOG + "\t-R HOST[:PORT]\t\tLog remotely to IP or hostname on PORT (default PORT=514/UDP)\n" +#endif #endif ; #endif