From 88a18b5070c3f132b5cfd6e1b3955fd9a4a7d8de Mon Sep 17 00:00:00 2001
From: "Carlos J. Torres" <vlaadbrain@gmail.com>
Date: Sat, 8 Feb 2014 12:54:04 -0500
Subject: disable all swap devices

---
 swapoff.c | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/swapoff.c b/swapoff.c
index 88762fe..68b1f02 100644
--- a/swapoff.c
+++ b/swapoff.c
@@ -1,5 +1,6 @@
 /* See LICENSE file for copyright and license details. */
 #include <sys/swap.h>
+#include <mntent.h>
 #include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -9,7 +10,7 @@
 static void
 usage(void)
 {
-	eprintf("usage: %s device\n", argv0);
+	eprintf("usage: %s [-a] device\n", argv0);
 }
 
 int
@@ -17,21 +18,41 @@ main(int argc, char *argv[])
 {
 	int i;
 	int ret = EXIT_SUCCESS;
+	int all = 0;
 
 	ARGBEGIN {
+	case 'a':
+		all = 1;
+		break;
 	default:
 		usage();
 	} ARGEND;
 
-	if (argc < 1)
+	if (!all && argc < 1)
 		usage();
 
-	for (i = 0; i < argc; i++) {
-		ret = swapoff(argv[i]);
-		if (ret < 0) {
-			fprintf(stderr, "swapoff %s: %s\n",
-				argv[i], strerror(errno));
-			ret = EXIT_FAILURE;
+	if (all) {
+		struct mntent *me = NULL;
+		FILE *fp;
+
+		fp = setmntent("/etc/fstab", "r");
+		while ((me = getmntent(fp)) != NULL) {
+			if (strcmp(me->mnt_type, MNTTYPE_SWAP) == 0) {
+				if (swapoff(me->mnt_fsname) < 0) {
+					fprintf(stderr, "swapoff %s: %s\n",
+							me->mnt_fsname, strerror(errno));
+					ret = EXIT_FAILURE;
+				}
+			}
+		}
+		endmntent(fp);
+	} else {
+		for (i = 0; i < argc; i++) {
+			if (swapoff(argv[i]) < 0) {
+				fprintf(stderr, "swapoff %s: %s\n",
+						argv[i], strerror(errno));
+				ret = EXIT_FAILURE;
+			}
 		}
 	}
 	return ret;
-- 
1.8.4

