Changeset 3621 in MondoRescue for branches/3.3/mindi-busybox/util-linux/losetup.c
- Timestamp:
- Dec 20, 2016, 4:07:32 PM (7 years ago)
- Location:
- branches/3.3
- Files:
-
- 1 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/3.3/mindi-busybox/util-linux/losetup.c
r3232 r3621 9 9 10 10 //usage:#define losetup_trivial_usage 11 //usage: "[-r] [-o OFS] LOOPDEVFILE - associate loop devices\n"11 //usage: "[-r] [-o OFS] {-f|LOOPDEV} FILE - associate loop devices\n" 12 12 //usage: " losetup -d LOOPDEV - disassociate\n" 13 //usage: " losetup [-f] - show" 13 //usage: " losetup -a - show status\n" 14 //usage: " losetup -f - show next free loop device" 14 15 //usage:#define losetup_full_usage "\n\n" 15 16 //usage: " -o OFS Start OFS bytes into FILE" 16 17 //usage: "\n -r Read-only" 17 //usage: "\n -f Show first free loop device"18 //usage: "\n -f Show/use next free loop device" 18 19 //usage: 19 20 //usage:#define losetup_notes_usage 20 //usage: "No arguments will display all current associations.\n"21 21 //usage: "One argument (losetup /dev/loop1) will display the current association\n" 22 22 //usage: "(if any), or disassociate it (with -d). The display shows the offset\n" … … 28 28 #include "libbb.h" 29 29 30 /* 1048575 is a max possible minor number in Linux circa 2010 */ 31 /* for now use something less extreme */ 32 #define MAX_LOOP_NUM 1023 33 30 34 int losetup_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 31 35 int losetup_main(int argc UNUSED_PARAM, char **argv) 32 36 { 33 37 unsigned opt; 34 int n;35 38 char *opt_o; 36 unsigned long long offset = 0;39 char dev[LOOP_NAMESIZE]; 37 40 enum { 38 41 OPT_d = (1 << 0), 39 42 OPT_o = (1 << 1), 40 43 OPT_f = (1 << 2), 41 OPT_r = (1 << 3), /* must be last */ 44 OPT_a = (1 << 3), 45 OPT_r = (1 << 4), /* must be last */ 42 46 }; 43 47 44 /* max 2 args, -d,-o,-f opts are mutually exclusive */ 45 opt_complementary = "?2:d--of:o--df:f--do"; 46 opt = getopt32(argv, "do:fr", &opt_o); 48 opt_complementary = "?2:d--ofar:a--ofr"; 49 opt = getopt32(argv, "do:far", &opt_o); 47 50 argv += optind; 48 51 49 if (opt == OPT_o) 50 offset = xatoull(opt_o); 51 52 if (opt == OPT_d) { 53 /* -d BLOCKDEV */ 54 if (!argv[0] || argv[1]) 55 bb_show_usage(); 56 if (del_loop(argv[0])) 57 bb_simple_perror_msg_and_die(argv[0]); 58 return EXIT_SUCCESS; 59 } 60 61 if (argv[0]) { 52 /* LOOPDEV */ 53 if (!opt && argv[0] && !argv[1]) { 62 54 char *s; 63 55 64 if (opt == OPT_f) /* -f should not have arguments */65 bb_show_usage();66 67 if (argv[1]) {68 /* [-r] [-o OFS] BLOCKDEV FILE */69 if (set_loop(&argv[0], argv[1], offset, (opt / OPT_r)) < 0)70 bb_simple_perror_msg_and_die(argv[0]);71 return EXIT_SUCCESS;72 }73 /* [-r] [-o OFS] BLOCKDEV */74 56 s = query_loop(argv[0]); 75 57 if (!s) … … 81 63 } 82 64 83 /* [-r] [-o OFS|-f] with no params */ 84 n = 0; 85 while (1) { 65 /* -d LOOPDEV */ 66 if (opt == OPT_d && argv[0]) { 67 if (del_loop(argv[0])) 68 bb_simple_perror_msg_and_die(argv[0]); 69 return EXIT_SUCCESS; 70 } 71 72 /* -a */ 73 if (opt == OPT_a) { 74 int n; 75 for (n = 0; n < MAX_LOOP_NUM; n++) { 76 char *s; 77 78 sprintf(dev, LOOP_FORMAT, n); 79 s = query_loop(dev); 80 if (s) { 81 printf("%s: %s\n", dev, s); 82 free(s); 83 } 84 } 85 return EXIT_SUCCESS; 86 } 87 88 /* contains -f */ 89 if (opt & OPT_f) { 86 90 char *s; 87 char dev[LOOP_NAMESIZE];91 int n = 0; 88 92 89 sprintf(dev, LOOP_FORMAT, n); 90 s = query_loop(dev); 91 n++; 92 if (!s) { 93 if (n > 9 && errno && errno != ENXIO) 94 return EXIT_SUCCESS; 95 if (opt == OPT_f) { 96 puts(dev); 97 return EXIT_SUCCESS; 98 } 99 } else { 100 if (opt != OPT_f) 101 printf("%s: %s\n", dev, s); 102 if (ENABLE_FEATURE_CLEAN_UP) 103 free(s); 93 do { 94 if (n > MAX_LOOP_NUM) 95 bb_error_msg_and_die("no free loop devices"); 96 sprintf(dev, LOOP_FORMAT, n++); 97 s = query_loop(dev); 98 free(s); 99 } while (s); 100 /* now: dev is next free "/dev/loopN" */ 101 if ((opt == OPT_f) && !argv[0]) { 102 puts(dev); 103 return EXIT_SUCCESS; 104 104 } 105 105 } 106 return EXIT_SUCCESS; 106 107 /* [-r] [-o OFS] {-f|LOOPDEV} FILE */ 108 if (argv[0] && ((opt & OPT_f) || argv[1])) { 109 unsigned long long offset = 0; 110 char *d = dev; 111 112 if (opt & OPT_o) 113 offset = xatoull(opt_o); 114 if (!(opt & OPT_f)) 115 d = *argv++; 116 117 if (argv[0]) { 118 if (set_loop(&d, argv[0], offset, (opt & OPT_r)) < 0) 119 bb_simple_perror_msg_and_die(argv[0]); 120 return EXIT_SUCCESS; 121 } 122 } 123 124 bb_show_usage(); /* does not return */ 125 /*return EXIT_FAILURE;*/ 107 126 }
Note:
See TracChangeset
for help on using the changeset viewer.