[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