4 * Copyright (C) 2012 by Darren Reed.
6 * See the IPFILTER.LICENCE file for details on licencing.
9 * kmemcpy() - copies n bytes from kernel memory into user buffer.
10 * returns 0 on success, -1 on error.
14 #include <sys/param.h>
15 #include <sys/types.h>
21 #if !defined(__sgi) && !defined(__hpux) && !defined(__osf__) && !defined(linux) && !defined(_AIX51)
25 #include <sys/socket.h>
26 #include <sys/ioctl.h>
27 #include <netinet/in.h>
28 #include <arpa/inet.h>
29 #include <netinet/in_systm.h>
30 #include <netinet/ip.h>
32 #if defined(linux) || defined(__osf__) || defined(__sgi) || defined(__hpux)
43 static const char sccsid[] = "@(#)kmem.c 1.4 1/12/96 (C) 1992 Darren Reed";
44 static const char rcsid[] = "@(#)$Id$";
49 #if !defined(__sgi) && !defined(__hpux) && !defined(__osf__) && \
50 !defined(linux) && !defined(_AIX51)
52 * For all platforms where there is a libkvm and a kvm_t, we use that...
54 static kvm_t *kvm_f = NULL;
58 *...and for the others (HP-UX, IRIX, Tru64), we have to provide our own.
63 static kvm_t kvm_f = NULL;
64 static char *kvm_errstr = NULL;
66 kvm_t kvm_open __P((char *, char *, char *, int, char *));
67 int kvm_read __P((kvm_t, u_long, char *, size_t));
69 kvm_t kvm_open(kernel, core, swap, mode, errstr)
70 char *kernel, *core, *swap;
82 fd = open(core, mode);
85 k = malloc(sizeof(*k));
92 int kvm_read(kvm, pos, buffer, size)
101 if (lseek(*kvm, pos, 0) == -1) {
102 if (kvm_errstr != NULL) {
103 fprintf(stderr, "%s", kvm_errstr);
109 for (bufp = buffer, left = size; left > 0; bufp += r, left -= r) {
110 r = read(*kvm, bufp, left);
113 * Tru64 returns "0" for successful operation, not the number
124 #endif /* !defined(__sgi) && !defined(__hpux) && !defined(__osf__) */
126 int openkmem(kern, core)
129 kvm_f = kvm_open(kern, core, NULL, O_RDONLY, NULL);
132 perror("openkmem:open");
135 return kvm_f != NULL;
138 int kmemcpy(buf, pos, n)
149 if (openkmem(NULL, NULL) == -1)
152 while ((r = kvm_read(kvm_f, pos, buf, n)) < n)
155 fprintf(stderr, "pos=0x%lx ", (u_long)pos);
156 perror("kmemcpy:read");
168 int kstrncpy(buf, pos, n)
179 if (openkmem(NULL, NULL) == -1)
184 r = kvm_read(kvm_f, pos, buf, 1);
187 fprintf(stderr, "pos=0x%lx ", (u_long)pos);
188 perror("kmemcpy:read");