1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <getopt.h>
5 #include <sys/swap.h>
6
usage(char * name)7 static void usage(char *name)
8 {
9 fprintf(stderr, "Usage: %s [-p prio] <filename>\n"
10 " prio must be between 0 and %d\n", name, SWAP_FLAG_PRIO_MASK);
11 }
12
parse_prio(char * prio_str)13 static int parse_prio(char *prio_str)
14 {
15 unsigned long p = strtoul(prio_str, NULL, 10);
16
17 return (p > SWAP_FLAG_PRIO_MASK)? -1 : (int)p;
18 }
19
swapon_main(int argc,char ** argv)20 int swapon_main(int argc, char **argv)
21 {
22 int err = 0;
23 int flags = 0;
24 int prio;
25
26 opterr = 0;
27 do {
28 int c = getopt(argc, argv, "hp:");
29 if (c == -1)
30 break;
31
32 switch (c) {
33 case 'p':
34 if (optarg != NULL)
35 prio = parse_prio(optarg);
36 else
37 prio = -1;
38
39 if (prio < 0) {
40 usage(argv[0]);
41 return -EINVAL;
42 }
43 flags |= SWAP_FLAG_PREFER;
44 flags |= (prio << SWAP_FLAG_PRIO_SHIFT) & SWAP_FLAG_PRIO_MASK;
45 break;
46 case 'h':
47 usage(argv[0]);
48 return 0;
49 case '?':
50 fprintf(stderr, "unknown option: %c\n", optopt);
51 return -EINVAL;
52 }
53 } while (1);
54
55 if (optind != argc - 1) {
56 usage(argv[0]);
57 return -EINVAL;
58 }
59
60 err = swapon(argv[argc - 1], flags);
61 if (err) {
62 fprintf(stderr, "swapon failed for %s\n", argv[argc - 1]);
63 }
64
65 return err;
66 }
67