Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37515591
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.1-up-20040627.patch
Скачать


diff -uprN sysklogd-1.4.1/CHANGES sysklogd/CHANGES
--- sysklogd-1.4.1/CHANGES	2001-03-11 19:35:51 +0000
+++ sysklogd/CHANGES	2004-04-17 16:07:21 +0000
@@ -1,3 +1,17 @@
+Version 1.4.2
+
+ . Steve Grubb: fix memory calculation
+ . klogd will reconnect to the logger (mostly syslogd) after it went
+   away.
+ . On heavily loaded system syslog will not spit out error messages
+   anymore when recvfrom() results in EAGAIN
+ . Jon Burgess <Jon_Burgess@eur.3com.com>
+   - Moved the installation of the signal handler up a little bit so it
+     guaranteed to be available when the child is forked, hence, fixing a
+     race condition.  This used to create problems with UML and fast
+     machines.
+ . local copy of module.h
+
 Version 1.4.1
 
  . klogd will set the console log level only if `-c' is given on the
@@ -30,3 +44,10 @@ Version 1.4
  . Olaf Kirch <okir@caldera.de>
    - Remove Unix Domain Sockets and switch to Datagram Unix Sockets
  . Several bugfixes and improvements, please refer to the .c files
+
+
+Local variables:
+mode: indented-text
+mode: iso-accents
+fill-column: 72
+End:
diff -uprN sysklogd-1.4.1/Makefile sysklogd/Makefile
--- sysklogd-1.4.1/Makefile	1998-10-12 20:25:15 +0000
+++ sysklogd/Makefile	2004-04-29 11:04:03 +0000
@@ -4,12 +4,15 @@ CC= gcc
 #CFLAGS= -g -DSYSV -Wall
 #LDFLAGS= -g
 CFLAGS= $(RPM_OPT_FLAGS) -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
+# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
 LDFLAGS= -s
 
 # Look where your install program is.
 INSTALL = /usr/bin/install
-BINDIR = /usr/sbin
-MANDIR = /usr/man
+
+# Destination paths, set prefix=/opt if required
+BINDIR = $(prefix)/usr/sbin
+MANDIR = $(prefix)/usr/share/man
 
 # There is one report that under an all ELF system there may be a need to
 # explicilty link with libresolv.a.  If linking syslogd fails you may wish
@@ -34,8 +37,9 @@ FSSTND = -DFSSTND
 # The following define establishes ownership for the man pages.
 # Avery tells me that there is a difference between Debian and
 # Slackware.  Rather than choose sides I am leaving it up to the user.
-MAN_OWNER = root
-# MAN_OWNER = man
+MAN_USER = root
+MAN_GROUP = root
+MAN_PERMS = 644
 
 # The following define establishes the name of the pid file for the
 # syslogd daemon.  The library include file (paths.h) defines the
@@ -116,7 +120,7 @@ install_exec: syslogd klogd
 	${INSTALL} -m 500 -s klogd ${BINDIR}/klogd
 
 install_man:
-	${INSTALL} -o ${MAN_OWNER} -g ${MAN_OWNER} -m 644 sysklogd.8 ${MANDIR}/man8/sysklogd.8
-	${INSTALL} -o ${MAN_OWNER} -g ${MAN_OWNER} -m 644 syslogd.8 ${MANDIR}/man8/syslogd.8
-	${INSTALL} -o ${MAN_OWNER} -g ${MAN_OWNER} -m 644 syslog.conf.5 ${MANDIR}/man5/syslog.conf.5
-	${INSTALL} -o ${MAN_OWNER} -g ${MAN_OWNER} -m 644 klogd.8 ${MANDIR}/man8/klogd.8
+	${INSTALL} -o ${MAN_USER} -g ${MAN_GROUP} -m ${MAN_PERMS} sysklogd.8 ${MANDIR}/man8/sysklogd.8
+	${INSTALL} -o ${MAN_USER} -g ${MAN_GROUP} -m ${MAN_PERMS} syslogd.8 ${MANDIR}/man8/syslogd.8
+	${INSTALL} -o ${MAN_USER} -g ${MAN_GROUP} -m ${MAN_PERMS} syslog.conf.5 ${MANDIR}/man5/syslog.conf.5
+	${INSTALL} -o ${MAN_USER} -g ${MAN_GROUP} -m ${MAN_PERMS} klogd.8 ${MANDIR}/man8/klogd.8
diff -uprN sysklogd-1.4.1/README.1st sysklogd/README.1st
--- sysklogd-1.4.1/README.1st	1997-06-02 17:21:39 +0000
+++ sysklogd/README.1st	2003-09-04 13:22:23 +0000
@@ -1,5 +1,5 @@
-Very important information before using version 1.3
----------------------------------------------------
+Important information
+---------------------
 
 The included version of syslogd behaves in a slightly different manner
 to the one in former releases.  Please review the following important
@@ -63,3 +63,10 @@ differences:
   these scripts should remove all old .pid files found in /var/run.
   This will insure that klogd and syslogd start properly even if prior
   executions have been terminated harshly.
+
+* Large file support, i.e. support to write to log files that are
+  larger than 2 GB is not part of syslogd, but a matter of the Glibc
+  emitting different system calls to the kernel interface.  To support
+  large files you'll have to compile syslogd with the compiler defines
+  -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE so that glibc adjusts the
+  system calls.
diff -uprN sysklogd-1.4.1/README.linux sysklogd/README.linux
--- sysklogd-1.4.1/README.linux	1999-01-19 00:09:12 +0000
+++ sysklogd/README.linux	2004-07-09 17:22:29 +0000
@@ -40,12 +40,17 @@ sources.  Hopefully the Linux community 
 a useful addition to the software gene pool.
 
 There is a mailing list covering this package and syslog in general.
-The lists address is sysklogd@Infodrom.North.DE .  To subscribe send a
-mail to Majordomo@Infodrom.North.DE with a line "subscribe sysklogd"
+The lists address is infodrom-sysklogd@lists.infodrom.org .  To subscribe send a
+mail to majordomo@lists.infodrom.org with a line "subscribe infodrom-sysklogd"
 in the message body.
 
-New versions of this package will be available at Joey's ftp server.
-ftp://ftp.infodrom.north.de/pub/people/joey/sysklogd/
+A second mailing list exists as infodrom-sysklogd-cvs@lists.infodrom.org.  Only
+CVS messages and diffs are distributed there. Whenever new code is added to
+sysklogd, CVS generates a mail from these changes which will be sent to
+this list.  Discussions will take place on the first list.
+
+The latest version of this software can be found at:
+http://www.infodrom.org/projects/sysklogd/download.php3
 
 Best regards,
 
@@ -67,6 +72,6 @@ shane@ion.apana.org.au
 
 Martin Schulze
 Infodrom Oldenburg
-joey@linux.de
+joey@infodrom.org
 
-And a host of bug reporters whose contributions cannot be underestimated.
+And a number of bug reporters whose contributions cannot be underestimated.
diff -uprN sysklogd-1.4.1/klogd.8 sysklogd/klogd.8
--- sysklogd-1.4.1/klogd.8	2001-03-11 19:35:51 +0000
+++ sysklogd/klogd.8	2001-03-11 23:00:51 +0000
@@ -321,7 +321,7 @@ to date.  This switch instructs
 .B klogd
 to reload the module symbol information whenever a protection fault
 is detected.  Caution should be used before invoking the program in
-\'paranoid\' mode.  The stability of the kernel and the operating
+\&'paranoid\&' mode.  The stability of the kernel and the operating
 environment is always under question when a protection fault occurs.
 Since the klogd daemon must execute system calls in order to read the
 module symbol information there is the possibility that the system may
diff -uprN sysklogd-1.4.1/klogd.c sysklogd/klogd.c
--- sysklogd-1.4.1/klogd.c	2001-03-11 19:40:10 +0000
+++ sysklogd/klogd.c	2004-04-29 13:29:03 +0000
@@ -243,6 +243,9 @@
  *	people have submitted patches: Troels Walsted Hansen
  *	<troels@thule.no>, Wolfgang Oertl <Wolfgang.Oertl@uibk.ac.at>
  *	and Thomas Roessler.
+ * Thu Apr 29 15:24:07 2004: Solar Designer <solar@openwall.com>
+ *	Prevent potential buffer overflow in reading messages from the
+ *	kernel log rinbuffer.
  */
 
 
@@ -938,7 +941,7 @@ static void LogKernelLine(void)
 	 * messages into this fresh buffer.
 	 */
 	memset(log_buffer, '\0', sizeof(log_buffer));
-	if ( (rdcnt = ksyslog(2, log_buffer, sizeof(log_buffer))) < 0 )
+	if ( (rdcnt = ksyslog(2, log_buffer, sizeof(log_buffer)-1)) < 0 )
 	{
 		if ( errno == EINTR )
 			return;
diff -uprN sysklogd-1.4.1/ksym.c sysklogd/ksym.c
--- sysklogd-1.4.1/ksym.c	2000-09-12 21:53:31 +0000
+++ sysklogd/ksym.c	2004-07-16 06:48:27 +0000
@@ -105,6 +105,15 @@
  *
  * Tue Sep 12 23:48:12 CEST 2000: Martin Schulze <joey@infodrom.ffis.de>
  *	Close symbol file in InitKsyms() when an error occurred.
+ *
+ * Thu Apr 29 18:07:16 CEST 2004: Dmitry Levin <ldv@altlinux.org>
+ *	Close file descriptor in FindSymbolFile() in order not to leak
+ *	file descriptors.
+ *
+ * Fri Jul 16 08:32:49 CEST 2004: Ulf HДrnhammar <Ulf.Harnhammar.9485@student.uu.se>
+ *	Added boundary check for fscanf() in InitKsyms() and
+ *	CheckMapVersion() to prevent an unintended crash when reading
+ *	an incorrect System.map.
  */
 
 
@@ -236,7 +245,7 @@ extern int InitKsyms(mapfile)
 	 */
 	while ( !feof(sym_file) )
 	{
-		if ( fscanf(sym_file, "%lx %c %s\n", &address, &type, sym)
+		if ( fscanf(sym_file, "%lx %c %511s\n", &address, &type, sym)
 		    != 3 )
 		{
 			Syslog(LOG_ERR, "Error in symbol table input (#1).");
@@ -344,6 +353,7 @@ static char * FindSymbolFile()
 		if ( (sym_file = fopen(symfile, "r")) != (FILE *) 0 ) {
 			if (CheckMapVersion(symfile) == 1)
 				file = symfile;
+			fclose (sym_file);
 		}
 		if (sym_file == (FILE *) 0 || file == (char *) 0) {
 			sprintf (symfile, "%s", *mf);
@@ -352,6 +362,7 @@ static char * FindSymbolFile()
 			if ( (sym_file = fopen(symfile, "r")) != (FILE *) 0 ) {
 				if (CheckMapVersion(symfile) == 1)
 					file = symfile;
+				fclose (sym_file);
 			}
 		}
 
@@ -533,7 +544,7 @@ static int CheckMapVersion(fname)
 		version = 0;
 		while ( !feof(sym_file) && (version == 0) )
 		{
-			if ( fscanf(sym_file, "%lx %c %s\n", &address, \
+			if ( fscanf(sym_file, "%lx %c %511s\n", &address, \
 				    &type, sym) != 3 )
 			{
 				Syslog(LOG_ERR, "Error in symbol table input (#2).");
@@ -899,3 +910,11 @@ extern void Syslog(int priority, char *f
 	return;
 }
 #endif
+
+/*
+ * Local variables:
+ *  c-indent-level: 8
+ *  c-basic-offset: 8
+ *  tab-width: 8
+ * End:
+ */
diff -uprN sysklogd-1.4.1/ksym_mod.c sysklogd/ksym_mod.c
--- sysklogd-1.4.1/ksym_mod.c	2000-09-12 21:15:28 +0000
+++ sysklogd/ksym_mod.c	2004-03-31 15:47:08 +0000
@@ -78,6 +78,11 @@
  *
  * Tue Sep 12 23:11:13 CEST 2000: Martin Schulze <joey@infodrom.ffis.de>
  *	Changed llseek() to lseek64() in order to skip a libc warning.
+ *
+ * Wed Mar 31 17:35:01 CEST 2004: Martin Schulze <joey@infodrom.org>
+ *	Removed references to <linux/module.h> since it doesn't work
+ *	anymore with its recent content from Linux 2.4/2.6, created
+ *	module.h locally instead.
  */
 
 
@@ -89,11 +94,12 @@
 #include <errno.h>
 #include <sys/fcntl.h>
 #include <sys/stat.h>
+#include "module.h"
 #if !defined(__GLIBC__)
 #include <linux/time.h>
-#include <linux/module.h>
+#include <linux/linkage.h>
 #else /* __GLIBC__ */
-#include <linux/module.h>
+#include <linux/linkage.h>
 extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
 extern int get_kernel_syms __P ((struct kernel_sym *__table));
 #endif /* __GLIBC__ */
@@ -107,7 +113,7 @@ extern int get_kernel_syms __P ((struct 
 
 #if !defined(__GLIBC__)
 /*
- * The following bit uses some kernel/library magic to product what
+ * The following bit uses some kernel/library magic to produce what
  * looks like a function call to user level code.  This function is
  * actually a system call in disguise.  The purpose of the getsyms
  * call is to return a current copy of the in-kernel symbol table.
diff -uprN sysklogd-1.4.1/module.h sysklogd/module.h
--- sysklogd-1.4.1/module.h	1970-01-01 00:00:00 +0000
+++ sysklogd/module.h	2004-07-27 11:36:10 +0000
@@ -0,0 +1,90 @@
+/*
+    module.h - Miscellaneous module definitions
+    Copyright (c) 1996 Richard Henderson <rth@tamu.edu>
+    Copyright (c) 2004 Martin Schulze <joey@infodrom.org>
+
+    This file is part of the sysklogd package.
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+/* ChangeLog:
+ *
+ * Wed Mar 31 17:35:01 CEST 2004: Martin Schulze <joey@infodrom.org>
+ *	Created local copy of module.h based on the content of Linux
+ *	2.2 since <linux/module.h> doesn't work anymore with its
+ *	recent content from Linux 2.4/2.6.
+ */
+
+#include <asm/atomic.h>
+
+#define MODULE_NAME_LEN 60
+
+struct kernel_sym
+{
+	unsigned long value;
+	char name[MODULE_NAME_LEN];
+};
+
+
+struct list_head {
+	struct list_head *next, *prev;
+};
+
+
+struct module_info
+{
+	unsigned long addr;
+	unsigned long size;
+	unsigned long flags;
+	long usecount;
+};
+
+
+struct module
+{
+	unsigned long size_of_struct;	/* == sizeof(module) */
+	struct module *next;
+	const char *name;
+	unsigned long size;
+
+	union
+	{
+		int usecount;
+		long pad;
+	} uc;				/* Needs to keep its size - so says rth */
+
+	unsigned long flags;		/* AUTOCLEAN et al */
+
+	unsigned nsyms;
+	unsigned ndeps;
+
+	struct module_symbol *syms;
+	struct module_ref *deps;
+	struct module_ref *refs;
+	int (*init)(void);
+	void (*cleanup)(void);
+	const struct exception_table_entry *ex_table_start;
+	const struct exception_table_entry *ex_table_end;
+#ifdef __alpha__
+	unsigned long gp;
+#endif
+	/* Members past this point are extensions to the basic
+	   module support and are optional.  Use mod_opt_member()
+	   to examine them.  */
+	const struct module_persist *persist_start;
+	const struct module_persist *persist_end;
+	int (*can_unload)(void);
+};
diff -uprN sysklogd-1.4.1/pidfile.c sysklogd/pidfile.c
--- sysklogd-1.4.1/pidfile.c	1998-02-10 22:37:12 +0000
+++ sysklogd/pidfile.c	2003-09-28 02:38:18 +0000
@@ -87,7 +87,7 @@ int write_pid (char *pidfile)
   int fd;
   int pid;
 
-  if ( ((fd = open(pidfile, O_RDWR|O_CREAT, 0644)) == -1)
+  if ( ((fd = open(pidfile, O_RDWR|O_CREAT|O_TRUNC, 0644)) == -1)
        || ((f = fdopen(fd, "r+")) == NULL) ) {
       fprintf(stderr, "Can't open or create %s.\n", pidfile);
       return 0;
diff -uprN sysklogd-1.4.1/sysklogd.8 sysklogd/sysklogd.8
--- sysklogd-1.4.1/sysklogd.8	2001-03-11 19:35:51 +0000
+++ sysklogd/sysklogd.8	2004-07-09 17:33:32 +0000
@@ -84,7 +84,7 @@ the symbol
 .B MAXFUNIX
 within the syslogd.c source file.  An example for a chroot() daemon is
 described by the people from OpenBSD at
-http://www.psionic.com/papers/dns.html.
+<http://www.guides.sk/psionic/dns/>.
 .TP
 .B "\-d"
 Turns on debug mode.  Using this the daemon will not proceed a 
@@ -117,7 +117,8 @@ logs a mark timestamp regularly.  The de
 between two \fI-- MARK --\fR lines is 20 minutes.  This can be changed
 with this option.  Setting the
 .I interval
-to zero turns it off entirely.
+to zero turns it off entirely.  Depending on other log messages
+generated these lines may not be written consecutively.
 .TP
 .B "\-n"
 Avoid auto-backgrounding.  This is needed especially if the
@@ -364,8 +365,10 @@ with the same single message. :-(
 
 To avoid this in further times no messages that were received from a
 remote host are sent out to another (or the same) remote host
-anymore.  If there are scenarios where this doesn't make sense, please
-drop me (Joey) a line.
+anymore.  If you experience are setup in which this doesn't make
+sense, please use the
+.B \-h
+commandline switch.
 
 If the remote host is located in the same domain as the host, 
 .B syslogd
diff -uprN sysklogd-1.4.1/syslog.c sysklogd/syslog.c
--- sysklogd-1.4.1/syslog.c	2001-03-11 19:35:51 +0000
+++ sysklogd/syslog.c	2003-08-27 15:56:01 +0000
@@ -47,6 +47,9 @@ static char sccsid[] = "@(#)syslog.c	5.2
  * Sun Mar 11 20:23:44 CET 2001: Martin Schulze <joey@infodrom.ffis.de>
  *	Use SOCK_DGRAM for loggin, renables it to work.	
  *
+ * Wed Aug 27 17:48:16 CEST 2003: Martin Schulze <joey@Infodrom.org>
+ *	Improved patch by Michael Pomraning <mjp@securepipe.com> to
+ *	reconnect klogd to the logger after it went away.
  */
 
 #include <sys/types.h>
@@ -98,6 +101,7 @@ vsyslog(pri, fmt, ap)
 	register char *p;
 	time_t now;
 	int fd, saved_errno;
+	int result;
 	char tbuf[2048], fmt_cpy[1024], *stdp = (char *) 0;
 
 	saved_errno = errno;
@@ -167,7 +171,16 @@ vsyslog(pri, fmt, ap)
 	}
 
 	/* output the message to the local logger */
-	if (write(LogFile, tbuf, cnt + 1) >= 0 || !(LogStat&LOG_CONS))
+	result = write(LogFile, tbuf, cnt + 1);
+
+	if (result == -1
+	    && (errno == ECONNRESET || errno == ENOTCONN || errno == ECONNREFUSED)) {
+		closelog();
+		openlog(LogTag, LogStat | LOG_NDELAY, LogFacility);
+		result = write(LogFile, tbuf, cnt + 1);
+	}
+
+	if (result >= 0 || !(LogStat&LOG_CONS))
 		return;
 
 	/*
diff -uprN sysklogd-1.4.1/syslog.conf.5 sysklogd/syslog.conf.5
--- sysklogd-1.4.1/syslog.conf.5	1999-08-21 10:49:14 +0000
+++ sysklogd/syslog.conf.5	2003-05-22 19:31:20 +0000
@@ -64,7 +64,7 @@ in
 The
 .I facility
 is one of the following keywords:
-.BR auth ", " authpriv ", " cron ", " daemon ", " kern ", " lpr ", "
+.BR auth ", " authpriv ", " cron ", " daemon ", " ftp ", " kern ", " lpr ", "
 .BR mail ", " mark ", " news ", " security " (same as " auth "), "
 .BR syslog ", " user ", " uucp " and " local0 " through " local7 .
 The keyword 
@@ -121,12 +121,21 @@ behavior you can exclude some priorities
 
 This 
 .BR syslogd (8)
-has a syntax extension to the original BSD source, that makes its use
+has a syntax extension to the original BSD source, which makes its use
 more intuitively.  You may precede every priority with an equation sign
-(``='') to specify only this single priority and not any of the
-above.  You may also (both is valid, too) precede the priority with an
-exclamation mark (``!'') to ignore all that priorities, either exact
-this one or this and any higher priority.  If you use both extensions
+(``='') to specify that
+.B syslogd
+should only refer to this single priority and not this priority and
+all higher priorities.
+
+You may also precide the priority with an exclamation mark (``!'') if
+you want
+.B syslogd
+to ignore this priority and all higher priorities.
+You may even use both, the exclamation mark and the equation sign if
+you want
+.B syslogd
+to ignore only this single priority.  If you use both extensions
 than the exclamation mark must occur before the equation sign, just
 use it intuitively.
 
@@ -300,7 +309,7 @@ This lets the
 .B syslogd
 log all messages that come with either the
 .BR info " or the " notice
-facility into the file
+priority into the file
 .IR /var/log/messages ,
 except for all messages that use the
 .B mail
diff -uprN sysklogd-1.4.1/syslogd.c sysklogd/syslogd.c
--- sysklogd-1.4.1/syslogd.c	2001-03-11 19:40:10 +0000
+++ sysklogd/syslogd.c	2004-05-04 14:52:56 +0000
@@ -441,6 +441,27 @@ static char sccsid[] = "@(#)syslogd.c	5.
  *	Don't return a closed fd if `-a' is called with a wrong path.
  *	Thanks to Bill Nottingham <notting@redhat.com> for providing
  *	a patch.
+ * Thu Apr 13 05:08:10 CEST 2001: Jon Burgess <Jon_Burgess@eur.3com.com>
+ *	Moved the installation of the signal handler up a little bit
+ *	so it guaranteed to be available when the child is forked,
+ *	hence, fixing a  race condition.  This used to create problems
+ *	with UML and fast machines.
+ *
+ * Sat Apr 17 18:03:05 CEST 2004: Steve Grubb <linux_4ever@yahoo.com>
+ *	Correct memory allocation for for commandline arguments in
+ *	crunch_list().
+ *
+ * Thu Apr 29 12:38:39 CEST 2004: Solar Designer <solar@openwall.com>
+ *	Applied Openwall paranoia patches to improve crunch_list().
+ *
+ * Tue May  4 16:47:30 CEST 2004: Solar Designer <solar@openwall.com>
+ *	Ensure that "len" is not placed in a register, and that the
+ *	endtty() signal handler is not installed too early which could
+ *	cause a segmentation fault or worse.
+ *
+ * Tue May  4 16:52:01 CEST 2004: Solar Designer <solar@openwall.com>
+ *	Adjust the size of a variable to prevent a buffer overflow
+ *	should _PATH_DEV ever contain something different than "/dev/".
  */
 
 
@@ -890,11 +911,11 @@ int main(argc, argv)
 		dprintf("Checking pidfile.\n");
 		if (!check_pid(PidFile))
 		{
+			signal (SIGTERM, doexit);
 			if (fork()) {
 				/*
 				 * Parent process
 				 */
-				signal (SIGTERM, doexit);
 				sleep(300);
 				/*
 				 * Not reached unless something major went wrong.  5
@@ -1141,13 +1162,13 @@ int main(argc, argv)
 				 */
 				printchopped(from, line, \
  					     i + 2,  finet);
-			} else if (i < 0 && errno != EINTR) {
+			} else if (i < 0 && errno != EINTR && errno != EAGAIN) {
 				dprintf("INET socket error: %d = %s.\n", \
 					errno, strerror(errno));
 				logerror("recvfrom inet");
 				/* should be harmless now that we set
 				 * BSDCOMPAT on the socket */
-				sleep(10);
+				sleep(1);
 			}
 		}
 #endif
@@ -1254,30 +1275,26 @@ char **
 crunch_list(list)
 	char *list;
 {
-	int count, i;
+	int i, m, n;
 	char *p, *q;
 	char **result = NULL;
 
 	p = list;
 	
 	/* strip off trailing delimiters */
-	while (p[strlen(p)-1] == LIST_DELIMITER) {
-		count--;
+	while (*p && p[strlen(p)-1] == LIST_DELIMITER)
 		p[strlen(p)-1] = '\0';
-	}
 	/* cut off leading delimiters */
-	while (p[0] == LIST_DELIMITER) {
-		count--;
+	while (p[0] == LIST_DELIMITER)
 		p++; 
-	}
 	
-	/* count delimiters to calculate elements */
-	for (count=i=0; p[i]; i++)
-		if (p[i] == LIST_DELIMITER) count++;
+	/* count delimiters to calculate the number of elements */
+	for (n = i = 0; p[i]; i++)
+		if (p[i] == LIST_DELIMITER) n++;
 	
-	if ((result = (char **)malloc(sizeof(char *) * count+2)) == NULL) {
+	if ((result = (char **)malloc(sizeof(char *) * (n + 2))) == NULL) {
 		printf ("Sorry, can't get enough memory, exiting.\n");
-		exit(0);
+		exit(1);
 	}
 	
 	/*
@@ -1285,30 +1302,28 @@ crunch_list(list)
 	 * characters are different from any delimiters,
 	 * so we don't have to care about this.
 	 */
-	count = 0;
-	while ((q=strchr(p, LIST_DELIMITER))) {
-		result[count] = (char *) malloc((q - p + 1) * sizeof(char));
-		if (result[count] == NULL) {
+	m = 0;
+	while ((q = strchr(p, LIST_DELIMITER)) && m < n) {
+		result[m] = (char *) malloc((q - p + 1) * sizeof(char));
+		if (result[m] == NULL) {
 			printf ("Sorry, can't get enough memory, exiting.\n");
-			exit(0);
+			exit(1);
 		}
-		strncpy(result[count], p, q - p);
-		result[count][q - p] = '\0';
+		memcpy(result[m], p, q - p);
+		result[m][q - p] = '\0';
 		p = q; p++;
-		count++;
+		m++;
 	}
-	if ((result[count] = \
-	     (char *)malloc(sizeof(char) * strlen(p) + 1)) == NULL) {
+	if ((result[m] = strdup(p)) == NULL) {
 		printf ("Sorry, can't get enough memory, exiting.\n");
-		exit(0);
+		exit(1);
 	}
-	strcpy(result[count],p);
-	result[++count] = NULL;
+	result[++m] = NULL;
 
 #if 0
-	count=0;
-	while (result[count])
-		dprintf ("#%d: %s\n", count, StripDomains[count++]);
+	m = 0;
+	while (result[m])
+		dprintf ("#%d: %s\n", m, result[m++]);
 #endif
 	return result;
 }
@@ -1815,7 +1830,7 @@ void fprintlog(f, from, flags, msg)
 			v->iov_len = 1;
 		}
 	again:
-		/* f->f_file == -1 is an indicator that the we couldn't
+		/* f->f_file == -1 is an indicator that we couldn't
 		   open the file at startup. */
 		if (f->f_file == -1)
 			break;
@@ -1891,7 +1906,7 @@ void wallmsg(f, iov)
 	register struct filed *f;
 	struct iovec *iov;
 {
-	char p[6 + UNAMESZ];
+	char p[sizeof (_PATH_DEV) + UNAMESZ];
 	register int i;
 	int ttyf, len;
 	static int reenter = 0;
@@ -1899,6 +1914,8 @@ void wallmsg(f, iov)
 	struct utmp *uptr;
 	char greetings[200];
 
+	(void) &len;
+
 	if (reenter++)
 		return;
 
@@ -1913,7 +1930,6 @@ void wallmsg(f, iov)
 	if (fork() == 0) {
 		(void) signal(SIGTERM, SIG_DFL);
 		(void) alarm(0);
-		(void) signal(SIGALRM, endtty);
 #ifndef SYSV
 		(void) signal(SIGTTOU, SIG_IGN);
 		(void) sigsetmask(0);
@@ -1929,7 +1945,7 @@ void wallmsg(f, iov)
 			/* is this slot used? */
 			if (ut.ut_name[0] == '\0')
 				continue;
-			if (ut.ut_type == LOGIN_PROCESS)
+			if (ut.ut_type != USER_PROCESS)
 			        continue;
 			if (!(strcmp (ut.ut_name,"LOGIN"))) /* paranoia */
 			        continue;
@@ -1959,6 +1975,7 @@ void wallmsg(f, iov)
 				iov[1].iov_len = 0;
 			}
 			if (setjmp(ttybuf) == 0) {
+				(void) signal(SIGALRM, endtty);
 				(void) alarm(15);
 				/* open the terminal */
 				ttyf = open(p, O_WRONLY|O_NOCTTY);
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin