blob: ab754848ebb89cdfa771b7b0efe885cfc7243f1b [file] [log] [blame]
Erik Andersene49d5ec2000-02-08 19:58:47 +00001/* vi: set sw=4 ts=4: */
Eric Andersen87590061999-10-18 21:22:59 +00002/*
3 * Mini swapon/swapoff implementation for busybox
4 *
Eric Andersenc7bda1c2004-03-15 08:29:22 +00005 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
Eric Andersen87590061999-10-18 21:22:59 +00006 *
Rob Landleye9a7a622006-09-22 02:52:41 +00007 * Licensed under the GPL version 2, see the file LICENSE in this tarball.
Eric Andersen87590061999-10-18 21:22:59 +00008 */
9
Rob Landley22d26fc2006-06-15 15:49:36 +000010#include "busybox.h"
Eric Andersen87590061999-10-18 21:22:59 +000011#include <mntent.h>
Eric Andersene76c3b02001-04-05 03:14:39 +000012#include <sys/swap.h>
Eric Andersene76c3b02001-04-05 03:14:39 +000013
Eric Andersen5e29c6f2000-06-19 18:25:49 +000014
Rob Landley20cc6d52006-09-12 21:42:17 +000015static int swap_enable_disable(char *device)
Eric Andersen87590061999-10-18 21:22:59 +000016{
Erik Andersene49d5ec2000-02-08 19:58:47 +000017 int status;
Eric Andersen97b141a2002-11-03 00:25:23 +000018 struct stat st;
19
Rob Landleyc5b1d4d2006-03-13 15:45:16 +000020 xstat(device, &st);
Eric Andersen97b141a2002-11-03 00:25:23 +000021
22 /* test for holes */
Mike Frysinger6943a942005-09-13 02:29:39 +000023 if (S_ISREG(st.st_mode))
24 if (st.st_blocks * 512 < st.st_size)
Manuel Novoa III cad53642003-03-19 09:13:01 +000025 bb_error_msg_and_die("swap file has holes");
Eric Andersen87590061999-10-18 21:22:59 +000026
Rob Landleybc3d4a12005-09-13 01:30:19 +000027 if (bb_applet_name[5] == 'n')
Erik Andersene49d5ec2000-02-08 19:58:47 +000028 status = swapon(device, 0);
29 else
30 status = swapoff(device);
31
Eric Andersendb1df5e2002-10-26 10:27:42 +000032 if (status != 0) {
Manuel Novoa III cad53642003-03-19 09:13:01 +000033 bb_perror_msg("%s", device);
Mike Frysinger2d5e4f62005-09-16 04:41:20 +000034 return 1;
Eric Andersendb1df5e2002-10-26 10:27:42 +000035 }
Mike Frysinger6943a942005-09-13 02:29:39 +000036
Mike Frysinger2d5e4f62005-09-16 04:41:20 +000037 return 0;
Eric Andersen87590061999-10-18 21:22:59 +000038}
39
Eric Andersendb1df5e2002-10-26 10:27:42 +000040static int do_em_all(void)
Eric Andersen87590061999-10-18 21:22:59 +000041{
42 struct mntent *m;
Mike Frysinger6943a942005-09-13 02:29:39 +000043 FILE *f;
44 int err;
Eric Andersen87590061999-10-18 21:22:59 +000045
Mike Frysinger6943a942005-09-13 02:29:39 +000046 f = setmntent("/etc/fstab", "r");
Matt Kraaia9819b22000-12-22 01:48:07 +000047 if (f == NULL)
Manuel Novoa III cad53642003-03-19 09:13:01 +000048 bb_perror_msg_and_die("/etc/fstab");
Mike Frysinger6943a942005-09-13 02:29:39 +000049
50 err = 0;
51 while ((m = getmntent(f)) != NULL)
52 if (strcmp(m->mnt_type, MNTTYPE_SWAP) == 0)
Mike Frysinger2d5e4f62005-09-16 04:41:20 +000053 err += swap_enable_disable(m->mnt_fsname);
Mike Frysinger6943a942005-09-13 02:29:39 +000054
Erik Andersene49d5ec2000-02-08 19:58:47 +000055 endmntent(f);
Mike Frysinger6943a942005-09-13 02:29:39 +000056
Eric Andersendb1df5e2002-10-26 10:27:42 +000057 return err;
Eric Andersen87590061999-10-18 21:22:59 +000058}
59
Mike Frysinger6943a942005-09-13 02:29:39 +000060#define DO_ALL 0x01
Eric Andersen87590061999-10-18 21:22:59 +000061
Rob Landleydfba7412006-03-06 20:47:33 +000062int swap_on_off_main(int argc, char **argv)
Eric Andersen87590061999-10-18 21:22:59 +000063{
Mike Frysinger2d5e4f62005-09-16 04:41:20 +000064 int ret;
Mike Frysinger6943a942005-09-13 02:29:39 +000065
Mike Frysinger2d5e4f62005-09-16 04:41:20 +000066 if (argc == 1)
Rob Landleybc3d4a12005-09-13 01:30:19 +000067 bb_show_usage();
Mike Frysinger6943a942005-09-13 02:29:39 +000068
Mike Frysinger2d5e4f62005-09-16 04:41:20 +000069 ret = bb_getopt_ulflags(argc, argv, "a");
70 if (ret & DO_ALL)
Rob Landleybc3d4a12005-09-13 01:30:19 +000071 return do_em_all();
Mike Frysinger6943a942005-09-13 02:29:39 +000072
Mike Frysinger2d5e4f62005-09-16 04:41:20 +000073 ret = 0;
74 while (*++argv)
75 ret += swap_enable_disable(*argv);
76 return ret;
Eric Andersen87590061999-10-18 21:22:59 +000077}