summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--applets/busybox.c10
-rw-r--r--busybox.c10
-rw-r--r--busybox.def.h3
-rw-r--r--internal.h1
-rw-r--r--swapoff.c52
-rw-r--r--swapon.c34
-rw-r--r--swaponoff.c121
-rw-r--r--util-linux/swaponoff.c121
8 files changed, 252 insertions, 100 deletions
diff --git a/applets/busybox.c b/applets/busybox.c
index 45365b3..6bc223a 100644
--- a/applets/busybox.c
+++ b/applets/busybox.c
@@ -132,11 +132,9 @@ static const struct Applet applets[] = {
#ifdef BB_TAR //bin
{"tar", tar_main},
#endif
-#ifdef BB_SWAPOFF //sbin
- {"swapoff", monadic_main},
-#endif
-#ifdef BB_SWAPON //sbin
- {"swapon", monadic_main},
+#ifdef BB_SWAPONOFF //sbin
+ {"swapon", swap_on_off_main},
+ {"swapoff", swap_on_off_main},
#endif
#ifdef BB_SYNC //bin
{"sync", sync_main},
@@ -148,7 +146,7 @@ static const struct Applet applets[] = {
{"true", true_main},
#endif
#ifdef BB_UMOUNT //bin
- {"umount", umount_main},
+ {"umount", umount_main},
#endif
#ifdef BB_UPDATE //sbin
{"update", update_main},
diff --git a/busybox.c b/busybox.c
index 45365b3..6bc223a 100644
--- a/busybox.c
+++ b/busybox.c
@@ -132,11 +132,9 @@ static const struct Applet applets[] = {
#ifdef BB_TAR //bin
{"tar", tar_main},
#endif
-#ifdef BB_SWAPOFF //sbin
- {"swapoff", monadic_main},
-#endif
-#ifdef BB_SWAPON //sbin
- {"swapon", monadic_main},
+#ifdef BB_SWAPONOFF //sbin
+ {"swapon", swap_on_off_main},
+ {"swapoff", swap_on_off_main},
#endif
#ifdef BB_SYNC //bin
{"sync", sync_main},
@@ -148,7 +146,7 @@ static const struct Applet applets[] = {
{"true", true_main},
#endif
#ifdef BB_UMOUNT //bin
- {"umount", umount_main},
+ {"umount", umount_main},
#endif
#ifdef BB_UPDATE //sbin
{"update", update_main},
diff --git a/busybox.def.h b/busybox.def.h
index 10a55f4..8fcbf83 100644
--- a/busybox.def.h
+++ b/busybox.def.h
@@ -42,8 +42,7 @@
#define BB_RM
#define BB_RMDIR
#define BB_SLEEP
-////#define BB_SWAPOFF
-//#define BB_SWAPON
+#define BB_SWAPONOFF
#define BB_SYNC
#define BB_TAR
#define BB_TOUCH
diff --git a/internal.h b/internal.h
index a876539..b676e5f 100644
--- a/internal.h
+++ b/internal.h
@@ -96,6 +96,7 @@ extern int rm_main(int argc, char** argv);
extern int scan_partitions_main(int argc, char** argv);
extern int sh_main(int argc, char** argv);
extern int sleep_main(int argc, char** argv);
+extern int swap_on_off_main(int argc, char** argv);
extern int tar_main(int argc, char** argv);
extern int touch_main(int argc, char** argv);
extern int sync_main(int argc, char** argv);
diff --git a/swapoff.c b/swapoff.c
deleted file mode 100644
index 29b9dae..0000000
--- a/swapoff.c
+++ /dev/null
@@ -1,52 +0,0 @@
-#include <sys/swap.h>
-#include <string.h>
-#include <errno.h>
-#include <mntent.h>
-#include "internal.h"
-
-const char swapoff_usage[] = "swapoff block-device\n"
-"\n"
-"\tStop swapping virtual memory pages on the given device.\n";
-
-extern int
-swapoff_fn(const struct FileInfo * i)
-{
- struct mntent entries[100];
- int count = 0;
- FILE * swapsTable = setmntent("/proc/swaps", "r");
- struct mntent * m;
-
- if (!(swapoff(i->source))) {
- if ( swapsTable == 0 ) {
- fprintf(stderr, "/etc/swaps: %s\n", strerror(errno));
- return 1;
- }
- while ( (m = getmntent(swapsTable)) != 0 ) {
- entries[count].mnt_fsname = strdup(m->mnt_fsname);
- entries[count].mnt_dir = strdup(m->mnt_dir);
- entries[count].mnt_type = strdup(m->mnt_type);
- entries[count].mnt_opts = strdup(m->mnt_opts);
- entries[count].mnt_freq = m->mnt_freq;
- entries[count].mnt_passno = m->mnt_passno;
- count++;
- }
- endmntent(swapsTable);
- if ( (swapsTable = setmntent("/etc/swaps", "w")) ) {
- int id;
- for ( id = 0; id < count; id++ ) {
- int result =
- (strcmp(entries[id].mnt_fsname, i->source)==0
- ||strcmp(entries[id].mnt_dir, i->source)==0);
- if ( result )
- continue;
- else
- addmntent(swapsTable, &entries[id]);
- }
- endmntent(swapsTable);
- }
- else if ( errno != EROFS )
- fprintf(stderr, "/etc/swaps: %s\n", strerror(errno));
- return (0);
- }
- return (-1);
-}
diff --git a/swapon.c b/swapon.c
deleted file mode 100644
index 78360a5..0000000
--- a/swapon.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <stdio.h>
-#include <mntent.h>
-#include <sys/swap.h>
-#include "internal.h"
-
-const char swapon_usage[] = "swapon block-device\n"
-"\n"
-"\tSwap virtual memory pages on the given device.\n";
-
-extern int
-swapon_fn(const struct FileInfo * i)
-{
- FILE *swapsTable;
- struct mntent m;
-
- if (!(swapon(i->source, 0))) {
- if ((swapsTable = setmntent("/etc/swaps", "a+"))) {
- /* Needs the cast to avoid warning about conversion from
- * const char* to just char*
- */
- m.mnt_fsname = (char*)i->source;
- m.mnt_dir = "none";
- m.mnt_type = "swap";
- m.mnt_opts = "sw";
- m.mnt_freq = 0;
- m.mnt_passno = 0;
- addmntent(swapsTable, &m);
- endmntent(swapsTable);
- }
- return (0);
- }
- return (-1);
-}
-
diff --git a/swaponoff.c b/swaponoff.c
new file mode 100644
index 0000000..56f93b3
--- /dev/null
+++ b/swaponoff.c
@@ -0,0 +1,121 @@
+/*
+ * Mini swapon/swapoff implementation for busybox
+ *
+ * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "internal.h"
+#include <stdio.h>
+#include <sys/mount.h>
+#include <sys/swap.h>
+#include <mntent.h>
+#include <dirent.h>
+#include <fstab.h>
+#include <errno.h>
+
+
+static int whichApp;
+static const char* appName;
+
+static const char swapoff_usage[] =
+"Usage: swapoff device\n"
+"\nStop swapping virtual memory pages on the given device.\n";
+static const char swapon_usage[] =
+"Usage: swapon device\n"
+"\nStart swapping virtual memory pages on the given device.\n";
+
+
+#define SWAPON_APP 1
+#define SWAPOFF_APP 2
+
+
+static void
+swap_enable_disable( char *device)
+{
+ int status;
+ if ( whichApp == SWAPON_APP )
+ status = swapon(device, 0);
+ else
+ status = swapoff(device);
+
+ if ( status != 0 ) {
+ perror(appName);
+ exit( FALSE);
+ }
+}
+
+static void
+do_em_all()
+{
+ struct mntent *m;
+ char swapName[NAME_MAX];
+ FILE *f = setmntent ("/etc/fstab", "r");
+
+ if (f == NULL) {
+ perror("/etc/fstab");
+ exit( FALSE);
+ }
+ while ((m = getmntent (f)) != NULL) {
+ if (!strstr (m->mnt_type, "swap")) {
+ swap_enable_disable( swapName);
+ }
+ }
+ endmntent (f);
+ exit( TRUE);
+}
+
+
+extern int
+swap_on_off_main(int argc, char * * argv)
+{
+ struct stat statBuf;
+ if (stat("/etc/fstab", &statBuf) < 0)
+ fprintf(stderr, "/etc/fstab file missing -- Please install one.\n\n");
+
+ if (strcmp(*argv, "swapon")==0) {
+ appName = *argv;
+ whichApp = SWAPON_APP;
+
+ } else {
+ appName = *argv;
+ whichApp = SWAPOFF_APP;
+ }
+
+ if (argc < 2)
+ goto usage_and_exit;
+ argc--;
+ argv++;
+
+ /* Parse any options */
+ while (**argv == '-') {
+ while (*++(*argv)) switch (**argv) {
+ case 'a':
+ do_em_all();
+ break;
+ default:
+ goto usage_and_exit;
+ }
+ }
+ swap_enable_disable(*argv);
+ //exit( TRUE);
+
+usage_and_exit:
+ fprintf(stderr, "Usage: %s", (whichApp==SWAPON_APP)? swapon_usage : swapoff_usage);
+ exit(FALSE);
+}
+
diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c
new file mode 100644
index 0000000..56f93b3
--- /dev/null
+++ b/util-linux/swaponoff.c
@@ -0,0 +1,121 @@
+/*
+ * Mini swapon/swapoff implementation for busybox
+ *
+ * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include "internal.h"
+#include <stdio.h>
+#include <sys/mount.h>
+#include <sys/swap.h>
+#include <mntent.h>
+#include <dirent.h>
+#include <fstab.h>
+#include <errno.h>
+
+
+static int whichApp;
+static const char* appName;
+
+static const char swapoff_usage[] =
+"Usage: swapoff device\n"
+"\nStop swapping virtual memory pages on the given device.\n";
+static const char swapon_usage[] =
+"Usage: swapon device\n"
+"\nStart swapping virtual memory pages on the given device.\n";
+
+
+#define SWAPON_APP 1
+#define SWAPOFF_APP 2
+
+
+static void
+swap_enable_disable( char *device)
+{
+ int status;
+ if ( whichApp == SWAPON_APP )
+ status = swapon(device, 0);
+ else
+ status = swapoff(device);
+
+ if ( status != 0 ) {
+ perror(appName);
+ exit( FALSE);
+ }
+}
+
+static void
+do_em_all()
+{
+ struct mntent *m;
+ char swapName[NAME_MAX];
+ FILE *f = setmntent ("/etc/fstab", "r");
+
+ if (f == NULL) {
+ perror("/etc/fstab");
+ exit( FALSE);
+ }
+ while ((m = getmntent (f)) != NULL) {
+ if (!strstr (m->mnt_type, "swap")) {
+ swap_enable_disable( swapName);
+ }
+ }
+ endmntent (f);
+ exit( TRUE);
+}
+
+
+extern int
+swap_on_off_main(int argc, char * * argv)
+{
+ struct stat statBuf;
+ if (stat("/etc/fstab", &statBuf) < 0)
+ fprintf(stderr, "/etc/fstab file missing -- Please install one.\n\n");
+
+ if (strcmp(*argv, "swapon")==0) {
+ appName = *argv;
+ whichApp = SWAPON_APP;
+
+ } else {
+ appName = *argv;
+ whichApp = SWAPOFF_APP;
+ }
+
+ if (argc < 2)
+ goto usage_and_exit;
+ argc--;
+ argv++;
+
+ /* Parse any options */
+ while (**argv == '-') {
+ while (*++(*argv)) switch (**argv) {
+ case 'a':
+ do_em_all();
+ break;
+ default:
+ goto usage_and_exit;
+ }
+ }
+ swap_enable_disable(*argv);
+ //exit( TRUE);
+
+usage_and_exit:
+ fprintf(stderr, "Usage: %s", (whichApp==SWAPON_APP)? swapon_usage : swapoff_usage);
+ exit(FALSE);
+}
+