syslogd/sysklogd-1.4.1-klogd24.dif
Dirk Mueller 2144a0b3f4 Accepting request 28151 from home:jengelh:branches:Base:System
Copy from home:jengelh:branches:Base:System/syslogd via accept of submit request 28151 revision 3.
Request was accepted with message:
thanks!

OBS-URL: https://build.opensuse.org/request/show/28151
OBS-URL: https://build.opensuse.org/package/show/Base:System/syslogd?expand=0&rev=12
2010-01-06 17:06:41 +00:00

503 lines
14 KiB
Plaintext

Index: klogd.c
===================================================================
--- klogd.c.orig 2001-03-11 20:40:10.000000000 +0100
+++ klogd.c 2009-11-24 18:12:53.393383000 +0100
@@ -879,7 +879,7 @@ static void LogLine(char *ptr, int len)
{
auto int sym_space;
- unsigned long value;
+ uintptr_t value;
auto struct symbol sym;
auto char *symbol;
@@ -904,7 +904,7 @@ static void LogLine(char *ptr, int len)
break;
}
- delta = sprintf( sym_start, "%s+%d/%d]",
+ delta = sprintf( sym_start, "%s+%llu/%zu]",
symbol, sym.offset, sym.size );
space = sym_space + delta;
Index: ksym.c
===================================================================
--- ksym.c.orig 2009-11-24 18:12:52.901406000 +0100
+++ ksym.c 2009-11-24 18:12:53.397383000 +0100
@@ -122,7 +122,7 @@
/* Variables static to this module. */
struct sym_table
{
- unsigned long value;
+ uintptr_t value;
char *name;
};
@@ -151,7 +151,7 @@ extern int debugging;
/* Function prototypes. */
static char * FindSymbolFile(void);
-static int AddSymbol(unsigned long, char*);
+static int AddSymbol(uintptr_t, char*);
static void FreeSymbols(void);
static int CheckVersion(char *);
static int CheckMapVersion(char *);
@@ -185,7 +185,7 @@ extern int InitKsyms(mapfile)
auto int version = 0;
- auto unsigned long int address;
+ auto uintptr_t address;
auto FILE *sym_file;
@@ -237,16 +237,24 @@ extern int InitKsyms(mapfile)
*/
while ( !feof(sym_file) )
{
- if ( fscanf(sym_file, "%lx %c %s\n", &address, &type, sym)
- != 3 )
+#if __WORDSIZE == 64
+ if ( fscanf(sym_file, "%lx %c %s\n", &address, &type, sym) != 3 )
+#else
+ if ( fscanf(sym_file, "%x %c %s\n", &address, &type, sym) != 3 )
+#endif
{
Syslog(LOG_ERR, "Error in symbol table input (#1).");
fclose(sym_file);
return(0);
}
if ( VERBOSE_DEBUGGING && debugging )
+#if __WORDSIZE == 64
fprintf(stderr, "Address: %lx, Type: %c, Symbol: %s\n",
address, type, sym);
+#else
+ fprintf(stderr, "Address: %x, Type: %c, Symbol: %s\n",
+ address, type, sym);
+#endif
if ( AddSymbol(address, sym) == 0 )
{
@@ -521,7 +529,7 @@ static int CheckMapVersion(fname)
{
int version;
FILE *sym_file;
- auto unsigned long int address;
+ auto uintptr_t address;
auto char type,
sym[512];
@@ -536,16 +544,24 @@ static int CheckMapVersion(fname)
version = 0;
while ( !feof(sym_file) && (version == 0) )
{
- if ( fscanf(sym_file, "%lx %c %s\n", &address, \
- &type, sym) != 3 )
+#if __WORDSIZE == 64
+ if ( fscanf(sym_file, "%lx %c %s\n", &address, &type, sym) != 3 )
+#else
+ if ( fscanf(sym_file, "%x %c %s\n", &address, &type, sym) != 3 )
+#endif
{
Syslog(LOG_ERR, "Error in symbol table input (#2).");
fclose(sym_file);
return(0);
}
if ( VERBOSE_DEBUGGING && debugging )
+#if __WORDSIZE == 64
fprintf(stderr, "Address: %lx, Type: %c, " \
"Symbol: %s\n", address, type, sym);
+#else
+ fprintf(stderr, "Address: %x, Type: %c, " \
+ "Symbol: %s\n", address, type, sym);
+#endif
version = CheckVersion(sym);
}
@@ -583,7 +599,7 @@ static int CheckMapVersion(fname)
* Purpose: This function is responsible for adding a symbol name
* and its address to the symbol table.
*
- * Arguements: (unsigned long) address, (char *) symbol
+ * Arguements: (uintptr_t) address, (char *) symbol
*
* Return: int
*
@@ -593,7 +609,7 @@ static int CheckMapVersion(fname)
static int AddSymbol(address, symbol)
- unsigned long address;
+ uintptr_t address;
char *symbol;
@@ -639,7 +655,7 @@ static int AddSymbol(address, symbol)
char * LookupSymbol(value, sym)
- unsigned long value;
+ uintptr_t value;
struct symbol *sym;
@@ -739,7 +755,7 @@ extern char * ExpandKadds(line, el)
*symbol;
char num[15];
- auto unsigned long int value;
+ auto uintptr_t value;
auto struct symbol sym;
@@ -821,7 +837,7 @@ extern char * ExpandKadds(line, el)
value = strtol(kp2, (char **) 0, 16);
if ( (symbol = LookupSymbol(value, &sym)) ) {
if (sym.size)
- elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ elp += sprintf(elp, " (%s+%ll/%zu)", symbol, sym.offset, sym.size);
else
elp += sprintf(elp, " (%s)", symbol);
}
@@ -830,7 +846,7 @@ extern char * ExpandKadds(line, el)
value = strtol(kp3, (char **) 0, 16);
if ( (symbol = LookupSymbol(value, &sym)) ) {
if (sym.size)
- elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ elp += sprintf(elp, " (%s+%ll/%zu)", symbol, sym.offset, sym.size);
else
elp += sprintf(elp, " (%s)", symbol);
}
@@ -841,7 +857,7 @@ extern char * ExpandKadds(line, el)
value = strtol(kp2, (char **) 0, 16);
if ( (symbol = LookupSymbol(value, &sym)) ) {
if (sym.size)
- elp += sprintf(elp, " (%s+%d/%d)", symbol, sym.offset, sym.size);
+ elp += sprintf(elp, " (%s+%ll/%zu)", symbol, sym.offset, sym.size);
else
elp += sprintf(elp, " (%s)", symbol);
}
@@ -877,17 +893,24 @@ extern char * ExpandKadds(line, el)
strcat(elp, symbol);
elp += strlen(symbol);
if ( debugging )
- fprintf(stderr, "Symbol: %s = %lx = %s, %x/%d\n", \
+#if __WORDSIZE == 64
+ fprintf(stderr, "Symbol: %s = %lx = %s, %llx/%zu\n", \
sl+1, value, \
(sym.size==0) ? symbol+1 : symbol, \
sym.offset, sym.size);
+#else
+ fprintf(stderr, "Symbol: %s = %x = %s, %llx/%zu\n", \
+ sl+1, value, \
+ (sym.size==0) ? symbol+1 : symbol, \
+ sym.offset, sym.size);
+#endif
value = 2;
if ( sym.size != 0 )
{
--value;
++kp;
- elp += sprintf(elp, "+%x/%d", sym.offset, sym.size);
+ elp += sprintf(elp, "+%llx/%zu", sym.offset, sym.size);
}
strncat(elp, kp, value);
elp += value;
Index: ksym_mod.c
===================================================================
--- ksym_mod.c.orig 2000-09-12 23:15:28.000000000 +0200
+++ ksym_mod.c 2009-11-24 18:12:53.402379000 +0100
@@ -89,43 +89,101 @@
#include <errno.h>
#include <sys/fcntl.h>
#include <sys/stat.h>
-#if !defined(__GLIBC__)
-#include <linux/time.h>
-#include <linux/module.h>
-#else /* __GLIBC__ */
-#include <linux/module.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__ */
#include <stdarg.h>
#include <paths.h>
-#include <linux/version.h>
+#include <asm/atomic.h>
+#include <limits.h>
+/* #include <linux/version.h> */
#include "klogd.h"
#include "ksyms.h"
+/* Used by get_kernel_syms, which is obsolete. */
+struct kernel_sym
+{
+ uintptr_t value;
+ char name[60]; /* should have been 64-sizeof(long); oh well */
+};
+
+extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
+extern int get_kernel_syms __P ((struct kernel_sym *__table));
+
+static inline __off64_t seek64(int fd, uintptr_t address)
+{
+ __off64_t off = (__off64_t)address;
+ __off64_t ret = (__off64_t)-1;
+
+ if (off < 0) {
+ __off64_t rel;
+ if (lseek64(fd, LONG_MAX, SEEK_SET) != LONG_MAX && errno)
+ goto err;
+ rel = (__off64_t)(address - LONG_MAX);
+ if ((ret = lseek64(fd, rel, SEEK_CUR)) != off && errno)
+ goto err;
+ ret = -ret; /* Relative to LONG_MAX */
+ } else
+ ret = lseek64(fd, off, SEEK_SET);
+err:
+ return ret;
+}
-#if !defined(__GLIBC__)
-/*
- * The following bit uses some kernel/library magic to product 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.
- */
-#define __LIBRARY__
-#include <linux/unistd.h>
-#define __NR_getsyms __NR_get_kernel_syms
-_syscall1(int, getsyms, struct kernel_sym *, syms);
-#undef __LIBRARY__
-extern int getsyms(struct kernel_sym *);
-#else /* __GLIBC__ */
#define getsyms get_kernel_syms
-#endif /* __GLIBC__ */
+
+struct module
+{
+ size_t size_of_struct; /* == sizeof(module) */
+ struct module *next;
+ const char *name;
+ size_t size;
+
+ union
+ {
+ atomic_t 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_member_present()
+ to examine them. */
+ const struct module_persist *persist_start;
+ const struct module_persist *persist_end;
+ int (*can_unload)(void);
+ int runsize; /* In modutils, not currently used */
+ const char *kallsyms_start; /* All symbols for kernel debugging */
+ const char *kallsyms_end;
+ const char *archdata_start; /* arch specific data for module */
+ const char *archdata_end;
+ const char *kernel_data; /* Reserved for kernel internal use */
+};
+
+struct module_info
+{
+ uintptr_t addr;
+ size_t size;
+ unsigned long flags;
+ long usecount;
+};
+
/* Variables static to this module. */
struct sym_table
{
- unsigned long value;
+ uintptr_t value;
char *name;
};
@@ -136,9 +194,7 @@ struct Module
char *name;
struct module module;
-#if LINUX_VERSION_CODE >= 0x20112
struct module_info module_info;
-#endif
};
static int num_modules = 0;
@@ -155,8 +211,8 @@ extern int debugging;
/* 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, uintptr_t, char *);
+static int AddModule(uintptr_t, char *);
static int symsort(const void *, const void *);
@@ -344,7 +400,7 @@ static void FreeModules()
* Purpose: This function is responsible for adding a module to
* the list of currently loaded modules.
*
- * Arguements: (unsigned long) address, (char *) symbol
+ * Arguements: (uintptr_t) address, (char *) symbol
*
* address:-> The address of the module.
*
@@ -355,7 +411,7 @@ static void FreeModules()
static int AddModule(address, symbol)
- unsigned long address;
+ uintptr_t address;
char *symbol;
@@ -403,10 +459,14 @@ static int AddModule(address, symbol)
Syslog(LOG_WARNING, "Error opening /dev/kmem\n");
return(0);
}
- if ( lseek64(memfd, address, SEEK_SET) < 0 )
+ if ( seek64(memfd, address) < 0 )
{
Syslog(LOG_WARNING, "Error seeking in /dev/kmem\n");
+#if __WORDSIZE == 64
+ Syslog(LOG_WARNING, "Symbol %s, value %16lx\n", symbol, address);
+#else
Syslog(LOG_WARNING, "Symbol %s, value %08x\n", symbol, address);
+#endif
return(0);
}
if ( read(memfd, \
@@ -450,7 +510,7 @@ static int AddModule(address, symbol)
* Purpose: This function is responsible for adding a symbol name
* and its address to the symbol table.
*
- * Arguements: (struct Module *) mp, (unsigned long) address, (char *) symbol
+ * Arguements: (struct Module *) mp, (uintptr_t) address, (char *) symbol
*
* mp:-> A pointer to the module which the symbol is
* to be added to.
@@ -469,7 +529,7 @@ static int AddSymbol(mp, address, symbol
struct Module *mp;
- unsigned long address;
+ uintptr_t address;
char *symbol;
@@ -508,7 +568,7 @@ static int AddSymbol(mp, address, symbol
* Purpose: Find the symbol which is related to the given address from
* a kernel module.
*
- * Arguements: (long int) value, (struct symbol *) sym
+ * Arguements: (uintptr_t) value, (struct symbol *) sym
*
* value:-> The address to be located.
*
@@ -524,7 +584,7 @@ static int AddSymbol(mp, address, symbol
extern char * LookupModuleSymbol(value, sym)
- unsigned long value;
+ uintptr_t value;
struct symbol *sym;
@@ -574,15 +634,9 @@ extern char * LookupModuleSymbol(value,
* If it is in this range we can at least return the
* name of the module.
*/
-#if LINUX_VERSION_CODE < 0x20112
- if ( (void *) value >= mp->module.addr &&
- (void *) value <= (mp->module.addr + \
- mp->module.size * 4096) )
-#else
if ( value >= mp->module_info.addr &&
value <= (mp->module_info.addr + \
- mp->module.size * 4096) )
-#endif
+ mp->module.size * getpagesize()) )
{
/*
* A special case needs to be checked for. The above
@@ -601,13 +655,8 @@ extern char * LookupModuleSymbol(value,
if ( mp->num_syms > 0 )
{
last = &mp->sym_array[mp->num_syms - 1];
-#if LINUX_VERSION_CODE < 0x20112
- sym->size = (int) mp->module.addr + \
- (mp->module.size * 4096) - value;
-#else
sym->size = (int) mp->module_info.addr + \
- (mp->module.size * 4096) - value;
-#endif
+ (mp->module.size * getpagesize()) - value;
sym->offset = value - last->value;
return(last->name);
}
@@ -617,12 +666,8 @@ extern char * LookupModuleSymbol(value,
* Return the module name and the offset of the
* faulting address in the module.
*/
- sym->size = mp->module.size * 4096;
-#if LINUX_VERSION_CODE < 0x20112
- sym->offset = (void *) value - mp->module.addr;
-#else
+ sym->size = mp->module.size * getpagesize();
sym->offset = value - mp->module_info.addr;
-#endif
return(mp->name);
}
}
Index: ksyms.h
===================================================================
--- ksyms.h.orig 1997-06-13 11:35:55.000000000 +0200
+++ ksyms.h 2009-11-24 18:12:53.406377000 +0100
@@ -20,16 +20,19 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <sys/types.h>
+#include <stdint.h>
+
/* Variables, structures and type definitions static to this module. */
struct symbol
{
char *name;
- int size;
- int offset;
+ size_t size;
+ __off64_t offset;
};
/* Function prototypes. */
-extern char * LookupSymbol(unsigned long, struct symbol *);
-extern char * LookupModuleSymbol(unsigned long int, struct symbol *);
+extern char * LookupSymbol(uintptr_t, struct symbol *);
+extern char * LookupModuleSymbol(uintptr_t, struct symbol *);