diff --git a/applets/busybox.c b/applets/busybox.c index 45365b370..6bc223a1d 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 45365b370..6bc223a1d 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 10a55f409..8fcbf8350 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 a87653927..b676e5f86 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 29b9daedd..000000000 --- a/swapoff.c +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include -#include -#include -#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 78360a55f..000000000 --- a/swapon.c +++ /dev/null @@ -1,34 +0,0 @@ -#include -#include -#include -#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 000000000..56f93b393 --- /dev/null +++ b/swaponoff.c @@ -0,0 +1,121 @@ +/* + * Mini swapon/swapoff implementation for busybox + * + * Copyright (C) 1998 by Erik Andersen + * + * 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 +#include +#include +#include +#include +#include +#include + + +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 000000000..56f93b393 --- /dev/null +++ b/util-linux/swaponoff.c @@ -0,0 +1,121 @@ +/* + * Mini swapon/swapoff implementation for busybox + * + * Copyright (C) 1998 by Erik Andersen + * + * 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 +#include +#include +#include +#include +#include +#include + + +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); +} +