Make the sys logger for so that concurrent logging will work

properly (see tests/syslog_test.c for example).
 -Erik
This commit is contained in:
Erik Andersen 2000-04-19 18:52:56 +00:00
parent 1101d23604
commit e3ed156eeb
5 changed files with 162 additions and 92 deletions

View File

@ -80,14 +80,23 @@ static void message (char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
static void message (char *fmt, ...)
{
int fd;
struct flock fl;
va_list arguments;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 1;
if ((fd = device_open (logFilePath,
O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND |
O_NONBLOCK)) >= 0) {
fl.l_type = F_WRLCK;
fcntl (fd, F_SETLKW, &fl);
va_start (arguments, fmt);
vdprintf (fd, fmt, arguments);
va_end (arguments);
fl.l_type = F_UNLCK;
fcntl (fd, F_SETLKW, &fl);
close (fd);
} else {
/* Always send console messages to /dev/console so people will see them. */
@ -173,6 +182,7 @@ static void doSyslogd (void)
signal (SIGTERM, quit_signal);
signal (SIGQUIT, quit_signal);
signal (SIGHUP, SIG_IGN);
signal (SIGCLD, SIG_IGN);
signal (SIGALRM, domark);
alarm (MarkInterval);
@ -216,25 +226,38 @@ static void doSyslogd (void)
for (fd = 0; (n_ready > 0) && (fd < FD_SETSIZE); fd++) {
if (FD_ISSET (fd, &readfds)) {
--n_ready;
if (fd == sock_fd) {
int conn;
pid_t pid;
if ((conn = accept (sock_fd, (struct sockaddr *) &sunx, &addrLength)) < 0) {
fatalError ("accept error: %s\n", strerror (errno));
}
FD_SET (conn, &fds);
pid = fork();
if (pid < 0) {
perror ("syslogd: fork");
close (conn);
continue;
}
else {
if (pid > 0) {
# define BUFSIZE 1023
char buf[ BUFSIZE + 1 ];
int n_read;
while ((n_read = read (fd, buf, BUFSIZE )) > 0) {
while ((n_read = read (conn, buf, BUFSIZE )) > 0) {
int pri = (LOG_USER | LOG_NOTICE);
char line[ BUFSIZE + 1 ];
unsigned char c;
char *p = buf, *q = line;
buf[ n_read - 1 ] = '\0';
@ -262,8 +285,9 @@ static void doSyslogd (void)
/* Now log it */
logMessage (pri, line);
}
close (fd);
FD_CLR (fd, &fds);
exit (0);
}
close (conn);
}
}
}
@ -432,9 +456,9 @@ extern int syslogd_main(int argc, char **argv)
}
/*
* Local Variables
* c-file-style: "linux"
* c-basic-offset: 4
* tab-width: 4
* End:
Local Variables
c-file-style: "linux"
c-basic-offset: 4
tab-width: 4
End:
*/

View File

@ -80,14 +80,23 @@ static void message (char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
static void message (char *fmt, ...)
{
int fd;
struct flock fl;
va_list arguments;
fl.l_whence = SEEK_SET;
fl.l_start = 0;
fl.l_len = 1;
if ((fd = device_open (logFilePath,
O_WRONLY | O_CREAT | O_NOCTTY | O_APPEND |
O_NONBLOCK)) >= 0) {
fl.l_type = F_WRLCK;
fcntl (fd, F_SETLKW, &fl);
va_start (arguments, fmt);
vdprintf (fd, fmt, arguments);
va_end (arguments);
fl.l_type = F_UNLCK;
fcntl (fd, F_SETLKW, &fl);
close (fd);
} else {
/* Always send console messages to /dev/console so people will see them. */
@ -173,6 +182,7 @@ static void doSyslogd (void)
signal (SIGTERM, quit_signal);
signal (SIGQUIT, quit_signal);
signal (SIGHUP, SIG_IGN);
signal (SIGCLD, SIG_IGN);
signal (SIGALRM, domark);
alarm (MarkInterval);
@ -216,25 +226,38 @@ static void doSyslogd (void)
for (fd = 0; (n_ready > 0) && (fd < FD_SETSIZE); fd++) {
if (FD_ISSET (fd, &readfds)) {
--n_ready;
if (fd == sock_fd) {
int conn;
pid_t pid;
if ((conn = accept (sock_fd, (struct sockaddr *) &sunx, &addrLength)) < 0) {
fatalError ("accept error: %s\n", strerror (errno));
}
FD_SET (conn, &fds);
pid = fork();
if (pid < 0) {
perror ("syslogd: fork");
close (conn);
continue;
}
else {
if (pid > 0) {
# define BUFSIZE 1023
char buf[ BUFSIZE + 1 ];
int n_read;
while ((n_read = read (fd, buf, BUFSIZE )) > 0) {
while ((n_read = read (conn, buf, BUFSIZE )) > 0) {
int pri = (LOG_USER | LOG_NOTICE);
char line[ BUFSIZE + 1 ];
unsigned char c;
char *p = buf, *q = line;
buf[ n_read - 1 ] = '\0';
@ -262,8 +285,9 @@ static void doSyslogd (void)
/* Now log it */
logMessage (pri, line);
}
close (fd);
FD_CLR (fd, &fds);
exit (0);
}
close (conn);
}
}
}
@ -432,9 +456,9 @@ extern int syslogd_main(int argc, char **argv)
}
/*
* Local Variables
* c-file-style: "linux"
* c-basic-offset: 4
* tab-width: 4
* End:
Local Variables
c-file-style: "linux"
c-basic-offset: 4
tab-width: 4
End:
*/

View File

@ -13,3 +13,4 @@ mv
mv_*.bb
mv_*.gnu
mv_tests
syslog_test

View File

@ -29,3 +29,5 @@ BBL := $(shell pushd .. >/dev/null && \
${BBL}: ../busybox
rm -f $@
ln ../busybox $@
syslog_test: syslog_test.c

19
tests/syslog_test.c Normal file
View File

@ -0,0 +1,19 @@
#include <syslog.h>
int do_log(char* msg, int delay)
{
openlog("testlog", LOG_PID, LOG_DAEMON);
while(1) {
syslog(LOG_ERR, "%s: testing one, two, three\n", msg);
sleep(delay);
}
closelog();
return(0);
};
int main(void)
{
if (fork()==0)
do_log("A", 2);
do_log("B", 3);
}