Home | History | Annotate | Line # | Download | only in libutil
kinfo_getvmmap.c revision 1.3
      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 *
     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