Beispiel #1
0
static void
swaplist(int lflag, int sflag, int hflag)
{
	size_t mibsize, size;
	struct xswdev xsw;
	int hlen, mib[16], n, pagesize;
	long blocksize;
	long long total = 0;
	long long used = 0;
	long long tmp_total;
	long long tmp_used;
	char buf[32];
	
	pagesize = getpagesize();
	switch(hflag) {
	case 'G':
	    blocksize = 1024 * 1024 * 1024;
	    strlcpy(buf, "1GB-blocks", sizeof(buf));
	    hlen = 10;
	    break;
	case 'H':
	    blocksize = -1;
	    strlcpy(buf, "Bytes", sizeof(buf));
	    hlen = 10;
	    break;
	case 'K':
	    blocksize = 1024;
	    strlcpy(buf, "1kB-blocks", sizeof(buf));
	    hlen = 10;
	    break;
	case 'M':
	    blocksize = 1024 * 1024;
	    strlcpy(buf, "1MB-blocks", sizeof(buf));
	    hlen = 10;
	    break;
	default:
	    getbsize(&hlen, &blocksize);
	    snprintf(buf, sizeof(buf), "%ld-blocks", blocksize);
	    break;
	}
	
	mibsize = sizeof mib / sizeof mib[0];
	if (sysctlnametomib("vm.swap_info", mib, &mibsize) == -1)
		err(1, "sysctlnametomib()");
	
	if (lflag) {
		printf("%-13s %*s %*s\n",
		    "Device:", 
		    hlen, buf,
		    hlen, "Used:");
	}
	
	for (n = 0; ; ++n) {
		mib[mibsize] = n;
		size = sizeof xsw;
		if (sysctl(mib, mibsize + 1, &xsw, &size, NULL, 0) == -1)
			break;
		if (xsw.xsw_version != XSWDEV_VERSION)
			errx(1, "xswdev version mismatch");
		
		tmp_total = (long long)xsw.xsw_nblks * pagesize;
		tmp_used  = (long long)xsw.xsw_used * pagesize;
		total += tmp_total;
		used  += tmp_used;
		if (lflag) {
			sizetobuf(buf, sizeof(buf), hflag, tmp_total, hlen,
			    blocksize);
			printf("/dev/%-8s %s ", devname(xsw.xsw_dev, S_IFCHR),
			    buf);
			sizetobuf(buf, sizeof(buf), hflag, tmp_used, hlen,
			    blocksize);
			printf("%s\n", buf);
		}
	}
	if (errno != ENOENT)
		err(1, "sysctl()");
	
	if (sflag) {
		sizetobuf(buf, sizeof(buf), hflag, total, hlen, blocksize);
		printf("Total:        %s ", buf);
		sizetobuf(buf, sizeof(buf), hflag, used, hlen, blocksize);
		printf("%s\n", buf);
	}
}
Beispiel #2
0
static void
swaplist(int lflag, int sflag, int hflag)
{
	size_t ksize, bytes = 0;
	char *xswbuf;
	struct xswdev *xsw;
	int hlen, pagesize;
	int i, n;
	long blocksize;
	long long total, used, tmp_total, tmp_used;
	char buf[32];

	pagesize = getpagesize();
	switch(hflag) {
	case 'G':
		blocksize = 1024 * 1024 * 1024;
		strlcpy(buf, "1GB-blocks", sizeof(buf));
		hlen = 10;
		break;
	case 'H':
		blocksize = -1;
		strlcpy(buf, "Bytes", sizeof(buf));
		hlen = 10;
		break;
	case 'K':
		blocksize = 1024;
		strlcpy(buf, "1kB-blocks", sizeof(buf));
		hlen = 10;
		break;
	case 'M':
		blocksize = 1024 * 1024;
		strlcpy(buf, "1MB-blocks", sizeof(buf));
		hlen = 10;
		break;
	default:
		getbsize(&hlen, &blocksize);
		snprintf(buf, sizeof(buf), "%ld-blocks", blocksize);
		break;
	}

	if (sysctlbyname("vm.swap_info_array", NULL, &bytes, NULL, 0) < 0)
		err(1, "sysctlbyname()");
	if (bytes == 0)
		err(1, "sysctlbyname()");

	xswbuf = malloc(bytes);
	if (sysctlbyname("vm.swap_info_array", xswbuf, &bytes, NULL, 0) < 0) {
		free(xswbuf);
		err(1, "sysctlbyname()");
	}
	if (bytes == 0) {
		free(xswbuf);
		err(1, "sysctlbyname()");
	}

	/*
	 * Calculate size of xsw entry returned by kernel (it can be larger
	 * than the one we have if there is a version mismatch).
	 */
	ksize = ((struct xswdev *)xswbuf)->xsw_size;
	n = (int)(bytes / ksize);

	if (lflag) {
		printf("%-13s %*s %*s\n",
		    "Device:",
		    hlen, buf,
		    hlen, "Used:");
	}

	total = used = tmp_total = tmp_used = 0;
	for (i = 0; i < n; ++i) {
		xsw = (void *)((char *)xswbuf + i * ksize);

		if (xsw->xsw_nblks == 0)
			continue;

		tmp_total = (long long)xsw->xsw_nblks * pagesize;
		tmp_used = (long long)xsw->xsw_used * pagesize;
		total += tmp_total;
		used += tmp_used;
		if (lflag) {
			sizetobuf(buf, sizeof(buf), hflag, tmp_total, hlen,
			    blocksize);
			if (xsw->xsw_dev == NODEV) {
				printf("%-13s %s ", "[NFS swap]", buf);
			} else {
				printf("/dev/%-8s %s ",
				    devname(xsw->xsw_dev, S_IFCHR), buf);
			}

			sizetobuf(buf, sizeof(buf), hflag, tmp_used, hlen,
			    blocksize);
			printf("%s\n", buf);
		}
	}

	if (sflag) {
		sizetobuf(buf, sizeof(buf), hflag, total, hlen, blocksize);
		printf("Total:        %s ", buf);
		sizetobuf(buf, sizeof(buf), hflag, used, hlen, blocksize);
		printf("%s\n", buf);
	}
}