17
17
#include < ctype.h>
18
18
#include < getopt.h>
19
19
#include < stdlib.h>
20
+
20
21
#include < iostream>
21
22
23
+ #include < android-base/file.h>
22
24
#include < android-base/strings.h>
23
25
#include < modprobe/modprobe.h>
24
26
27
+ namespace {
28
+
25
29
enum modprobe_mode {
26
30
AddModulesMode,
27
31
RemoveModulesMode,
28
32
ListModulesMode,
29
33
ShowDependenciesMode,
30
34
};
31
35
32
- static void print_usage (void ) {
36
+ void print_usage (void ) {
33
37
std::cerr << " Usage:" << std::endl;
34
38
std::cerr << std::endl;
35
- std::cerr << " modprobe [-alrqvsDb] [-d DIR] [MODULE]+" << std::endl;
36
- std::cerr << " modprobe [-alrqvsDb] [-d DIR] MODULE [symbol=value][...]" << std::endl;
39
+ // -d option is required on Android
40
+ std::cerr << " modprobe [options] -d DIR MODULE..." << std::endl;
41
+ std::cerr << " modprobe [options] -d DIR MODULE [symbol=value]..." << std::endl;
37
42
std::cerr << std::endl;
38
43
std::cerr << " Options:" << std::endl;
39
- std::cerr << " -b: Apply blocklist to module names too" << std::endl;
40
- std::cerr << " -d: Load modules from DIR, option may be used multiple times" << std::endl;
41
- std::cerr << " -D: Print dependencies for modules only, do not load" ;
42
- std::cerr << " -h: Print this help" << std::endl;
43
- std::cerr << " -l: List modules matching pattern" << std::endl;
44
- std::cerr << " -r: Remove MODULE (multiple modules may be specified)" << std::endl;
45
- std::cerr << " -q: Quiet" << std::endl;
46
- std::cerr << " -v: Verbose" << std::endl;
44
+ std::cerr << " -b, --use-blocklist: Apply blocklist to module names too" << std::endl;
45
+ std::cerr << " -d, --dirname=DIR: Load modules from DIR, option may be used multiple times"
46
+ << std::endl;
47
+ std::cerr << " -D, --show-depends: Print dependencies for modules only, do not load"
48
+ << std::endl;
49
+ std::cerr << " -h, --help: Print this help" << std::endl;
50
+ std::cerr << " -l, --list: List modules matching pattern" << std::endl;
51
+ std::cerr << " -r, --remove: Remove MODULE (multiple modules may be specified)" << std::endl;
52
+ std::cerr << " -q, --quiet: disable messages" << std::endl;
53
+ std::cerr << " -v, --verbose: enable more messages" << std::endl;
47
54
std::cerr << std::endl;
48
55
}
49
56
@@ -54,6 +61,8 @@ static void print_usage(void) {
54
61
return EXIT_FAILURE; \
55
62
}
56
63
64
+ } // anonymous namespace
65
+
57
66
extern " C" int modprobe_main (int argc, char ** argv) {
58
67
std::vector<std::string> modules;
59
68
std::string module_parameters;
@@ -64,7 +73,23 @@ extern "C" int modprobe_main(int argc, char** argv) {
64
73
int rv = EXIT_SUCCESS;
65
74
66
75
int opt;
67
- while ((opt = getopt (argc, argv, " abd:Dhlqrv" )) != -1 ) {
76
+ int option_index = 0 ;
77
+ // NB: We have non-standard short options -l and -D to make it easier for
78
+ // OEMs to transition from toybox.
79
+ // clang-format off
80
+ static struct option long_options[] = {
81
+ { " all" , no_argument, 0 , ' a' },
82
+ { " use-blocklist" , no_argument, 0 , ' b' },
83
+ { " dirname" , required_argument, 0 , ' d' },
84
+ { " show-depends" , no_argument, 0 , ' D' },
85
+ { " help" , no_argument, 0 , ' h' },
86
+ { " list" , no_argument, 0 , ' l' },
87
+ { " quiet" , no_argument, 0 , ' q' },
88
+ { " remove" , no_argument, 0 , ' r' },
89
+ { " verbose" , no_argument, 0 , ' v' },
90
+ };
91
+ // clang-format on
92
+ while ((opt = getopt_long (argc, argv, " abd:Dhlqrv" , long_options, &option_index)) != -1 ) {
68
93
switch (opt) {
69
94
case ' a' :
70
95
// toybox modprobe supported -a to load multiple modules, this
@@ -121,9 +146,9 @@ extern "C" int modprobe_main(int argc, char** argv) {
121
146
if (verbose) {
122
147
std::cout << " mode is " << mode << std::endl;
123
148
std::cout << " verbose is " << verbose << std::endl;
124
- std::cout << " mod_dirs is: " << android::base::Join (mod_dirs, " " ) << std::endl;
125
- std::cout << " modules is: " << android::base::Join (modules, " " ) << std::endl;
126
- std::cout << " module parameters is: " << android::base::Join (module_parameters, " " )
149
+ std::cout << " mod_dirs is: " << android::base::Join (mod_dirs, " " ) << std::endl;
150
+ std::cout << " modules is: " << android::base::Join (modules, " " ) << std::endl;
151
+ std::cout << " module parameters is: " << android::base::Join (module_parameters, " " )
127
152
<< std::endl;
128
153
}
129
154
@@ -159,13 +184,13 @@ extern "C" int modprobe_main(int argc, char** argv) {
159
184
switch (mode) {
160
185
case AddModulesMode:
161
186
if (!m.LoadWithAliases (module , true , module_parameters)) {
162
- std::cerr << " Failed to load module " << module ;
187
+ std::cerr << " Failed to load module " << module << std::endl ;
163
188
rv = EXIT_FAILURE;
164
189
}
165
190
break ;
166
191
case RemoveModulesMode:
167
192
if (!m.Remove (module )) {
168
- std::cerr << " Failed to remove module " << module ;
193
+ std::cerr << " Failed to remove module " << module << std::endl ;
169
194
rv = EXIT_FAILURE;
170
195
}
171
196
break ;
@@ -192,7 +217,7 @@ extern "C" int modprobe_main(int argc, char** argv) {
192
217
break ;
193
218
}
194
219
default :
195
- std::cerr << " Bad mode" ;
220
+ std::cerr << " Bad mode" << std::endl ;
196
221
rv = EXIT_FAILURE;
197
222
}
198
223
}
0 commit comments