| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <getopt.h> |
| #include <asm/page.h> |
| #include <sys/swap.h> |
| |
| void usage(char *name) |
| { |
| fprintf(stderr, "Usage: %s [-p prio] <filename>\n" |
| " prio must be between 0 and %d\n", name, SWAP_FLAG_PRIO_MASK); |
| } |
| |
| int parse_prio(char *prio_str) |
| { |
| unsigned long p = strtoul(prio_str, NULL, 10); |
| |
| return (p > SWAP_FLAG_PRIO_MASK)? -1 : (int)p; |
| } |
| |
| int swapon_main(int argc, char **argv) |
| { |
| int err = 0; |
| int flags = 0; |
| int prio; |
| |
| opterr = 0; |
| do { |
| int c = getopt(argc, argv, "hp:"); |
| if (c == -1) |
| break; |
| |
| switch (c) { |
| case 'p': |
| if (optarg != NULL) |
| prio = parse_prio(optarg); |
| else |
| prio = -1; |
| |
| if (prio < 0) { |
| usage(argv[0]); |
| return -EINVAL; |
| } |
| flags |= SWAP_FLAG_PREFER; |
| flags |= (prio << SWAP_FLAG_PRIO_SHIFT) & SWAP_FLAG_PRIO_MASK; |
| break; |
| case 'h': |
| usage(argv[0]); |
| return 0; |
| case '?': |
| fprintf(stderr, "unknown option: %c\n", optopt); |
| return -EINVAL; |
| } |
| } while (1); |
| |
| if (optind != argc - 1) { |
| usage(argv[0]); |
| return -EINVAL; |
| } |
| |
| err = swapon(argv[argc - 1], flags); |
| if (err) { |
| fprintf(stderr, "swapon failed for %s\n", argv[argc - 1]); |
| } |
| |
| return err; |
| } |