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 */