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