Correct math and limerick.
[dragonfly.git] / contrib / sendmail-8.14 / libsm / memstat.c
blob80391d757b3a010cf72ec1126c06ce2e28d5c6e9
1 /*
2 * Copyright (c) 2005-2007 Sendmail, Inc. and its suppliers.
3 * All rights reserved.
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 */
10 #include <sm/gen.h>
11 SM_RCSID("@(#)$Id: memstat.c,v 1.6 2007/03/20 23:26:12 ca Exp $")
13 #include <errno.h>
14 #include <sm/misc.h>
16 #if USESWAPCTL
17 #include <sys/stat.h>
18 #include <sys/swap.h>
20 static long sc_page_size;
23 ** SM_MEMSTAT_OPEN -- open memory statistics
25 ** Parameters:
26 ** none
28 ** Results:
29 ** errno as error code, 0: ok
32 int
33 sm_memstat_open()
35 sc_page_size = sysconf(_SC_PAGE_SIZE);
36 if (sc_page_size == -1)
37 return (errno != 0) ? errno : -1;
38 return 0;
42 ** SM_MEMSTAT_CLOSE -- close memory statistics
44 ** Parameters:
45 ** none
47 ** Results:
48 ** errno as error code, 0: ok
51 int
52 sm_memstat_close()
54 return 0;
58 ** SM_MEMSTAT_GET -- get memory statistics
60 ** Parameters:
61 ** resource -- resource to look up
62 ** pvalue -- (pointer to) memory statistics value (output)
64 ** Results:
65 ** 0: success
66 ** !=0: error
69 int
70 sm_memstat_get(resource, pvalue)
71 char *resource;
72 long *pvalue;
74 int r;
75 struct anoninfo ai;
77 r = swapctl(SC_AINFO, &ai);
78 if (r == -1)
79 return (errno != 0) ? errno : -1;
80 r = ai.ani_max - ai.ani_resv;
81 r *= sc_page_size >> 10;
82 *pvalue = r;
83 return 0;
86 #elif USEKSTAT
88 #include <kstat.h>
89 #include <sys/sysinfo.h>
91 static kstat_ctl_t *kc;
92 static kstat_t *kst;
95 ** SM_MEMSTAT_OPEN -- open memory statistics
97 ** Parameters:
98 ** none
100 ** Results:
101 ** errno as error code, 0: ok
105 sm_memstat_open()
107 kstat_named_t *kn;
109 kc = kstat_open();
110 if (kc == NULL)
111 return (errno != 0) ? errno : -1;
112 kst = kstat_lookup(kc, "unix", 0,
113 (name != NULL) ? name : "system_pages");
114 if (kst == 0)
115 return (errno != 0) ? errno : -2;
116 return 0;
120 ** SM_MEMSTAT_CLOSE -- close memory statistics
122 ** Parameters:
123 ** none
125 ** Results:
126 ** errno as error code, 0: ok
130 sm_memstat_close()
132 int r;
134 if (kc == NULL)
135 return 0;
136 r = kstat_close(kc);
137 if (r != 0)
138 return (errno != 0) ? errno : -1;
139 return 0;
143 ** SM_MEMSTAT_GET -- get memory statistics
145 ** Parameters:
146 ** resource -- resource to look up
147 ** pvalue -- (pointer to) memory statistics value (output)
149 ** Results:
150 ** 0: success
151 ** !=0: error
155 sm_memstat_get(resource, pvalue)
156 char *resource;
157 long *pvalue;
159 int r;
160 kstat_named_t *kn;
162 if (kc == NULL || kst == NULL)
163 return -1;
164 if (kstat_read(kc, kst, NULL) == -1)
165 return (errno != 0) ? errno : -2;
166 kn = kstat_data_lookup(kst,
167 (resource != NULL) ? resource: "freemem");
168 if (kn == NULL)
169 return (errno != 0) ? errno : -3;
170 *pvalue = kn->value.ul;
171 return 0;
174 #elif USEPROCMEMINFO
177 /proc/meminfo?
178 total: used: free: shared: buffers: cached:
179 Mem: 261468160 252149760 9318400 0 3854336 109813760
180 Swap: 1052794880 62185472 990609408
181 MemTotal: 255340 kB
182 MemFree: 9100 kB
183 MemShared: 0 kB
184 Buffers: 3764 kB
185 Cached: 107240 kB
186 Active: 104340 kB
187 Inact_dirty: 4220 kB
188 Inact_clean: 2444 kB
189 Inact_target: 4092 kB
190 HighTotal: 0 kB
191 HighFree: 0 kB
192 LowTotal: 255340 kB
193 LowFree: 9100 kB
194 SwapTotal: 1028120 kB
195 SwapFree: 967392 kB
198 #include <stdio.h>
199 #include <string.h>
200 static FILE *fp;
203 ** SM_MEMSTAT_OPEN -- open memory statistics
205 ** Parameters:
206 ** none
208 ** Results:
209 ** errno as error code, 0: ok
213 sm_memstat_open()
215 fp = fopen("/proc/meminfo", "r");
216 return (fp != NULL) ? 0 : errno;
220 ** SM_MEMSTAT_CLOSE -- close memory statistics
222 ** Parameters:
223 ** none
225 ** Results:
226 ** errno as error code, 0: ok
230 sm_memstat_close()
232 if (fp != NULL)
234 fclose(fp);
235 fp = NULL;
237 return 0;
241 ** SM_MEMSTAT_GET -- get memory statistics
243 ** Parameters:
244 ** resource -- resource to look up
245 ** pvalue -- (pointer to) memory statistics value (output)
247 ** Results:
248 ** 0: success
249 ** !=0: error
253 sm_memstat_get(resource, pvalue)
254 char *resource;
255 long *pvalue;
257 int r;
258 size_t l;
259 char buf[80];
261 if (resource == NULL)
262 return EINVAL;
263 if (pvalue == NULL)
264 return EINVAL;
265 if (fp == NULL)
266 return -1; /* try to reopen? */
267 rewind(fp);
268 l = strlen(resource);
269 if (l >= sizeof(buf))
270 return EINVAL;
271 while (fgets(buf, sizeof(buf), fp) != NULL)
273 if (strncmp(buf, resource, l) == 0 && buf[l] == ':')
275 r = sscanf(buf + l + 1, "%ld", pvalue);
276 return (r > 0) ? 0 : -1;
279 return 0;
282 #else /* USEPROCMEMINFO */
285 ** SM_MEMSTAT_OPEN -- open memory statistics
287 ** Parameters:
288 ** none
290 ** Results:
291 ** errno as error code, 0: ok
295 sm_memstat_open()
297 return -1;
301 ** SM_MEMSTAT_CLOSE -- close memory statistics
303 ** Parameters:
304 ** none
306 ** Results:
307 ** errno as error code, 0: ok
311 sm_memstat_close()
313 return 0;
317 ** SM_MEMSTAT_GET -- get memory statistics
319 ** Parameters:
320 ** resource -- resource to look up
321 ** pvalue -- (pointer to) memory statistics value (output)
323 ** Results:
324 ** 0: success
325 ** !=0: error
329 sm_memstat_get(resource, pvalue)
330 char *resource;
331 long *pvalue;
333 return -1;
336 #endif /* USEKSTAT */