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

# User Rev Content
1 tdb 1.10 /*
2 pajs 1.1 * i-scream central monitoring system
3 tdb 1.5 * http://www.i-scream.org
4 tdb 1.10 * Copyright (C) 2000-2004 i-scream
5 pajs 1.1 *
6 tdb 1.10 * 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 pajs 1.1 *
11 tdb 1.10 * This library is distributed in the hope that it will be useful,
12 pajs 1.1 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 tdb 1.10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14     * Lesser General Public License for more details.
15 pajs 1.1 *
16 tdb 1.10 * 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 tdb 1.11 *
21 tdb 1.12 * $Id: swap_stats.c,v 1.11 2004/01/19 16:49:21 tdb Exp $
22 pajs 1.1 */
23    
24     #ifdef HAVE_CONFIG_H
25     #include "config.h"
26     #endif
27    
28     #include "statgrab.h"
29 ats 1.6 #include "tools.h"
30 pajs 1.1 #ifdef SOLARIS
31     #include <sys/stat.h>
32     #include <sys/swap.h>
33     #include <unistd.h>
34     #endif
35 ats 1.9 #if defined(LINUX) || defined(CYGWIN)
36 pajs 1.3 #include <stdio.h>
37 ats 1.8 #include <string.h>
38 pajs 1.3 #endif
39 pajs 1.4 #ifdef FREEBSD
40     #include <unistd.h>
41     #include <sys/types.h>
42     #include <kvm.h>
43     #endif
44 tdb 1.12 #ifdef OPENBSD
45     #include <stdlib.h>
46     #include <sys/param.h>
47     #include <sys/sysctl.h>
48     #include <uvm/uvm.h>
49     #endif
50 pajs 1.1
51     swap_stat_t *get_swap_stats(){
52    
53     static swap_stat_t swap_stat;
54    
55 pajs 1.3 #ifdef SOLARIS
56 pajs 1.1 struct anoninfo ai;
57     int pagesize;
58 pajs 1.3 #endif
59 ats 1.9 #if defined(LINUX) || defined(CYGWIN)
60 pajs 1.3 FILE *f;
61     char *line_ptr;
62 ats 1.8 unsigned long long value;
63 pajs 1.3 #endif
64 pajs 1.4 #ifdef FREEBSD
65     struct kvm_swap swapinfo;
66     int pagesize;
67 ats 1.6 kvm_t *kvmd;
68 pajs 1.4 #endif
69 tdb 1.12 #if defined(NETBSD) || defined(OPENBSD)
70 ats 1.7 struct uvmexp *uvm;
71     #endif
72 tdb 1.12 #ifdef OPENBSD
73     int mib[2];
74     size_t size;
75     #endif
76 pajs 1.1
77 pajs 1.3 #ifdef SOLARIS
78 pajs 1.1 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 pajs 1.3 #endif
88 ats 1.9 #if defined(LINUX) || defined(CYGWIN)
89 ats 1.8 if ((f = fopen("/proc/meminfo", "r")) == NULL) {
90 pajs 1.3 return NULL;
91     }
92 ats 1.8
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 pajs 1.3 }
105 ats 1.8
106 pajs 1.3 fclose(f);
107 ats 1.8 swap_stat.used = swap_stat.total - swap_stat.free;
108 pajs 1.3 #endif
109 pajs 1.4 #ifdef FREEBSD
110 ats 1.6 if((kvmd = get_kvm()) == NULL){
111 pajs 1.4 return NULL;
112     }
113     if ((kvm_getswapinfo(kvmd, &swapinfo, 1,0)) == -1){
114     return NULL;
115     }
116     pagesize=getpagesize();
117 pajs 1.1
118 pajs 1.4 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 ats 1.7 #endif
122     #ifdef NETBSD
123     if ((uvm = get_uvmexp()) == NULL) {
124     return NULL;
125     }
126 tdb 1.12 #endif
127     #ifdef OPENBSD
128     mib[0] = CTL_VM;
129     mib[1] = VM_UVMEXP;
130 ats 1.7
131 tdb 1.12 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 ats 1.7 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 pajs 1.4 #endif
150 tdb 1.12
151     #ifdef OPENBSD
152     free(uvm);
153     #endif
154    
155 pajs 1.1 return &swap_stat;
156    
157     }