block: restore support for using swap files
[project/ubox.git] / block.c
diff --git a/block.c b/block.c
index 18c9299..b5bc494 100644 (file)
--- a/block.c
+++ b/block.c
@@ -12,6 +12,7 @@
  * GNU General Public License for more details.
  */
 
+#define _GNU_SOURCE
 #include <stdio.h>
 #include <unistd.h>
 #include <syslog.h>
@@ -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) {
@@ -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);
 
@@ -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]);