1367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand#include <stdio.h>
2367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand#include <stdlib.h>
3367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand#include <unistd.h>
4367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand#include <getopt.h>
5367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand#include <sys/swap.h>
6367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
77bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesstatic void usage(char *name)
8367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand{
9367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    fprintf(stderr, "Usage: %s [-p prio] <filename>\n"
10367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand        "        prio must be between 0 and %d\n", name, SWAP_FLAG_PRIO_MASK);
11367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand}
12367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
137bb5660647d0106f96b000c25f5690a45734c38cElliott Hughesstatic int parse_prio(char *prio_str)
14367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand{
15367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    unsigned long p = strtoul(prio_str, NULL, 10);
16367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
17367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    return (p > SWAP_FLAG_PRIO_MASK)? -1 : (int)p;
18367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand}
19367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
20367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchandint swapon_main(int argc, char **argv)
21367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand{
22367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    int err = 0;
23367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    int flags = 0;
24367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    int prio;
25367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
26367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    opterr = 0;
27367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    do {
28367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand        int c = getopt(argc, argv, "hp:");
29367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand        if (c == -1)
30367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand            break;
31367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
32367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand        switch (c) {
33367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand            case 'p':
34367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                if (optarg != NULL)
35367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                    prio = parse_prio(optarg);
36367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                else
37367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                    prio = -1;
38367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
39367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                if (prio < 0) {
40367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                    usage(argv[0]);
41367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                    return -EINVAL;
42367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                }
43367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                flags |= SWAP_FLAG_PREFER;
44367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                flags |= (prio << SWAP_FLAG_PRIO_SHIFT) & SWAP_FLAG_PRIO_MASK;
45367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                break;
46367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand            case 'h':
47367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                usage(argv[0]);
48367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                return 0;
49367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand            case '?':
50367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                fprintf(stderr, "unknown option: %c\n", optopt);
51367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand                return -EINVAL;
52367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand        }
53367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    } while (1);
54367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
55367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    if (optind != argc - 1) {
56367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand        usage(argv[0]);
57367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand        return -EINVAL;
58367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    }
59367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
60367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    err = swapon(argv[argc - 1], flags);
61367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    if (err) {
62367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand        fprintf(stderr, "swapon failed for %s\n", argv[argc - 1]);
63367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    }
64367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand
65367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand    return err;
66367297c3d764eaf6e60880964e1739df13f0b703Rom Lemarchand}
67