c2d3339e0ab3c4fbe48e35eea04e346f01cf0016
[platform/upstream/busybox.git] / util-linux / losetup.c
1 /*
2  * Mini losetup implementation for busybox
3  *
4  * Copyright (C) 2002  Matt Kraai.
5  *
6  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
7  */
8
9 #include <getopt.h>
10 #include <stdlib.h>
11
12 #include "busybox.h"
13
14 int losetup_main (int argc, char **argv)
15 {
16   int offset = 0;
17
18   /* This will need a "while(getopt()!=-1)" loop when we can have more than
19      one option, but for now we can't. */
20   switch(getopt(argc,argv, "do:")) {
21     case 'd':
22       /* detach takes exactly one argument */
23       if(optind+1!=argc) bb_show_usage();
24       if(!del_loop(argv[optind])) return EXIT_SUCCESS;
25 die_failed:
26       bb_perror_msg_and_die("%s",argv[optind]);
27
28     case 'o':
29       offset = bb_xparse_number (optarg, NULL);
30       /* Fall through to do the losetup */
31     case -1:
32       /* losetup takes two argument:, loop_device and file */
33       if(optind+2==argc) {
34         if(set_loop(&argv[optind], argv[optind + 1], offset)>=0)
35           return EXIT_SUCCESS;
36         else goto die_failed;
37       }
38       if(optind+1==argc) {
39         char *s=query_loop(argv[optind]);
40         if (!s) goto die_failed;
41         printf("%s: %s\n",argv[optind],s);
42         if(ENABLE_FEATURE_CLEAN_UP) free(s);
43         return EXIT_SUCCESS;
44       }
45       break;
46   }
47   bb_show_usage();
48   return EXIT_FAILURE;
49 }