1 /* vi: set sw=4 ts=4: */
3 * Mini swapon/swapoff implementation for busybox
5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
7 * Licensed under GPLv2, see file LICENSE in this source tree.
14 #if ENABLE_FEATURE_MOUNT_LABEL
15 # include "volume_id.h"
17 # define resolve_mount_spec(fsname) ((void)0)
20 #if ENABLE_FEATURE_SWAPON_PRI
24 #define G (*(struct globals*)&bb_common_bufsiz1)
25 #define g_flags (G.flags)
30 static int swap_enable_disable(char *device
)
35 resolve_mount_spec(&device
);
36 if (stat(device
, &st
)) {
37 bb_perror_msg("warning: can't stat '%s'", device
);
43 if (S_ISREG(st
.st_mode
))
44 if (st
.st_blocks
* (off_t
)512 < st
.st_size
)
45 bb_error_msg("warning: swap file has holes");
48 if (applet_name
[5] == 'n')
49 status
= swapon(device
, g_flags
);
51 status
= swapoff(device
);
54 bb_simple_perror_msg(device
);
61 static int do_em_all(void)
67 f
= setmntent("/etc/fstab", "r");
69 bb_perror_msg_and_die("/etc/fstab");
72 while ((m
= getmntent(f
)) != NULL
) {
73 if (strcmp(m
->mnt_type
, MNTTYPE_SWAP
) == 0) {
74 /* swapon -a should ignore entries with noauto,
75 * but swapoff -a should process them */
76 if (applet_name
[5] != 'n'
77 || hasmntopt(m
, MNTOPT_NOAUTO
) == NULL
79 err
+= swap_enable_disable(m
->mnt_fsname
);
84 if (ENABLE_FEATURE_CLEAN_UP
)
90 int swap_on_off_main(int argc
, char **argv
) MAIN_EXTERNALLY_VISIBLE
;
91 int swap_on_off_main(int argc UNUSED_PARAM
, char **argv
)
95 #if !ENABLE_FEATURE_SWAPON_PRI
96 ret
= getopt32(argv
, "a");
98 opt_complementary
= "p+";
99 ret
= getopt32(argv
, (applet_name
[5] == 'n') ? "ap:" : "a", &g_flags
);
102 g_flags
= SWAP_FLAG_PREFER
|
103 ((g_flags
& SWAP_FLAG_PRIO_MASK
) << SWAP_FLAG_PRIO_SHIFT
);
108 if (ret
/* & 1: not needed */) // -a
115 /* ret = 0; redundant */
117 ret
+= swap_enable_disable(*argv
);