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 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 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 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"); 114*5b0945b5SGregory 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