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 0000000..55124d0 --- /dev/null +++ b/swapoff.c @@ -0,0 +1,52 @@ +#include <sys/swap.h> +#include <string.h> +#include <errno.h> +#include <mntent.h> +#include "internal.h" + +const char swapoff_usage[] = "swapoff block-device\n" +"\n" +"\tStop swapping virtual memory pages on the given device.\n"; + +extern int +swapoff_fn(const struct FileInfo * i) +{ + struct mntent entries[100]; + int count = 0; + FILE * swapsTable = setmntent("/etc/swaps", "r"); + struct mntent * m; + + if (!(swapoff(i->source))) { + if ( swapsTable == 0 ) { + fprintf(stderr, "/etc/swaps: %s\n", strerror(errno)); + return 1; + } + while ( (m = getmntent(swapsTable)) != 0 ) { + entries[count].mnt_fsname = strdup(m->mnt_fsname); + entries[count].mnt_dir = strdup(m->mnt_dir); + entries[count].mnt_type = strdup(m->mnt_type); + entries[count].mnt_opts = strdup(m->mnt_opts); + entries[count].mnt_freq = m->mnt_freq; + entries[count].mnt_passno = m->mnt_passno; + count++; + } + endmntent(swapsTable); + if ( (swapsTable = setmntent("/etc/swaps", "w")) ) { + int id; + for ( id = 0; id < count; id++ ) { + int result = + (strcmp(entries[id].mnt_fsname, i->source)==0 + ||strcmp(entries[id].mnt_dir, i->source)==0); + if ( result ) + continue; + else + addmntent(swapsTable, &entries[id]); + } + endmntent(swapsTable); + } + else if ( errno != EROFS ) + fprintf(stderr, "/etc/swaps: %s\n", strerror(errno)); + return (0); + } + return (-1); +} |