xref: /freebsd/sbin/ipf/libipf/kmem.c (revision 924226fba12cc9a228c73b956e1b7fa24c60b055)
1 /*	$FreeBSD$	*/
2 
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  */
8 /*
9  * kmemcpy() - copies n bytes from kernel memory into user buffer.
10  * returns 0 on success, -1 on error.
11  */
12 
13 #include <stdio.h>
14 #include <sys/param.h>
15 #include <sys/types.h>
16 #include <sys/uio.h>
17 #include <unistd.h>
18 #include <string.h>
19 #include <fcntl.h>
20 #include <sys/file.h>
21 #include <kvm.h>
22 #include <fcntl.h>
23 #include <sys/socket.h>
24 #include <sys/ioctl.h>
25 #include <netinet/in.h>
26 #include <arpa/inet.h>
27 #include <netinet/in_systm.h>
28 #include <netinet/ip.h>
29 #include <net/if.h>
30 
31 #include "kmem.h"
32 
33 #if !defined(lint)
34 static const char sccsid[] = "@(#)kmem.c	1.4 1/12/96 (C) 1992 Darren Reed";
35 static const char rcsid[] = "@(#)$Id$";
36 #endif
37 
38 
39 
40 static	kvm_t	*kvm_f = NULL;
41 
42 
43 int
44 openkmem(char *kern, char *core)
45 {
46 	kvm_f = kvm_open(kern, core, NULL, O_RDONLY, NULL);
47 	if (kvm_f == NULL)
48 	    {
49 		perror("openkmem:open");
50 		return (-1);
51 	    }
52 	return (kvm_f != NULL);
53 }
54 
55 int
56 kmemcpy(register char *buf, long pos, register int n)
57 {
58 	register int	r;
59 
60 	if (!n)
61 		return (0);
62 
63 	if (kvm_f == NULL)
64 		if (openkmem(NULL, NULL) == -1)
65 			return (-1);
66 
67 	while ((r = kvm_read(kvm_f, pos, buf, n)) < n)
68 		if (r <= 0)
69 		    {
70 			fprintf(stderr, "pos=0x%lx ", (u_long)pos);
71 			perror("kmemcpy:read");
72 			return (-1);
73 		    }
74 		else
75 		    {
76 			buf += r;
77 			pos += r;
78 			n -= r;
79 		    }
80 	return (0);
81 }
82 
83 int
84 kstrncpy(register char *buf, long pos, register int n)
85 {
86 	register int	r;
87 
88 	if (!n)
89 		return (0);
90 
91 	if (kvm_f == NULL)
92 		if (openkmem(NULL, NULL) == -1)
93 			return (-1);
94 
95 	while (n > 0)
96 	    {
97 		r = kvm_read(kvm_f, pos, buf, 1);
98 		if (r <= 0)
99 		    {
100 			fprintf(stderr, "pos=0x%lx ", (u_long)pos);
101 			perror("kmemcpy:read");
102 			return (-1);
103 		    }
104 		else
105 		    {
106 			if (*buf == '\0')
107 				break;
108 			buf++;
109 			pos++;
110 			n--;
111 		    }
112 	    }
113 	return (0);
114 }
115