2 * Copyright (c) 2005-2007 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.6 2007/03/20 23:26:12 ca Exp $")
20 static long sc_page_size;
23 ** SM_MEMSTAT_OPEN -- open memory statistics
29 ** errno as error code, 0: ok
35 sc_page_size = sysconf(_SC_PAGE_SIZE);
36 if (sc_page_size == -1)
37 return (errno != 0) ? errno : -1;
42 ** SM_MEMSTAT_CLOSE -- close memory statistics
48 ** errno as error code, 0: ok
58 ** SM_MEMSTAT_GET -- get memory statistics
61 ** resource -- resource to look up
62 ** pvalue -- (pointer to) memory statistics value (output)
70 sm_memstat_get(resource, pvalue)
77 r = swapctl(SC_AINFO, &ai);
79 return (errno != 0) ? errno : -1;
80 r = ai.ani_max - ai.ani_resv;
81 r *= sc_page_size >> 10;
89 #include <sys/sysinfo.h>
91 static kstat_ctl_t *kc;
95 ** SM_MEMSTAT_OPEN -- open memory statistics
101 ** errno as error code, 0: ok
111 return (errno != 0) ? errno : -1;
112 kst = kstat_lookup(kc, "unix", 0,
113 (name != NULL) ? name : "system_pages");
115 return (errno != 0) ? errno : -2;
120 ** SM_MEMSTAT_CLOSE -- close memory statistics
126 ** errno as error code, 0: ok
138 return (errno != 0) ? errno : -1;
143 ** SM_MEMSTAT_GET -- get memory statistics
146 ** resource -- resource to look up
147 ** pvalue -- (pointer to) memory statistics value (output)
155 sm_memstat_get(resource, pvalue)
162 if (kc == NULL || kst == NULL)
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");
169 return (errno != 0) ? errno : -3;
170 *pvalue = kn->value.ul;
178 total: used: free: shared: buffers: cached:
179 Mem: 261468160 252149760 9318400 0 3854336 109813760
180 Swap: 1052794880 62185472 990609408
189 Inact_target: 4092 kB
194 SwapTotal: 1028120 kB
203 ** SM_MEMSTAT_OPEN -- open memory statistics
209 ** errno as error code, 0: ok
215 fp = fopen("/proc/meminfo", "r");
216 return (fp != NULL) ? 0 : errno;
220 ** SM_MEMSTAT_CLOSE -- close memory statistics
226 ** errno as error code, 0: ok
241 ** SM_MEMSTAT_GET -- get memory statistics
244 ** resource -- resource to look up
245 ** pvalue -- (pointer to) memory statistics value (output)
253 sm_memstat_get(resource, pvalue)
261 if (resource == NULL)
266 return -1; /* try to reopen? */
268 l = strlen(resource);
269 if (l >= sizeof(buf))
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;
282 #else /* USEPROCMEMINFO */
285 ** SM_MEMSTAT_OPEN -- open memory statistics
291 ** errno as error code, 0: ok
301 ** SM_MEMSTAT_CLOSE -- close memory statistics
307 ** errno as error code, 0: ok
317 ** SM_MEMSTAT_GET -- get memory statistics
320 ** resource -- resource to look up
321 ** pvalue -- (pointer to) memory statistics value (output)
329 sm_memstat_get(resource, pvalue)
336 #endif /* USEKSTAT */