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