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