diff options
Diffstat (limited to 'swapoff.c')
-rw-r--r-- | swapoff.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/swapoff.c b/swapoff.c new file mode 100644 index 000000000..55124d0b8 --- /dev/null +++ b/swapoff.c | |||
@@ -0,0 +1,52 @@ | |||
1 | #include <sys/swap.h> | ||
2 | #include <string.h> | ||
3 | #include <errno.h> | ||
4 | #include <mntent.h> | ||
5 | #include "internal.h" | ||
6 | |||
7 | const char swapoff_usage[] = "swapoff block-device\n" | ||
8 | "\n" | ||
9 | "\tStop swapping virtual memory pages on the given device.\n"; | ||
10 | |||
11 | extern int | ||
12 | swapoff_fn(const struct FileInfo * i) | ||
13 | { | ||
14 | struct mntent entries[100]; | ||
15 | int count = 0; | ||
16 | FILE * swapsTable = setmntent("/etc/swaps", "r"); | ||
17 | struct mntent * m; | ||
18 | |||
19 | if (!(swapoff(i->source))) { | ||
20 | if ( swapsTable == 0 ) { | ||
21 | fprintf(stderr, "/etc/swaps: %s\n", strerror(errno)); | ||
22 | return 1; | ||
23 | } | ||
24 | while ( (m = getmntent(swapsTable)) != 0 ) { | ||
25 | entries[count].mnt_fsname = strdup(m->mnt_fsname); | ||
26 | entries[count].mnt_dir = strdup(m->mnt_dir); | ||
27 | entries[count].mnt_type = strdup(m->mnt_type); | ||
28 | entries[count].mnt_opts = strdup(m->mnt_opts); | ||
29 | entries[count].mnt_freq = m->mnt_freq; | ||
30 | entries[count].mnt_passno = m->mnt_passno; | ||
31 | count++; | ||
32 | } | ||
33 | endmntent(swapsTable); | ||
34 | if ( (swapsTable = setmntent("/etc/swaps", "w")) ) { | ||
35 | int id; | ||
36 | for ( id = 0; id < count; id++ ) { | ||
37 | int result = | ||
38 | (strcmp(entries[id].mnt_fsname, i->source)==0 | ||
39 | ||strcmp(entries[id].mnt_dir, i->source)==0); | ||
40 | if ( result ) | ||
41 | continue; | ||
42 | else | ||
43 | addmntent(swapsTable, &entries[id]); | ||
44 | } | ||
45 | endmntent(swapsTable); | ||
46 | } | ||
47 | else if ( errno != EROFS ) | ||
48 | fprintf(stderr, "/etc/swaps: %s\n", strerror(errno)); | ||
49 | return (0); | ||
50 | } | ||
51 | return (-1); | ||
52 | } | ||