--- sysklogd-1.3.25/ksym_mod.c.orig	Sun Mar 29 16:51:13 1998
+++ sysklogd-1.3.25/ksym_mod.c	Sun Mar 29 16:52:15 1998
@@ -101,8 +101,19 @@
 _syscall1(int, getsyms, struct kernel_sym *, syms);
 #undef __LIBRARY__
 extern int getsyms(struct kernel_sym *);
+#ifdef __NR_query_module
+_syscall5(int, query_module, const char *, name_user, int, which,
+	  char *, buf, size_t, bufsize, size_t *, ret);
+extern int query_module(const char *name_user, int which,
+			char *buf, size_t bufsize, size_t *ret);
+#endif
 #else /* __GLIBC__ */
 #define getsyms get_kernel_syms
+#include <linux/unistd.h>
+#ifdef __NR_query_module
+extern int query_module(const char *name_user, int which,
+			char *buf, size_t bufsize, size_t *ret);
+#endif
 #endif /* __GLIBC__ */
 
 /* Variables static to this module. */
@@ -118,10 +129,15 @@
 	int num_syms;
 
 	char *name;
+#ifdef __NR_query_module
+ 	struct module_info module;
+#else
 	struct module module;
 #if LINUX_VERSION_CODE >= 0x20112
 	struct module_info module_info;
 #endif
+#endif
+
 };
 
 static int num_modules = 0;
@@ -343,7 +359,10 @@
      char *symbol;
 
 {
+#ifndef __NR_query_module
 	auto int memfd;
+#endif
+	auto int tmp;
 
 	auto struct Module *mp;
 
@@ -381,6 +400,7 @@
 		}
 		mp = &sym_array_modules[num_modules];
 
+#ifndef __NR_query_module
 		if ( (memfd = open("/dev/kmem", O_RDONLY)) < 0 )
 		{
 			Syslog(LOG_WARNING, "Error opening /dev/kmem\n");
@@ -400,6 +420,28 @@
 			return(0);
 		}
 		close(memfd);
+#else
+		/* 
+		   For some reason 2.1.91 kernel will not let us seek
+		   to read the module header, so use the new
+		   query_module interface.
+
+		   Note this interface does not exist for 2.0.x so
+		   this file MUST be re-compiling for the correct
+		   kernel version... :-( */
+
+		if(query_module(&symbol[1], QM_INFO, 
+				(char *)&sym_array_modules[num_modules].module,
+				sizeof(sym_array_modules[num_modules].module),
+				&tmp) < 0 )
+		{
+			Syslog(LOG_WARNING, "Error reading module "
+			       "descriptor.\n");
+			return(0);
+		}
+		   
+		
+#endif
 
 		/* Save the module name. */
 		mp->name = (char *) malloc(strlen(&symbol[1]) + 1);
@@ -553,9 +595,9 @@
 		 * 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 + \
+#if LINUX_VERSION_CODE < 0x20112 || defined(__NR_query_module)
+		if ( (void *) value >= (void *)mp->module.addr &&
+		     (void *) value <= ((void *)mp->module.addr + \
 					mp->module.size * 4096) )
 #else
 		if ( value >= mp->module_info.addr &&
@@ -580,14 +622,14 @@
 			if ( mp->num_syms > 0 )
 			{
 				last = &mp->sym_array[mp->num_syms - 1];
-#if LINUX_VERSION_CODE < 0x20112
+#if LINUX_VERSION_CODE < 0x20112 || defined(__NR_query_module)
 				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
-				sym->offset = value - last->value;
+				sym->offset = (void *)value - (void *)last->value;
 				return(last->name);
 			}
 
@@ -597,8 +639,8 @@
 			 * faulting address in the module.
 			 */
 			sym->size = mp->module.size * 4096;
-#if LINUX_VERSION_CODE < 0x20112
-			sym->offset = (void *) value - mp->module.addr;
+#if LINUX_VERSION_CODE < 0x20112 || defined(__NR_query_module)
+			sym->offset = (void *) value - (void *)mp->module.addr;
 #else
 			sym->offset = value - mp->module_info.addr;
 #endif
