ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/i-scream/projects/cms/source/ihost/libstatgrab/swap_stats.c
Revision: 1.2
Committed: Sat May 18 18:15:56 2002 UTC (22 years, 4 months ago) by tdb
Content type: text/plain
Branch: MAIN
Changes since 1.1: +19 -0 lines
Log Message:
i-scream is now licensed under the GPL. I've added the GPL headers to every
source file, and put a full copy of the license in the appropriate places.
I think I've covered everything. This is going to be a mad commit ;)

File Contents

# User Rev Content
1 tdb 1.2 /*
2     * i-scream central monitoring system
3     * Copyright (C) 2000-2002 i-scream
4     *
5     * This program is free software; you can redistribute it and/or
6     * modify it under the terms of the GNU General Public License
7     * as published by the Free Software Foundation; either version 2
8     * of the License, or (at your option) any later version.
9     *
10     * This program is distributed in the hope that it will be useful,
11     * but WITHOUT ANY WARRANTY; without even the implied warranty of
12     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13     * GNU General Public License for more details.
14     *
15     * You should have received a copy of the GNU General Public License
16     * along with this program; if not, write to the Free Software
17     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18     */
19    
20 pajs 1.1 #include <stdio.h>
21     #include "ukcprog.h"
22     #ifdef SOLARIS
23     #include <sys/stat.h>
24     #include <sys/swap.h>
25     #include <unistd.h>
26     #endif
27     #ifdef LINUX
28     #include <string.h>
29     #endif
30     #ifdef FREEBSD
31     #include <sys/types.h>
32     #include <pwd.h>
33     #include <unistd.h>
34     #include <fcntl.h>
35     #include <kvm.h>
36     #include <limits.h>
37     #include <grp.h>
38     #endif
39    
40     char *get_swap_stats(){
41     char *xml_swap_stats;
42     long swaptotal=0;
43     long swapfree=0;
44     long swapused=0;
45     #ifdef SOLARIS
46     struct anoninfo ai;
47     int pagesize;
48     #endif
49     #ifdef LINUX
50     char *line;
51     FILE *f;
52     #endif
53     #ifdef FREEBSD
54     gid_t gid;
55     struct group *kmem_grp;
56     struct kvm_swap swapinfo;
57     int pagesize;
58     kvm_t *kvmd = NULL;
59     char errbuf[_POSIX2_LINE_MAX];
60     #endif
61    
62     #ifdef SOLARIS
63     if((pagesize=sysconf(_SC_PAGESIZE)) == -1){
64     errf("failed to get system pagesize (%m)");
65     return NULL;
66     }
67     if (swapctl(SC_AINFO, &ai) == -1) {
68     errf("failed to get swap stats (%m)");
69     return NULL;
70     }
71     swaptotal=((ai.ani_max/1024)*pagesize)/1024;
72     swapused=((ai.ani_resv/1024)*pagesize)/1024;
73     swapfree=swaptotal-swapused;
74     #endif
75     #ifdef LINUX
76     if ((f=fopen("/proc/meminfo", "r" ))==NULL) {
77     errf("Failed to open memory stats (%m)");
78     return NULL;
79     }
80     while((line=fpgetline(f)) != NULL){
81     if (((strncmp(line,"Swap: ",6)) == 0)) {
82     if((sscanf(line, "%*s %ld %ld %ld", &swaptotal, &swapused, &swapfree)) != 3){
83     errf("Failed to read swap details (%m)");
84     return NULL;
85     }
86     break;
87     }
88     }
89     if ((fclose(f)) != 0) {
90     errf("Failed to close file (%m)");
91     return NULL;
92     }
93     swaptotal=(swaptotal/1024)/1024;
94     swapused=(swapused/1024)/1024;
95     swapfree=(swapfree/1024)/1024;
96     #endif
97     #ifdef FREEBSD
98     /* To do this, this has to be setgid kmem, or be run as root :(
99     */
100     #define MEM_GROUP "kmem"
101     if((kmem_grp=getgrnam(MEM_GROUP))==NULL){
102     errf("Failed to find gid for kmem (%m)");
103     return NULL;
104     }
105     gid=getgid();
106     if((setegid(kmem_grp->gr_gid))!=0){
107     errf("Failed to become gid kmem (%m)\nCan not get swap info.");
108     return NULL;
109     }
110     if((kvmd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, errbuf)) == NULL){
111     errf("Failed to open kvm info to get swap stats (%m)");
112     return NULL;
113     }
114     if ((kvm_getswapinfo(kvmd, &swapinfo, 1,0)) == -1){
115     errf("Failed to get swap info (%m)");
116     return NULL;
117     }
118     if((kvm_close(kvmd))!=0){
119     errf("Failed to close kvm (%m)");
120     return NULL;
121     }
122     if((setegid(gid))!=0){
123     errf("Failed to lose gid kmem (%m)");
124     exit(1);
125     return NULL;
126     }
127     pagesize=getpagesize();
128     swaptotal=((((long)swapinfo.ksw_total)*pagesize)/1024)/1024;
129     swapused=((((long)swapinfo.ksw_used)*pagesize)/1024)/1024;
130     swapfree=swaptotal-swapused;
131     #endif
132    
133    
134    
135     if((xml_swap_stats=strf("<swap><total>%ld</total><used>%ld</used><free>%ld</free></swap>", swaptotal, swapused, swapfree)) == NULL){
136     errf("strf failed (%m)");
137     return NULL;
138     }
139    
140     return xml_swap_stats;
141     }