Make the sys logger for so that concurrent logging will work
properly (see tests/syslog_test.c for example).
-Erik
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 4cfb458..004e6ab 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -80,14 +80,23 @@
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 @@
signal (SIGTERM, quit_signal);
signal (SIGQUIT, quit_signal);
signal (SIGHUP, SIG_IGN);
+ signal (SIGCLD, SIG_IGN);
signal (SIGALRM, domark);
alarm (MarkInterval);
@@ -216,54 +226,68 @@
for (fd = 0; (n_ready > 0) && (fd < FD_SETSIZE); fd++) {
if (FD_ISSET (fd, &readfds)) {
+
--n_ready;
+
if (fd == sock_fd) {
- int conn;
+
+ 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);
- continue;
- }
- else {
-# define BUFSIZE 1023
- char buf[ BUFSIZE + 1 ];
- int n_read;
- while ((n_read = read (fd, buf, BUFSIZE )) > 0) {
+ pid = fork();
- int pri = (LOG_USER | LOG_NOTICE);
- char line[ BUFSIZE + 1 ];
- unsigned char c;
- char *p = buf, *q = line;
-
- buf[ n_read - 1 ] = '\0';
-
- while (p && (c = *p) && q < &line[ sizeof (line) - 1 ]) {
- if (c == '<') {
- /* Parse the magic priority number. */
- pri = 0;
- while (isdigit (*(++p))) {
- pri = 10 * pri + (*p - '0');
- }
- if (pri & ~(LOG_FACMASK | LOG_PRIMASK))
- pri = (LOG_USER | LOG_NOTICE);
- } else if (c == '\n') {
- *q++ = ' ';
- } else if (iscntrl (c) && (c < 0177)) {
- *q++ = '^';
- *q++ = c ^ 0100;
- } else {
- *q++ = c;
- }
- p++;
- }
- *q = '\0';
- /* Now log it */
- logMessage (pri, line);
+ if (pid < 0) {
+ perror ("syslogd: fork");
+ close (conn);
+ continue;
}
- close (fd);
- FD_CLR (fd, &fds);
+
+ if (pid > 0) {
+
+# define BUFSIZE 1023
+ char buf[ BUFSIZE + 1 ];
+ int n_read;
+
+ 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';
+
+ while (p && (c = *p) && q < &line[ sizeof (line) - 1 ]) {
+ if (c == '<') {
+ /* Parse the magic priority number. */
+ pri = 0;
+ while (isdigit (*(++p))) {
+ pri = 10 * pri + (*p - '0');
+ }
+ if (pri & ~(LOG_FACMASK | LOG_PRIMASK))
+ pri = (LOG_USER | LOG_NOTICE);
+ } else if (c == '\n') {
+ *q++ = ' ';
+ } else if (iscntrl (c) && (c < 0177)) {
+ *q++ = '^';
+ *q++ = c ^ 0100;
+ } else {
+ *q++ = c;
+ }
+ p++;
+ }
+ *q = '\0';
+ /* Now log it */
+ logMessage (pri, line);
+ }
+ exit (0);
+ }
+ close (conn);
}
}
}
@@ -432,9 +456,9 @@
}
/*
- * 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:
+*/
diff --git a/syslogd.c b/syslogd.c
index 4cfb458..004e6ab 100644
--- a/syslogd.c
+++ b/syslogd.c
@@ -80,14 +80,23 @@
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 @@
signal (SIGTERM, quit_signal);
signal (SIGQUIT, quit_signal);
signal (SIGHUP, SIG_IGN);
+ signal (SIGCLD, SIG_IGN);
signal (SIGALRM, domark);
alarm (MarkInterval);
@@ -216,54 +226,68 @@
for (fd = 0; (n_ready > 0) && (fd < FD_SETSIZE); fd++) {
if (FD_ISSET (fd, &readfds)) {
+
--n_ready;
+
if (fd == sock_fd) {
- int conn;
+
+ 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);
- continue;
- }
- else {
-# define BUFSIZE 1023
- char buf[ BUFSIZE + 1 ];
- int n_read;
- while ((n_read = read (fd, buf, BUFSIZE )) > 0) {
+ pid = fork();
- int pri = (LOG_USER | LOG_NOTICE);
- char line[ BUFSIZE + 1 ];
- unsigned char c;
- char *p = buf, *q = line;
-
- buf[ n_read - 1 ] = '\0';
-
- while (p && (c = *p) && q < &line[ sizeof (line) - 1 ]) {
- if (c == '<') {
- /* Parse the magic priority number. */
- pri = 0;
- while (isdigit (*(++p))) {
- pri = 10 * pri + (*p - '0');
- }
- if (pri & ~(LOG_FACMASK | LOG_PRIMASK))
- pri = (LOG_USER | LOG_NOTICE);
- } else if (c == '\n') {
- *q++ = ' ';
- } else if (iscntrl (c) && (c < 0177)) {
- *q++ = '^';
- *q++ = c ^ 0100;
- } else {
- *q++ = c;
- }
- p++;
- }
- *q = '\0';
- /* Now log it */
- logMessage (pri, line);
+ if (pid < 0) {
+ perror ("syslogd: fork");
+ close (conn);
+ continue;
}
- close (fd);
- FD_CLR (fd, &fds);
+
+ if (pid > 0) {
+
+# define BUFSIZE 1023
+ char buf[ BUFSIZE + 1 ];
+ int n_read;
+
+ 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';
+
+ while (p && (c = *p) && q < &line[ sizeof (line) - 1 ]) {
+ if (c == '<') {
+ /* Parse the magic priority number. */
+ pri = 0;
+ while (isdigit (*(++p))) {
+ pri = 10 * pri + (*p - '0');
+ }
+ if (pri & ~(LOG_FACMASK | LOG_PRIMASK))
+ pri = (LOG_USER | LOG_NOTICE);
+ } else if (c == '\n') {
+ *q++ = ' ';
+ } else if (iscntrl (c) && (c < 0177)) {
+ *q++ = '^';
+ *q++ = c ^ 0100;
+ } else {
+ *q++ = c;
+ }
+ p++;
+ }
+ *q = '\0';
+ /* Now log it */
+ logMessage (pri, line);
+ }
+ exit (0);
+ }
+ close (conn);
}
}
}
@@ -432,9 +456,9 @@
}
/*
- * 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:
+*/
diff --git a/tests/.cvsignore b/tests/.cvsignore
index 5f84523..3645cf9 100644
--- a/tests/.cvsignore
+++ b/tests/.cvsignore
@@ -13,3 +13,4 @@
mv_*.bb
mv_*.gnu
mv_tests
+syslog_test
diff --git a/tests/Makefile b/tests/Makefile
index c4fb0e9..508bc64 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -29,3 +29,5 @@
${BBL}: ../busybox
rm -f $@
ln ../busybox $@
+
+syslog_test: syslog_test.c
diff --git a/tests/syslog_test.c b/tests/syslog_test.c
new file mode 100644
index 0000000..fb4c691
--- /dev/null
+++ b/tests/syslog_test.c
@@ -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);
+}