On Sun, Dec 15, 2002 at 02:47:51PM -0800, Matthew Dillon wrote: > : > :How about renaming swapon(8) into swapctl(8) after this function > enhancemen= > :t? > :This name reflects it's purpose much better and would be consistent > with the > :other BSDs. > : > :- Christian > > I am not volunteering to do this, at least not right now. I > have too > big a stack of things that still need to be committed, but if > someone > else would like to tackle this I think it would be a nice little > project > for a developer with some free time to waste and I would be > happy to > review and test the work. >
I have made a small patch, added l, s and h switches to show information about the swap devices. And the U switch to swapctl only to remove all activated swap devices. If anything else is needed let me know and I will add it. -- Eirik Nygaard <[EMAIL PROTECTED]> PGP Key: 83C55EDE
Index: sbin/swapon/Makefile =================================================================== RCS file: /home/ncvs/src/sbin/swapon/Makefile,v retrieving revision 1.7 diff -u -r1.7 Makefile --- sbin/swapon/Makefile 15 Dec 2002 19:17:56 -0000 1.7 +++ sbin/swapon/Makefile 17 Dec 2002 17:00:47 -0000 @@ -3,7 +3,9 @@ PROG= swapon MAN= swapon.8 -LINKS= ${BINDIR}/swapon ${BINDIR}/swapoff +LINKS= ${BINDIR}/swapoff ${BINDIR}/swapon +LINKS+= ${BINDIR}/swapctl ${BINDIR}/swapon MLINKS= swapon.8 swapoff.8 +LDADD= -lc -lkvm .include <bsd.prog.mk> Index: sbin/swapon/swapon.c =================================================================== RCS file: /home/ncvs/src/sbin/swapon/swapon.c,v retrieving revision 1.13 diff -u -r1.13 swapon.c --- sbin/swapon/swapon.c 15 Dec 2002 19:17:56 -0000 1.13 +++ sbin/swapon/swapon.c 17 Dec 2002 17:00:47 -0000 @@ -52,10 +52,17 @@ #include <stdlib.h> #include <string.h> #include <unistd.h> +#include <kvm.h> +#include <fcntl.h> -static void usage(const char *); +#define MAXSWAP 100 + +static void usage(void); static int is_swapoff(const char *); +static int is_swapon(const char *); +static int is_swapctl(const char *); int swap_on_off(char *name, int ignoreebusy, int do_swapoff); +void swaplist(int, int, int); int main(int argc, char **argv) @@ -63,41 +70,68 @@ struct fstab *fsp; int stat; int ch, doall; - int do_swapoff; - char *pname = argv[0]; - - do_swapoff = is_swapoff(pname); - + int do_swapoff, do_swapon; + int sflag = 0, lflag = 0, hflag = 0; + + do_swapoff = is_swapoff(getprogname()); + do_swapon = is_swapon(getprogname()); + doall = 0; - while ((ch = getopt(argc, argv, "a")) != -1) - switch((char)ch) { + while ((ch = getopt(argc, argv, "alhsU")) != -1) + switch(ch) { case 'a': doall = 1; break; + case 's': + sflag = 1; + break; + case 'l': + lflag = 1; + break; + case 'h': + hflag = 1; + break; + case 'U': + if (!do_swapon) { + doall = 1; + do_swapoff = 1; + break; + } /* Remove the if if you want the U switch to work with +swapon also, don't know if that is wanted */ case '?': default: - usage(pname); + usage(); } argv += optind; - + stat = 0; - if (doall) - while ((fsp = getfsent()) != NULL) { - if (strcmp(fsp->fs_type, FSTAB_SW)) - continue; - if (strstr(fsp->fs_mntops, "noauto")) - continue; - if (swap_on_off(fsp->fs_spec, 1, do_swapoff)) - stat = 1; - else - printf("%s: %sing %s as swap device\n", - pname, do_swapoff ? "remov" : "add", - fsp->fs_spec); + if (do_swapoff || do_swapon) { + if (doall) { + while ((fsp = getfsent()) != NULL) { + if (strcmp(fsp->fs_type, FSTAB_SW)) + continue; + if (strstr(fsp->fs_mntops, "noauto")) + continue; + if (swap_on_off(fsp->fs_spec, 1, do_swapoff)) + stat = 1; + else + printf("%s: %sing %s as swap device\n", + getprogname(), do_swapoff ? "remov" : +"add", + fsp->fs_spec); + } } - else if (!*argv) - usage(pname); - for (; *argv; ++argv) - stat |= swap_on_off(*argv, 0, do_swapoff); + else if (!*argv) + usage(); + for (; *argv; ++argv) + stat |= swap_on_off(*argv, 0, do_swapoff); + } + else { + if (lflag == 1 || sflag == 1) + swaplist(lflag, sflag, hflag); + + else + usage(); + } + exit(stat); } @@ -120,23 +154,95 @@ } static void -usage(const char *pname) +usage(void) { - fprintf(stderr, "usage: %s [-a] [special_file ...]\n", pname); + fprintf(stderr, "usage: %s [-a%s] [special_file ...]\n", getprogname(), + is_swapctl ? "lsU" : ""); exit(1); } static int is_swapoff(const char *s) { - const char *u; + if (strcmp(s, "swapoff") == 0) + return 1; + else + return 0; +} - if ((u = strrchr(s, '/')) != NULL) - ++u; +static int +is_swapon(const char *s) +{ + if (strcmp(s, "swapon") == 0) + return 1; else - u = s; - if (strcmp(u, "swapoff") == 0) + return 0; +} + +static int +is_swapctl(const char *s) +{ + if (strcmp(s, "swapctl") == 0) return 1; else return 0; } + +void +swaplist(int lflag, int sflag, int hflag) +{ + struct kvm_swap swapinfo[MAXSWAP]; + kvm_t *kd; + int pagesize, i = 0; + int used, total; + + if ((kd = kvm_open("/dev/null", "/dev/null", "/dev/null", O_RDONLY, +"kvm_open")) < 0) { + perror("kvm_open"); + exit(1); + } + if (kvm_getswapinfo(kd, swapinfo, MAXSWAP, 0) < -1) { + fprintf(stderr, "Error getting swap information."); + exit(2); + } + + if (lflag) + printf("%-*s %s%10s %s%10s\n", + 13, "Device:", + hflag ? " " : "", "Total:", + hflag ? " " : "", "Used:"); + + pagesize = getpagesize(); + used = total = 0; + while (swapinfo[i + 1].ksw_total != 0) { + if (lflag) { + total = swapinfo[i].ksw_total * pagesize / 1024; + used = swapinfo[i].ksw_used * pagesize / 1024; + if (hflag) { + total = total / 1000; + used = used / 1000; + } + + printf("%-*s %10d%s %10d%s\n", + 13, swapinfo[i].ksw_devname, + total, hflag ? "M" : "", + used, hflag ? "M" : ""); + } + if (sflag) { + total += swapinfo[i].ksw_total * pagesize / 1024; + used += swapinfo[i].ksw_used * pagesize / 1024; + } + i++; + } + if (hflag) { + total = total / 1000; + used = used / 1000; + } + if (sflag) + printf("Swap: Total: %8d%s Used: %8d%s\n", + total, hflag ? "M" : "", + used, hflag ? "M" : ""); + + kvm_close(kd); + +} +
msg49004/pgp00000.pgp
Description: PGP signature