Jim Gifford wrote:
Andrew Benton wrote:
Sysklog-1.4.1 seems to have a problem with asm/atomic.h
If it includes asm/processor.h then the sysklog build errors out like
this
andy:/sources/sysklogd-1.4.1$ make
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
-DSYSLOG_INET -DSYSLOG_UNIXAF -DNO_SCCS -DFSSTND
-DSYSLOGD_PIDNAME=\"syslogd.pid\" -c syslogd.cgcc -O3 -DSYSV
-fomit-frame-pointer -Wall -fno-strength-reduce -c pidfile.c
gcc -s -o syslogd syslogd.o pidfile.o
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
-DFSSTND -c klogd.c
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
-DALLOW_KERNEL_LOGGING -c syslog.c
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
-DFSSTND -c ksym.c
gcc -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
-DFSSTND -c ksym_mod.c
In file included from /usr/include/asm/atomic.h:5,
from module.h:31,
from ksym_mod.c:97:
/usr/include/asm/processor.h:70: error: ‘CONFIG_X86_L1_CACHE_SHIFT’
undeclared here (not in a function)
/usr/include/asm/processor.h:70: error: requested alignment is not a
constant
make: *** [ksym_mod.o] Error 1
If I remove the #include <asm/processor.h> and #include
<linux/compiler.h> from <asm/atomic.h> then everything builds fine.
Andy
Thanx Andrew, wondering why I never got this error. I'm looking into a
fix right now.
Another solution is to alter the patch we apply to sysklogd.
<asm/atomic.h> is pulled in by the module.h file created by the
sysklogd-1.4.1-fixes-1.patch. We could alter that to also create an
atomic.h file in the sysklogd sources and include that instead of
/usr/include/asm/atomic.h.
Andy
diff -Naur sysklogd-1.4.1-orig/atomic.h sysklogd-1.4.1/atomic.h
--- sysklogd-1.4.1-orig/atomic.h 1970-01-01 01:00:00.000000000 +0100
+++ sysklogd-1.4.1/atomic.h 2006-03-12 20:33:56.000000000 +0000
@@ -0,0 +1,253 @@
+#ifndef __ARCH_I386_ATOMIC__
+#define __ARCH_I386_ATOMIC__
+
+/*
+ * Atomic operations that C can't guarantee us. Useful for
+ * resource counting etc..
+ */
+
+#ifdef CONFIG_SMP
+#define LOCK "lock ; "
+#else
+#define LOCK ""
+#endif
+
+/*
+ * Make sure gcc doesn't try to be clever and move things around
+ * on us. We need to use _exactly_ the address the user gave us,
+ * not some alias that contains the same information.
+ */
+typedef struct { volatile int counter; } atomic_t;
+
+#define ATOMIC_INIT(i) { (i) }
+
+/**
+ * atomic_read - read atomic variable
+ * @v: pointer of type atomic_t
+ *
+ * Atomically reads the value of @v.
+ */
+#define atomic_read(v) ((v)->counter)
+
+/**
+ * atomic_set - set atomic variable
+ * @v: pointer of type atomic_t
+ * @i: required value
+ *
+ * Atomically sets the value of @v to @i.
+ */
+#define atomic_set(v,i) (((v)->counter) = (i))
+
+/**
+ * atomic_add - add integer to atomic variable
+ * @i: integer value to add
+ * @v: pointer of type atomic_t
+ *
+ * Atomically adds @i to @v.
+ */
+static __inline__ void atomic_add(int i, atomic_t *v)
+{
+ __asm__ __volatile__(
+ LOCK "addl %1,%0"
+ :"=m" (v->counter)
+ :"ir" (i), "m" (v->counter));
+}
+
+/**
+ * atomic_sub - subtract the atomic variable
+ * @i: integer value to subtract
+ * @v: pointer of type atomic_t
+ *
+ * Atomically subtracts @i from @v.
+ */
+static __inline__ void atomic_sub(int i, atomic_t *v)
+{
+ __asm__ __volatile__(
+ LOCK "subl %1,%0"
+ :"=m" (v->counter)
+ :"ir" (i), "m" (v->counter));
+}
+
+/**
+ * atomic_sub_and_test - subtract value from variable and test result
+ * @i: integer value to subtract
+ * @v: pointer of type atomic_t
+ *
+ * Atomically subtracts @i from @v and returns
+ * true if the result is zero, or false for all
+ * other cases.
+ */
+static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
+{
+ unsigned char c;
+
+ __asm__ __volatile__(
+ LOCK "subl %2,%0; sete %1"
+ :"=m" (v->counter), "=qm" (c)
+ :"ir" (i), "m" (v->counter) : "memory");
+ return c;
+}
+
+/**
+ * atomic_inc - increment atomic variable
+ * @v: pointer of type atomic_t
+ *
+ * Atomically increments @v by 1.
+ */
+static __inline__ void atomic_inc(atomic_t *v)
+{
+ __asm__ __volatile__(
+ LOCK "incl %0"
+ :"=m" (v->counter)
+ :"m" (v->counter));
+}
+
+/**
+ * atomic_dec - decrement atomic variable
+ * @v: pointer of type atomic_t
+ *
+ * Atomically decrements @v by 1.
+ */
+static __inline__ void atomic_dec(atomic_t *v)
+{
+ __asm__ __volatile__(
+ LOCK "decl %0"
+ :"=m" (v->counter)
+ :"m" (v->counter));
+}
+
+/**
+ * atomic_dec_and_test - decrement and test
+ * @v: pointer of type atomic_t
+ *
+ * Atomically decrements @v by 1 and
+ * returns true if the result is 0, or false for all other
+ * cases.
+ */
+static __inline__ int atomic_dec_and_test(atomic_t *v)
+{
+ unsigned char c;
+
+ __asm__ __volatile__(
+ LOCK "decl %0; sete %1"
+ :"=m" (v->counter), "=qm" (c)
+ :"m" (v->counter) : "memory");
+ return c != 0;
+}
+
+/**
+ * atomic_inc_and_test - increment and test
+ * @v: pointer of type atomic_t
+ *
+ * Atomically increments @v by 1
+ * and returns true if the result is zero, or false for all
+ * other cases.
+ */
+static __inline__ int atomic_inc_and_test(atomic_t *v)
+{
+ unsigned char c;
+
+ __asm__ __volatile__(
+ LOCK "incl %0; sete %1"
+ :"=m" (v->counter), "=qm" (c)
+ :"m" (v->counter) : "memory");
+ return c != 0;
+}
+
+/**
+ * atomic_add_negative - add and test if negative
+ * @v: pointer of type atomic_t
+ * @i: integer value to add
+ *
+ * Atomically adds @i to @v and returns true
+ * if the result is negative, or false when
+ * result is greater than or equal to zero.
+ */
+static __inline__ int atomic_add_negative(int i, atomic_t *v)
+{
+ unsigned char c;
+
+ __asm__ __volatile__(
+ LOCK "addl %2,%0; sets %1"
+ :"=m" (v->counter), "=qm" (c)
+ :"ir" (i), "m" (v->counter) : "memory");
+ return c;
+}
+
+/**
+ * atomic_add_return - add and return
+ * @v: pointer of type atomic_t
+ * @i: integer value to add
+ *
+ * Atomically adds @i to @v and returns @i + @v
+ */
+static __inline__ int atomic_add_return(int i, atomic_t *v)
+{
+ int __i;
+#ifdef CONFIG_M386
+ if(unlikely(boot_cpu_data.x86==3))
+ goto no_xadd;
+#endif
+ /* Modern 486+ processor */
+ __i = i;
+ __asm__ __volatile__(
+ LOCK "xaddl %0, %1;"
+ :"=r"(i)
+ :"m"(v->counter), "0"(i));
+ return i + __i;
+
+#ifdef CONFIG_M386
+no_xadd: /* Legacy 386 processor */
+ local_irq_disable();
+ __i = atomic_read(v);
+ atomic_set(v, i + __i);
+ local_irq_enable();
+ return i + __i;
+#endif
+}
+
+static __inline__ int atomic_sub_return(int i, atomic_t *v)
+{
+ return atomic_add_return(-i,v);
+}
+
+#define atomic_cmpxchg(v, old, new) ((int)cmpxchg(&((v)->counter), old, new))
+
+/**
+ * atomic_add_unless - add unless the number is a given value
+ * @v: pointer of type atomic_t
+ * @a: the amount to add to v...
+ * @u: ...unless v is equal to u.
+ *
+ * Atomically adds @a to @v, so long as it was not @u.
+ * Returns non-zero if @v was not @u, and zero otherwise.
+ */
+#define atomic_add_unless(v, a, u) \
+({ \
+ int c, old; \
+ c = atomic_read(v); \
+ while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \
+ c = old; \
+ c != (u); \
+})
+#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
+
+#define atomic_inc_return(v) (atomic_add_return(1,v))
+#define atomic_dec_return(v) (atomic_sub_return(1,v))
+
+/* These are x86-specific, used by some header files */
+#define atomic_clear_mask(mask, addr) \
+__asm__ __volatile__(LOCK "andl %0,%1" \
+: : "r" (~(mask)),"m" (*addr) : "memory")
+
+#define atomic_set_mask(mask, addr) \
+__asm__ __volatile__(LOCK "orl %0,%1" \
+: : "r" (mask),"m" (*(addr)) : "memory")
+
+/* Atomic operations are already serializing on x86 */
+#define smp_mb__before_atomic_dec() barrier()
+#define smp_mb__after_atomic_dec() barrier()
+#define smp_mb__before_atomic_inc() barrier()
+#define smp_mb__after_atomic_inc() barrier()
+
+#endif
diff -Naur sysklogd-1.4.1-orig/CHANGES sysklogd-1.4.1/CHANGES
--- sysklogd-1.4.1-orig/CHANGES 2001-03-11 19:35:51.000000000 +0000
+++ sysklogd-1.4.1/CHANGES 2006-03-12 20:32:25.000000000 +0000
@@ -1,3 +1,42 @@
+Version 1.4.2
+
+ . Dmitry V. Levin <[EMAIL PROTECTED]>
+ - Close file descriptor in FindSymbolFile() in ksym.c in order not to
+ leak file descriptors.
+ . Solar Designer <[EMAIL PROTECTED]>
+ - improve crunch_list()
+ - Prevent potential buffer overflow in reading messages from the
+ kernel log ringbuffer.
+ - 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.
+ . Steve Grubb <[EMAIL PROTECTED]>
+ - fix memory calculation in crunch_list()
+ . Martin Schulze <[EMAIL PROTECTED]>
+ - 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
+ - Makefile improvements
+ - Local copy of module.h
+ - Improved sysklogd.8
+ - Always log with syslogd's timezone and locale
+ - Remove trailing newline when forwarding messages
+ . Jon Burgess <[EMAIL PROTECTED]>
+ - 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.
+ . Greg Trounson <[EMAIL PROTECTED]>
+ - Improved README.linux
+ . Ulf Härnhammar <[EMAIL PROTECTED]>
+ - Bondary check for fscanf() in InitKsyms() and CheckMapVersion()
+ . Colin Phipps <[EMAIL PROTECTED]>
+ - Don't block on the network socket in case of package los
+ . Dirk Mueller <[EMAIL PROTECTED]>
+ - Don't crash when filesize limit is reached (e.g. without LFS)
+
+
Version 1.4.1
. klogd will set the console log level only if `-c' is given on the
@@ -30,3 +69,9 @@
. Olaf Kirch <[EMAIL PROTECTED]>
- 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
+fill-column: 72
+End:
diff -Naur sysklogd-1.4.1-orig/klogd.8 sysklogd-1.4.1/klogd.8
--- sysklogd-1.4.1-orig/klogd.8 2001-03-11 19:35:51.000000000 +0000
+++ sysklogd-1.4.1/klogd.8 2006-03-12 20:32:25.000000000 +0000
@@ -321,7 +321,7 @@
.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 -Naur sysklogd-1.4.1-orig/klogd.c sysklogd-1.4.1/klogd.c
--- sysklogd-1.4.1-orig/klogd.c 2001-03-11 19:40:10.000000000 +0000
+++ sysklogd-1.4.1/klogd.c 2006-03-12 20:32:25.000000000 +0000
@@ -243,6 +243,9 @@
* people have submitted patches: Troels Walsted Hansen
* <[EMAIL PROTECTED]>, Wolfgang Oertl <[EMAIL PROTECTED]>
* and Thomas Roessler.
+ * Thu Apr 29 15:24:07 2004: Solar Designer <[EMAIL PROTECTED]>
+ * Prevent potential buffer overflow in reading messages from the
+ * kernel log rinbuffer.
*/
@@ -938,7 +941,7 @@
* 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 -Naur sysklogd-1.4.1-orig/ksym.c sysklogd-1.4.1/ksym.c
--- sysklogd-1.4.1-orig/ksym.c 2000-09-12 22:53:31.000000000 +0100
+++ sysklogd-1.4.1/ksym.c 2006-03-12 20:32:25.000000000 +0000
@@ -105,6 +105,15 @@
*
* Tue Sep 12 23:48:12 CEST 2000: Martin Schulze <[EMAIL PROTECTED]>
* Close symbol file in InitKsyms() when an error occurred.
+ *
+ * Thu Apr 29 18:07:16 CEST 2004: Dmitry Levin <[EMAIL PROTECTED]>
+ * Close file descriptor in FindSymbolFile() in order not to leak
+ * file descriptors.
+ *
+ * Fri Jul 16 08:32:49 CEST 2004: Ulf Härnhammar <[EMAIL PROTECTED]>
+ * Added boundary check for fscanf() in InitKsyms() and
+ * CheckMapVersion() to prevent an unintended crash when reading
+ * an incorrect System.map.
*/
@@ -236,7 +245,7 @@
*/
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 @@
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 @@
if ( (sym_file = fopen(symfile, "r")) != (FILE *) 0 ) {
if (CheckMapVersion(symfile) == 1)
file = symfile;
+ fclose (sym_file);
}
}
@@ -533,7 +544,7 @@
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 @@
return;
}
#endif
+
+/*
+ * Local variables:
+ * c-indent-level: 8
+ * c-basic-offset: 8
+ * tab-width: 8
+ * End:
+ */
diff -Naur sysklogd-1.4.1-orig/ksym_mod.c sysklogd-1.4.1/ksym_mod.c
--- sysklogd-1.4.1-orig/ksym_mod.c 2000-09-12 22:15:28.000000000 +0100
+++ sysklogd-1.4.1/ksym_mod.c 2006-03-12 20:32:25.000000000 +0000
@@ -78,6 +78,11 @@
*
* Tue Sep 12 23:11:13 CEST 2000: Martin Schulze <[EMAIL PROTECTED]>
* Changed llseek() to lseek64() in order to skip a libc warning.
+ *
+ * Wed Mar 31 17:35:01 CEST 2004: Martin Schulze <[EMAIL PROTECTED]>
+ * 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 @@
#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 -Naur sysklogd-1.4.1-orig/Makefile sysklogd-1.4.1/Makefile
--- sysklogd-1.4.1-orig/Makefile 1998-10-12 21:25:15.000000000 +0100
+++ sysklogd-1.4.1/Makefile 2006-03-12 20:32:25.000000000 +0000
@@ -4,12 +4,15 @@
#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 @@
# 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} -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 -Naur sysklogd-1.4.1-orig/module.h sysklogd-1.4.1/module.h
--- sysklogd-1.4.1-orig/module.h 1970-01-01 01:00:00.000000000 +0100
+++ sysklogd-1.4.1/module.h 2006-03-12 20:32:55.000000000 +0000
@@ -0,0 +1,90 @@
+/*
+ module.h - Miscellaneous module definitions
+ Copyright (c) 1996 Richard Henderson <[EMAIL PROTECTED]>
+ Copyright (c) 2004 Martin Schulze <[EMAIL PROTECTED]>
+
+ 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 <[EMAIL PROTECTED]>
+ * 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 "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 -Naur sysklogd-1.4.1-orig/pidfile.c sysklogd-1.4.1/pidfile.c
--- sysklogd-1.4.1-orig/pidfile.c 1998-02-10 22:37:12.000000000 +0000
+++ sysklogd-1.4.1/pidfile.c 2006-03-12 20:32:25.000000000 +0000
@@ -87,7 +87,7 @@
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 -Naur sysklogd-1.4.1-orig/README.1st sysklogd-1.4.1/README.1st
--- sysklogd-1.4.1-orig/README.1st 1997-06-02 18:21:39.000000000 +0100
+++ sysklogd-1.4.1/README.1st 2006-03-12 20:32:25.000000000 +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 @@
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 -Naur sysklogd-1.4.1-orig/README.linux sysklogd-1.4.1/README.linux
--- sysklogd-1.4.1-orig/README.linux 1999-01-19 00:09:12.000000000 +0000
+++ sysklogd-1.4.1/README.linux 2006-03-12 20:32:25.000000000 +0000
@@ -40,12 +40,17 @@
a useful addition to the software gene pool.
There is a mailing list covering this package and syslog in general.
-The lists address is [EMAIL PROTECTED] . To subscribe send a
-mail to [EMAIL PROTECTED] with a line "subscribe sysklogd"
+The lists address is [EMAIL PROTECTED] . To subscribe send a
+mail to [EMAIL PROTECTED] 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 [EMAIL PROTECTED] 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 @@
Martin Schulze
Infodrom Oldenburg
[EMAIL PROTECTED]
[EMAIL PROTECTED]
-And a host of bug reporters whose contributions cannot be underestimated.
+And a number of bug reporters whose contributions cannot be underestimated.
diff -Naur sysklogd-1.4.1-orig/sysklogd.8 sysklogd-1.4.1/sysklogd.8
--- sysklogd-1.4.1-orig/sysklogd.8 2001-03-11 19:35:51.000000000 +0000
+++ sysklogd-1.4.1/sysklogd.8 2006-03-12 20:32:25.000000000 +0000
@@ -84,7 +84,7 @@
.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 @@
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 @@
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 -Naur sysklogd-1.4.1-orig/syslog.c sysklogd-1.4.1/syslog.c
--- sysklogd-1.4.1-orig/syslog.c 2001-03-11 19:35:51.000000000 +0000
+++ sysklogd-1.4.1/syslog.c 2006-03-12 20:32:25.000000000 +0000
@@ -47,6 +47,9 @@
* Sun Mar 11 20:23:44 CET 2001: Martin Schulze <[EMAIL PROTECTED]>
* Use SOCK_DGRAM for loggin, renables it to work.
*
+ * Wed Aug 27 17:48:16 CEST 2003: Martin Schulze <[EMAIL PROTECTED]>
+ * Improved patch by Michael Pomraning <[EMAIL PROTECTED]> to
+ * reconnect klogd to the logger after it went away.
*/
#include <sys/types.h>
@@ -98,6 +101,7 @@
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 @@
}
/* 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 -Naur sysklogd-1.4.1-orig/syslog.conf.5 sysklogd-1.4.1/syslog.conf.5
--- sysklogd-1.4.1-orig/syslog.conf.5 1999-08-21 11:49:14.000000000 +0100
+++ sysklogd-1.4.1/syslog.conf.5 2006-03-12 20:32:25.000000000 +0000
@@ -64,7 +64,7 @@
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 @@
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 @@
.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 -Naur sysklogd-1.4.1-orig/syslogd.c sysklogd-1.4.1/syslogd.c
--- sysklogd-1.4.1-orig/syslogd.c 2001-03-11 19:40:10.000000000 +0000
+++ sysklogd-1.4.1/syslogd.c 2006-03-12 20:32:25.000000000 +0000
@@ -441,6 +441,39 @@
* Don't return a closed fd if `-a' is called with a wrong path.
* Thanks to Bill Nottingham <[EMAIL PROTECTED]> for providing
* a patch.
+ * Thu Apr 13 05:08:10 CEST 2001: Jon Burgess <[EMAIL PROTECTED]>
+ * 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 <[EMAIL PROTECTED]>
+ * Correct memory allocation for for commandline arguments in
+ * crunch_list().
+ *
+ * Thu Apr 29 12:38:39 CEST 2004: Solar Designer <[EMAIL PROTECTED]>
+ * Applied Openwall paranoia patches to improve crunch_list().
+ *
+ * Tue May 4 16:47:30 CEST 2004: Solar Designer <[EMAIL PROTECTED]>
+ * 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 <[EMAIL PROTECTED]>
+ * Adjust the size of a variable to prevent a buffer overflow
+ * should _PATH_DEV ever contain something different than "/dev/".
+ *
+ * Tue Nov 2 20:28:23 CET 2004: Colin Phipps <[EMAIL PROTECTED]>
+ * Don't block on the network socket, in case a packet gets lost
+ * between select and recv.
+ *
+ * Sun Nov 7 12:28:47 CET 2004: Martin Schulze <[EMAIL PROTECTED]>
+ * Discard any timestamp information found in received syslog
+ * messages. This will affect local messages sent from a
+ * different timezone.
+ *
+ * Sun Nov 7 13:47:00 CET 2004: Martin Schulze <[EMAIL PROTECTED]>
+ * Remove trailing newline when forwarding messages.
*/
@@ -890,11 +923,11 @@
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
@@ -992,6 +1025,7 @@
(void) signal(SIGCHLD, reapchild);
(void) signal(SIGALRM, domark);
(void) signal(SIGUSR1, Debug ? debug_switch : SIG_IGN);
+ (void) signal(SIGXFSZ, SIG_IGN);
(void) alarm(TIMERINTVL);
/* Create a partial message table for all file descriptors. */
@@ -1141,13 +1175,13 @@
*/
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
@@ -1216,6 +1250,7 @@
{
int fd, on = 1;
struct sockaddr_in sin;
+ int sockflags;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
@@ -1241,6 +1276,24 @@
close(fd);
return -1;
}
+ /* We must not block on the network socket, in case a packet
+ * gets lost between select and recv, otherise the process
+ * 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) {
+ logerror("fcntl(O_NONBLOCK), suspending inet");
+ close(fd);
+ return -1;
+ }
if (bind(fd, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
logerror("bind, suspending inet");
close(fd);
@@ -1254,30 +1307,26 @@
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 +1334,28 @@
* 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;
}
@@ -1548,21 +1595,25 @@
/*
* Check to see if msg looks non-standard.
+ *
+ * A message looks like
+ * Nov 17 11:42:33 CRON[
+ * 01234567890123456
+ * ^ ^ ^ ^ ^
+ *
+ * Remote messages are not accompanied by a timestamp.
+ * Local messages are accompanied by a timestamp (program's timezone)
*/
msglen = strlen(msg);
- if (msglen < 16 || msg[3] != ' ' || msg[6] != ' ' ||
- msg[9] != ':' || msg[12] != ':' || msg[15] != ' ')
- flags |= ADDDATE;
-
- (void) time(&now);
- if (flags & ADDDATE)
- timestamp = ctime(&now) + 4;
- else {
- timestamp = msg;
+ if (!(msglen < 16 || msg[3] != ' ' || msg[6] != ' ' ||
+ msg[9] != ':' || msg[12] != ':' || msg[15] != ' ')) {
msg += 16;
msglen -= 16;
}
+ (void) time(&now);
+ timestamp = ctime(&now) + 4;
+
/* extract facility and priority level */
if (flags & MARK)
fac = LOG_NFACILITIES;
@@ -1771,7 +1822,7 @@
dprintf("Not sending message to remote.\n");
else {
f->f_time = now;
- (void) snprintf(line, sizeof(line), "<%d>%s\n", f->f_prevpri, \
+ (void) snprintf(line, sizeof(line), "<%d>%s", f->f_prevpri, \
(char *) iov[4].iov_base);
l = strlen(line);
if (l > MAXLINE)
@@ -1815,7 +1866,7 @@
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;
@@ -1852,7 +1903,7 @@
errno = e;
logerror(f->f_un.f_fname);
}
- } else if (f->f_flags & SYNC_FILE)
+ } else if (f->f_type == F_FILE && (f->f_flags & SYNC_FILE))
(void) fsync(f->f_file);
break;
@@ -1891,7 +1942,7 @@
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 +1950,8 @@
struct utmp *uptr;
char greetings[200];
+ (void) &len;
+
if (reenter++)
return;
@@ -1913,7 +1966,6 @@
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 +1981,7 @@
/* 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 +2011,7 @@
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);
--
http://linuxfromscratch.org/mailman/listinfo/lfs-dev
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page