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.4 2017/06/14 12:24:51 kamil Exp $");
6 
7 #include <sys/param.h>
8 #include <sys/sysctl.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <util.h>
12 #include <uvm/uvm_param.h>
13 
14 struct kinfo_vmentry *
kinfo_getvmmap(pid_t pid,size_t * cntp)15 kinfo_getvmmap(pid_t pid, size_t *cntp)
16 {
17           int mib[5];
18           int error;
19           size_t len;
20           struct kinfo_vmentry *kiv;
21 
22           *cntp = 0;
23           len = 0;
24           mib[0] = CTL_VM;
25           mib[1] = VM_PROC;
26           mib[2] = VM_PROC_MAP;
27           mib[3] = pid;
28           mib[4] = sizeof(*kiv);
29 
30           error = sysctl(mib, (u_int)__arraycount(mib), NULL, &len, NULL, 0);
31           if (error)
32                     return NULL;
33 
34           len = len * 4 / 3;
35 
36           kiv = malloc(len);
37           if (kiv == NULL)
38                     return NULL;
39 
40           error = sysctl(mib, (u_int)__arraycount(mib), kiv, &len, NULL, 0);
41           if (error) {
42                     free(kiv);
43                     return NULL;
44           }
45 
46           *cntp = len / sizeof(*kiv);
47           return kiv;         /* Caller must free() return value */
48 }
49