ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/swap_stats.c
Revision: 1.12
Committed: Thu Feb 12 23:04:52 2004 UTC (20 years, 3 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.11: +36 -2 lines
Log Message:
Add preliminary support for OpenBSD (tested on 3.3).

All works apart from Disk IO stats - currently the disks are not named
correctly. The fix for this is probably to use KVM.

Mostly similar to the NetBSD code, the notable exception being the uvm
stuff. In NetBSD there's a function to get it, in OpenBSD sysctl is needed
to get hold of it.

File Contents

# Content
1 /*
2 * i-scream central monitoring system
3 * http://www.i-scream.org
4 * Copyright (C) 2000-2004 i-scream
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 * 02111-1307 USA
20 *
21 * $Id: swap_stats.c,v 1.11 2004/01/19 16:49:21 tdb Exp $
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include "statgrab.h"
29 #include "tools.h"
30 #ifdef SOLARIS
31 #include <sys/stat.h>
32 #include <sys/swap.h>
33 #include <unistd.h>
34 #endif
35 #if defined(LINUX) || defined(CYGWIN)
36 #include <stdio.h>
37 #include <string.h>
38 #endif
39 #ifdef FREEBSD
40 #include <unistd.h>
41 #include <sys/types.h>
42 #include <kvm.h>
43 #endif
44 #ifdef OPENBSD
45 #include <stdlib.h>
46 #include <sys/param.h>
47 #include <sys/sysctl.h>
48 #include <uvm/uvm.h>
49 #endif
50
51 swap_stat_t *get_swap_stats(){
52
53 static swap_stat_t swap_stat;
54
55 #ifdef SOLARIS
56 struct anoninfo ai;
57 int pagesize;
58 #endif
59 #if defined(LINUX) || defined(CYGWIN)
60 FILE *f;
61 char *line_ptr;
62 unsigned long long value;
63 #endif
64 #ifdef FREEBSD
65 struct kvm_swap swapinfo;
66 int pagesize;
67 kvm_t *kvmd;
68 #endif
69 #if defined(NETBSD) || defined(OPENBSD)
70 struct uvmexp *uvm;
71 #endif
72 #ifdef OPENBSD
73 int mib[2];
74 size_t size;
75 #endif
76
77 #ifdef SOLARIS
78 if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
79 return NULL;
80 }
81 if (swapctl(SC_AINFO, &ai) == -1) {
82 return NULL;
83 }
84 swap_stat.total = (long long)ai.ani_max * (long long)pagesize;
85 swap_stat.used = (long long)ai.ani_resv * (long long)pagesize;
86 swap_stat.free = swap_stat.total - swap_stat.used;
87 #endif
88 #if defined(LINUX) || defined(CYGWIN)
89 if ((f = fopen("/proc/meminfo", "r")) == NULL) {
90 return NULL;
91 }
92
93 while ((line_ptr = f_read_line(f, "")) != NULL) {
94 if (sscanf(line_ptr, "%*s %llu kB", &value) != 1) {
95 continue;
96 }
97 value *= 1024;
98
99 if (strncmp(line_ptr, "SwapTotal:", 10) == 0) {
100 swap_stat.total = value;
101 } else if (strncmp(line_ptr, "SwapFree:", 9) == 0) {
102 swap_stat.free = value;
103 }
104 }
105
106 fclose(f);
107 swap_stat.used = swap_stat.total - swap_stat.free;
108 #endif
109 #ifdef FREEBSD
110 if((kvmd = get_kvm()) == NULL){
111 return NULL;
112 }
113 if ((kvm_getswapinfo(kvmd, &swapinfo, 1,0)) == -1){
114 return NULL;
115 }
116 pagesize=getpagesize();
117
118 swap_stat.total= (long long)swapinfo.ksw_total * (long long)pagesize;
119 swap_stat.used = (long long)swapinfo.ksw_used * (long long)pagesize;
120 swap_stat.free = swap_stat.total-swap_stat.used;
121 #endif
122 #ifdef NETBSD
123 if ((uvm = get_uvmexp()) == NULL) {
124 return NULL;
125 }
126 #endif
127 #ifdef OPENBSD
128 mib[0] = CTL_VM;
129 mib[1] = VM_UVMEXP;
130
131 if (sysctl(mib, 2, NULL, &size, NULL, 0) < 0) {
132 return NULL;
133 }
134
135 uvm = malloc(size);
136 if (uvm == NULL) {
137 return NULL;
138 }
139
140 if (sysctl(mib, 2, uvm, &size, NULL, 0) < 0) {
141 return NULL;
142 }
143 #endif
144
145 #if defined(NETBSD) || defined(OPENBSD)
146 swap_stat.total = (long long)uvm->pagesize * (long long)uvm->swpages;
147 swap_stat.used = (long long)uvm->pagesize * (long long)uvm->swpginuse;
148 swap_stat.free = swap_stat.total - swap_stat.used;
149 #endif
150
151 #ifdef OPENBSD
152 free(uvm);
153 #endif
154
155 return &swap_stat;
156
157 }