[PATCH] losetup: fix util-linux compatibility
Bernhard Reutner-Fischer
rep.dot.nop at gmail.com
Wed Mar 6 20:39:59 UTC 2013
On 5 March 2013 01:33:12 Mandeep Singh Baines <msb at chromium.org> wrote:
> Added -a support. Also made sure -f works as follows:
>
> losetup [-r] [-o offset] {-f|loopdev} file
>
> Removed support for 'losetup -r' with no arguments.
What is the scripts/bloat-o-meter output for this patch?
Thanks,
>
> Signed-off-by: Mandeep Singh Baines <msb at chromium.org>
> ---
> util-linux/losetup.c | 116 +++++++++++++++++++++++++++++----------------------
> 1 file changed, 65 insertions(+), 51 deletions(-)
>
> diff --git a/util-linux/losetup.c b/util-linux/losetup.c
> index 21108d0..c697633 100644
> --- a/util-linux/losetup.c
> +++ b/util-linux/losetup.c
> @@ -8,16 +8,16 @@
> */
>
> //usage:#define losetup_trivial_usage
> -//usage: "[-r] [-o OFS] LOOPDEV FILE - associate loop devices\n"
> +//usage: "[-r] [-o OFS] {-f|LOOPDEV} FILE - associate loop devices\n"
> //usage: " losetup -d LOOPDEV - disassociate\n"
> -//usage: " losetup [-f] - show"
> +//usage: " losetup -a - show status of all\n"
> +//usage: " losetup -f - show next available"
> //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: "\n -f Show/find first free loop device"
> //usage:
> //usage:#define losetup_notes_usage
> -//usage: "No arguments will display all current associations.\n"
> //usage: "One argument (losetup /dev/loop1) will display the
> current association\n"
> //usage: "(if any), or disassociate it (with -d). The display
> shows the offset\n"
> //usage: "and filename of the file the loop device is currently
> bound to.\n\n"
> @@ -31,77 +31,91 @@ int losetup_main(int argc, char **argv)
> MAIN_EXTERNALLY_VISIBLE;
> int losetup_main(int argc UNUSED_PARAM, char **argv)
> {
> unsigned opt;
> - int n;
> char *opt_o;
> - unsigned long long offset = 0;
> + char dev[LOOP_NAMESIZE];
> enum {
> OPT_d = (1 << 0),
> OPT_o = (1 << 1),
> OPT_f = (1 << 2),
> - OPT_r = (1 << 3), /* must be last */
> + OPT_a = (1 << 3),
> + OPT_r = (1 << 4), /* must be last */
> };
>
> - /* max 2 args, -d,-o,-f opts are mutually exclusive */
> - opt_complementary = "?2:d--of:o--df:f--do";
> - opt = getopt32(argv, "do:fr", &opt_o);
> + opt_complementary = "?2:d--ofar:a--ofr";
> + opt = getopt32(argv, "do:far", &opt_o);
> argv += optind;
>
> - if (opt == OPT_o)
> - offset = xatoull(opt_o);
> + /* LOOPDEV */
> + if (!opt && argv[0] && !argv[1]) {
> + char *s;
>
> + s = query_loop(argv[0]);
> + if (!s)
> + bb_simple_perror_msg_and_die(argv[0]);
> + printf("%s: %s\n", argv[0], s);
> + if (ENABLE_FEATURE_CLEAN_UP)
> + free(s);
> + return EXIT_SUCCESS;
> + }
> +
> + /* -d LOOPDEV */
> if (opt == OPT_d) {
> - /* -d BLOCKDEV */
> - if (!argv[0] || argv[1])
> - bb_show_usage();
> if (del_loop(argv[0]))
> bb_simple_perror_msg_and_die(argv[0]);
> return EXIT_SUCCESS;
> }
>
> - if (argv[0]) {
> - char *s;
> -
> - if (opt == OPT_f) /* -f should not have arguments */
> - bb_show_usage();
> + /* -a */
> + if (opt == OPT_a) {
> + int n;
> + for (n = 0; n < 10; n++) {
> + char *s;
>
> - if (argv[1]) {
> - /* [-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;
> + sprintf(dev, LOOP_FORMAT, n);
> + s = query_loop(dev);
> + if (s) {
> + printf("%s: %s\n", dev, s);
> + if (ENABLE_FEATURE_CLEAN_UP)
> + free(s);
> + }
> }
> - /* [-r] [-o OFS] BLOCKDEV */
> - s = query_loop(argv[0]);
> - if (!s)
> - bb_simple_perror_msg_and_die(argv[0]);
> - printf("%s: %s\n", argv[0], s);
> - if (ENABLE_FEATURE_CLEAN_UP)
> - free(s);
> return EXIT_SUCCESS;
> }
>
> - /* [-r] [-o OFS|-f] with no params */
> - n = 0;
> - while (1) {
> + /* contains -f */
> + if (opt & OPT_f) {
> char *s;
> - char dev[LOOP_NAMESIZE];
> + int n = 0;
>
> - sprintf(dev, LOOP_FORMAT, n);
> - s = query_loop(dev);
> - n++;
> - if (!s) {
> - if (n > 9 && errno && errno != ENXIO)
> - return EXIT_SUCCESS;
> - if (opt == OPT_f) {
> - puts(dev);
> - return EXIT_SUCCESS;
> - }
> - } else {
> - if (opt != OPT_f)
> - printf("%s: %s\n", dev, s);
> - if (ENABLE_FEATURE_CLEAN_UP)
> + do {
> + sprintf(dev, LOOP_FORMAT, n);
> + s = query_loop(dev);
> + if (s && ENABLE_FEATURE_CLEAN_UP)
> free(s);
> + } while (s);
> + if ((opt == OPT_f) && !argv[0]) {
> + puts(dev);
> + return EXIT_SUCCESS;
> }
> }
> - return EXIT_SUCCESS;
> +
> + /* [-r] [-o OFS] {-f|LOOPDEV} FILE */
> + if (argv[0] && ((opt & OPT_f) || argv[1])) {
> + unsigned long long offset = 0;
> + char *d = dev;
> +
> + if (opt == OPT_o)
> + offset = xatoull(opt_o);
> + if (opt != OPT_f)
> + d = *(argv++);
> +
> + if (argv[0]) {
> + if (set_loop(&d, argv[0], offset, (opt / OPT_r)) < 0)
> + bb_simple_perror_msg_and_die(argv[0]);
> + return EXIT_SUCCESS;
> + }
> + }
> +
> + bb_show_usage();
> + return EXIT_FAILURE;
> }
> --
> 1.7.12.4
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox
Sent with AquaMail for Android
http://www.aqua-mail.com
More information about the busybox
mailing list