Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 May 2004 23:57:45 +0200 (CEST)
From:      Martin Blapp <mb@imp.ch>
To:        current@freebsd.org
Subject:   Re: syslogd(8): timed out waiting for child 
Message-ID:  <20040525235603.A7820@cvs.imp.ch>
In-Reply-To: <20040525233637.C7820@cvs.imp.ch>
References:  <20040525233637.C7820@cvs.imp.ch>

next in thread | previous in thread | raw e-mail | index | archive | help

and here is the patch adapted for current ...

--- syslogd.c.orig	Tue May 25 23:52:28 2004
+++ syslogd.c	Tue May 25 23:50:55 2004
@@ -881,7 +881,7 @@
 	/* log the message to the particular outputs */
 	if (!Initialized) {
 		f = &consfile;
-		f->f_file = open(ctty, O_WRONLY, 0);
+		f->f_file = open(ctty, O_WRONLY|O_NONBLOCK, 0);

 		if (f->f_file >= 0) {
 			(void)strlcpy(f->f_lasttime, timestamp,
@@ -1135,12 +1135,34 @@
 		dprintf(" %s\n", f->f_un.f_fname);
 		v->iov_base = "\n";
 		v->iov_len = 1;
+	again:
 		if (writev(f->f_file, iov, 7) < 0) {
 			int e = errno;
 			(void)close(f->f_file);
-			f->f_type = F_UNUSED;
-			errno = e;
-			logerror(f->f_un.f_fname);
+
+			/*
+			 * Check for errors on TTY's due to loss of tty
+			 */
+			if (e == EAGAIN) {
+				/*
+				 * Silently drop messages on blocked write.
+				 * This can happen when logging to a locked tty.
+				 */
+				break;
+			} else if ((e == EIO || e == EBADF) &&
+			    f->f_type != F_FILE) {
+				f->f_file = open(f->f_un.f_fname,
+				    O_WRONLY|O_APPEND|O_NONBLOCK, 0);
+				if (f->f_file < 0) {
+					f->f_type = F_UNUSED;
+					logerror(f->f_un.f_fname);
+				} else
+					goto again;
+			} else {
+				f->f_type = F_UNUSED;
+				errno = e;
+				logerror(f->f_un.f_fname);
+			}
 		} else if (f->f_flags & SYNC_FILE)
 			(void)fsync(f->f_file);
 		break;
@@ -1792,7 +1814,8 @@
 		break;

 	case '/':
-		if ((f->f_file = open(p, O_WRONLY|O_APPEND, 0)) < 0) {
+		f->f_file = open(p, O_WRONLY|O_APPEND|O_NONBLOCK, 0);
+		if (f->f_file < 0) {
 			f->f_type = F_UNUSED;
 			logerror(p);
 			break;
@@ -1807,8 +1830,13 @@
 			(void)strlcpy(f->f_un.f_fname, p + sizeof(_PATH_DEV) - 1,
 			    sizeof(f->f_un.f_fname));
 		} else {
-			(void)strlcpy(f->f_un.f_fname, p, sizeof(f->f_un.f_fname));
 			f->f_type = F_FILE;
+			/* Clear O_NONBLOCK flag on f->f_file */
+			if ((i = fcntl(f->f_file, F_GETFL, 0)) != -1) {
+				i &= ~O_NONBLOCK;
+				fcntl(f->f_file, F_SETFL, i);
+			}
+			(void)strlcpy(f->f_un.f_fname, p, sizeof(f->f_un.f_fname));
 		}
 		break;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040525235603.A7820>