X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=block.c;h=74e4d96c3fb900ff0b1c292bf362fa198b46a809;hp=c9285d642ad8346bbb10dede5c9df2af99828ded;hb=0588218d4bc58b0e099272338decbe4734f5678b;hpb=0acfbd17311d2c1bbaac031ae719296d9df85b55;ds=sidebyside diff --git a/block.c b/block.c index c9285d6..74e4d96 100644 --- a/block.c +++ b/block.c @@ -13,6 +13,7 @@ */ #define _GNU_SOURCE +#include #include #include #include @@ -519,12 +520,12 @@ static struct blkid_struct_probe* find_block_info(char *uuid, char *label, char if (label) list_for_each_entry(pr, &devices, list) - if (strcmp(pr->label, label)) + if (!strcmp(pr->label, label)) return pr; if (path) list_for_each_entry(pr, &devices, list) - if (!strcmp(pr->dev, path)) + if (!strcmp(basename(pr->dev), basename(path))) return pr; return NULL; @@ -545,8 +546,10 @@ static char* find_mount_point(char *block) char *p = &line[len + 1]; char *t = strstr(p, " "); - if (!t) + if (!t) { + fclose(fp); return NULL; + } *t = '\0'; point = p; break; @@ -869,14 +872,14 @@ static int mount_extroot(char *cfg) if (!m || !m->extroot) return -1; - pr = find_block_info(m->uuid, m->label, NULL); + pr = find_block_info(m->uuid, m->label, m->device); if (!pr && delay_root){ fprintf(stderr, "extroot: is not ready yet, retrying in %u seconds\n", delay_root); sleep(delay_root); mkblkdev(); cache_load(0); - pr = find_block_info(m->uuid, m->label, NULL); + pr = find_block_info(m->uuid, m->label, m->device); } if (pr) { if (strncmp(pr->id->name, "ext", 3)) { @@ -1034,50 +1037,75 @@ static int main_info(int argc, char **argv) return 0; } +static int swapon_usage(void) +{ + fprintf(stderr, "Usage: swapon [-s] [-a] [[-p pri] DEVICE]\n\n" + "\tStart swapping on [DEVICE]\n" + " -a\tStart swapping on all swap devices\n" + " -p pri\tSet priority of swap device\n" + " -s\tShow summary\n"); + return -1; +} + static int main_swapon(int argc, char **argv) { - if (argc != 2) { - fprintf(stderr, "Usage: swapon <-s> <-a> [DEVICE]\n\n\tStart swapping on [DEVICE]\n -a\tStart swapping on all swap devices\n -s\tShow summary\n"); - return -1; - } + int ch; + FILE *fp; + char *lineptr; + size_t s; + struct blkid_struct_probe *pr; + int flags = 0; + int pri; + struct stat st; + int err; - if (!strcmp(argv[1], "-s")) { - FILE *fp = fopen("/proc/swaps", "r"); - char *lineptr = NULL; - size_t s; + while ((ch = getopt(argc, argv, "ap:s")) != -1) { + switch(ch) { + case 's': + fp = fopen("/proc/swaps", "r"); + lineptr = NULL; - if (!fp) { - fprintf(stderr, "failed to open /proc/swaps\n"); - return -1; + if (!fp) { + fprintf(stderr, "failed to open /proc/swaps\n"); + return -1; + } + while (getline(&lineptr, &s, fp) > 0) + printf(lineptr); + if (lineptr) + free(lineptr); + fclose(fp); + return 0; + case 'a': + cache_load(0); + list_for_each_entry(pr, &devices, list) { + if (strcmp(pr->id->name, "swap")) + continue; + if (swapon(pr->dev, 0)) + fprintf(stderr, "failed to swapon %s\n", pr->dev); + } + return 0; + case 'p': + pri = atoi(optarg); + if (pri >= 0) + flags = ((pri << SWAP_FLAG_PRIO_SHIFT) & SWAP_FLAG_PRIO_MASK) | SWAP_FLAG_PREFER; + break; + default: + return swapon_usage(); } - while (getline(&lineptr, &s, fp) > 0) - printf(lineptr); - if (lineptr) - free(lineptr); - fclose(fp); - } else if (!strcmp(argv[1], "-a")) { - struct blkid_struct_probe *pr; - cache_load(0); - list_for_each_entry(pr, &devices, list) { - if (strcmp(pr->id->name, "swap")) - continue; - if (swapon(pr->dev, 0)) - fprintf(stderr, "failed to swapon %s\n", pr->dev); - } - } else { - struct stat s; - int err; + } - if (stat(argv[1], &s) || (!S_ISBLK(s.st_mode) && !S_ISREG(s.st_mode))) { - fprintf(stderr, "%s is not a block device or file\n", argv[1]); - return -1; - } - err = swapon(argv[1], 0); - if (err) { - fprintf(stderr, "failed to swapon %s (%d)\n", argv[1], err); - return err; - } + if (optind != (argc - 1)) + return swapon_usage(); + + if (stat(argv[optind], &st) || (!S_ISBLK(st.st_mode) && !S_ISREG(st.st_mode))) { + fprintf(stderr, "%s is not a block device or file\n", argv[optind]); + return -1; + } + err = swapon(argv[optind], flags); + if (err) { + fprintf(stderr, "failed to swapon %s (%d)\n", argv[optind], err); + return err; } return 0; @@ -1086,7 +1114,9 @@ static int main_swapon(int argc, char **argv) static int main_swapoff(int argc, char **argv) { if (argc != 2) { - fprintf(stderr, "Usage: swapoff [-a] [DEVICE]\n\n\tStop swapping on DEVICE\n -a\tStop swapping on all swap devices\n"); + fprintf(stderr, "Usage: swapoff [-a] [DEVICE]\n\n" + "\tStop swapping on DEVICE\n" + " -a\tStop swapping on all swap devices\n"); return -1; }