summaryrefslogtreecommitdiff
path: root/util-linux/swaponoff.c
diff options
context:
space:
mode:
authorDenis Vlasenko2008-05-18 23:05:34 +0000
committerDenis Vlasenko2008-05-18 23:05:34 +0000
commitee56e013cfb6304f66129afee7978b0864699419 (patch)
tree367b176fc97757fea9322871d8aaf629239e2038 /util-linux/swaponoff.c
parent5599502a550a7f892d4b73dceb2105a6916f83e6 (diff)
downloadbusybox-ee56e013cfb6304f66129afee7978b0864699419.zip
busybox-ee56e013cfb6304f66129afee7978b0864699419.tar.gz
swapon: optional -p PRIO support (by Francois Barel <frabar666 AT gmail.com>)
function old new delta swap_on_off_main 153 216 +63 packed_usage 24190 24214 +24 swap_enable_disable 127 131 +4 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 3/0 up/down: 91/0) Total: 91 bytes
Diffstat (limited to 'util-linux/swaponoff.c')
-rw-r--r--util-linux/swaponoff.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/util-linux/swaponoff.c b/util-linux/swaponoff.c
index beefac0..6eafa3e 100644
--- a/util-linux/swaponoff.c
+++ b/util-linux/swaponoff.c
@@ -11,6 +11,16 @@
#include <mntent.h>
#include <sys/swap.h>
+#if ENABLE_FEATURE_SWAPON_PRI
+struct globals {
+ int flags;
+};
+#define G (*(struct globals*)&bb_common_bufsiz1)
+#define g_flags (G.flags)
+#else
+#define g_flags 0
+#endif
+
static int swap_enable_disable(char *device)
{
int status;
@@ -26,7 +36,7 @@ static int swap_enable_disable(char *device)
#endif
if (applet_name[5] == 'n')
- status = swapon(device, 0);
+ status = swapon(device, g_flags);
else
status = swapoff(device);
@@ -63,15 +73,30 @@ int swap_on_off_main(int argc ATTRIBUTE_UNUSED, char **argv)
{
int ret;
- if (!argv[1])
- bb_show_usage();
-
+#if !ENABLE_FEATURE_SWAPON_PRI
ret = getopt32(argv, "a");
- if (ret)
+#else
+ opt_complementary = "p+";
+ ret = getopt32(argv, (applet_name[5] == 'n') ? "ap:" : "a", &g_flags);
+
+ if (ret & 2) { // -p
+ g_flags = SWAP_FLAG_PREFER |
+ ((g_flags & SWAP_FLAG_PRIO_MASK) << SWAP_FLAG_PRIO_SHIFT);
+ ret &= 1;
+ }
+#endif
+
+ if (ret /* & 1: not needed */) // -a
return do_em_all();
+ argv += optind;
+ if (!*argv)
+ bb_show_usage();
+
/* ret = 0; redundant */
- while (*++argv)
+ do {
ret += swap_enable_disable(*argv);
+ } while (*++argv);
+
return ret;
}