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 <sys/swap.h>
      6 
      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 
     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 
     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