Fix losetup so that it A) actually works again, B) has much better error

messages, C) can show the current association (if any) when called
with only one argument.  Update the documentation a lot too.

Remind me to add a test suite for this thing.  I think I've figured out
how to handle root-only testsuites...
This commit is contained in:
Rob Landley
2005-11-29 23:47:10 +00:00
parent 70678bc5b6
commit 1d589b2e2d
4 changed files with 65 additions and 90 deletions

View File

@ -24,8 +24,7 @@
#include "busybox.h"
int
losetup_main (int argc, char **argv)
int losetup_main (int argc, char **argv)
{
int offset = 0;
@ -34,18 +33,27 @@ losetup_main (int argc, char **argv)
switch(getopt(argc,argv, "do:")) {
case 'd':
/* detach takes exactly one argument */
if(optind+1==argc)
return del_loop(argv[optind]) ? EXIT_SUCCESS : EXIT_FAILURE;
break;
if(optind+1==argc && !del_loop(argv[optind])) return EXIT_SUCCESS;
die_failed:
bb_perror_msg_and_die("%s",argv[optind]);
case 'o':
offset = bb_xparse_number (optarg, NULL);
/* Fall through to do the losetup */
case -1:
/* losetup takes two argument:, loop_device and file */
if(optind+2==argc)
return set_loop(&argv[optind], argv[optind + 1], offset)<0
? EXIT_FAILURE : EXIT_SUCCESS;
if(optind+2==argc) {
if(set_loop(&argv[optind], argv[optind + 1], offset)>=0)
return EXIT_SUCCESS;
else goto die_failed;
}
if(optind+1==argc) {
char *s=query_loop(argv[optind]);
if (!s) goto die_failed;
printf("%s: %s\n",argv[optind],s);
if(ENABLE_FEATURE_CLEAN_UP) free(s);
return EXIT_SUCCESS;
}
break;
}
bb_show_usage();