2 * Copyright (c) 2005 Sendmail, Inc. and its suppliers.
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.
11 SM_RCSID("@(#)$Id: memstat.c,v 1.4 2005/12/10 00:38:48 ca Exp $")
19 static long sc_page_size;
22 ** SM_MEMSTAT_OPEN -- open memory statistics
28 ** errno as error code, 0: ok
34 sc_page_size = sysconf(_SC_PAGE_SIZE);
35 if (sc_page_size == -1)
36 return (errno != 0) ? errno : -1;
41 ** SM_MEMSTAT_CLOSE -- close memory statistics
47 ** errno as error code, 0: ok
57 ** SM_MEMSTAT_GET -- get memory statistics
60 ** resource -- resource to look up
61 ** pvalue -- (pointer to) memory statistics value (output)
69 sm_memstat_get(resource, pvalue)
76 r = swapctl(SC_AINFO, &ai);
78 return (errno != 0) ? errno : -1;
79 r = ai.ani_max - ai.ani_resv;
80 r *= sc_page_size >> 10;
88 #include <sys/sysinfo.h>
90 static kstat_ctl_t *kc;
94 ** SM_MEMSTAT_OPEN -- open memory statistics
100 ** errno as error code, 0: ok
110 return (errno != 0) ? errno : -1;
111 kst = kstat_lookup(kc, "unix", 0,
112 (name != NULL) ? name : "system_pages");
114 return (errno != 0) ? errno : -2;
119 ** SM_MEMSTAT_CLOSE -- close memory statistics
125 ** errno as error code, 0: ok
137 return (errno != 0) ? errno : -1;
142 ** SM_MEMSTAT_GET -- get memory statistics
145 ** resource -- resource to look up
146 ** pvalue -- (pointer to) memory statistics value (output)
154 sm_memstat_get(resource, pvalue)
161 if (kc == NULL || kst == NULL)
163 if (kstat_read(kc, kst, NULL) == -1)
164 return (errno != 0) ? errno : -2;
165 kn = kstat_data_lookup(kst,
166 (resource != NULL) ? resource: "freemem");
168 return (errno != 0) ? errno : -3;
169 *pvalue = kn->value.ul;
177 total: used: free: shared: buffers: cached:
178 Mem: 261468160 252149760 9318400 0 3854336 109813760
179 Swap: 1052794880 62185472 990609408
188 Inact_target: 4092 kB
193 SwapTotal: 1028120 kB
202 ** SM_MEMSTAT_OPEN -- open memory statistics
208 ** errno as error code, 0: ok
214 fp = fopen("/proc/meminfo", "r");
215 return (fp != NULL) ? 0 : errno;
219 ** SM_MEMSTAT_CLOSE -- close memory statistics
225 ** errno as error code, 0: ok
240 ** SM_MEMSTAT_GET -- get memory statistics
243 ** resource -- resource to look up
244 ** pvalue -- (pointer to) memory statistics value (output)
252 sm_memstat_get(resource, pvalue)
260 if (resource == NULL)
265 return -1; /* try to reopen? */
267 l = strlen(resource);
268 while (fgets(buf, sizeof(buf), fp) != NULL)
270 if (strncmp(buf, resource, l) == 0 && buf[l] == ':')
272 r = sscanf(buf + l + 1, "%ld", pvalue);
273 return (r > 0) ? 0 : -1;
279 #else /* USEPROCMEMINFO */
282 ** SM_MEMSTAT_OPEN -- open memory statistics
288 ** errno as error code, 0: ok
298 ** SM_MEMSTAT_CLOSE -- close memory statistics
304 ** errno as error code, 0: ok
314 ** SM_MEMSTAT_GET -- get memory statistics
317 ** resource -- resource to look up
318 ** pvalue -- (pointer to) memory statistics value (output)
326 sm_memstat_get(resource, pvalue)
333 #endif /* USEKSTAT */