SOURCES: sysklogd-bind.patch (NEW), sysklogd-querymod.patch (NEW) ...

glen glen at pld-linux.org
Thu Mar 30 01:32:28 CEST 2006


Author: glen                         Date: Wed Mar 29 23:32:28 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- from http://bugs.gentoo.org/show_bug.cgi?id=109671

---- Files affected:
SOURCES:
   sysklogd-bind.patch (NONE -> 1.1)  (NEW), sysklogd-querymod.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/sysklogd-bind.patch
diff -u /dev/null SOURCES/sysklogd-bind.patch:1.1
--- /dev/null	Thu Mar 30 01:32:28 2006
+++ SOURCES/sysklogd-bind.patch	Thu Mar 30 01:32:23 2006
@@ -0,0 +1,111 @@
+diff -ur sysklogd-1.4.1.orig/sysklogd.8 sysklogd-1.4.1/sysklogd.8
+--- sysklogd-1.4.1.orig/sysklogd.8	Sun Mar 11 22:35:51 2001
++++ sysklogd-1.4.1/sysklogd.8	Mon Oct  8 07:20:31 2001
+@@ -2,7 +2,7 @@
+ .\" May be distributed under the GNU General Public License
+ .\" Sun Aug 30 11:35:55 MET: Martin Schulze: Updates
+ .\"
+-.TH SYSKLOGD 8 "12 October 1998" "Version 1.3" "Linux System Administration"
++.TH SYSKLOGD 8 "8 October, 2001" "Version 1.4.1+CAEN/OW" "Linux System Administration"
+ .SH NAME
+ sysklogd \- Linux system logging utilities.
+ .SH SYNOPSIS
+@@ -15,6 +15,9 @@
+ .I config file
+ ]
+ .RB [ " \-h " ] 
++.RB [ " \-i "
++.I IP address
++]
+ .RB [ " \-l "
+ .I hostlist
+ ]
+@@ -103,6 +106,13 @@
+ Specifying this switch on the command line will cause the log daemon to
+ forward any remote messages it receives to forwarding hosts which have been
+ defined.
++.TP
++.BI "\-i " "IP address"
++If
++.B syslogd
++is configured to accept log input from a UDP port, specify an IP address
++to bind to, rather than the default of INADDR_ANY.  The address must be in
++dotted quad notation, DNS host names are not allowed.
+ .TP
+ .BI "\-l " "hostlist"
+ Specify a hostname that should be logged only with its simple hostname
+diff -ur sysklogd-1.4.1.orig/syslogd.c sysklogd-1.4.1/syslogd.c
+--- sysklogd-1.4.1.orig/syslogd.c	Sun Mar 11 22:40:10 2001
++++ sysklogd-1.4.1/syslogd.c	Mon Oct  8 07:24:41 2001
+@@ -736,6 +736,8 @@
+ int	NoHops = 1;		/* Can we bounce syslog messages through an
+ 				   intermediate host. */
+ 
++char	*bind_addr = NULL;	/* bind UDP port to this interface only */
++
+ extern	int errno;
+ 
+ /* Function prototypes. */
+@@ -829,7 +831,7 @@
+ 		funix[i]  = -1;
+ 	}
+ 
+-	while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:v")) != EOF)
++	while ((ch = getopt(argc, argv, "a:dhf:i:l:m:np:rs:v")) != EOF)
+ 		switch((char)ch) {
+ 		case 'a':
+ 			if (nfunix < MAXFUNIX)
+@@ -846,9 +848,17 @@
+ 		case 'h':
+ 			NoHops = 0;
+ 			break;
++		case 'i':
++			if (bind_addr) {
++				fprintf(stderr, "Only one -i argument allowed, "
++					"the first one is taken.\n");
++				break;
++			}
++			bind_addr = optarg;
++			break;
+ 		case 'l':
+ 			if (LocalHosts) {
+-				fprintf (stderr, "Only one -l argument allowed," \
++				fprintf(stderr, "Only one -l argument allowed, "
+ 					"the first one is taken.\n");
+ 				break;
+ 			}
+@@ -1175,7 +1185,7 @@
+ int usage()
+ {
+ 	fprintf(stderr, "usage: syslogd [-drvh] [-l hostlist] [-m markinterval] [-n] [-p path]\n" \
+-		" [-s domainlist] [-f conffile]\n");
++		" [-s domainlist] [-f conffile] [-i IP address]\n");
+ 	exit(1);
+ }
+ 
+@@ -1217,15 +1227,22 @@
+ 	int fd, on = 1;
+ 	struct sockaddr_in sin;
+ 
++	memset(&sin, 0, sizeof(sin));
++	sin.sin_family = AF_INET;
++	sin.sin_port = LogPort;
++	if (bind_addr) {
++		if (!inet_aton(bind_addr, &sin.sin_addr)) {
++			logerror("syslog: not a valid IP address to bind to.");
++			return -1;
++		}
++	}
++
+ 	fd = socket(AF_INET, SOCK_DGRAM, 0);
+ 	if (fd < 0) {
+ 		logerror("syslog: Unknown protocol, suspending inet service.");
+ 		return fd;
+ 	}
+ 
+-	memset(&sin, 0, sizeof(sin));
+-	sin.sin_family = AF_INET;
+-	sin.sin_port = LogPort;
+ 	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, \
+ 		       (char *) &on, sizeof(on)) < 0 ) {
+ 		logerror("setsockopt(REUSEADDR), suspending inet");

================================================================
Index: SOURCES/sysklogd-querymod.patch
diff -u /dev/null SOURCES/sysklogd-querymod.patch:1.1
--- /dev/null	Thu Mar 30 01:32:28 2006
+++ SOURCES/sysklogd-querymod.patch	Thu Mar 30 01:32:23 2006
@@ -0,0 +1,428 @@
+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	2005-10-17 23:56:17.527192000 -0400
++++ sysklogd-1.4.1/ksym_mod.c	2005-10-18 00:07:36.817712908 -0400
+@@ -128,6 +128,8 @@
+ #define getsyms get_kernel_syms
+ #endif /* __GLIBC__ */
+ 
++extern int query_module(const char *, int, void *, size_t, size_t *);
++
+ /* Variables static to this module. */
+ struct sym_table
+ {
+@@ -148,7 +150,7 @@
+ };
+ 
+ static int num_modules = 0;
+-struct Module *sym_array_modules = (struct Module *) 0;
++struct Module *sym_array_modules = NULL;
+ 
+ static int have_modules = 0;
+ 
+@@ -161,8 +163,8 @@
+ 
+ /* Function prototypes. */
+ static void FreeModules(void);
+-static int AddSymbol(struct Module *mp, unsigned long, char *);
+-static int AddModule(unsigned long, char *);
++static int AddSymbol(struct Module *mp, unsigned long, const char *);
++static int AddModule(char *);
+ static int symsort(const void *, const void *);
+ 
+ 
+@@ -185,81 +187,106 @@
+ extern int InitMsyms()
+ 
+ {
+-	auto int	rtn,
+-			tmp;
++	auto size_t	rtn;
++	auto int	tmp;
++
++	auto char	**mod_table;
++
++	char			*modbuf = NULL,
++				*newbuf;
+ 
+-	auto struct kernel_sym	*ksym_table,
+-				*p;
++	int			 modsize = 32,
++				 result;
+ 
+ 
+ 	/* Initialize the kernel module symbol table. */
+ 	FreeModules();
+ 
++	/*
++	 * New style symbol table parser.  This uses the newer query_module
++	 * function rather than the old obsolete hack of stepping thru
++	 * /dev/kmem.
++	 */
+ 
+ 	/*
+-	 * The system call which returns the kernel symbol table has
+-	 * essentialy two modes of operation.  Called with a null pointer
+-	 * the system call returns the number of symbols defined in the
+-	 * the table.
+-	 *
+-	 * The second mode of operation is to pass a valid pointer to
+-	 * the call which will then load the current symbol table into
+-	 * the memory provided.
+-	 *
+-	 * Returning the symbol table is essentially an all or nothing
+-	 * proposition so we need to pre-allocate enough memory for the
+-	 * complete table regardless of how many symbols we need.
+-	 *
+-	 * Bummer.
++	 * First, we query for the list of loaded modules.  We may
++	 * have to grow our buffer in size.
+ 	 */
+-	if ( (rtn = getsyms((struct kernel_sym *) 0)) < 0 )
+-	{
+-		if ( errno == ENOSYS )
+-			Syslog(LOG_INFO, "No module symbols loaded - "
+-			       "kernel modules not enabled.\n");
+-		else
++	do {
++		modsize+=modsize;
++		newbuf=realloc(modbuf, modsize);
++
++		if (newbuf==NULL) {
++			/* Well, that sucks. */
+ 			Syslog(LOG_ERR, "Error loading kernel symbols " \
+ 			       "- %s\n", strerror(errno));
++			if (modbuf!=NULL) free(modbuf);
++			return(0);
++		}
++
++		modbuf=newbuf;
++
++		result=query_module(NULL, QM_MODULES, modbuf, modsize, &rtn);
++
++		if (result<0 && errno!=ENOSPC) {
++			Syslog(LOG_ERR, "Error querying loaded modules " \
++			       "- %s\n", strerror(errno));
++			free(modbuf);
++			return(0);
++		}
++	} while (result<0);
++
++	if ( rtn <= 0 ) {
++		/* No modules??? */
++		Syslog(LOG_INFO, "No module symbols loaded - "
++		       "modules disabled?\n");
++		free(modbuf);
+ 		return(0);
+ 	}
+ 	if ( debugging )
+ 		fprintf(stderr, "Loading kernel module symbols - "
+ 			"Size of table: %d\n", rtn);
+ 
+-	ksym_table = (struct kernel_sym *) malloc(rtn * \
+-						  sizeof(struct kernel_sym));
+-	if ( ksym_table == (struct kernel_sym *) 0 )
++	mod_table = (char **) malloc(rtn * sizeof(char *));
++	if ( mod_table == NULL )
+ 	{
+ 		Syslog(LOG_WARNING, " Failed memory allocation for kernel " \
+ 		       "symbol table.\n");
++		free(modbuf);
+ 		return(0);
+ 	}
+-	if ( (rtn = getsyms(ksym_table)) < 0 )
++
++	sym_array_modules = (struct Module *) malloc(rtn * sizeof(struct Module));
++	if ( sym_array_modules == NULL )
+ 	{
+-		Syslog(LOG_WARNING, "Error reading kernel symbols - %s\n", \
+-		       strerror(errno));
++		Syslog(LOG_WARNING, " Failed memory allocation for kernel " \
++		       "symbol table.\n");
++		free(mod_table);
++		free(modbuf);
+ 		return(0);
+ 	}
+ 
+-
+ 	/*
+ 	 * Build a symbol table compatible with the other one used by
+ 	 * klogd.
+ 	 */
+-	tmp = rtn;
+-	p = ksym_table;
+-	while ( tmp-- )
++	newbuf=modbuf;
++	for (tmp=rtn-1; tmp>=0; tmp--)
+ 	{
+- 		if ( !AddModule(p->value, p->name) )
++		mod_table[tmp]=newbuf;
++		newbuf+=(strlen(newbuf)+1);
++ 		if ( !AddModule(mod_table[tmp]) )
+ 		{
+ 			Syslog(LOG_WARNING, "Error adding kernel module table "
+ 				"entry.\n");
+-			free(ksym_table);
++			free(mod_table);
++			free(modbuf);
+ 			return(0);
+ 		}
+-		++p;
+ 	}
+ 
++	have_modules = 1;
++
+ 	/* Sort the symbol tables in each module. */
+ 	for (rtn = tmp= 0; tmp < num_modules; ++tmp)
+ 	{
+@@ -277,7 +304,8 @@
+ 		Syslog(LOG_INFO, "Loaded %d %s from %d module%s", rtn, \
+ 		       (rtn == 1) ? "symbol" : "symbols", \
+ 		       num_modules, (num_modules == 1) ? "." : "s.");
+-	free(ksym_table);
++	free(mod_table);
++	free(modbuf);
+ 	return(1);
+ }
+ 
+@@ -322,23 +350,23 @@
+ 
+ 	/* Check to see if the module symbol tables need to be cleared. */
+ 	have_modules = 0;
+-	if ( num_modules == 0 )
+-		return;
+-
+ 
+-	for (nmods= 0; nmods < num_modules; ++nmods)
+-	{
+-		mp = &sym_array_modules[nmods];
+-		if ( mp->num_syms == 0 )
+-			continue;
++	if (sym_array_modules != NULL) {
++		for (nmods= 0; nmods < num_modules; ++nmods)
++		{
++			mp = &sym_array_modules[nmods];
++			if ( mp->num_syms == 0 )
++				continue;
+ 	       
+-		for (nsyms= 0; nsyms < mp->num_syms; ++nsyms)
+-			free(mp->sym_array[nsyms].name);
+-		free(mp->sym_array);
++			for (nsyms= 0; nsyms < mp->num_syms; ++nsyms)
++				free(mp->sym_array[nsyms].name);
++			free(mp->sym_array);
++		}
++
++		free(sym_array_modules);
++		sym_array_modules = NULL;
+ 	}
+ 
+-	free(sym_array_modules);
+-	sym_array_modules = (struct Module *) 0;
+ 	num_modules = 0;
+ 	return;
+ }
+@@ -350,23 +378,25 @@
+  * Purpose:	This function is responsible for adding a module to
+  *		the list of currently loaded modules.
+  *
+- * Arguements:	(unsigned long) address, (char *) symbol
+- *
+- *		address:->	The address of the module.
++ * Arguements:	(char *) symbol
+  *
+  *		symbol:->	The name of the module.
+  *
+  * Return:	int
+  **************************************************************************/
+ 
+-static int AddModule(address, symbol)
+-
+-     unsigned long address;
++static int AddModule(symbol)
+ 
+      char *symbol;
+ 
+ {
+-	auto int memfd;
++	size_t rtn;
++	size_t i;
++	const char *cbuf;
++	int symsize=128;
++	int result;
++	struct module_symbol *symbuf=NULL,
++			     *newbuf;
+ 
+ 	auto struct Module *mp;
+ 
+@@ -374,78 +404,75 @@
+ 	/* Return if we have loaded the modules. */
+ 	if ( have_modules )
+ 		return(1);
++	
++	/* We already have space for the module. */
++	mp = &sym_array_modules[num_modules];
++
++	if (query_module(symbol, QM_INFO, &sym_array_modules[num_modules].module,
++			 sizeof(struct module), &rtn)<0)
++	{
++		Syslog(LOG_WARNING, "Error reading module info for %s.\n",
++		       symbol);
++		return(0);
++	}
++
++	/* Save the module name. */
++	mp->name = strdup(symbol);
++	if ( mp->name == NULL )
++		return(0);
++
++	mp->num_syms = 0;
++	mp->sym_array = NULL;
++	++num_modules;
+ 
+ 	/*
+-	 * The following section of code is responsible for determining
+-	 * whether or not we are done reading the list of modules.
++	 * First, we query for the list of exported symbols.  We may
++	 * have to grow our buffer in size.
+ 	 */
+-	if ( symbol[0] == '#' )
+-	{
++	do {
++		symsize+=symsize;
++		newbuf=realloc(symbuf, symsize);
+ 
+-		if ( symbol[1] == '\0' )
+-		{
+-			/*
+-			 * A symbol which consists of a # sign only
+-			 * signifies a a resident kernel segment.  When we
+-			 * hit one of these we are done reading the
+-			 * module list.
+-			 */
+-			have_modules = 1;
+-			return(1);
+-		}
+-		/* Allocate space for the module. */
+-		sym_array_modules = (struct Module *) \
+-			realloc(sym_array_modules, \
+-				(num_modules+1) * sizeof(struct Module));
+-		if ( sym_array_modules == (struct Module *) 0 )
+-		{
+-			Syslog(LOG_WARNING, "Cannot allocate Module array.\n");
++		if (newbuf==NULL) {
++			/* Well, that sucks. */
++			Syslog(LOG_ERR, "Error loading kernel symbols " \
++			       "- %s\n", strerror(errno));
++			if (symbuf!=NULL) free(symbuf);
+ 			return(0);
+ 		}
+-		mp = &sym_array_modules[num_modules];
+ 
+-		if ( (memfd = open("/dev/kmem", O_RDONLY)) < 0 )
+-		{
+-			Syslog(LOG_WARNING, "Error opening /dev/kmem\n");
+-			return(0);
+-		}
+-		if ( lseek64(memfd, address, SEEK_SET) < 0 )
+-		{
+-			Syslog(LOG_WARNING, "Error seeking in /dev/kmem\n");
+-			Syslog(LOG_WARNING, "Symbol %s, value %08x\n", symbol, address);
+-			return(0);
+-		}
+-		if ( read(memfd, \
+-			  (char *)&sym_array_modules[num_modules].module,  \
+-			  sizeof(struct module)) < 0 )
+-		{
+-			Syslog(LOG_WARNING, "Error reading module "
+-			       "descriptor.\n");
+-			return(0);
+-		}
+-		close(memfd);
++		symbuf=newbuf;
++
++		result=query_module(symbol, QM_SYMBOLS, symbuf, symsize, &rtn);
+ 
+-		/* Save the module name. */
+-		mp->name = (char *) malloc(strlen(&symbol[1]) + 1);
+-		if ( mp->name == (char *) 0 )
++		if (result<0 && errno!=ENOSPC) {
++			Syslog(LOG_ERR, "Error querying symbol list for %s " \
++			       "- %s\n", symbol, strerror(errno));
++			free(symbuf);
+ 			return(0);
+-		strcpy(mp->name, &symbol[1]);
++		}
++	} while (result<0);
+ 
+-		mp->num_syms = 0;
+-		mp->sym_array = (struct sym_table *) 0;
+-		++num_modules;
+-		return(1);
+-	}
+-	else
+-	{
+-	    if (num_modules > 0)
+-		mp = &sym_array_modules[num_modules - 1];
+-	    else
+-		mp = &sym_array_modules[0];
+-		AddSymbol(mp, address, symbol);
++	if ( rtn < 0 ) {
++		/* No symbols??? */
++		Syslog(LOG_INFO, "No module symbols loaded - unknown error.\n");
++		free(symbuf);
++		return(0);
+ 	}
+ 
++	cbuf=(char *)symbuf;
++
++	for (i=0; i<rtn; i++) {
++		if (num_modules > 0)
++			mp = &sym_array_modules[num_modules - 1];
++		else
++			mp = &sym_array_modules[0];
++
++		AddSymbol(mp, symbuf[i].value,
++			  cbuf+(unsigned long)(symbuf[i].name));
++	}
+ 
++	free(symbuf);
+ 	return(1);
+ }
+ 
+@@ -477,7 +504,7 @@
+ 
+ 	unsigned long address;
+ 	
+-	char *symbol;
++	const char *symbol;
+ 	
+ {
+ 	auto int tmp;
+diff -Naur sysklogd-1.4.1-orig/module.h sysklogd-1.4.1/module.h
+--- sysklogd-1.4.1-orig/module.h	2005-10-17 23:56:17.530192000 -0400
++++ sysklogd-1.4.1/module.h	2005-10-18 00:05:23.308858441 -0400
+@@ -38,11 +38,24 @@
+ 	char name[MODULE_NAME_LEN];
+ };
+ 
++struct module_symbol
++{
++	unsigned long value;
++	const char *name;
++};
+ 
+ struct list_head {
+ 	struct list_head *next, *prev;
+ };
+ 
++/* Values for query_module's which.  */
++
++#define QM_MODULES		1
++#define QM_DEPS			2
++#define QM_REFS			3
++#define QM_SYMBOLS		4
++#define QM_INFO			5
++
+ 
+ struct module_info
+ {
================================================================


More information about the pld-cvs-commit mailing list