diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-09-06 10:18:21 +0200 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-09-06 10:18:21 +0200 |
commit | 96f064d4161ed66d8db95bf8047eece90959f1e1 (patch) | |
tree | 14a9d1f501d6ddcc601d104c45a45d3e4c158b87 | |
parent | e09bff33412c150a2c4c80ca7e2d5c6b76f10c9f (diff) | |
download | busybox-w32-96f064d4161ed66d8db95bf8047eece90959f1e1.tar.gz busybox-w32-96f064d4161ed66d8db95bf8047eece90959f1e1.tar.bz2 busybox-w32-96f064d4161ed66d8db95bf8047eece90959f1e1.zip |
shell: remove lash and bbsh
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r-- | TEST_config_nommu | 1 | ||||
-rw-r--r-- | TEST_config_noprintf | 1 | ||||
-rw-r--r-- | TEST_config_rh9 | 1 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | include/applets.src.h | 1 | ||||
-rw-r--r-- | shell/bbsh.c | 223 | ||||
-rw-r--r-- | shell/hush.c | 19 |
7 files changed, 1 insertions, 247 deletions
diff --git a/TEST_config_nommu b/TEST_config_nommu index 911f02f6b..18f448391 100644 --- a/TEST_config_nommu +++ b/TEST_config_nommu | |||
@@ -904,7 +904,6 @@ CONFIG_HUSH_FUNCTIONS=y | |||
904 | CONFIG_HUSH_LOCAL=y | 904 | CONFIG_HUSH_LOCAL=y |
905 | CONFIG_HUSH_EXPORT_N=y | 905 | CONFIG_HUSH_EXPORT_N=y |
906 | CONFIG_HUSH_RANDOM_SUPPORT=y | 906 | CONFIG_HUSH_RANDOM_SUPPORT=y |
907 | CONFIG_LASH=y | ||
908 | CONFIG_MSH=y | 907 | CONFIG_MSH=y |
909 | CONFIG_SH_MATH_SUPPORT=y | 908 | CONFIG_SH_MATH_SUPPORT=y |
910 | CONFIG_SH_MATH_SUPPORT_64=y | 909 | CONFIG_SH_MATH_SUPPORT_64=y |
diff --git a/TEST_config_noprintf b/TEST_config_noprintf index ba003a1fb..22525ecb6 100644 --- a/TEST_config_noprintf +++ b/TEST_config_noprintf | |||
@@ -904,7 +904,6 @@ CONFIG_FEATURE_SH_IS_NONE=y | |||
904 | # CONFIG_FEATURE_BASH_IS_ASH is not set | 904 | # CONFIG_FEATURE_BASH_IS_ASH is not set |
905 | # CONFIG_FEATURE_BASH_IS_HUSH is not set | 905 | # CONFIG_FEATURE_BASH_IS_HUSH is not set |
906 | CONFIG_FEATURE_BASH_IS_NONE=y | 906 | CONFIG_FEATURE_BASH_IS_NONE=y |
907 | # CONFIG_LASH is not set | ||
908 | # CONFIG_MSH is not set | 907 | # CONFIG_MSH is not set |
909 | # CONFIG_SH_MATH_SUPPORT is not set | 908 | # CONFIG_SH_MATH_SUPPORT is not set |
910 | # CONFIG_SH_MATH_SUPPORT_64 is not set | 909 | # CONFIG_SH_MATH_SUPPORT_64 is not set |
diff --git a/TEST_config_rh9 b/TEST_config_rh9 index 3ffb1c6f3..e45608351 100644 --- a/TEST_config_rh9 +++ b/TEST_config_rh9 | |||
@@ -918,7 +918,6 @@ CONFIG_HUSH_FUNCTIONS=y | |||
918 | CONFIG_HUSH_LOCAL=y | 918 | CONFIG_HUSH_LOCAL=y |
919 | CONFIG_HUSH_EXPORT_N=y | 919 | CONFIG_HUSH_EXPORT_N=y |
920 | CONFIG_HUSH_RANDOM_SUPPORT=y | 920 | CONFIG_HUSH_RANDOM_SUPPORT=y |
921 | # CONFIG_LASH is not set | ||
922 | CONFIG_MSH=y | 921 | CONFIG_MSH=y |
923 | CONFIG_SH_MATH_SUPPORT=y | 922 | CONFIG_SH_MATH_SUPPORT=y |
924 | CONFIG_SH_MATH_SUPPORT_64=y | 923 | CONFIG_SH_MATH_SUPPORT_64=y |
@@ -82,7 +82,7 @@ Rob Landley suggested this: | |||
82 | 82 | ||
83 | initramfs | 83 | initramfs |
84 | Busybox should have a sample initramfs build script. This depends on | 84 | Busybox should have a sample initramfs build script. This depends on |
85 | bbsh, mdev, and switch_root. | 85 | shell, mdev, and switch_root. |
86 | 86 | ||
87 | mkdep | 87 | mkdep |
88 | Write a mkdep that doesn't segfault if there's a directory it doesn't | 88 | Write a mkdep that doesn't segfault if there's a directory it doesn't |
diff --git a/include/applets.src.h b/include/applets.src.h index 195598fee..0e4f966de 100644 --- a/include/applets.src.h +++ b/include/applets.src.h | |||
@@ -75,7 +75,6 @@ IF_ARPING(APPLET(arping, _BB_DIR_USR_BIN, _BB_SUID_DROP)) | |||
75 | IF_AWK(APPLET_NOEXEC(awk, awk, _BB_DIR_USR_BIN, _BB_SUID_DROP, awk)) | 75 | IF_AWK(APPLET_NOEXEC(awk, awk, _BB_DIR_USR_BIN, _BB_SUID_DROP, awk)) |
76 | IF_BASENAME(APPLET_NOFORK(basename, basename, _BB_DIR_USR_BIN, _BB_SUID_DROP, basename)) | 76 | IF_BASENAME(APPLET_NOFORK(basename, basename, _BB_DIR_USR_BIN, _BB_SUID_DROP, basename)) |
77 | IF_BBCONFIG(APPLET(bbconfig, _BB_DIR_BIN, _BB_SUID_DROP)) | 77 | IF_BBCONFIG(APPLET(bbconfig, _BB_DIR_BIN, _BB_SUID_DROP)) |
78 | //IF_BBSH(APPLET(bbsh, _BB_DIR_BIN, _BB_SUID_DROP)) | ||
79 | IF_BEEP(APPLET(beep, _BB_DIR_USR_BIN, _BB_SUID_DROP)) | 78 | IF_BEEP(APPLET(beep, _BB_DIR_USR_BIN, _BB_SUID_DROP)) |
80 | IF_BLKID(APPLET(blkid, _BB_DIR_SBIN, _BB_SUID_DROP)) | 79 | IF_BLKID(APPLET(blkid, _BB_DIR_SBIN, _BB_SUID_DROP)) |
81 | IF_BOOTCHARTD(APPLET(bootchartd, _BB_DIR_SBIN, _BB_SUID_DROP)) | 80 | IF_BOOTCHARTD(APPLET(bootchartd, _BB_DIR_SBIN, _BB_SUID_DROP)) |
diff --git a/shell/bbsh.c b/shell/bbsh.c deleted file mode 100644 index 8e25db458..000000000 --- a/shell/bbsh.c +++ /dev/null | |||
@@ -1,223 +0,0 @@ | |||
1 | /* vi: set ts=4 : | ||
2 | * | ||
3 | * bbsh - busybox shell | ||
4 | * | ||
5 | * Copyright 2006 Rob Landley <rob@landley.net> | ||
6 | * | ||
7 | * Licensed under GPLv2 or later, see file LICENSE in this source tree. | ||
8 | */ | ||
9 | |||
10 | // A section of code that gets repeatedly or conditionally executed is stored | ||
11 | // as a string and parsed each time it's run. | ||
12 | |||
13 | |||
14 | |||
15 | // Wheee, debugging. | ||
16 | |||
17 | // Terminal control | ||
18 | #define ENABLE_BBSH_TTY 0 | ||
19 | |||
20 | // &, fg, bg, jobs. (ctrl-z with tty.) | ||
21 | #define ENABLE_BBSH_JOBCTL 0 | ||
22 | |||
23 | // Flow control (if, while, for, functions { }) | ||
24 | #define ENABLE_BBSH_FLOWCTL 0 | ||
25 | |||
26 | #define ENABLE_BBSH_ENVVARS 0 // Environment variable support | ||
27 | |||
28 | // Local and synthetic variables, fancy prompts, set, $?, etc. | ||
29 | #define ENABLE_BBSH_LOCALVARS 0 | ||
30 | |||
31 | // Pipes and redirects: | > < >> << && || & () ; | ||
32 | #define ENABLE_BBSH_PIPES 0 | ||
33 | |||
34 | /* Fun: | ||
35 | |||
36 | echo `echo hello#comment " woot` and more | ||
37 | */ | ||
38 | |||
39 | #include "libbb.h" | ||
40 | |||
41 | // A single executable, its arguments, and other information we know about it. | ||
42 | #define BBSH_FLAG_EXIT 1 | ||
43 | #define BBSH_FLAG_SUSPEND 2 | ||
44 | #define BBSH_FLAG_PIPE 4 | ||
45 | #define BBSH_FLAG_AND 8 | ||
46 | #define BBSH_FLAG_OR 16 | ||
47 | #define BBSH_FLAG_AMP 32 | ||
48 | #define BBSH_FLAG_SEMI 64 | ||
49 | #define BBSH_FLAG_PAREN 128 | ||
50 | |||
51 | // What we know about a single process. | ||
52 | struct command { | ||
53 | struct command *next; | ||
54 | int flags; // exit, suspend, && || | ||
55 | int pid; // pid (or exit code) | ||
56 | int argc; | ||
57 | char *argv[]; | ||
58 | }; | ||
59 | |||
60 | // A collection of processes piped into/waiting on each other. | ||
61 | struct pipeline { | ||
62 | struct pipeline *next; | ||
63 | int job_id; | ||
64 | struct command *cmd; | ||
65 | char *cmdline; | ||
66 | int cmdlinelen; | ||
67 | }; | ||
68 | |||
69 | static void free_list(void *list, void (*freeit)(void *data)) | ||
70 | { | ||
71 | while (list) { | ||
72 | void **next = (void **)list; | ||
73 | void *list_next = *next; | ||
74 | freeit(list); | ||
75 | free(list); | ||
76 | list = list_next; | ||
77 | } | ||
78 | } | ||
79 | |||
80 | // Parse one word from the command line, appending one or more argv[] entries | ||
81 | // to struct command. Handles environment variable substitution and | ||
82 | // substrings. Returns pointer to next used byte, or NULL if it | ||
83 | // hit an ending token. | ||
84 | static char *parse_word(char *start, struct command **cmd) | ||
85 | { | ||
86 | char *end; | ||
87 | |||
88 | // Detect end of line (and truncate line at comment) | ||
89 | if (ENABLE_BBSH_PIPES && strchr("><&|(;", *start)) return 0; | ||
90 | |||
91 | // Grab next word. (Add dequote and envvar logic here) | ||
92 | end = start; | ||
93 | end = skip_non_whitespace(end); | ||
94 | (*cmd)->argv[(*cmd)->argc++] = xstrndup(start, end-start); | ||
95 | |||
96 | // Allocate more space if there's no room for NULL terminator. | ||
97 | |||
98 | if (!((*cmd)->argc & 7)) | ||
99 | *cmd = xrealloc(*cmd, | ||
100 | sizeof(struct command) + ((*cmd)->argc+8)*sizeof(char *)); | ||
101 | (*cmd)->argv[(*cmd)->argc] = 0; | ||
102 | return end; | ||
103 | } | ||
104 | |||
105 | // Parse a line of text into a pipeline. | ||
106 | // Returns a pointer to the next line. | ||
107 | |||
108 | static char *parse_pipeline(char *cmdline, struct pipeline *line) | ||
109 | { | ||
110 | struct command **cmd = &(line->cmd); | ||
111 | char *start = line->cmdline = cmdline; | ||
112 | |||
113 | if (!cmdline) return 0; | ||
114 | |||
115 | if (ENABLE_BBSH_JOBCTL) line->cmdline = cmdline; | ||
116 | |||
117 | // Parse command into argv[] | ||
118 | for (;;) { | ||
119 | char *end; | ||
120 | |||
121 | // Skip leading whitespace and detect end of line. | ||
122 | start = skip_whitespace(start); | ||
123 | if (!*start || *start=='#') { | ||
124 | if (ENABLE_BBSH_JOBCTL) line->cmdlinelen = start-cmdline; | ||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | // Allocate next command structure if necessary | ||
129 | if (!*cmd) *cmd = xzalloc(sizeof(struct command)+8*sizeof(char *)); | ||
130 | |||
131 | // Parse next argument and add the results to argv[] | ||
132 | end = parse_word(start, cmd); | ||
133 | |||
134 | // If we hit the end of this command, how did it end? | ||
135 | if (!end) { | ||
136 | if (ENABLE_BBSH_PIPES && *start) { | ||
137 | if (*start==';') { | ||
138 | start++; | ||
139 | break; | ||
140 | } | ||
141 | // handle | & < > >> << || && | ||
142 | } | ||
143 | break; | ||
144 | } | ||
145 | start = end; | ||
146 | } | ||
147 | |||
148 | if (ENABLE_BBSH_JOBCTL) line->cmdlinelen = start-cmdline; | ||
149 | |||
150 | return start; | ||
151 | } | ||
152 | |||
153 | // Execute the commands in a pipeline | ||
154 | static int run_pipeline(struct pipeline *line) | ||
155 | { | ||
156 | struct command *cmd = line->cmd; | ||
157 | if (!cmd || !cmd->argc) return 0; | ||
158 | |||
159 | // Handle local commands. This is totally fake and plastic. | ||
160 | if (cmd->argc==2 && !strcmp(cmd->argv[0],"cd")) | ||
161 | chdir(cmd->argv[1]); | ||
162 | else if (!strcmp(cmd->argv[0],"exit")) | ||
163 | exit(cmd->argc>1 ? atoi(cmd->argv[1]) : 0); | ||
164 | else { | ||
165 | int status; | ||
166 | pid_t pid=fork(); | ||
167 | if (!pid) { | ||
168 | run_applet_and_exit(cmd->argv[0],cmd->argc,cmd->argv); | ||
169 | execvp(cmd->argv[0],cmd->argv); | ||
170 | printf("No %s", cmd->argv[0]); | ||
171 | exit(EXIT_FAILURE); | ||
172 | } else waitpid(pid, &status, 0); | ||
173 | } | ||
174 | |||
175 | return 0; | ||
176 | } | ||
177 | |||
178 | static void free_cmd(void *data) | ||
179 | { | ||
180 | struct command *cmd=(struct command *)data; | ||
181 | |||
182 | while (cmd->argc) free(cmd->argv[--cmd->argc]); | ||
183 | } | ||
184 | |||
185 | |||
186 | static void handle(char *command) | ||
187 | { | ||
188 | struct pipeline line; | ||
189 | char *start = command; | ||
190 | |||
191 | for (;;) { | ||
192 | memset(&line,0,sizeof(struct pipeline)); | ||
193 | start = parse_pipeline(start, &line); | ||
194 | if (!line.cmd) break; | ||
195 | |||
196 | run_pipeline(&line); | ||
197 | free_list(line.cmd, free_cmd); | ||
198 | } | ||
199 | } | ||
200 | |||
201 | int bbsh_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||
202 | int bbsh_main(int argc UNUSED_PARAM, char **argv) | ||
203 | { | ||
204 | char *command=NULL; | ||
205 | FILE *f; | ||
206 | |||
207 | getopt32(argv, "c:", &command); | ||
208 | |||
209 | f = argv[optind] ? xfopen_for_read(argv[optind]) : NULL; | ||
210 | if (command) handle(command); | ||
211 | else { | ||
212 | unsigned cmdlen=0; | ||
213 | for (;;) { | ||
214 | if (!f) putchar('$'); | ||
215 | if (1 > getline(&command, &cmdlen, f ? f : stdin)) break; | ||
216 | |||
217 | handle(command); | ||
218 | } | ||
219 | if (ENABLE_FEATURE_CLEAN_UP) free(command); | ||
220 | } | ||
221 | |||
222 | return 1; | ||
223 | } | ||
diff --git a/shell/hush.c b/shell/hush.c index 2afe12fea..81811cbb0 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -102,7 +102,6 @@ | |||
102 | 102 | ||
103 | //applet:IF_HUSH(APPLET(hush, _BB_DIR_BIN, _BB_SUID_DROP)) | 103 | //applet:IF_HUSH(APPLET(hush, _BB_DIR_BIN, _BB_SUID_DROP)) |
104 | //applet:IF_MSH(APPLET(msh, _BB_DIR_BIN, _BB_SUID_DROP)) | 104 | //applet:IF_MSH(APPLET(msh, _BB_DIR_BIN, _BB_SUID_DROP)) |
105 | //applet:IF_LASH(APPLET(lash, _BB_DIR_BIN, _BB_SUID_DROP)) | ||
106 | //applet:IF_FEATURE_SH_IS_HUSH(APPLET_ODDNAME(sh, hush, _BB_DIR_BIN, _BB_SUID_DROP, sh)) | 105 | //applet:IF_FEATURE_SH_IS_HUSH(APPLET_ODDNAME(sh, hush, _BB_DIR_BIN, _BB_SUID_DROP, sh)) |
107 | //applet:IF_FEATURE_BASH_IS_HUSH(APPLET_ODDNAME(bash, hush, _BB_DIR_BIN, _BB_SUID_DROP, bash)) | 106 | //applet:IF_FEATURE_BASH_IS_HUSH(APPLET_ODDNAME(bash, hush, _BB_DIR_BIN, _BB_SUID_DROP, bash)) |
108 | 107 | ||
@@ -223,13 +222,6 @@ | |||
223 | //config: This instructs hush to print commands before execution. | 222 | //config: This instructs hush to print commands before execution. |
224 | //config: Adds ~300 bytes. | 223 | //config: Adds ~300 bytes. |
225 | //config: | 224 | //config: |
226 | //config:config LASH | ||
227 | //config: bool "lash (deprecated: aliased to hush)" | ||
228 | //config: default n | ||
229 | //config: select HUSH | ||
230 | //config: help | ||
231 | //config: lash is deprecated and will be removed, please migrate to hush. | ||
232 | //config: | ||
233 | //config:config MSH | 225 | //config:config MSH |
234 | //config: bool "msh (deprecated: aliased to hush)" | 226 | //config: bool "msh (deprecated: aliased to hush)" |
235 | //config: default n | 227 | //config: default n |
@@ -240,8 +232,6 @@ | |||
240 | 232 | ||
241 | //usage:#define hush_trivial_usage NOUSAGE_STR | 233 | //usage:#define hush_trivial_usage NOUSAGE_STR |
242 | //usage:#define hush_full_usage "" | 234 | //usage:#define hush_full_usage "" |
243 | //usage:#define lash_trivial_usage NOUSAGE_STR | ||
244 | //usage:#define lash_full_usage "" | ||
245 | //usage:#define msh_trivial_usage NOUSAGE_STR | 235 | //usage:#define msh_trivial_usage NOUSAGE_STR |
246 | //usage:#define msh_full_usage "" | 236 | //usage:#define msh_full_usage "" |
247 | 237 | ||
@@ -7732,15 +7722,6 @@ int hush_main(int argc, char **argv) | |||
7732 | } | 7722 | } |
7733 | 7723 | ||
7734 | 7724 | ||
7735 | #if ENABLE_LASH | ||
7736 | int lash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | ||
7737 | int lash_main(int argc, char **argv) | ||
7738 | { | ||
7739 | bb_error_msg("lash is deprecated, please use hush instead"); | ||
7740 | return hush_main(argc, argv); | ||
7741 | } | ||
7742 | #endif | ||
7743 | |||
7744 | #if ENABLE_MSH | 7725 | #if ENABLE_MSH |
7745 | int msh_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 7726 | int msh_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
7746 | int msh_main(int argc, char **argv) | 7727 | int msh_main(int argc, char **argv) |