xref: /freebsd/lib/libutil/kinfo_getvmobject.c (revision a2f733abcff64628b7771a47089628b7327a88bd)
1ff87ae35SJohn Baldwin /*
2ff87ae35SJohn Baldwin  * Copyright (c) 2013 Hudson River Trading LLC
3ff87ae35SJohn Baldwin  * Written by: John H. Baldwin <jhb@FreeBSD.org>
4ff87ae35SJohn Baldwin  * All rights reserved.
5ff87ae35SJohn Baldwin  *
6ff87ae35SJohn Baldwin  * Redistribution and use in source and binary forms, with or without
7ff87ae35SJohn Baldwin  * modification, are permitted provided that the following conditions
8ff87ae35SJohn Baldwin  * are met:
9ff87ae35SJohn Baldwin  * 1. Redistributions of source code must retain the above copyright
10ff87ae35SJohn Baldwin  *    notice, this list of conditions and the following disclaimer.
11ff87ae35SJohn Baldwin  * 2. Redistributions in binary form must reproduce the above copyright
12ff87ae35SJohn Baldwin  *    notice, this list of conditions and the following disclaimer in the
13ff87ae35SJohn Baldwin  *    documentation and/or other materials provided with the distribution.
14ff87ae35SJohn Baldwin  *
15ff87ae35SJohn Baldwin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16ff87ae35SJohn Baldwin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17ff87ae35SJohn Baldwin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18ff87ae35SJohn Baldwin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19ff87ae35SJohn Baldwin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20ff87ae35SJohn Baldwin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21ff87ae35SJohn Baldwin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22ff87ae35SJohn Baldwin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23ff87ae35SJohn Baldwin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24ff87ae35SJohn Baldwin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25ff87ae35SJohn Baldwin  * SUCH DAMAGE.
26ff87ae35SJohn Baldwin  */
27ff87ae35SJohn Baldwin 
28ff87ae35SJohn Baldwin #include <sys/types.h>
29ff87ae35SJohn Baldwin #include <sys/sysctl.h>
30ff87ae35SJohn Baldwin #include <sys/user.h>
31ff87ae35SJohn Baldwin #include <stdlib.h>
32ff87ae35SJohn Baldwin #include <string.h>
33ff87ae35SJohn Baldwin 
34ff87ae35SJohn Baldwin #include "libutil.h"
35ff87ae35SJohn Baldwin 
36*f2069331SKonstantin Belousov static struct kinfo_vmobject *
kinfo_getvmobject_impl(int * cntp,const char * vmobjsysctl)37*f2069331SKonstantin Belousov kinfo_getvmobject_impl(int *cntp, const char *vmobjsysctl)
38ff87ae35SJohn Baldwin {
39ff87ae35SJohn Baldwin 	char *buf, *bp, *ep;
40ff87ae35SJohn Baldwin 	struct kinfo_vmobject *kvo, *list, *kp;
41ff87ae35SJohn Baldwin 	size_t len;
42ff87ae35SJohn Baldwin 	int cnt, i;
43ff87ae35SJohn Baldwin 
44ff87ae35SJohn Baldwin 	buf = NULL;
45ff87ae35SJohn Baldwin 	for (i = 0; i < 3; i++) {
46*f2069331SKonstantin Belousov 		if (sysctlbyname(vmobjsysctl, NULL, &len, NULL, 0) < 0) {
4791601d8cSStephen J. Kiernan 			free(buf);
48ff87ae35SJohn Baldwin 			return (NULL);
4991601d8cSStephen J. Kiernan 		}
50ff87ae35SJohn Baldwin 		buf = reallocf(buf, len);
51ff87ae35SJohn Baldwin 		if (buf == NULL)
52ff87ae35SJohn Baldwin 			return (NULL);
53*f2069331SKonstantin Belousov 		if (sysctlbyname(vmobjsysctl, buf, &len, NULL, 0) == 0)
54ff87ae35SJohn Baldwin 			goto unpack;
55ff87ae35SJohn Baldwin 		if (errno != ENOMEM) {
56ff87ae35SJohn Baldwin 			free(buf);
57ff87ae35SJohn Baldwin 			return (NULL);
58ff87ae35SJohn Baldwin 		}
59ff87ae35SJohn Baldwin 	}
60ff87ae35SJohn Baldwin 	free(buf);
61ff87ae35SJohn Baldwin 	return (NULL);
62ff87ae35SJohn Baldwin 
63ff87ae35SJohn Baldwin unpack:
64ff87ae35SJohn Baldwin 	/* Count items */
65ff87ae35SJohn Baldwin 	cnt = 0;
66ff87ae35SJohn Baldwin 	bp = buf;
67ff87ae35SJohn Baldwin 	ep = buf + len;
68ff87ae35SJohn Baldwin 	while (bp < ep) {
69ff87ae35SJohn Baldwin 		kvo = (struct kinfo_vmobject *)(uintptr_t)bp;
70ff87ae35SJohn Baldwin 		bp += kvo->kvo_structsize;
71ff87ae35SJohn Baldwin 		cnt++;
72ff87ae35SJohn Baldwin 	}
73ff87ae35SJohn Baldwin 
74ff87ae35SJohn Baldwin 	list = calloc(cnt, sizeof(*list));
75ff87ae35SJohn Baldwin 	if (list == NULL) {
76ff87ae35SJohn Baldwin 		free(buf);
77ff87ae35SJohn Baldwin 		return (NULL);
78ff87ae35SJohn Baldwin 	}
79ff87ae35SJohn Baldwin 
80ff87ae35SJohn Baldwin 	/* Unpack */
81ff87ae35SJohn Baldwin 	bp = buf;
82ff87ae35SJohn Baldwin 	kp = list;
83ff87ae35SJohn Baldwin 	while (bp < ep) {
84ff87ae35SJohn Baldwin 		kvo = (struct kinfo_vmobject *)(uintptr_t)bp;
85ff87ae35SJohn Baldwin 		memcpy(kp, kvo, kvo->kvo_structsize);
86ff87ae35SJohn Baldwin 		bp += kvo->kvo_structsize;
87ff87ae35SJohn Baldwin 		kp->kvo_structsize = sizeof(*kp);
88ff87ae35SJohn Baldwin 		kp++;
89ff87ae35SJohn Baldwin 	}
90ff87ae35SJohn Baldwin 	free(buf);
91ff87ae35SJohn Baldwin 	*cntp = cnt;
92ff87ae35SJohn Baldwin 	return (list);
93ff87ae35SJohn Baldwin }
94*f2069331SKonstantin Belousov 
95*f2069331SKonstantin Belousov struct kinfo_vmobject *
kinfo_getvmobject(int * cntp)96*f2069331SKonstantin Belousov kinfo_getvmobject(int *cntp)
97*f2069331SKonstantin Belousov {
98*f2069331SKonstantin Belousov 	return (kinfo_getvmobject_impl(cntp, "vm.objects"));
99*f2069331SKonstantin Belousov }
100*f2069331SKonstantin Belousov 
101*f2069331SKonstantin Belousov struct kinfo_vmobject *
kinfo_getswapvmobject(int * cntp)102*f2069331SKonstantin Belousov kinfo_getswapvmobject(int *cntp)
103*f2069331SKonstantin Belousov {
104*f2069331SKonstantin Belousov 	return (kinfo_getvmobject_impl(cntp, "vm.swap_objects"));
105*f2069331SKonstantin Belousov }
106