1*00c7fec1SAndroid Build Coastguard Worker #include <signal.h>
2*00c7fec1SAndroid Build Coastguard Worker #include <stdio.h>
3*00c7fec1SAndroid Build Coastguard Worker #include <stdlib.h>
4*00c7fec1SAndroid Build Coastguard Worker #include <string.h>
5*00c7fec1SAndroid Build Coastguard Worker #include <unistd.h>
6*00c7fec1SAndroid Build Coastguard Worker
7*00c7fec1SAndroid Build Coastguard Worker #define TOOL(name) int name##_main(int, char**);
8*00c7fec1SAndroid Build Coastguard Worker #include "tools.h"
9*00c7fec1SAndroid Build Coastguard Worker #undef TOOL
10*00c7fec1SAndroid Build Coastguard Worker
11*00c7fec1SAndroid Build Coastguard Worker static struct {
12*00c7fec1SAndroid Build Coastguard Worker const char* name;
13*00c7fec1SAndroid Build Coastguard Worker int (*func)(int, char**);
14*00c7fec1SAndroid Build Coastguard Worker } tools[] = {
15*00c7fec1SAndroid Build Coastguard Worker #define TOOL(name) { #name, name##_main },
16*00c7fec1SAndroid Build Coastguard Worker #include "tools.h"
17*00c7fec1SAndroid Build Coastguard Worker #undef TOOL
18*00c7fec1SAndroid Build Coastguard Worker { 0, 0 },
19*00c7fec1SAndroid Build Coastguard Worker };
20*00c7fec1SAndroid Build Coastguard Worker
SIGPIPE_handler(int signal)21*00c7fec1SAndroid Build Coastguard Worker static void SIGPIPE_handler(int signal) {
22*00c7fec1SAndroid Build Coastguard Worker // Those desktop Linux tools that catch SIGPIPE seem to agree that it's
23*00c7fec1SAndroid Build Coastguard Worker // a successful way to exit, not a failure. (Which makes sense --- we were
24*00c7fec1SAndroid Build Coastguard Worker // told to stop by a reader, rather than failing to continue ourselves.)
25*00c7fec1SAndroid Build Coastguard Worker _exit(0);
26*00c7fec1SAndroid Build Coastguard Worker }
27*00c7fec1SAndroid Build Coastguard Worker
main(int argc,char ** argv)28*00c7fec1SAndroid Build Coastguard Worker int main(int argc, char** argv) {
29*00c7fec1SAndroid Build Coastguard Worker // Let's assume that none of this code handles broken pipes. At least ls,
30*00c7fec1SAndroid Build Coastguard Worker // ps, and top were broken (though I'd previously added this fix locally
31*00c7fec1SAndroid Build Coastguard Worker // to top). We exit rather than use SIG_IGN because tools like top will
32*00c7fec1SAndroid Build Coastguard Worker // just keep on writing to nowhere forever if we don't stop them.
33*00c7fec1SAndroid Build Coastguard Worker signal(SIGPIPE, SIGPIPE_handler);
34*00c7fec1SAndroid Build Coastguard Worker
35*00c7fec1SAndroid Build Coastguard Worker char* cmd = strrchr(argv[0], '/');
36*00c7fec1SAndroid Build Coastguard Worker char* name = cmd ? (cmd + 1) : argv[0];
37*00c7fec1SAndroid Build Coastguard Worker
38*00c7fec1SAndroid Build Coastguard Worker for (size_t i = 0; tools[i].name; i++) {
39*00c7fec1SAndroid Build Coastguard Worker if (!strcmp(tools[i].name, name)) {
40*00c7fec1SAndroid Build Coastguard Worker return tools[i].func(argc, argv);
41*00c7fec1SAndroid Build Coastguard Worker }
42*00c7fec1SAndroid Build Coastguard Worker }
43*00c7fec1SAndroid Build Coastguard Worker
44*00c7fec1SAndroid Build Coastguard Worker printf("%s: no such tool\n", argv[0]);
45*00c7fec1SAndroid Build Coastguard Worker return 127;
46*00c7fec1SAndroid Build Coastguard Worker }
47*00c7fec1SAndroid Build Coastguard Worker
toolbox_main(int argc,char ** argv)48*00c7fec1SAndroid Build Coastguard Worker int toolbox_main(int argc, char** argv) {
49*00c7fec1SAndroid Build Coastguard Worker // "toolbox foo ..." is equivalent to "foo ..."
50*00c7fec1SAndroid Build Coastguard Worker if (argc > 1) {
51*00c7fec1SAndroid Build Coastguard Worker return main(argc - 1, argv + 1);
52*00c7fec1SAndroid Build Coastguard Worker }
53*00c7fec1SAndroid Build Coastguard Worker
54*00c7fec1SAndroid Build Coastguard Worker // Plain "toolbox" lists the tools.
55*00c7fec1SAndroid Build Coastguard Worker for (size_t i = 1; tools[i].name; i++) {
56*00c7fec1SAndroid Build Coastguard Worker printf("%s%c", tools[i].name, tools[i+1].name ? ' ' : '\n');
57*00c7fec1SAndroid Build Coastguard Worker }
58*00c7fec1SAndroid Build Coastguard Worker return 0;
59*00c7fec1SAndroid Build Coastguard Worker }
60