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