source: MondoRescue/branches/3.3/mindi-busybox/util-linux/losetup.c@ 3625

Last change on this file since 3625 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

File size: 3.1 KB
Line 
1/* vi: set sw=4 ts=4: */
2/*
3 * Mini losetup implementation for busybox
4 *
5 * Copyright (C) 2002 Matt Kraai.
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this source tree.
8 */
9
10//usage:#define losetup_trivial_usage
11//usage: "[-r] [-o OFS] {-f|LOOPDEV} FILE - associate loop devices\n"
12//usage: " losetup -d LOOPDEV - disassociate\n"
13//usage: " losetup -a - show status\n"
14//usage: " losetup -f - show next free loop device"
15//usage:#define losetup_full_usage "\n\n"
16//usage: " -o OFS Start OFS bytes into FILE"
17//usage: "\n -r Read-only"
18//usage: "\n -f Show/use next free loop device"
19//usage:
20//usage:#define losetup_notes_usage
21//usage: "One argument (losetup /dev/loop1) will display the current association\n"
22//usage: "(if any), or disassociate it (with -d). The display shows the offset\n"
23//usage: "and filename of the file the loop device is currently bound to.\n\n"
24//usage: "Two arguments (losetup /dev/loop1 file.img) create a new association,\n"
25//usage: "with an optional offset (-o 12345). Encryption is not yet supported.\n"
26//usage: "losetup -f will show the first loop free loop device\n\n"
27
28#include "libbb.h"
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
34int losetup_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
35int losetup_main(int argc UNUSED_PARAM, char **argv)
36{
37 unsigned opt;
38 char *opt_o;
39 char dev[LOOP_NAMESIZE];
40 enum {
41 OPT_d = (1 << 0),
42 OPT_o = (1 << 1),
43 OPT_f = (1 << 2),
44 OPT_a = (1 << 3),
45 OPT_r = (1 << 4), /* must be last */
46 };
47
48 opt_complementary = "?2:d--ofar:a--ofr";
49 opt = getopt32(argv, "do:far", &opt_o);
50 argv += optind;
51
52 /* LOOPDEV */
53 if (!opt && argv[0] && !argv[1]) {
54 char *s;
55
56 s = query_loop(argv[0]);
57 if (!s)
58 bb_simple_perror_msg_and_die(argv[0]);
59 printf("%s: %s\n", argv[0], s);
60 if (ENABLE_FEATURE_CLEAN_UP)
61 free(s);
62 return EXIT_SUCCESS;
63 }
64
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) {
90 char *s;
91 int n = 0;
92
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 }
105 }
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;*/
126}
Note: See TracBrowser for help on using the repository browser.