summaryrefslogtreecommitdiff
path: root/util-linux
diff options
context:
space:
mode:
authorRob Landley2005-11-29 23:47:10 +0000
committerRob Landley2005-11-29 23:47:10 +0000
commit1d589b2e2d6e9e0af719b481c7ef333bc73e2a7a (patch)
tree4a6c23fb08ab9c8fa2e3ad68c9425f65a3fe6a21 /util-linux
parent70678bc5b65a62176a6b41b4481e7f4f274a9c93 (diff)
downloadbusybox-1d589b2e2d6e9e0af719b481c7ef333bc73e2a7a.zip
busybox-1d589b2e2d6e9e0af719b481c7ef333bc73e2a7a.tar.gz
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...
Diffstat (limited to 'util-linux')
-rw-r--r--util-linux/losetup.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/util-linux/losetup.c b/util-linux/losetup.c
index 11bd66e..b2af63d 100644
--- a/util-linux/losetup.c
+++ b/util-linux/losetup.c
@@ -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();