annotate main.c @ 1156:faf7117c4489 draft

Fix some issues raised (albeit indirectly) by Isaac Dunham. POLL_IN defined as a constant by some libc. Factor out login.c's change_identity() to xwrap.c as xsetuser(). Replace xsetuid() with xsetuser() Put a space between argument globals and non-argument globals. TT starts zeroed, don't need to re-zero entries in it. STDIN_FILENO has been 0 since 1969, even DOS copied that. Just say 0. Added an xchroot() using xchdir() to lib/xwrap.c. Remove endgrent() call until somebody can explain why it was there.
author Rob Landley <rob@landley.net>
date Mon, 23 Dec 2013 06:49:38 -0600
parents ac4a0cde89c2
children 4654f241ccbe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
1 /* Toybox infrastructure.
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
2 *
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
3 * Copyright 2006 Rob Landley <rob@landley.net>
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
4 */
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
5
1
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
6 #include "toys.h"
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
7
21
6475d6c46066 Add pwd. Consolidate toy list information under toylist.h.
Rob Landley <rob@landley.net>
parents: 20
diff changeset
8 // Populate toy_list[].
1
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
9
88
021fe1a818c3 Small cleanup to prepare for cross-compile friendly make install.
Rob Landley <rob@landley.net>
parents: 65
diff changeset
10 #undef NEWTOY
021fe1a818c3 Small cleanup to prepare for cross-compile friendly make install.
Rob Landley <rob@landley.net>
parents: 65
diff changeset
11 #undef OLDTOY
021fe1a818c3 Small cleanup to prepare for cross-compile friendly make install.
Rob Landley <rob@landley.net>
parents: 65
diff changeset
12 #define NEWTOY(name, opts, flags) {#name, name##_main, opts, flags},
021fe1a818c3 Small cleanup to prepare for cross-compile friendly make install.
Rob Landley <rob@landley.net>
parents: 65
diff changeset
13 #define OLDTOY(name, oldname, opts, flags) {#name, oldname##_main, opts, flags},
021fe1a818c3 Small cleanup to prepare for cross-compile friendly make install.
Rob Landley <rob@landley.net>
parents: 65
diff changeset
14
1
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
15 struct toy_list toy_list[] = {
234
163498bf547b Move NEWTOY() list from end of toylist.h to generated/newtoys.h.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
16 #include "generated/newtoys.h"
1
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
17 };
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
18
873
d90f14e011b8 Fix some comments from way back when toybox first started (in 2006), when I was still cleaning busybox-isms out of my head...
Rob Landley <rob@landley.net>
parents: 782
diff changeset
19 // global context for this command.
1
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
20
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
21 struct toy_context toys;
237
7cb15eae1664 Zap toylist.h, moving contents of global structures into DEFINE_GLOBALS()
Rob Landley <rob@landley.net>
parents: 234
diff changeset
22 union global_union this;
1043
acf7bb2b99e2 Introduce libbuf analogous to toybuf but for use by lib/*.c. Change readfile() semantics to be able to read into an existing buffer, or malloc its own if that's NULL.
Rob Landley <rob@landley.net>
parents: 1032
diff changeset
23 char toybuf[4096], libbuf[4096];
1
59d58fab67c6 Next snapshot. Tries to grab something out of lib in order to build, I have
landley@driftwood
parents: 0
diff changeset
24
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
25 struct toy_list *toy_find(char *name)
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
26 {
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
27 int top, bottom, middle;
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
28
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
29 // If the name starts with "toybox" accept that as a match. Otherwise
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
30 // skip the first entry, which is out of order.
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
31
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
32 if (!strncmp(name,"toybox",6)) return toy_list;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
33 bottom = 1;
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
34
873
d90f14e011b8 Fix some comments from way back when toybox first started (in 2006), when I was still cleaning busybox-isms out of my head...
Rob Landley <rob@landley.net>
parents: 782
diff changeset
35 // Binary search to find this command.
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
36
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
37 top = ARRAY_LEN(toy_list)-1;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
38 for (;;) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
39 int result;
156
1e8f4b05cb65 Remove trailing whitespace (thanks to Charlie Shepherd), and a couple comment
Rob Landley <rob@landley.net>
parents: 138
diff changeset
40
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
41 middle = (top+bottom)/2;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
42 if (middle<bottom || middle>top) return NULL;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
43 result = strcmp(name,toy_list[middle].name);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
44 if (!result) return toy_list+middle;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
45 if (result<0) top=--middle;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
46 else bottom = ++middle;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
47 }
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
48 }
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
49
122
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
50 // Figure out whether or not anything is using the option parsing logic,
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
51 // because the compiler can't figure out whether or not to optimize it away
402
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
52 // on its' own. NEED_OPTIONS becomes a constant allowing if() to optimize
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
53 // stuff out via dead code elimination.
122
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
54
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
55 #undef NEWTOY
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
56 #undef OLDTOY
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
57 #define NEWTOY(name, opts, flags) opts ||
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
58 #define OLDTOY(name, oldname, opts, flags) opts ||
125
a4af344fb349 Make warning go away.
Rob Landley <rob@landley.net>
parents: 122
diff changeset
59 static const int NEED_OPTIONS =
234
163498bf547b Move NEWTOY() list from end of toylist.h to generated/newtoys.h.
Rob Landley <rob@landley.net>
parents: 197
diff changeset
60 #include "generated/newtoys.h"
122
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
61 0; // Ends the opts || opts || opts...
ee49aa0dc731 Show the compiler how to optimize out the option parsing logic when nothing
Rob Landley <rob@landley.net>
parents: 121
diff changeset
62
956
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
63 // Subset of init needed by singlemain
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
64 static void toy_singleinit(struct toy_list *which, char *argv[])
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
65 {
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
66 toys.which = which;
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
67 toys.argv = argv;
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
68
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
69 if (CFG_TOYBOX_HELP_DASHDASH && argv[1] && !strcmp(argv[1], "--help")) {
1022
71f64e2f24a9 Fix --help option to multiplexer.
Rob Landley <rob@landley.net>
parents: 956
diff changeset
70 if (toys.which == toy_list && toys.argv[2])
71f64e2f24a9 Fix --help option to multiplexer.
Rob Landley <rob@landley.net>
parents: 956
diff changeset
71 if (!(toys.which = toy_find(toys.argv[2]))) return;
956
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
72 show_help();
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
73 xexit();
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
74 }
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
75
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
76 if (NEED_OPTIONS && which->options) get_optflags();
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
77 else {
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
78 toys.optargs = argv+1;
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
79 for (toys.optc=0; toys.optargs[toys.optc]; toys.optc++);
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
80 }
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
81 toys.old_umask = umask(0);
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
82 if (!(which->flags & TOYFLAG_UMASK)) umask(toys.old_umask);
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
83 }
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
84
402
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
85 // Setup toybox global state for this command.
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
86
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
87 void toy_init(struct toy_list *which, char *argv[])
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
88 {
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
89 // Drop permissions for non-suid commands.
370
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 257
diff changeset
90
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
91 if (CFG_TOYBOX_SUID) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
92 uid_t uid = getuid(), euid = geteuid();
370
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 257
diff changeset
93
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
94 if (!(which->flags & TOYFLAG_STAYROOT)) {
1156
faf7117c4489 Fix some issues raised (albeit indirectly) by Isaac Dunham.
Rob Landley <rob@landley.net>
parents: 1150
diff changeset
95 if (uid != euid)
faf7117c4489 Fix some issues raised (albeit indirectly) by Isaac Dunham.
Rob Landley <rob@landley.net>
parents: 1150
diff changeset
96 if (!setuid(euid=uid)) perror_exit("setuid"); // drop root
769
098ab2654fa0 TOYBOX_DEBUG warns about lack of suid bit when running a STAYROOT command, but it shouldn't warn just because the multiplexer command "toybox" is stayroot.
Rob Landley <rob@landley.net>
parents: 761
diff changeset
97 } else if (CFG_TOYBOX_DEBUG && uid && which != toy_list)
098ab2654fa0 TOYBOX_DEBUG warns about lack of suid bit when running a STAYROOT command, but it shouldn't warn just because the multiplexer command "toybox" is stayroot.
Rob Landley <rob@landley.net>
parents: 761
diff changeset
98 error_msg("Not installed suid root");
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
99
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
100 if ((which->flags & TOYFLAG_NEEDROOT) && euid) error_exit("Not root");
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
101 }
370
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 257
diff changeset
102
696
99ca30ad3d2b Add rebound support to intercept error_exit() and longjmp instead.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
103 // Free old toys contents (to be reentrant), but leave rebound if any
370
c7a26e26ad08 Add TOYBOX_SUID.
Rob Landley <rob@landley.net>
parents: 257
diff changeset
104
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
105 if (toys.optargs != toys.argv+1) free(toys.optargs);
696
99ca30ad3d2b Add rebound support to intercept error_exit() and longjmp instead.
Rob Landley <rob@landley.net>
parents: 694
diff changeset
106 memset(&toys, 0, offsetof(struct toy_context, rebound));
373
5e68c7cab1a4 Make toy_init() reentrant, or else xexec() has funky errors.
Rob Landley <rob@landley.net>
parents: 370
diff changeset
107
956
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
108 // Subset of init needed by singlemain.
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
109 toy_singleinit(which, argv);
3
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
110 }
266a462ed18c Next drop of toysh, plus more infratructure.
landley@driftwood
parents: 2
diff changeset
111
402
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
112 // Like exec() but runs an internal toybox command instead of another file.
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
113 // Only returns if it can't find the command, otherwise exit() when done.
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
114 void toy_exec(char *argv[])
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
115 {
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
116 struct toy_list *which;
121
933766b0bd4b Allow applets with optarg string NULL to use toy.optargs[].
Rob Landley <rob@landley.net>
parents: 93
diff changeset
117
895
60a430b7791e Add --help option to toybox command when TOYBOX_HELP is enabled.
Rob Landley <rob@landley.net>
parents: 873
diff changeset
118 if (!(which = toy_find(argv[0]))) return;
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
119 toy_init(which, argv);
1022
71f64e2f24a9 Fix --help option to multiplexer.
Rob Landley <rob@landley.net>
parents: 956
diff changeset
120 if (toys.which) toys.which->toy_main();
761
6a558bf5de65 Elie De Brauwer pointed out that xputs() isn't reliably reporting errors because there's no flush. Rather than change the output granularity, flush before exit and check errors there. (We still need xputc() doing it so "yes" doesn't continue forever.)
Rob Landley <rob@landley.net>
parents: 712
diff changeset
121 if (fflush(NULL) || ferror(stdout)) perror_exit("write");
938
812e8c5d026f Add config option for --help support in all commands.
Rob Landley <rob@landley.net>
parents: 895
diff changeset
122 xexit();
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
123 }
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
124
402
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
125 // Multiplexer command, first argument is command to run, rest are args to that.
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
126 // If first argument starts with - output list of command install paths.
2551e517b800 Expand comments.
Rob Landley <rob@landley.net>
parents: 373
diff changeset
127
186
25447caf1b4b Change command main() functions to return void, and exit(toys.exitval) from
Rob Landley <rob@landley.net>
parents: 182
diff changeset
128 void toybox_main(void)
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
129 {
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
130 static char *toy_paths[]={"usr/","bin/","sbin/",0};
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
131 int i, len = 0;
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
132
704
e45ab88c477d Init global context to toybox multiplexer early so error_exit() doesn't segfault trying to print current command name, and change TOYBOX_DEBUG+TOYBOX_SUID complaint about not having the suid bit set to warning rather than exit..
Rob Landley <rob@landley.net>
parents: 697
diff changeset
133 toys.which = toy_list;
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
134 if (toys.argv[1]) {
1022
71f64e2f24a9 Fix --help option to multiplexer.
Rob Landley <rob@landley.net>
parents: 956
diff changeset
135 toy_exec(toys.argv+1);
71f64e2f24a9 Fix --help option to multiplexer.
Rob Landley <rob@landley.net>
parents: 956
diff changeset
136 if (toys.argv[1][0] == '-') goto list;
895
60a430b7791e Add --help option to toybox command when TOYBOX_HELP is enabled.
Rob Landley <rob@landley.net>
parents: 873
diff changeset
137
60a430b7791e Add --help option to toybox command when TOYBOX_HELP is enabled.
Rob Landley <rob@landley.net>
parents: 873
diff changeset
138 error_exit("Unknown command %s",toys.argv[1]);
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
139 }
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
140
895
60a430b7791e Add --help option to toybox command when TOYBOX_HELP is enabled.
Rob Landley <rob@landley.net>
parents: 873
diff changeset
141 list:
873
d90f14e011b8 Fix some comments from way back when toybox first started (in 2006), when I was still cleaning busybox-isms out of my head...
Rob Landley <rob@landley.net>
parents: 782
diff changeset
142 // Output list of command.
694
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
143 for (i=1; i<ARRAY_LEN(toy_list); i++) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
144 int fl = toy_list[i].flags;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
145 if (fl & TOYMASK_LOCATION) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
146 if (toys.argv[1]) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
147 int j;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
148 for (j=0; toy_paths[j]; j++)
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
149 if (fl & (1<<j)) len += printf("%s", toy_paths[j]);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
150 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
151 len += printf("%s ",toy_list[i].name);
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
152 if (len>65) {
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
153 xputc('\n');
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
154 len=0;
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
155 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
156 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
157 }
786841fdb1e0 Reindent to two spaces per level. Remove vi: directives that haven't worked right in years (ubuntu broke its' vim implementation). Remove trailing spaces. Add/remove blank lines. Re-wordwrap in places. Update documentation with new coding style.
Rob Landley <rob@landley.net>
parents: 647
diff changeset
158 xputc('\n');
2
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
159 }
67b517913e56 Infrastructure, first drop of toy shell, and a bit of work on df.
landley@driftwood
parents: 1
diff changeset
160
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
161 int main(int argc, char *argv[])
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
162 {
712
a950dd960593 Cleanup i18n support (#ifdefectomy, move global init to process launch). Teach make.sh to emit "#define FLAG_x 0" for options inside disabled USE macros so we can unconditionally refer to them.
Rob Landley <rob@landley.net>
parents: 710
diff changeset
163 if (CFG_TOYBOX_I18N) setlocale(LC_ALL, "");
a950dd960593 Cleanup i18n support (#ifdefectomy, move global init to process launch). Teach make.sh to emit "#define FLAG_x 0" for options inside disabled USE macros so we can unconditionally refer to them.
Rob Landley <rob@landley.net>
parents: 710
diff changeset
164
1032
40d0c96a8e89 Add scripts/single.sh to build individual non-multiplexed standalone commands.
Rob Landley <rob@landley.net>
parents: 1022
diff changeset
165 if (CFG_TOYBOX) {
956
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
166 // Trim path off of command name
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
167 *argv = basename(*argv);
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
168
956
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
169 // Call the multiplexer, adjusting this argv[] to be its' argv[1].
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
170 // (It will adjust it back before calling toy_exec().)
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
171 toys.argv = argv-1;
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
172 toybox_main();
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
173 } else {
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
174 // a single toybox command built standalone with no multiplexer
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
175 toy_singleinit(toy_list, argv);
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
176 toy_list->toy_main();
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
177 if (fflush(NULL) || ferror(stdout)) perror_exit("write");
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
178 }
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
179
caa05719070f Start of TOYBOX_SINGLE support, for building standalone commands with no multiplexer.
Rob Landley <rob@landley.net>
parents: 938
diff changeset
180 return toys.exitval;
0
e651a31d5416 Starting a new project. Just a bit past the "hello world" stage...
landley@driftwood
parents:
diff changeset
181 }