Home | History | Annotate | Download | only in toolbox
      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