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