xref: /freebsd/lib/libutil/kinfo_getvmobject.c (revision f2069331e5821f4c2b65d82af2809946a34158d2)
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/cdefs.h>
29ff87ae35SJohn Baldwin __FBSDID("$FreeBSD$");
30ff87ae35SJohn Baldwin 
31ff87ae35SJohn Baldwin #include <sys/types.h>
32ff87ae35SJohn Baldwin #include <sys/sysctl.h>
33ff87ae35SJohn Baldwin #include <sys/user.h>
34ff87ae35SJohn Baldwin #include <stdlib.h>
35ff87ae35SJohn Baldwin #include <string.h>
36ff87ae35SJohn Baldwin 
37ff87ae35SJohn Baldwin #include "libutil.h"
38ff87ae35SJohn Baldwin 
39*f2069331SKonstantin Belousov static struct kinfo_vmobject *
40*f2069331SKonstantin Belousov kinfo_getvmobject_impl(int *cntp, const char *vmobjsysctl)
41ff87ae35SJohn Baldwin {
42ff87ae35SJohn Baldwin 	char *buf, *bp, *ep;
43ff87ae35SJohn Baldwin 	struct kinfo_vmobject *kvo, *list, *kp;
44ff87ae35SJohn Baldwin 	size_t len;
45ff87ae35SJohn Baldwin 	int cnt, i;
46ff87ae35SJohn Baldwin 
47ff87ae35SJohn Baldwin 	buf = NULL;
48ff87ae35SJohn Baldwin 	for (i = 0; i < 3; i++) {
49*f2069331SKonstantin Belousov 		if (sysctlbyname(vmobjsysctl, NULL, &len, NULL, 0) < 0) {
5091601d8cSStephen J. Kiernan 			free(buf);
51ff87ae35SJohn Baldwin 			return (NULL);
5291601d8cSStephen J. Kiernan 		}
53ff87ae35SJohn Baldwin 		buf = reallocf(buf, len);
54ff87ae35SJohn Baldwin 		if (buf == NULL)
55ff87ae35SJohn Baldwin 			return (NULL);
56*f2069331SKonstantin Belousov 		if (sysctlbyname(vmobjsysctl, buf, &len, NULL, 0) == 0)
57ff87ae35SJohn Baldwin 			goto unpack;
58ff87ae35SJohn Baldwin 		if (errno != ENOMEM) {
59ff87ae35SJohn Baldwin 			free(buf);
60ff87ae35SJohn Baldwin 			return (NULL);
61ff87ae35SJohn Baldwin 		}
62ff87ae35SJohn Baldwin 	}
63ff87ae35SJohn Baldwin 	free(buf);
64ff87ae35SJohn Baldwin 	return (NULL);
65ff87ae35SJohn Baldwin 
66ff87ae35SJohn Baldwin unpack:
67ff87ae35SJohn Baldwin 	/* Count items */
68ff87ae35SJohn Baldwin 	cnt = 0;
69ff87ae35SJohn Baldwin 	bp = buf;
70ff87ae35SJohn Baldwin 	ep = buf + len;
71ff87ae35SJohn Baldwin 	while (bp < ep) {
72ff87ae35SJohn Baldwin 		kvo = (struct kinfo_vmobject *)(uintptr_t)bp;
73ff87ae35SJohn Baldwin 		bp += kvo->kvo_structsize;
74ff87ae35SJohn Baldwin 		cnt++;
75ff87ae35SJohn Baldwin 	}
76ff87ae35SJohn Baldwin 
77ff87ae35SJohn Baldwin 	list = calloc(cnt, sizeof(*list));
78ff87ae35SJohn Baldwin 	if (list == NULL) {
79ff87ae35SJohn Baldwin 		free(buf);
80ff87ae35SJohn Baldwin 		return (NULL);
81ff87ae35SJohn Baldwin 	}
82ff87ae35SJohn Baldwin 
83ff87ae35SJohn Baldwin 	/* Unpack */
84ff87ae35SJohn Baldwin 	bp = buf;
85ff87ae35SJohn Baldwin 	kp = list;
86ff87ae35SJohn Baldwin 	while (bp < ep) {
87ff87ae35SJohn Baldwin 		kvo = (struct kinfo_vmobject *)(uintptr_t)bp;
88ff87ae35SJohn Baldwin 		memcpy(kp, kvo, kvo->kvo_structsize);
89ff87ae35SJohn Baldwin 		bp += kvo->kvo_structsize;
90ff87ae35SJohn Baldwin 		kp->kvo_structsize = sizeof(*kp);
91ff87ae35SJohn Baldwin 		kp++;
92ff87ae35SJohn Baldwin 	}
93ff87ae35SJohn Baldwin 	free(buf);
94ff87ae35SJohn Baldwin 	*cntp = cnt;
95ff87ae35SJohn Baldwin 	return (list);
96ff87ae35SJohn Baldwin }
97*f2069331SKonstantin Belousov 
98*f2069331SKonstantin Belousov struct kinfo_vmobject *
99*f2069331SKonstantin Belousov kinfo_getvmobject(int *cntp)
100*f2069331SKonstantin Belousov {
101*f2069331SKonstantin Belousov 	return (kinfo_getvmobject_impl(cntp, "vm.objects"));
102*f2069331SKonstantin Belousov }
103*f2069331SKonstantin Belousov 
104*f2069331SKonstantin Belousov struct kinfo_vmobject *
105*f2069331SKonstantin Belousov kinfo_getswapvmobject(int *cntp)
106*f2069331SKonstantin Belousov {
107*f2069331SKonstantin Belousov 	return (kinfo_getvmobject_impl(cntp, "vm.swap_objects"));
108*f2069331SKonstantin Belousov }
109