losetup: implement -r option. Closes 4033.
[platform/upstream/busybox.git] / util-linux / losetup.c
index 9b7c49f..21108d0 100644 (file)
@@ -8,11 +8,12 @@
  */
 
 //usage:#define losetup_trivial_usage
-//usage:       "[-o OFS] LOOPDEV FILE - associate loop devices\n"
+//usage:       "[-r] [-o OFS] LOOPDEV FILE - associate loop devices\n"
 //usage:       "       losetup -d LOOPDEV - disassociate\n"
 //usage:       "       losetup [-f] - show"
 //usage:#define losetup_full_usage "\n\n"
 //usage:       "       -o OFS  Start OFS bytes into FILE"
+//usage:     "\n       -r      Read-only"
 //usage:     "\n       -f      Show first free loop device"
 //usage:
 //usage:#define losetup_notes_usage
@@ -37,11 +38,12 @@ int losetup_main(int argc UNUSED_PARAM, char **argv)
                OPT_d = (1 << 0),
                OPT_o = (1 << 1),
                OPT_f = (1 << 2),
+               OPT_r = (1 << 3), /* must be last */
        };
 
-       /* max 2 args, all opts are mutually exclusive */
+       /* max 2 args, -d,-o,-f opts are mutually exclusive */
        opt_complementary = "?2:d--of:o--df:f--do";
-       opt = getopt32(argv, "do:f", &opt_o);
+       opt = getopt32(argv, "do:fr", &opt_o);
        argv += optind;
 
        if (opt == OPT_o)
@@ -63,12 +65,12 @@ int losetup_main(int argc UNUSED_PARAM, char **argv)
                        bb_show_usage();
 
                if (argv[1]) {
-                       /* [-o OFS] BLOCKDEV FILE */
-                       if (set_loop(&argv[0], argv[1], offset) < 0)
+                       /* [-r] [-o OFS] BLOCKDEV FILE */
+                       if (set_loop(&argv[0], argv[1], offset, (opt / OPT_r)) < 0)
                                bb_simple_perror_msg_and_die(argv[0]);
                        return EXIT_SUCCESS;
                }
-               /* [-o OFS] BLOCKDEV */
+               /* [-r] [-o OFS] BLOCKDEV */
                s = query_loop(argv[0]);
                if (!s)
                        bb_simple_perror_msg_and_die(argv[0]);
@@ -78,7 +80,7 @@ int losetup_main(int argc UNUSED_PARAM, char **argv)
                return EXIT_SUCCESS;
        }
 
-       /* [-o OFS|-f] with no params */
+       /* [-r] [-o OFS|-f] with no params */
        n = 0;
        while (1) {
                char *s;