block: restore support for using swap files
[project/ubox.git] / block.c
diff --git a/block.c b/block.c
index 860a95c..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>
@@ -512,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) {
@@ -803,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);
 
@@ -877,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);
@@ -895,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);
@@ -912,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;
        }
 
@@ -941,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]);