X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=block.c;h=74e4d96c3fb900ff0b1c292bf362fa198b46a809;hp=723c0f0456413c353c32358706e01050ef6b28a9;hb=30deade42ebd7fa112ee2693e9c2cc6532f0e3cf;hpb=9284b0ea87db88ecb6de01669efbba852be8f966 diff --git a/block.c b/block.c index 723c0f0..74e4d96 100644 --- a/block.c +++ b/block.c @@ -13,6 +13,7 @@ */ #define _GNU_SOURCE +#include #include #include #include @@ -302,7 +303,13 @@ static int swap_add(struct uci_section *s) /* store complete swap path */ if (tb[SWAP_DEVICE]) m->target = blobmsg_get_strdup(tb[SWAP_DEVICE]); - vlist_add(&mounts, &m->node, (m->uuid) ? (m->uuid) : (m->device)); + + if (m->uuid) + vlist_add(&mounts, &m->node, m->uuid); + else if (m->label) + vlist_add(&mounts, &m->node, m->label); + else if (m->device) + vlist_add(&mounts, &m->node, m->device); } return 0; @@ -513,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; @@ -539,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; @@ -863,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)) { @@ -957,6 +966,8 @@ static int main_mount(int argc, char **argv) list_for_each_entry(pr, &devices, list) mount_device(pr, 0); + handle_swapfiles(true); + return 0; } @@ -1026,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; @@ -1078,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; }