5a2d735ad8f65fca130ee51a131829393799aa9a
[oweals/busybox.git] / util-linux / swaponoff.c
1 /*
2  * Mini swapon/swapoff implementation for busybox
3  *
4  * Copyright (C) 1998 by Erik Andersen <andersee@debian.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21
22 #include "internal.h"
23 #include <stdio.h>
24 #include <sys/mount.h>
25 #include <sys/swap.h>
26 #include <mntent.h>
27 #include <dirent.h>
28 #include <fstab.h>
29 #include <errno.h>
30
31
32 static int whichApp;
33 static const char* appName;
34
35 static const char swapoff_usage[] = 
36 "swapoff device\n"
37 "\nStop swapping virtual memory pages on the given device.\n";
38 static const char swapon_usage[] = 
39 "swapon device\n"
40 "\nStart swapping virtual memory pages on the given device.\n";
41
42
43 #define SWAPON_APP   1
44 #define SWAPOFF_APP  2
45
46
47 static void
48 swap_enable_disable( char *device)
49 {
50     int status;
51     if ( whichApp == SWAPON_APP )
52         status = swapon(device, 0);
53     else 
54         status = swapoff(device);
55
56     if ( status != 0 ) { 
57         perror(appName);
58         exit( FALSE);
59     }
60 }
61
62 static void
63 do_em_all()
64 {
65         struct mntent *m;
66         char swapName[NAME_MAX];
67         FILE *f = setmntent ("/etc/fstab", "r");
68
69         if (f == NULL) {
70             perror("/etc/fstab");
71             exit( FALSE); 
72         }
73         while ((m = getmntent (f)) != NULL) {
74             if (!strstr (m->mnt_type, "swap")) {
75                     swap_enable_disable( swapName);
76             }
77         }
78         endmntent (f);
79         exit( TRUE);
80 }
81
82
83 extern int
84 swap_on_off_main(int argc, char * * argv)
85 {
86     struct stat statBuf;
87     if (stat("/etc/fstab", &statBuf) < 0) 
88         fprintf(stderr, "/etc/fstab file missing -- Please install one.\n\n");
89
90     if (strcmp(*argv, "swapon")==0) {
91         appName = *argv;
92         whichApp = SWAPON_APP;
93
94     } else {
95         appName = *argv;
96         whichApp = SWAPOFF_APP;
97     }
98
99     if (argc < 2)
100         goto usage_and_exit;
101     argc--;
102     argv++;
103
104     /* Parse any options */
105     while (**argv == '-') {
106         while (*++(*argv)) switch (**argv) {
107             case 'a':
108                 do_em_all();
109                 break;
110             default:
111                 goto usage_and_exit;
112         }
113     }
114     swap_enable_disable(*argv);
115     exit( TRUE);
116
117 usage_and_exit:
118     usage( (whichApp==SWAPON_APP)? swapon_usage : swapoff_usage);
119     exit( FALSE);
120 }
121