master xplshn/aruu / cmd / linux / swapon.c
 1/* See LICENSE file for copyright and license details. */
 2
 3#include <sys/swap.h>
 4
 5#include <mntent.h>
 6#include <stdio.h>
 7#include <stdlib.h>
 8#include <string.h>
 9
10#include "util.h"
11
12static void
13usage(void)
14{
15  eprintf("usage: %s [-dp] -a | device\n", argv0);
16}
17
18// ?man swapon: enable swap devices
19// ?man arguments: -a | device
20// ?man enable paging and swapping on specified devices
21int
22main(int argc, char *argv[])
23{
24  int            i;
25  int            ret   = 0;
26  int            flags = 0;
27  int            all   = 0;
28  struct mntent *me;
29  FILE          *fp;
30
31  ARGBEGIN
32  {
33    // ?man -a: print or show all entries
34    case 'a':
35      all = 1;
36      break;
37    // ?man -d: specify directory
38    case 'd':
39      flags |= SWAP_FLAG_DISCARD;
40      break;
41    // ?man -p: preserve file attributes
42    case 'p':
43      flags |= SWAP_FLAG_PREFER;
44      break;
45    default:
46      usage();
47  }
48  ARGEND;
49
50  if ((!all && argc < 1) || (all && argc > 0))
51    usage();
52
53  if (all) {
54    fp = setmntent("/etc/fstab", "r");
55    if (!fp)
56      eprintf("setmntent %s:", "/etc/fstab");
57    while ((me = getmntent(fp)) != NULL) {
58      if (strcmp(me->mnt_type, MNTTYPE_SWAP) == 0 && (hasmntopt(me, MNTOPT_NOAUTO) == NULL)) {
59        if (swapon(me->mnt_fsname, flags) < 0) {
60          weprintf("swapon %s:", me->mnt_fsname);
61          ret = 1;
62        }
63      }
64    }
65    endmntent(fp);
66  } else {
67    for (i = 0; i < argc; i++) {
68      if (swapon(argv[i], flags) < 0) {
69        weprintf("swapon %s:", argv[i]);
70        ret = 1;
71      }
72    }
73  }
74  return ret;
75}