X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=block.c;h=194eb4a17c7ac85353b9e8a19d2ddc2f9fb6b0c1;hp=18c9299961a4b55aa12ae98521a3c65e9bb20bf5;hb=75b17dab43c511d1cecc70c370e9f8283dfbf547;hpb=28f9eaee93e5b0ae37aec6db80865de2e01e6419 diff --git a/block.c b/block.c index 18c9299..194eb4a 100644 --- a/block.c +++ b/block.c @@ -12,6 +12,7 @@ * GNU General Public License for more details. */ +#define _GNU_SOURCE #include #include #include @@ -327,7 +328,7 @@ static int _cache_load(const char *path) struct blkid_struct_probe *pr = malloc(sizeof(struct blkid_struct_probe)); memset(pr, 0, sizeof(struct blkid_struct_probe)); probe_block(gl.gl_pathv[j], pr); - if (pr->err) + if (pr->err || !pr->id) free(pr); else list_add_tail(&pr->list, &devices); @@ -344,6 +345,10 @@ static void cache_load(int mtd) _cache_load("/dev/mtdblock*"); _cache_load("/dev/mmcblk*"); _cache_load("/dev/sd*"); + _cache_load("/dev/sdc*"); + _cache_load("/dev/hd*"); + _cache_load("/dev/md*"); + _cache_load("/dev/mapper/*"); } static int print_block_info(struct blkid_struct_probe *pr) @@ -377,7 +382,7 @@ static int print_block_uci(struct blkid_struct_probe *pr) if (pr->uuid[0]) printf("\toption\tuuid\t'%s'\n", pr->uuid); else - printf("\toption\tdevice\t'%s'\n", basename(pr->dev)); + printf("\toption\tdevice\t'%s'\n", pr->dev); printf("\toption\tenabled\t'0'\n\n"); return 0; @@ -477,11 +482,13 @@ static void check_filesystem(struct blkid_struct_probe *pr) static int mount_device(struct blkid_struct_probe *pr, int hotplug) { struct mount *m; - char *device = basename(pr->dev); + char *device; if (!pr) return -1; + device = basename(pr->dev); + if (!strcmp(pr->id->name, "swap")) { if (hotplug && !auto_swap) return -1; @@ -506,7 +513,7 @@ static int mount_device(struct blkid_struct_probe *pr, int hotplug) if (m) { char *target = m->target; - char _target[] = "/mnt/mmcblk123"; + char _target[32]; int err = 0; if (!target) { @@ -656,7 +663,7 @@ static int check_extroot(char *path) if (!strcmp(pr->dev, fs)) { struct stat s; FILE *fp = NULL; - char tag[32]; + char tag[64]; char uuid[32] = { 0 }; snprintf(tag, sizeof(tag), "%s/etc/.extroot-uuid", path); @@ -690,8 +697,8 @@ static int check_extroot(char *path) static int mount_extroot(char *cfg) { - char overlay[] = "/tmp/overlay"; - char mnt[] = "/tmp/mnt"; + char overlay[] = "/tmp/extroot/overlay"; + char mnt[] = "/tmp/extroot/mnt"; char *path = mnt; struct blkid_struct_probe *pr; struct mount *m; @@ -710,7 +717,7 @@ static int mount_extroot(char *cfg) pr = find_block_info(m->uuid, m->label, NULL); if (!pr && delay_root){ - fprintf(stderr, "extroot: is not ready yet, retrying in %ui seconds\n", delay_root); + fprintf(stderr, "extroot: is not ready yet, retrying in %u seconds\n", delay_root); sleep(delay_root); mkblkdev(); cache_load(0); @@ -797,7 +804,7 @@ static int main_mount(int argc, char **argv) if (config_load(NULL)) return -1; - cache_load(0); + cache_load(1); list_for_each_entry(pr, &devices, list) mount_device(pr, 0); @@ -828,7 +835,7 @@ static int main_detect(int argc, char **argv) printf("\toption\tanon_mount\t'0'\n"); printf("\toption\tauto_swap\t'1'\n"); printf("\toption\tauto_mount\t'1'\n"); - printf("\toption\tdelay_root\t'0'\n"); + printf("\toption\tdelay_root\t'5'\n"); printf("\toption\tcheck_fs\t'0'\n\n"); list_for_each_entry(pr, &devices, list) print_block_uci(pr); @@ -871,11 +878,25 @@ static int main_info(int argc, char **argv) static int main_swapon(int argc, char **argv) { if (argc != 2) { - fprintf(stderr, "Usage: swapoff [-a] [DEVICE]\n\nStop swapping on DEVICE\n\n\t-a Stop swapping on all swap devices\n"); + 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; } - if (!strcmp(argv[1], "-a")) { + if (!strcmp(argv[1], "-s")) { + FILE *fp = fopen("/proc/swaps", "r"); + char *lineptr = NULL; + size_t s; + + 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); + } else if (!strcmp(argv[1], "-a")) { struct blkid_struct_probe *pr; cache_load(0); @@ -889,8 +910,8 @@ static int main_swapon(int argc, char **argv) struct stat s; int err; - if (stat(argv[1], &s) || !S_ISBLK(s.st_mode)) { - fprintf(stderr, "%s is not a block device\n", argv[1]); + 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); @@ -906,7 +927,7 @@ 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\nStop swapping on DEVICE\n\n\t-a Stop 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; } @@ -935,8 +956,8 @@ static int main_swapoff(int argc, char **argv) struct stat s; int err; - if (stat(argv[1], &s) || !S_ISBLK(s.st_mode)) { - fprintf(stderr, "%s is not a block device\n", argv[1]); + 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 = swapoff(argv[1]);