xref: /minix3/lib/libutil/kinfo_getvmmap.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc #include <sys/cdefs.h>
2*0a6a1f1dSLionel Sambuc #ifdef __FBSDID
3*0a6a1f1dSLionel Sambuc __FBSDID("$FreeBSD: head/lib/libutil/kinfo_getvmmap.c 186512 2008-12-27 11:12:23Z rwatson $");
4*0a6a1f1dSLionel Sambuc #endif
5*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: kinfo_getvmmap.c,v 1.3 2015/09/26 20:28:55 christos Exp $");
6*0a6a1f1dSLionel Sambuc 
7*0a6a1f1dSLionel Sambuc #include <sys/param.h>
8*0a6a1f1dSLionel Sambuc #include <sys/user.h>
9*0a6a1f1dSLionel Sambuc #include <sys/sysctl.h>
10*0a6a1f1dSLionel Sambuc #include <stdlib.h>
11*0a6a1f1dSLionel Sambuc #include <string.h>
12*0a6a1f1dSLionel Sambuc #include <util.h>
13*0a6a1f1dSLionel Sambuc #include <uvm/uvm_param.h>
14*0a6a1f1dSLionel Sambuc 
15*0a6a1f1dSLionel Sambuc struct kinfo_vmentry *
kinfo_getvmmap(pid_t pid,size_t * cntp)16*0a6a1f1dSLionel Sambuc kinfo_getvmmap(pid_t pid, size_t *cntp)
17*0a6a1f1dSLionel Sambuc {
18*0a6a1f1dSLionel Sambuc 	int mib[5];
19*0a6a1f1dSLionel Sambuc 	int error;
20*0a6a1f1dSLionel Sambuc 	size_t len;
21*0a6a1f1dSLionel Sambuc 	struct kinfo_vmentry *kiv;
22*0a6a1f1dSLionel Sambuc 
23*0a6a1f1dSLionel Sambuc 	*cntp = 0;
24*0a6a1f1dSLionel Sambuc 	len = 0;
25*0a6a1f1dSLionel Sambuc 	mib[0] = CTL_VM;
26*0a6a1f1dSLionel Sambuc 	mib[1] = VM_PROC;
27*0a6a1f1dSLionel Sambuc 	mib[2] = VM_PROC_MAP;
28*0a6a1f1dSLionel Sambuc 	mib[3] = pid;
29*0a6a1f1dSLionel Sambuc 	mib[4] = sizeof(*kiv);
30*0a6a1f1dSLionel Sambuc 
31*0a6a1f1dSLionel Sambuc 	error = sysctl(mib, (u_int)__arraycount(mib), NULL, &len, NULL, 0);
32*0a6a1f1dSLionel Sambuc 	if (error)
33*0a6a1f1dSLionel Sambuc 		return NULL;
34*0a6a1f1dSLionel Sambuc 
35*0a6a1f1dSLionel Sambuc 	len = len * 4 / 3;
36*0a6a1f1dSLionel Sambuc 
37*0a6a1f1dSLionel Sambuc 	kiv = malloc(len);
38*0a6a1f1dSLionel Sambuc 	if (kiv == NULL)
39*0a6a1f1dSLionel Sambuc 		return NULL;
40*0a6a1f1dSLionel Sambuc 
41*0a6a1f1dSLionel Sambuc 	error = sysctl(mib, (u_int)__arraycount(mib), kiv, &len, NULL, 0);
42*0a6a1f1dSLionel Sambuc 	if (error) {
43*0a6a1f1dSLionel Sambuc 		free(kiv);
44*0a6a1f1dSLionel Sambuc 		return NULL;
45*0a6a1f1dSLionel Sambuc 	}
46*0a6a1f1dSLionel Sambuc 
47*0a6a1f1dSLionel Sambuc 	*cntp = len / sizeof(*kiv);
48*0a6a1f1dSLionel Sambuc 	return kiv;	/* Caller must free() return value */
49*0a6a1f1dSLionel Sambuc }
50