X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=sysklogd%2Fsyslogd.c;h=db6401c5202e581e235128438f04f176e7ba95bd;hb=b78d9b56eb0fe4ba8b347f12848ab4154805f4c5;hp=e5ddd3b8202e96eaf0cd1db509826eda28693eee;hpb=f6aa13d403085b1645b65caae4517a338f4636e6;p=oweals%2Fbusybox.git diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c index e5ddd3b82..db6401c52 100644 --- a/sysklogd/syslogd.c +++ b/sysklogd/syslogd.c @@ -2,8 +2,8 @@ /* * Mini syslogd implementation for busybox * - * Copyright (C) 1999,2000,2001 by Lineo, inc. - * Written by Erik Andersen , + * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen + * Copyright (C) 1999,2000,2001 by Erik Andersen * * Copyright (C) 2000 by Karl M. Hegbloom * @@ -55,7 +55,7 @@ #define __LOG_FILE "/var/log/messages" /* Path to the unix socket */ -static char lfile[BUFSIZ] = ""; +static char lfile[BUFSIZ]; static char *logFilePath = __LOG_FILE; @@ -65,7 +65,7 @@ static int MarkInterval = 20 * 60; /* localhost's name */ static char LocalHostName[32]; -#ifdef BB_FEATURE_REMOTE_LOG +#ifdef CONFIG_FEATURE_REMOTE_LOG #include /* udp socket for logging to remote host */ static int remotefd = -1; @@ -79,7 +79,7 @@ static int local_logging = FALSE; #endif /* circular buffer variables/structures */ -#ifdef BB_FEATURE_IPC_SYSLOG +#ifdef CONFIG_FEATURE_IPC_SYSLOG #include #include @@ -119,7 +119,7 @@ static inline void sem_up(int semid) */ static inline void sem_down(int semid) { - if ( semop(semid, SMwdn, 2) == -1 ) + if ( semop(semid, SMwdn, 3) == -1 ) perror_msg_and_die("semop[SMwdn]"); } @@ -269,7 +269,7 @@ static void message (char *fmt, ...) fl.l_start = 0; fl.l_len = 1; -#ifdef BB_FEATURE_IPC_SYSLOG +#ifdef CONFIG_FEATURE_IPC_SYSLOG if ((circular_logging == TRUE) && (buf != NULL)){ char b[1024]; va_start (arguments, fmt); @@ -339,14 +339,14 @@ static void logMessage (int pri, char *msg) /* todo: supress duplicates */ -#ifdef BB_FEATURE_REMOTE_LOG +#ifdef CONFIG_FEATURE_REMOTE_LOG /* send message to remote logger */ if ( -1 != remotefd){ static const int IOV_COUNT = 2; struct iovec iov[IOV_COUNT]; struct iovec *v = iov; - bzero(&res, sizeof(res)); + memset(&res, 0, sizeof(res)); snprintf(res, sizeof(res), "<%d>", pri); v->iov_base = res ; v->iov_len = strlen(res); @@ -370,9 +370,9 @@ static const int IOV_COUNT = 2; static void quit_signal(int sig) { - logMessage(0, "System log daemon exiting."); + logMessage(LOG_SYSLOG | LOG_INFO, "System log daemon exiting."); unlink(lfile); -#ifdef BB_FEATURE_IPC_SYSLOG +#ifdef CONFIG_FEATURE_IPC_SYSLOG ipcsyslog_cleanup(); #endif @@ -387,19 +387,24 @@ static void domark(int sig) } } -static const int BUFSIZE = 1023; +/* This must be a #define, since when DODEBUG and BUFFERS_GO_IN_BSS are + * enabled, we otherwise get a "storage size isn't constant error. */ +#define BUFSIZE 1023 static int serveConnection (int conn) { - RESERVE_BB_BUFFER(tmpbuf, BUFSIZE + 1); + RESERVE_CONFIG_BUFFER(tmpbuf, BUFSIZE + 1); int n_read; + char *p = tmpbuf; - while ((n_read = read (conn, tmpbuf, BUFSIZE )) > 0) { + n_read = read (conn, tmpbuf, BUFSIZE ); + + while (p < tmpbuf + n_read) { int pri = (LOG_USER | LOG_NOTICE); char line[ BUFSIZE + 1 ]; unsigned char c; - char *p = tmpbuf, *q = line; + char *q = line; tmpbuf[ n_read - 1 ] = '\0'; @@ -424,33 +429,31 @@ static int serveConnection (int conn) p++; } *q = '\0'; + p++; /* Now log it */ logMessage (pri, line); } - return (0); + RELEASE_CONFIG_BUFFER (tmpbuf); + return n_read; } -#ifdef BB_FEATURE_REMOTE_LOG +#ifdef CONFIG_FEATURE_REMOTE_LOG static void init_RemoteLog (void){ struct sockaddr_in remoteaddr; struct hostent *hostinfo; int len = sizeof(remoteaddr); - bzero(&remoteaddr, len); - + memset(&remoteaddr, 0, len); + remotefd = socket(AF_INET, SOCK_DGRAM, 0); if (remotefd < 0) { error_msg_and_die("syslogd: cannot create socket"); } - hostinfo = (struct hostent *) gethostbyname(RemoteHost); - - if (!hostinfo) { - error_msg_and_die("syslogd: cannot resolve remote host name [%s]", RemoteHost); - } + hostinfo = xgethostbyname(RemoteHost); remoteaddr.sin_family = AF_INET; remoteaddr.sin_addr = *(struct in_addr *) *hostinfo->h_addr_list; @@ -490,17 +493,14 @@ static void doSyslogd (void) alarm (MarkInterval); /* Create the syslog file so realpath() can work. */ - close (open (_PATH_LOG, O_RDWR | O_CREAT, 0644)); - if (realpath (_PATH_LOG, lfile) == NULL) - perror_msg_and_die ("Could not resolve path to " _PATH_LOG); - - unlink (lfile); + if (realpath (_PATH_LOG, lfile) != NULL) + unlink (lfile); memset (&sunx, 0, sizeof (sunx)); sunx.sun_family = AF_UNIX; strncpy (sunx.sun_path, lfile, sizeof (sunx.sun_path)); if ((sock_fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0) - perror_msg_and_die ("Couldn't obtain descriptor for socket " _PATH_LOG); + perror_msg_and_die ("Couldn't get file descriptor for socket " _PATH_LOG); addrLength = sizeof (sunx.sun_family) + strlen (sunx.sun_path); if ((bind (sock_fd, (struct sockaddr *) &sunx, addrLength)) || (listen (sock_fd, 5))) @@ -512,13 +512,19 @@ static void doSyslogd (void) FD_ZERO (&fds); FD_SET (sock_fd, &fds); - #ifdef BB_FEATURE_REMOTE_LOG +#ifdef CONFIG_FEATURE_IPC_SYSLOG + if (circular_logging == TRUE ){ + ipcsyslog_init(); + } +#endif + + #ifdef CONFIG_FEATURE_REMOTE_LOG if (doRemoteLog == TRUE){ init_RemoteLog(); } #endif - logMessage (0, "syslogd started: BusyBox v" BB_VER " (" BB_BT ")"); + logMessage (LOG_SYSLOG | LOG_INFO, "syslogd started: " BB_BANNER); for (;;) { @@ -548,29 +554,21 @@ static void doSyslogd (void) FD_SET(conn, &fds); //printf("conn: %i, set_size: %i\n",conn,FD_SETSIZE); - } else { + } else { //printf("Serving connection: %i\n",fd); - serveConnection (fd); - close (fd); - FD_CLR(fd, &fds); + if ( serveConnection(fd) <= 0 ) { + close (fd); + FD_CLR(fd, &fds); + } } /* fd == sock_fd */ }/* FD_ISSET() */ }/* for */ } /* for main loop */ } -static void daemon_init (char **argv, char *dz, void fn (void)) -{ - setsid(); - chdir ("/"); - strncpy(argv[0], dz, strlen(argv[0])); - fn(); - exit(0); -} - extern int syslogd_main(int argc, char **argv) { - int opt, pid; + int opt; int doFork = TRUE; char *p; @@ -587,20 +585,20 @@ extern int syslogd_main(int argc, char **argv) case 'O': logFilePath = strdup(optarg); break; -#ifdef BB_FEATURE_REMOTE_LOG +#ifdef CONFIG_FEATURE_REMOTE_LOG case 'R': RemoteHost = strdup(optarg); if ( (p = strchr(RemoteHost, ':'))){ RemotePort = atoi(p+1); *p = '\0'; - } + } doRemoteLog = TRUE; break; case 'L': local_logging = TRUE; break; #endif -#ifdef BB_FEATURE_IPC_SYSLOG +#ifdef CONFIG_FEATURE_IPC_SYSLOG case 'C': circular_logging = TRUE; break; @@ -610,7 +608,7 @@ extern int syslogd_main(int argc, char **argv) } } -#ifdef BB_FEATURE_REMOTE_LOG +#ifdef CONFIG_FEATURE_REMOTE_LOG /* If they have not specified remote logging, then log locally */ if (doRemoteLog == FALSE) local_logging = TRUE; @@ -625,22 +623,11 @@ extern int syslogd_main(int argc, char **argv) umask(0); -#ifdef BB_FEATURE_IPC_SYSLOG - if (circular_logging == TRUE ){ - ipcsyslog_init(); - } -#endif - if (doFork == TRUE) { - pid = fork(); - if (pid < 0) - exit(pid); - else if (pid == 0) { - daemon_init (argv, "syslogd", doSyslogd); - } - } else { - doSyslogd(); + if (daemon(0, 1) < 0) + perror_msg_and_die("daemon"); } + doSyslogd(); return EXIT_SUCCESS; }