Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37509033
en ru br
Репозитории ALT
S:1.8.0-alt1
5.1: 1.4.1-alt30
4.1: 1.4.1-alt28
4.0: 1.4.1-alt27
3.0: 1.4.1-alt20
www.altlinux.org/Changes

Группа :: Система/Ядро и оборудование
Пакет: sysklogd

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: sysklogd-1.4.2-alt-syslogd-nonblock.patch
Скачать


diff -upk.orig sysklogd-1.4.2.orig/syslogd.c sysklogd-1.4.2/syslogd.c
--- sysklogd-1.4.2.orig/syslogd.c	2005-08-18 12:37:31 +0000
+++ sysklogd-1.4.2/syslogd.c	2005-08-18 13:24:31 +0000
@@ -815,6 +815,16 @@ static int create_unix_socket(const char
 static int create_inet_socket();
 #endif
 
+static int set_nonblock_flag(int desc)
+{
+	int flags = fcntl(desc, F_GETFL, 0);
+
+	if ((flags == -1) || (flags & O_NONBLOCK))
+		return flags;
+
+	return fcntl(desc, F_SETFL, flags | O_NONBLOCK);
+}
+
 int main(argc, argv)
 	int argc;
 	char **argv;
@@ -1275,7 +1285,6 @@ static int create_inet_socket()
 {
 	int fd, on = 1;
 	struct sockaddr_in sin;
-	int sockflags;
 
 	fd = socket(AF_INET, SOCK_DGRAM, 0);
 	if (fd < 0) {
@@ -1306,15 +1315,7 @@ static int create_inet_socket()
 	 * will stall until the timeout, and other processes trying to
 	 * log will also stall.
 	 */
-	if ((sockflags = fcntl(fd, F_GETFL)) != -1) {
-		sockflags |= O_NONBLOCK;
-		/*
-		 * SETFL could fail too, so get it caught by the subsequent
-		 * error check.
-		 */
-		sockflags = fcntl(fd, F_SETFL, sockflags);
-	}
-	if (sockflags == -1) {
+	if (set_nonblock_flag(fd) == -1) {
 		logerror("fcntl(O_NONBLOCK), suspending inet");
 		close(fd);
 		return -1;
@@ -1923,7 +1924,7 @@ void fprintlog(f, from, flags, msg)
 
 			/* If a named pipe is full, just ignore it for now
 			   - mrn 24 May 96 */
-			if (f->f_type == F_PIPE && e == EAGAIN)
+			if ((f->f_type == F_PIPE || f->f_type == F_TTY) && e == EAGAIN)
 				break;
 
 			(void) close(f->f_file);
@@ -1945,6 +1946,8 @@ void fprintlog(f, from, flags, msg)
 					untty();
 					goto again;
 				}
+				if (f->f_type == F_TTY)
+					(void) set_nonblock_flag(f->f_file);
 			} else {
 				f->f_type = F_UNUSED;
 				errno = e;
@@ -2752,6 +2755,7 @@ void cfline(line, f)
 			break;
 		}
 		if (isatty(f->f_file)) {
+			(void) set_nonblock_flag(f->f_file);
 			f->f_type = F_TTY;
 			untty();
 		}
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin