X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=block.c;h=b5bc4941cafe5b363801f363085f6853edabf73b;hp=ea142481b0c03b749220060beb1c01a993e8a098;hb=3637b9f8e7097d38a17d5b6ffa9a4d6eb1249eb3;hpb=c897416adf05299d57e9ba25a8ea2bc628675c5f diff --git a/block.c b/block.c index ea14248..b5bc494 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); @@ -346,6 +347,8 @@ static void cache_load(int mtd) _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) @@ -479,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; @@ -508,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) { @@ -799,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); @@ -873,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); @@ -891,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); @@ -908,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; } @@ -937,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]);