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