xref: /freebsd/contrib/sendmail/libsm/memstat.c (revision 2fb4f839)
14e4196cbSGregory Neil Shapiro /*
25dd76dd0SGregory Neil Shapiro  * Copyright (c) 2005-2007 Proofpoint, Inc. and its suppliers.
34e4196cbSGregory Neil Shapiro  *      All rights reserved.
44e4196cbSGregory Neil Shapiro  *
54e4196cbSGregory Neil Shapiro  * By using this file, you agree to the terms and conditions set
64e4196cbSGregory Neil Shapiro  * forth in the LICENSE file which can be found at the top level of
74e4196cbSGregory Neil Shapiro  * the sendmail distribution.
84e4196cbSGregory Neil Shapiro  */
94e4196cbSGregory Neil Shapiro 
104e4196cbSGregory Neil Shapiro #include <sm/gen.h>
114313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: memstat.c,v 1.7 2013-11-22 20:51:43 ca Exp $")
124e4196cbSGregory Neil Shapiro 
134e4196cbSGregory Neil Shapiro #include <errno.h>
14d0cef73dSGregory Neil Shapiro #include <sm/misc.h>
154e4196cbSGregory Neil Shapiro 
164e4196cbSGregory Neil Shapiro #if USESWAPCTL
174e4196cbSGregory Neil Shapiro #include <sys/stat.h>
184e4196cbSGregory Neil Shapiro #include <sys/swap.h>
194e4196cbSGregory Neil Shapiro 
204e4196cbSGregory Neil Shapiro static long sc_page_size;
214e4196cbSGregory Neil Shapiro 
224e4196cbSGregory Neil Shapiro /*
234e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_OPEN -- open memory statistics
244e4196cbSGregory Neil Shapiro **
254e4196cbSGregory Neil Shapiro **	Parameters:
264e4196cbSGregory Neil Shapiro **		none
274e4196cbSGregory Neil Shapiro **
284e4196cbSGregory Neil Shapiro **	Results:
294e4196cbSGregory Neil Shapiro **		errno as error code, 0: ok
304e4196cbSGregory Neil Shapiro */
314e4196cbSGregory Neil Shapiro 
324e4196cbSGregory Neil Shapiro int
sm_memstat_open()334e4196cbSGregory Neil Shapiro sm_memstat_open()
344e4196cbSGregory Neil Shapiro {
354e4196cbSGregory Neil Shapiro 	sc_page_size = sysconf(_SC_PAGE_SIZE);
364e4196cbSGregory Neil Shapiro 	if (sc_page_size == -1)
374e4196cbSGregory Neil Shapiro 		return (errno != 0) ? errno : -1;
384e4196cbSGregory Neil Shapiro 	return 0;
394e4196cbSGregory Neil Shapiro }
404e4196cbSGregory Neil Shapiro 
414e4196cbSGregory Neil Shapiro /*
424e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_CLOSE -- close memory statistics
434e4196cbSGregory Neil Shapiro **
444e4196cbSGregory Neil Shapiro **	Parameters:
454e4196cbSGregory Neil Shapiro **		none
464e4196cbSGregory Neil Shapiro **
474e4196cbSGregory Neil Shapiro **	Results:
484e4196cbSGregory Neil Shapiro **		errno as error code, 0: ok
494e4196cbSGregory Neil Shapiro */
504e4196cbSGregory Neil Shapiro 
514e4196cbSGregory Neil Shapiro int
sm_memstat_close()524e4196cbSGregory Neil Shapiro sm_memstat_close()
534e4196cbSGregory Neil Shapiro {
544e4196cbSGregory Neil Shapiro 	return 0;
554e4196cbSGregory Neil Shapiro }
564e4196cbSGregory Neil Shapiro 
574e4196cbSGregory Neil Shapiro /*
584e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_GET -- get memory statistics
594e4196cbSGregory Neil Shapiro **
604e4196cbSGregory Neil Shapiro **	Parameters:
614e4196cbSGregory Neil Shapiro **		resource -- resource to look up
624e4196cbSGregory Neil Shapiro **		pvalue -- (pointer to) memory statistics value (output)
634e4196cbSGregory Neil Shapiro **
644e4196cbSGregory Neil Shapiro **	Results:
654e4196cbSGregory Neil Shapiro **		0: success
664e4196cbSGregory Neil Shapiro **		!=0: error
674e4196cbSGregory Neil Shapiro */
684e4196cbSGregory Neil Shapiro 
694e4196cbSGregory Neil Shapiro int
sm_memstat_get(resource,pvalue)704e4196cbSGregory Neil Shapiro sm_memstat_get(resource, pvalue)
714e4196cbSGregory Neil Shapiro 	char *resource;
724e4196cbSGregory Neil Shapiro 	long *pvalue;
734e4196cbSGregory Neil Shapiro {
744e4196cbSGregory Neil Shapiro 	int r;
754e4196cbSGregory Neil Shapiro 	struct anoninfo ai;
764e4196cbSGregory Neil Shapiro 
774e4196cbSGregory Neil Shapiro 	r = swapctl(SC_AINFO, &ai);
784e4196cbSGregory Neil Shapiro 	if (r == -1)
794e4196cbSGregory Neil Shapiro 		return (errno != 0) ? errno : -1;
804e4196cbSGregory Neil Shapiro 	r = ai.ani_max - ai.ani_resv;
814e4196cbSGregory Neil Shapiro 	r *= sc_page_size >> 10;
824e4196cbSGregory Neil Shapiro 	*pvalue = r;
834e4196cbSGregory Neil Shapiro 	return 0;
844e4196cbSGregory Neil Shapiro }
854e4196cbSGregory Neil Shapiro 
864e4196cbSGregory Neil Shapiro #elif USEKSTAT
874e4196cbSGregory Neil Shapiro 
884e4196cbSGregory Neil Shapiro #include <kstat.h>
894e4196cbSGregory Neil Shapiro #include <sys/sysinfo.h>
904e4196cbSGregory Neil Shapiro 
914e4196cbSGregory Neil Shapiro static kstat_ctl_t *kc;
924e4196cbSGregory Neil Shapiro static kstat_t *kst;
934e4196cbSGregory Neil Shapiro 
944e4196cbSGregory Neil Shapiro /*
954e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_OPEN -- open memory statistics
964e4196cbSGregory Neil Shapiro **
974e4196cbSGregory Neil Shapiro **	Parameters:
984e4196cbSGregory Neil Shapiro **		none
994e4196cbSGregory Neil Shapiro **
1004e4196cbSGregory Neil Shapiro **	Results:
1014e4196cbSGregory Neil Shapiro **		errno as error code, 0: ok
1024e4196cbSGregory Neil Shapiro */
1034e4196cbSGregory Neil Shapiro 
1044e4196cbSGregory Neil Shapiro int
1054e4196cbSGregory Neil Shapiro sm_memstat_open()
1064e4196cbSGregory Neil Shapiro {
1074e4196cbSGregory Neil Shapiro 	kstat_named_t *kn;
1084e4196cbSGregory Neil Shapiro 
1094e4196cbSGregory Neil Shapiro 	kc = kstat_open();
1104e4196cbSGregory Neil Shapiro 	if (kc == NULL)
1114e4196cbSGregory Neil Shapiro 		return (errno != 0) ? errno : -1;
1124e4196cbSGregory Neil Shapiro 	kst = kstat_lookup(kc, "unix", 0,
1134e4196cbSGregory Neil Shapiro 		(name != NULL) ? name : "system_pages");
1145b0945b5SGregory Neil Shapiro 	if (kst == NULL)
1154e4196cbSGregory Neil Shapiro 		return (errno != 0) ? errno : -2;
1164e4196cbSGregory Neil Shapiro 	return 0;
1174e4196cbSGregory Neil Shapiro }
1184e4196cbSGregory Neil Shapiro 
1194e4196cbSGregory Neil Shapiro /*
1204e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_CLOSE -- close memory statistics
1214e4196cbSGregory Neil Shapiro **
1224e4196cbSGregory Neil Shapiro **	Parameters:
1234e4196cbSGregory Neil Shapiro **		none
1244e4196cbSGregory Neil Shapiro **
1254e4196cbSGregory Neil Shapiro **	Results:
1264e4196cbSGregory Neil Shapiro **		errno as error code, 0: ok
1274e4196cbSGregory Neil Shapiro */
1284e4196cbSGregory Neil Shapiro 
1294e4196cbSGregory Neil Shapiro int
1304e4196cbSGregory Neil Shapiro sm_memstat_close()
1314e4196cbSGregory Neil Shapiro {
1324e4196cbSGregory Neil Shapiro 	int r;
1334e4196cbSGregory Neil Shapiro 
1344e4196cbSGregory Neil Shapiro 	if (kc == NULL)
1354e4196cbSGregory Neil Shapiro 		return 0;
1364e4196cbSGregory Neil Shapiro 	r = kstat_close(kc);
1374e4196cbSGregory Neil Shapiro 	if (r != 0)
1384e4196cbSGregory Neil Shapiro 		return (errno != 0) ? errno : -1;
1394e4196cbSGregory Neil Shapiro 	return 0;
1404e4196cbSGregory Neil Shapiro }
1414e4196cbSGregory Neil Shapiro 
1424e4196cbSGregory Neil Shapiro /*
1434e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_GET -- get memory statistics
1444e4196cbSGregory Neil Shapiro **
1454e4196cbSGregory Neil Shapiro **	Parameters:
1464e4196cbSGregory Neil Shapiro **		resource -- resource to look up
1474e4196cbSGregory Neil Shapiro **		pvalue -- (pointer to) memory statistics value (output)
1484e4196cbSGregory Neil Shapiro **
1494e4196cbSGregory Neil Shapiro **	Results:
1504e4196cbSGregory Neil Shapiro **		0: success
1514e4196cbSGregory Neil Shapiro **		!=0: error
1524e4196cbSGregory Neil Shapiro */
1534e4196cbSGregory Neil Shapiro 
1544e4196cbSGregory Neil Shapiro int
1554e4196cbSGregory Neil Shapiro sm_memstat_get(resource, pvalue)
1564e4196cbSGregory Neil Shapiro 	char *resource;
1574e4196cbSGregory Neil Shapiro 	long *pvalue;
1584e4196cbSGregory Neil Shapiro {
1594e4196cbSGregory Neil Shapiro 	int r;
1604e4196cbSGregory Neil Shapiro 	kstat_named_t *kn;
1614e4196cbSGregory Neil Shapiro 
1624e4196cbSGregory Neil Shapiro 	if (kc == NULL || kst == NULL)
1634e4196cbSGregory Neil Shapiro 		return -1;
1644e4196cbSGregory Neil Shapiro 	if (kstat_read(kc, kst, NULL) == -1)
1654e4196cbSGregory Neil Shapiro 		return (errno != 0) ? errno : -2;
1664e4196cbSGregory Neil Shapiro 	kn = kstat_data_lookup(kst,
1674e4196cbSGregory Neil Shapiro 			(resource != NULL) ? resource: "freemem");
1684e4196cbSGregory Neil Shapiro 	if (kn == NULL)
1694e4196cbSGregory Neil Shapiro 		return (errno != 0) ? errno : -3;
1704e4196cbSGregory Neil Shapiro 	*pvalue = kn->value.ul;
1714e4196cbSGregory Neil Shapiro 	return 0;
1724e4196cbSGregory Neil Shapiro }
1734e4196cbSGregory Neil Shapiro 
1744e4196cbSGregory Neil Shapiro #elif USEPROCMEMINFO
1754e4196cbSGregory Neil Shapiro 
1764e4196cbSGregory Neil Shapiro /*
1774e4196cbSGregory Neil Shapiro /proc/meminfo?
1784e4196cbSGregory Neil Shapiro         total:    used:    free:  shared: buffers:  cached:
1794e4196cbSGregory Neil Shapiro Mem:  261468160 252149760  9318400        0  3854336 109813760
1804e4196cbSGregory Neil Shapiro Swap: 1052794880 62185472 990609408
1814e4196cbSGregory Neil Shapiro MemTotal:       255340 kB
1824e4196cbSGregory Neil Shapiro MemFree:          9100 kB
1834e4196cbSGregory Neil Shapiro MemShared:           0 kB
1844e4196cbSGregory Neil Shapiro Buffers:          3764 kB
1854e4196cbSGregory Neil Shapiro Cached:         107240 kB
1864e4196cbSGregory Neil Shapiro Active:         104340 kB
1874e4196cbSGregory Neil Shapiro Inact_dirty:      4220 kB
1884e4196cbSGregory Neil Shapiro Inact_clean:      2444 kB
1894e4196cbSGregory Neil Shapiro Inact_target:     4092 kB
1904e4196cbSGregory Neil Shapiro HighTotal:           0 kB
1914e4196cbSGregory Neil Shapiro HighFree:            0 kB
1924e4196cbSGregory Neil Shapiro LowTotal:       255340 kB
1934e4196cbSGregory Neil Shapiro LowFree:          9100 kB
1944e4196cbSGregory Neil Shapiro SwapTotal:     1028120 kB
1954e4196cbSGregory Neil Shapiro SwapFree:       967392 kB
1964e4196cbSGregory Neil Shapiro */
1974e4196cbSGregory Neil Shapiro 
1984e4196cbSGregory Neil Shapiro #include <stdio.h>
1994e4196cbSGregory Neil Shapiro #include <string.h>
2004e4196cbSGregory Neil Shapiro static FILE *fp;
2014e4196cbSGregory Neil Shapiro 
2024e4196cbSGregory Neil Shapiro /*
2034e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_OPEN -- open memory statistics
2044e4196cbSGregory Neil Shapiro **
2054e4196cbSGregory Neil Shapiro **	Parameters:
2064e4196cbSGregory Neil Shapiro **		none
2074e4196cbSGregory Neil Shapiro **
2084e4196cbSGregory Neil Shapiro **	Results:
2094e4196cbSGregory Neil Shapiro **		errno as error code, 0: ok
2104e4196cbSGregory Neil Shapiro */
2114e4196cbSGregory Neil Shapiro 
2124e4196cbSGregory Neil Shapiro int
2134e4196cbSGregory Neil Shapiro sm_memstat_open()
2144e4196cbSGregory Neil Shapiro {
2154e4196cbSGregory Neil Shapiro 	fp = fopen("/proc/meminfo", "r");
2164e4196cbSGregory Neil Shapiro 	return (fp != NULL) ? 0 : errno;
2174e4196cbSGregory Neil Shapiro }
2184e4196cbSGregory Neil Shapiro 
2194e4196cbSGregory Neil Shapiro /*
2204e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_CLOSE -- close memory statistics
2214e4196cbSGregory Neil Shapiro **
2224e4196cbSGregory Neil Shapiro **	Parameters:
2234e4196cbSGregory Neil Shapiro **		none
2244e4196cbSGregory Neil Shapiro **
2254e4196cbSGregory Neil Shapiro **	Results:
2264e4196cbSGregory Neil Shapiro **		errno as error code, 0: ok
2274e4196cbSGregory Neil Shapiro */
2284e4196cbSGregory Neil Shapiro 
2294e4196cbSGregory Neil Shapiro int
2304e4196cbSGregory Neil Shapiro sm_memstat_close()
2314e4196cbSGregory Neil Shapiro {
2324e4196cbSGregory Neil Shapiro 	if (fp != NULL)
2334e4196cbSGregory Neil Shapiro 	{
2344e4196cbSGregory Neil Shapiro 		fclose(fp);
2354e4196cbSGregory Neil Shapiro 		fp = NULL;
2364e4196cbSGregory Neil Shapiro 	}
2374e4196cbSGregory Neil Shapiro 	return 0;
2384e4196cbSGregory Neil Shapiro }
2394e4196cbSGregory Neil Shapiro 
2404e4196cbSGregory Neil Shapiro /*
2414e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_GET -- get memory statistics
2424e4196cbSGregory Neil Shapiro **
2434e4196cbSGregory Neil Shapiro **	Parameters:
2444e4196cbSGregory Neil Shapiro **		resource -- resource to look up
2454e4196cbSGregory Neil Shapiro **		pvalue -- (pointer to) memory statistics value (output)
2464e4196cbSGregory Neil Shapiro **
2474e4196cbSGregory Neil Shapiro **	Results:
2484e4196cbSGregory Neil Shapiro **		0: success
2494e4196cbSGregory Neil Shapiro **		!=0: error
2504e4196cbSGregory Neil Shapiro */
2514e4196cbSGregory Neil Shapiro 
2524e4196cbSGregory Neil Shapiro int
2534e4196cbSGregory Neil Shapiro sm_memstat_get(resource, pvalue)
2544e4196cbSGregory Neil Shapiro 	char *resource;
2554e4196cbSGregory Neil Shapiro 	long *pvalue;
2564e4196cbSGregory Neil Shapiro {
2574e4196cbSGregory Neil Shapiro 	int r;
2584e4196cbSGregory Neil Shapiro 	size_t l;
2594e4196cbSGregory Neil Shapiro 	char buf[80];
2604e4196cbSGregory Neil Shapiro 
2614e4196cbSGregory Neil Shapiro 	if (resource == NULL)
2624e4196cbSGregory Neil Shapiro 		return EINVAL;
2634e4196cbSGregory Neil Shapiro 	if (pvalue == NULL)
2644e4196cbSGregory Neil Shapiro 		return EINVAL;
2654e4196cbSGregory Neil Shapiro 	if (fp == NULL)
2664e4196cbSGregory Neil Shapiro 		return -1;	/* try to reopen? */
2674e4196cbSGregory Neil Shapiro 	rewind(fp);
2684e4196cbSGregory Neil Shapiro 	l = strlen(resource);
269d0cef73dSGregory Neil Shapiro 	if (l >= sizeof(buf))
270d0cef73dSGregory Neil Shapiro 		return EINVAL;
2714e4196cbSGregory Neil Shapiro 	while (fgets(buf, sizeof(buf), fp) != NULL)
2724e4196cbSGregory Neil Shapiro 	{
2734e4196cbSGregory Neil Shapiro 		if (strncmp(buf, resource, l) == 0 && buf[l] == ':')
2744e4196cbSGregory Neil Shapiro 		{
2754e4196cbSGregory Neil Shapiro 			r = sscanf(buf + l + 1, "%ld", pvalue);
2764e4196cbSGregory Neil Shapiro 			return (r > 0) ? 0 : -1;
2774e4196cbSGregory Neil Shapiro 		}
2784e4196cbSGregory Neil Shapiro 	}
2794e4196cbSGregory Neil Shapiro 	return 0;
2804e4196cbSGregory Neil Shapiro }
2814e4196cbSGregory Neil Shapiro 
2824e4196cbSGregory Neil Shapiro #else /* USEPROCMEMINFO */
2834e4196cbSGregory Neil Shapiro 
2844e4196cbSGregory Neil Shapiro /*
2854e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_OPEN -- open memory statistics
2864e4196cbSGregory Neil Shapiro **
2874e4196cbSGregory Neil Shapiro **	Parameters:
2884e4196cbSGregory Neil Shapiro **		none
2894e4196cbSGregory Neil Shapiro **
2904e4196cbSGregory Neil Shapiro **	Results:
2914e4196cbSGregory Neil Shapiro **		errno as error code, 0: ok
2924e4196cbSGregory Neil Shapiro */
2934e4196cbSGregory Neil Shapiro 
2944e4196cbSGregory Neil Shapiro int
2954e4196cbSGregory Neil Shapiro sm_memstat_open()
2964e4196cbSGregory Neil Shapiro {
2974e4196cbSGregory Neil Shapiro 	return -1;
2984e4196cbSGregory Neil Shapiro }
2994e4196cbSGregory Neil Shapiro 
3004e4196cbSGregory Neil Shapiro /*
3014e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_CLOSE -- close memory statistics
3024e4196cbSGregory Neil Shapiro **
3034e4196cbSGregory Neil Shapiro **	Parameters:
3044e4196cbSGregory Neil Shapiro **		none
3054e4196cbSGregory Neil Shapiro **
3064e4196cbSGregory Neil Shapiro **	Results:
3074e4196cbSGregory Neil Shapiro **		errno as error code, 0: ok
3084e4196cbSGregory Neil Shapiro */
3094e4196cbSGregory Neil Shapiro 
3104e4196cbSGregory Neil Shapiro int
3114e4196cbSGregory Neil Shapiro sm_memstat_close()
3124e4196cbSGregory Neil Shapiro {
3134e4196cbSGregory Neil Shapiro 	return 0;
3144e4196cbSGregory Neil Shapiro }
3154e4196cbSGregory Neil Shapiro 
3164e4196cbSGregory Neil Shapiro /*
3174e4196cbSGregory Neil Shapiro **  SM_MEMSTAT_GET -- get memory statistics
3184e4196cbSGregory Neil Shapiro **
3194e4196cbSGregory Neil Shapiro **	Parameters:
3204e4196cbSGregory Neil Shapiro **		resource -- resource to look up
3214e4196cbSGregory Neil Shapiro **		pvalue -- (pointer to) memory statistics value (output)
3224e4196cbSGregory Neil Shapiro **
3234e4196cbSGregory Neil Shapiro **	Results:
3244e4196cbSGregory Neil Shapiro **		0: success
3254e4196cbSGregory Neil Shapiro **		!=0: error
3264e4196cbSGregory Neil Shapiro */
3274e4196cbSGregory Neil Shapiro 
3284e4196cbSGregory Neil Shapiro int
3294e4196cbSGregory Neil Shapiro sm_memstat_get(resource, pvalue)
3304e4196cbSGregory Neil Shapiro 	char *resource;
3314e4196cbSGregory Neil Shapiro 	long *pvalue;
3324e4196cbSGregory Neil Shapiro {
3334e4196cbSGregory Neil Shapiro 	return -1;
3344e4196cbSGregory Neil Shapiro }
3354e4196cbSGregory Neil Shapiro 
3364e4196cbSGregory Neil Shapiro #endif /* USEKSTAT */
337