1*aa2bd510Smlelstv /* $NetBSD: swaplist.c,v 1.19 2023/12/11 12:47:24 mlelstv Exp $ */
201a7eafbSmrg
301a7eafbSmrg /*
401a7eafbSmrg * Copyright (c) 1997 Matthew R. Green
501a7eafbSmrg * All rights reserved.
601a7eafbSmrg *
701a7eafbSmrg * Redistribution and use in source and binary forms, with or without
801a7eafbSmrg * modification, are permitted provided that the following conditions
901a7eafbSmrg * are met:
1001a7eafbSmrg * 1. Redistributions of source code must retain the above copyright
1101a7eafbSmrg * notice, this list of conditions and the following disclaimer.
1201a7eafbSmrg * 2. Redistributions in binary form must reproduce the above copyright
1301a7eafbSmrg * notice, this list of conditions and the following disclaimer in the
1401a7eafbSmrg * documentation and/or other materials provided with the distribution.
1501a7eafbSmrg *
1601a7eafbSmrg * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1701a7eafbSmrg * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1801a7eafbSmrg * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1901a7eafbSmrg * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2001a7eafbSmrg * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2101a7eafbSmrg * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2201a7eafbSmrg * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
2301a7eafbSmrg * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
2401a7eafbSmrg * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2501a7eafbSmrg * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2601a7eafbSmrg * SUCH DAMAGE.
2701a7eafbSmrg */
28c2a3b5ecSagc #include <sys/cdefs.h>
29c2a3b5ecSagc
30c2a3b5ecSagc #ifndef lint
31*aa2bd510Smlelstv __RCSID("$NetBSD: swaplist.c,v 1.19 2023/12/11 12:47:24 mlelstv Exp $");
32c2a3b5ecSagc #endif
33c2a3b5ecSagc
3401a7eafbSmrg
3501a7eafbSmrg #include <sys/param.h>
3601a7eafbSmrg #include <sys/stat.h>
373d6db0acSmrg #include <sys/swap.h>
3801a7eafbSmrg
3901a7eafbSmrg #include <unistd.h>
40e5ef66b3Smikel #include <err.h>
4101a7eafbSmrg #include <errno.h>
4201a7eafbSmrg #include <stdio.h>
4301a7eafbSmrg #include <stdlib.h>
4401a7eafbSmrg #include <string.h>
458fe1f9c5Sross #include <inttypes.h>
465fd013c4Smrg #include <util.h>
478fe1f9c5Sross
488fe1f9c5Sross #define dbtoqb(b) dbtob((int64_t)(b))
4901a7eafbSmrg
5001a7eafbSmrg /*
5101a7eafbSmrg * NOTE: This file is separate from swapctl.c so that pstat can grab it.
5201a7eafbSmrg */
5301a7eafbSmrg
5401a7eafbSmrg #include "swapctl.h"
5501a7eafbSmrg
56b99b0d9aSmartin int
list_swap(int pri,int kflag,int pflag,int tflag,int dolong,int hflag)57f7f17852Sxtraeme list_swap(int pri, int kflag, int pflag, int tflag, int dolong, int hflag)
5801a7eafbSmrg {
59327d42e4Smrg struct swapent *sep, *fsep;
6001a7eafbSmrg long blocksize;
615fd013c4Smrg char szbuf[5], usbuf[5], avbuf[5]; /* size, used, avail */
62f7f17852Sxtraeme const char *header, *suff;
635f508bdaSlukem size_t l;
64*aa2bd510Smlelstv int hlen, size, inuse, ncounted, pathmax;
65b5f69ff6Smrg int rnswap, nswap = swapctl(SWAP_NSWAP, 0, 0), i;
66*aa2bd510Smlelstv int64_t totalsize, totalinuse;
6701a7eafbSmrg
6801a7eafbSmrg if (nswap < 1) {
6901a7eafbSmrg puts("no swap devices configured");
70b99b0d9aSmartin return 0;
7101a7eafbSmrg }
7201a7eafbSmrg
73327d42e4Smrg fsep = sep = (struct swapent *)malloc(nswap * sizeof(*sep));
7401a7eafbSmrg if (sep == NULL)
7501a7eafbSmrg err(1, "malloc");
7601a7eafbSmrg rnswap = swapctl(SWAP_STATS, (void *)sep, nswap);
77b5f69ff6Smrg if (rnswap < 0)
783e9d54f4Smrg err(1, "SWAP_STATS");
7901a7eafbSmrg if (nswap != rnswap)
80b5f69ff6Smrg warnx("SWAP_STATS different to SWAP_NSWAP (%d != %d)",
81b5f69ff6Smrg rnswap, nswap);
8201a7eafbSmrg
83b5f69ff6Smrg pathmax = 11;
849bf440d2Smrg switch(kflag) {
859bf440d2Smrg case 1:
8601a7eafbSmrg header = "1K-blocks";
8701a7eafbSmrg blocksize = 1024;
889bf440d2Smrg suff = "KBytes";
899bf440d2Smrg break;
909bf440d2Smrg case 2:
919bf440d2Smrg suff = "MBytes";
929bf440d2Smrg header = "1M-blocks";
939bf440d2Smrg blocksize = 1024 * 1024;
949bf440d2Smrg break;
959bf440d2Smrg case 3:
969bf440d2Smrg header = "1G-blocks";
979bf440d2Smrg blocksize = 1024 * 1024 * 1024;
989bf440d2Smrg suff = "GBytes";
999bf440d2Smrg break;
1009bf440d2Smrg default:
1019bf440d2Smrg suff = "blocks";
1029bf440d2Smrg if (!hflag) {
10301a7eafbSmrg header = getbsize(&hlen, &blocksize);
1049bf440d2Smrg } else {
1059bf440d2Smrg header = "Size";
1069bf440d2Smrg blocksize = 1; suff = ""; /* unused */
1079bf440d2Smrg }
1089bf440d2Smrg break;
1099bf440d2Smrg }
1109bf440d2Smrg if (hflag || kflag)
1119bf440d2Smrg hlen = strlen(header);
1129bf440d2Smrg
1139bf440d2Smrg if (dolong && tflag == 0) {
114b5f69ff6Smrg for (i = rnswap; i-- > 0; sep++)
1155f508bdaSlukem if ((size_t)pathmax < (l = strlen(sep->se_path)))
116b5f69ff6Smrg pathmax = l;
117b5f69ff6Smrg sep = fsep;
118b5f69ff6Smrg (void)printf("%-*s %*s %8s %8s %8s %s\n",
119b5f69ff6Smrg pathmax, "Device", hlen, header,
12001a7eafbSmrg "Used", "Avail", "Capacity", "Priority");
12101a7eafbSmrg }
12201a7eafbSmrg totalsize = totalinuse = ncounted = 0;
12301a7eafbSmrg for (; rnswap-- > 0; sep++) {
12401a7eafbSmrg if (pflag && sep->se_priority != pri)
12501a7eafbSmrg continue;
12601a7eafbSmrg ncounted++;
12701a7eafbSmrg size = sep->se_nblks;
12801a7eafbSmrg inuse = sep->se_inuse;
12901a7eafbSmrg totalsize += size;
13001a7eafbSmrg totalinuse += inuse;
13101a7eafbSmrg
13201a7eafbSmrg if (dolong && tflag == 0) {
1335fd013c4Smrg if (hflag == 0) {
134b5f69ff6Smrg (void)printf("%-*s %*ld ", pathmax, sep->se_path, hlen,
135b5f69ff6Smrg (long)(dbtoqb(size) / blocksize));
13601a7eafbSmrg
137e5ef66b3Smikel (void)printf("%8ld %8ld %5.0f%% %d\n",
1388fe1f9c5Sross (long)(dbtoqb(inuse) / blocksize),
1398fe1f9c5Sross (long)(dbtoqb(size - inuse) / blocksize),
14001a7eafbSmrg (double)inuse / (double)size * 100.0,
14101a7eafbSmrg sep->se_priority);
1425fd013c4Smrg } else {
1435fd013c4Smrg if ((humanize_number(szbuf, sizeof(szbuf), (dbtoqb(size)),
1445fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
1455fd013c4Smrg err(1, "humanize_number");
1465fd013c4Smrg if ((humanize_number(usbuf, sizeof(usbuf), (dbtoqb(inuse)),
1475fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
1485fd013c4Smrg err(1, "humanize_number");
1495fd013c4Smrg if ((humanize_number(avbuf, sizeof(avbuf), (dbtoqb(size-inuse)),
1505fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
1515fd013c4Smrg err(1, "humanize_number");
1525fd013c4Smrg (void)printf("%-*s %*s ", pathmax, sep->se_path, hlen, szbuf);
1535fd013c4Smrg
1545fd013c4Smrg (void)printf("%8s %8s %5.0f%% %d\n",
1555fd013c4Smrg usbuf, avbuf,
1565fd013c4Smrg (double)inuse / (double)size * 100.0,
1575fd013c4Smrg sep->se_priority);
1585fd013c4Smrg }
15901a7eafbSmrg }
16001a7eafbSmrg }
1619bf440d2Smrg if (tflag) {
1629bf440d2Smrg if (hflag) {
1639bf440d2Smrg if ((humanize_number(usbuf, sizeof(usbuf), (dbtoqb(totalinuse)),
1649bf440d2Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
1659bf440d2Smrg err(1, "humanize_number");
1669bf440d2Smrg if ((humanize_number(szbuf, sizeof(szbuf), (dbtoqb(totalsize)),
1679bf440d2Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
1689bf440d2Smrg err(1, "humanize_number");
1699bf440d2Smrg (void)printf("%s/%s swap space\n", usbuf, szbuf);
1709bf440d2Smrg } else {
1719bf440d2Smrg (void)printf("%ld/%ld %s swap space\n",
1729bf440d2Smrg (long)(dbtoqb(totalinuse) / blocksize),
1739bf440d2Smrg (long)(dbtoqb(totalsize) / blocksize),
1749bf440d2Smrg suff);
1759bf440d2Smrg }
1769bf440d2Smrg }
1775fd013c4Smrg else if (dolong == 0) {
1785fd013c4Smrg if (hflag) {
1795fd013c4Smrg if ((humanize_number(szbuf, sizeof(szbuf), (dbtoqb(totalsize)),
1805fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
1815fd013c4Smrg err(1, "humanize_number");
1825fd013c4Smrg if ((humanize_number(usbuf, sizeof(usbuf), (dbtoqb(totalinuse)),
1835fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
1845fd013c4Smrg err(1, "humanize_number");
1855fd013c4Smrg if ((humanize_number(avbuf, sizeof(avbuf), (dbtoqb(totalsize-totalinuse)),
1865fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
1875fd013c4Smrg err(1, "humanize_number");
18859695411Spgoyette (void)printf("total: %s allocated, %s used, %s available.\n",
1895fd013c4Smrg szbuf, usbuf, avbuf);
1905fd013c4Smrg } else {
19159695411Spgoyette printf("total: %ld %s allocated, %ld %s used, "
1929bf440d2Smrg "%ld %s available\n",
1939bf440d2Smrg (long)(dbtoqb(totalsize) / blocksize), suff,
1949bf440d2Smrg (long)(dbtoqb(totalinuse) / blocksize), suff,
1959bf440d2Smrg (long)(dbtoqb(totalsize - totalinuse) / blocksize), suff);
1965fd013c4Smrg }
1975fd013c4Smrg } else if (ncounted > 1) {
1985fd013c4Smrg if (hflag) {
1995fd013c4Smrg if ((humanize_number(szbuf, sizeof(szbuf), (dbtoqb(totalsize)),
2005fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
2015fd013c4Smrg err(1, "humanize_number");
2025fd013c4Smrg if ((humanize_number(usbuf, sizeof(usbuf), (dbtoqb(totalinuse)),
2035fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
2045fd013c4Smrg err(1, "humanize_number");
2055fd013c4Smrg if ((humanize_number(avbuf, sizeof(avbuf), (dbtoqb(totalsize-totalinuse)),
2065fd013c4Smrg "", HN_AUTOSCALE, (HN_DECIMAL | HN_B | HN_NOSPACE))) == -1)
2075fd013c4Smrg err(1, "humanize_number");
2085fd013c4Smrg (void)printf("%-*s %*s %8s %8s %5.0f%%\n", pathmax, "Total",
2095fd013c4Smrg hlen, szbuf, usbuf, avbuf,
2105fd013c4Smrg (double)(totalinuse) / (double)totalsize * 100.0);
2115fd013c4Smrg } else {
212b5f69ff6Smrg (void)printf("%-*s %*ld %8ld %8ld %5.0f%%\n", pathmax, "Total",
213b5f69ff6Smrg hlen,
2148fe1f9c5Sross (long)(dbtoqb(totalsize) / blocksize),
2158fe1f9c5Sross (long)(dbtoqb(totalinuse) / blocksize),
2168fe1f9c5Sross (long)(dbtoqb(totalsize - totalinuse) / blocksize),
21701a7eafbSmrg (double)(totalinuse) / (double)totalsize * 100.0);
2185fd013c4Smrg }
2195fd013c4Smrg }
220327d42e4Smrg if (fsep)
221327d42e4Smrg (void)free(fsep);
222b99b0d9aSmartin
223b99b0d9aSmartin return 1;
22401a7eafbSmrg }
225