2 * Copyright (C) 1993-2002 by Darren Reed.
4 * See the IPFILTER.LICENCE file for details on licencing.
7 * kmemcpy() - copies n bytes from kernel memory into user buffer.
8 * returns 0 on success, -1 on error.
11 #if defined(__sgi) && (IRIX > 602)
12 # include <sys/ptimers.h>
15 #include <sys/param.h>
16 #include <sys/types.h>
26 #include <sys/socket.h>
27 #include <sys/ioctl.h>
28 #include <netinet/in.h>
29 #include <arpa/inet.h>
30 #include <netinet/in_systm.h>
31 #include <netinet/ip.h>
33 #if __FreeBSD_version >= 300000
34 # include <net/if_var.h>
38 #include "netinet/ip_compat.h"
39 #include "netinet/ip_fil.h"
48 static const char sccsid[] = "@(#)kmem.c 1.4 1/12/96 (C) 1992 Darren Reed";
49 static const char rcsid[] = "@(#)$Id: kmem.c,v 2.2.2.16 2002/12/06 11:40:27 darrenr Exp $";
55 static int kvm_fd = -1;
56 static char *kvm_errstr;
58 kvm_t *kvm_open(kernel, core, swap, mode, errstr)
59 char *kernel, *core, *swap;
67 kvm_fd = open(core, mode);
68 return (kvm_fd >= 0) ? (kvm_t *)&kvm_fd : NULL;
71 int kvm_read(kvm, pos, buffer, size)
81 if (lseek(*kvm, pos, 0) == -1) {
82 fprintf(stderr, "%s", kvm_errstr);
87 for (bufp = buffer, left = size; left > 0; bufp += r, left -= r) {
88 r = read(*kvm, bufp, 1);
96 static kvm_t *kvm_f = NULL;
98 int openkmem(kern, core)
106 kvm_f = kvm_open(kern, core, NULL, O_RDONLY, "");
109 perror("openkmem:open");
116 int kmemcpy(buf, pos, n)
127 if (openkmem(NULL, NULL) == -1)
130 while ((r = kvm_read(kvm_f, pos, buf, (size_t)n)) < n)
133 fprintf(stderr, "pos=0x%x ", (u_int)pos);
134 perror("kmemcpy:read");
146 int kstrncpy(buf, pos, n)
157 if (openkmem(NULL, NULL) == -1)
162 r = kvm_read(kvm_f, pos, buf, (size_t)1);
165 fprintf(stderr, "pos=0x%x ", (u_int)pos);
166 perror("kstrncpy:read");
183 * Given a pointer to an interface in the kernel, return a pointer to a
184 * string which is the interface name.
193 if (ptr == (void *)-1)
198 if (kmemcpy((char *)&ill, (u_long)ptr, sizeof(ill)) == -1)
200 ifname = malloc(ill.ill_name_length + 1);
201 if (kmemcpy(ifname, (u_long)ill.ill_name,
202 ill.ill_name_length) == -1)
206 # if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
214 if (ptr == (void *)-1)
219 if (kmemcpy((char *)&netif, (u_long)ptr, sizeof(netif)) == -1)
221 # if defined(NetBSD) && (NetBSD >= 199905) && (NetBSD < 1991011) || \
222 defined(__OpenBSD__) || defined(__DragonFly__)
223 return strdup(netif.if_xname);
225 if (kstrncpy(buf, (u_long)netif.if_name, sizeof(buf)) == -1)
227 if (netif.if_unit < 10)
229 else if (netif.if_unit < 1000)
231 else if (netif.if_unit < 10000)
235 buf[sizeof(buf) - len] = '\0';
236 sprintf(buf + strlen(buf), "%d", netif.if_unit % 10000);