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

# User Rev Content
1 tdb 1.10 /*
2 tdb 1.19 * i-scream libstatgrab
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.20 * $Id: swap_stats.c,v 1.19 2004/04/06 14:52:58 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 tdb 1.16 #if defined(FREEBSD) || defined(DFBSD)
40 tdb 1.15 #ifdef FREEBSD5
41     #include <sys/param.h>
42     #include <sys/sysctl.h>
43     #include <sys/user.h>
44     #else
45 pajs 1.4 #include <sys/types.h>
46     #include <kvm.h>
47     #endif
48 tdb 1.17 #include <unistd.h>
49 tdb 1.15 #endif
50 tdb 1.13 #if defined(NETBSD) || defined(OPENBSD)
51 tdb 1.12 #include <sys/param.h>
52 ats 1.14 #include <sys/time.h>
53 tdb 1.12 #include <uvm/uvm.h>
54 tdb 1.17 #include <unistd.h>
55 tdb 1.12 #endif
56 pajs 1.1
57 ats 1.18 sg_swap_stats *sg_get_swap_stats(){
58 pajs 1.1
59 ats 1.18 static sg_swap_stats swap_stat;
60 pajs 1.1
61 pajs 1.3 #ifdef SOLARIS
62 pajs 1.1 struct anoninfo ai;
63     int pagesize;
64 pajs 1.3 #endif
65 ats 1.9 #if defined(LINUX) || defined(CYGWIN)
66 pajs 1.3 FILE *f;
67     char *line_ptr;
68 ats 1.8 unsigned long long value;
69 pajs 1.3 #endif
70 tdb 1.16 #if defined(FREEBSD) || defined(DFBSD)
71 tdb 1.15 int pagesize;
72     #ifdef FREEBSD5
73     struct xswdev xsw;
74     int mib[16], n;
75     size_t mibsize, size;
76     #else
77 pajs 1.4 struct kvm_swap swapinfo;
78 ats 1.6 kvm_t *kvmd;
79 pajs 1.4 #endif
80 tdb 1.15 #endif
81 tdb 1.12 #if defined(NETBSD) || defined(OPENBSD)
82 ats 1.7 struct uvmexp *uvm;
83     #endif
84 pajs 1.1
85 pajs 1.3 #ifdef SOLARIS
86 pajs 1.1 if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
87 tdb 1.20 sg_set_error(SG_ERROR_SYSCONF, "_SC_PAGESIZE");
88 pajs 1.1 return NULL;
89     }
90     if (swapctl(SC_AINFO, &ai) == -1) {
91 tdb 1.20 sg_set_error(SG_ERROR_SWAPCTL, NULL);
92 pajs 1.1 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 pajs 1.3 #endif
98 ats 1.9 #if defined(LINUX) || defined(CYGWIN)
99 ats 1.8 if ((f = fopen("/proc/meminfo", "r")) == NULL) {
100 tdb 1.20 sg_set_error(SG_ERROR_OPEN, "/proc/meminfo");
101 pajs 1.3 return NULL;
102     }
103 ats 1.8
104 ats 1.18 while ((line_ptr = sg_f_read_line(f, "")) != NULL) {
105 ats 1.8 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 pajs 1.3 }
116 ats 1.8
117 pajs 1.3 fclose(f);
118 ats 1.8 swap_stat.used = swap_stat.total - swap_stat.free;
119 pajs 1.3 #endif
120 tdb 1.16 #if defined(FREEBSD) || defined(DFBSD)
121 tdb 1.15 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 tdb 1.20 sg_set_error(SG_ERROR_SYSCTLNAMETOMIB, "vm.swap_info");
130 tdb 1.15 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 tdb 1.20 sg_set_error(SG_ERROR_XSW_VER_MISMATCH, NULL);
140 tdb 1.15 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 tdb 1.20 sg_set_error(SG_ERROR_ENOENT, NULL);
147 tdb 1.15 return NULL;
148     }
149     #else
150 ats 1.18 if((kvmd = sg_get_kvm()) == NULL){
151 pajs 1.4 return NULL;
152     }
153     if ((kvm_getswapinfo(kvmd, &swapinfo, 1,0)) == -1){
154 tdb 1.20 sg_set_error(SG_ERROR_KVM_GETSWAPINFO, NULL);
155 pajs 1.4 return NULL;
156     }
157 pajs 1.1
158 tdb 1.15 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 ats 1.7 #endif
165 tdb 1.13 #if defined(NETBSD) || defined(OPENBSD)
166 ats 1.18 if ((uvm = sg_get_uvmexp()) == NULL) {
167 ats 1.7 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 tdb 1.12 #endif
174    
175 pajs 1.1 return &swap_stat;
176    
177     }