xref: /freebsd/sbin/ipf/libipf/kmem.c (revision 963f5dc7a30624e95d72fb7f87b8892651164e46)
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	openkmem(kern, core)
44 	char	*kern, *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	kmemcpy(buf, pos, n)
56 	register char	*buf;
57 	long	pos;
58 	register int	n;
59 {
60 	register int	r;
61 
62 	if (!n)
63 		return 0;
64 
65 	if (kvm_f == NULL)
66 		if (openkmem(NULL, NULL) == -1)
67 			return -1;
68 
69 	while ((r = kvm_read(kvm_f, pos, buf, n)) < n)
70 		if (r <= 0)
71 		    {
72 			fprintf(stderr, "pos=0x%lx ", (u_long)pos);
73 			perror("kmemcpy:read");
74 			return -1;
75 		    }
76 		else
77 		    {
78 			buf += r;
79 			pos += r;
80 			n -= r;
81 		    }
82 	return 0;
83 }
84 
85 int	kstrncpy(buf, pos, n)
86 	register char	*buf;
87 	long	pos;
88 	register int	n;
89 {
90 	register int	r;
91 
92 	if (!n)
93 		return 0;
94 
95 	if (kvm_f == NULL)
96 		if (openkmem(NULL, NULL) == -1)
97 			return -1;
98 
99 	while (n > 0)
100 	    {
101 		r = kvm_read(kvm_f, pos, buf, 1);
102 		if (r <= 0)
103 		    {
104 			fprintf(stderr, "pos=0x%lx ", (u_long)pos);
105 			perror("kmemcpy:read");
106 			return -1;
107 		    }
108 		else
109 		    {
110 			if (*buf == '\0')
111 				break;
112 			buf++;
113 			pos++;
114 			n--;
115 		    }
116 	    }
117 	return 0;
118 }
119