ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/libstatgrab/src/libstatgrab/swap_stats.c
Revision: 1.20
Committed: Wed Apr 7 21:08:40 2004 UTC (20 years, 1 month ago) by tdb
Content type: text/plain
Branch: MAIN
CVS Tags: LIBSTATGRAB_0_10
Changes since 1.19: +8 -1 lines
Log Message:
The rest of the error handling stuff (except the vector code).

I've been extremely unimaginative with the string names in error.c, but
they're all in one place so much easier to tidy up. I'm also beginning to
wonder if we actually needed an SG_ERROR_SYSTEM_CALL to indicate some call
into the system failed - because the majority of our errors are those :-)

Still to do, then:
 - vector code
 - better string names in error.c
 - deal with arg string in some way
 - make use of the error status in statgrab/saidar/examples

File Contents

# Content
1 /*
2 * i-scream libstatgrab
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.19 2004/04/06 14:52:58 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 #if defined(FREEBSD) || defined(DFBSD)
40 #ifdef FREEBSD5
41 #include <sys/param.h>
42 #include <sys/sysctl.h>
43 #include <sys/user.h>
44 #else
45 #include <sys/types.h>
46 #include <kvm.h>
47 #endif
48 #include <unistd.h>
49 #endif
50 #if defined(NETBSD) || defined(OPENBSD)
51 #include <sys/param.h>
52 #include <sys/time.h>
53 #include <uvm/uvm.h>
54 #include <unistd.h>
55 #endif
56
57 sg_swap_stats *sg_get_swap_stats(){
58
59 static sg_swap_stats swap_stat;
60
61 #ifdef SOLARIS
62 struct anoninfo ai;
63 int pagesize;
64 #endif
65 #if defined(LINUX) || defined(CYGWIN)
66 FILE *f;
67 char *line_ptr;
68 unsigned long long value;
69 #endif
70 #if defined(FREEBSD) || defined(DFBSD)
71 int pagesize;
72 #ifdef FREEBSD5
73 struct xswdev xsw;
74 int mib[16], n;
75 size_t mibsize, size;
76 #else
77 struct kvm_swap swapinfo;
78 kvm_t *kvmd;
79 #endif
80 #endif
81 #if defined(NETBSD) || defined(OPENBSD)
82 struct uvmexp *uvm;
83 #endif
84
85 #ifdef SOLARIS
86 if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
87 sg_set_error(SG_ERROR_SYSCONF, "_SC_PAGESIZE");
88 return NULL;
89 }
90 if (swapctl(SC_AINFO, &ai) == -1) {
91 sg_set_error(SG_ERROR_SWAPCTL, NULL);
92 return NULL;
93 }
94 swap_stat.total = (long long)ai.ani_max * (long long)pagesize;
95 swap_stat.used = (long long)ai.ani_resv * (long long)pagesize;
96 swap_stat.free = swap_stat.total - swap_stat.used;
97 #endif
98 #if defined(LINUX) || defined(CYGWIN)
99 if ((f = fopen("/proc/meminfo", "r")) == NULL) {
100 sg_set_error(SG_ERROR_OPEN, "/proc/meminfo");
101 return NULL;
102 }
103
104 while ((line_ptr = sg_f_read_line(f, "")) != NULL) {
105 if (sscanf(line_ptr, "%*s %llu kB", &value) != 1) {
106 continue;
107 }
108 value *= 1024;
109
110 if (strncmp(line_ptr, "SwapTotal:", 10) == 0) {
111 swap_stat.total = value;
112 } else if (strncmp(line_ptr, "SwapFree:", 9) == 0) {
113 swap_stat.free = value;
114 }
115 }
116
117 fclose(f);
118 swap_stat.used = swap_stat.total - swap_stat.free;
119 #endif
120 #if defined(FREEBSD) || defined(DFBSD)
121 pagesize=getpagesize();
122
123 #ifdef FREEBSD5
124 swap_stat.total = 0;
125 swap_stat.used = 0;
126
127 mibsize = sizeof mib / sizeof mib[0];
128 if (sysctlnametomib("vm.swap_info", mib, &mibsize) < 0) {
129 sg_set_error(SG_ERROR_SYSCTLNAMETOMIB, "vm.swap_info");
130 return NULL;
131 }
132 for (n = 0; ; ++n) {
133 mib[mibsize] = n;
134 size = sizeof xsw;
135 if (sysctl(mib, mibsize + 1, &xsw, &size, NULL, NULL) < 0) {
136 break;
137 }
138 if (xsw.xsw_version != XSWDEV_VERSION) {
139 sg_set_error(SG_ERROR_XSW_VER_MISMATCH, NULL);
140 return NULL;
141 }
142 swap_stat.total += (long long) xsw.xsw_nblks;
143 swap_stat.used += (long long) xsw.xsw_used;
144 }
145 if (errno != ENOENT) {
146 sg_set_error(SG_ERROR_ENOENT, NULL);
147 return NULL;
148 }
149 #else
150 if((kvmd = sg_get_kvm()) == NULL){
151 return NULL;
152 }
153 if ((kvm_getswapinfo(kvmd, &swapinfo, 1,0)) == -1){
154 sg_set_error(SG_ERROR_KVM_GETSWAPINFO, NULL);
155 return NULL;
156 }
157
158 swap_stat.total = (long long)swapinfo.ksw_total;
159 swap_stat.used = (long long)swapinfo.ksw_used;
160 #endif
161 swap_stat.total *= pagesize;
162 swap_stat.used *= pagesize;
163 swap_stat.free = swap_stat.total - swap_stat.used;
164 #endif
165 #if defined(NETBSD) || defined(OPENBSD)
166 if ((uvm = sg_get_uvmexp()) == NULL) {
167 return NULL;
168 }
169
170 swap_stat.total = (long long)uvm->pagesize * (long long)uvm->swpages;
171 swap_stat.used = (long long)uvm->pagesize * (long long)uvm->swpginuse;
172 swap_stat.free = swap_stat.total - swap_stat.used;
173 #endif
174
175 return &swap_stat;
176
177 }