summaryrefslogtreecommitdiff
path: root/sh.c
diff options
context:
space:
mode:
authorMatt Kraai2000-09-06 01:46:18 +0000
committerMatt Kraai2000-09-06 01:46:18 +0000
commit6085c72b6ee92d69642a85b6f5d2dff239c5b1c1 (patch)
tree6ad444d5f11a33d7f74104511c37438775dfb424 /sh.c
parent9dd79791c89979caa40c14250b27016721b44b13 (diff)
downloadbusybox-6085c72b6ee92d69642a85b6f5d2dff239c5b1c1.zip
busybox-6085c72b6ee92d69642a85b6f5d2dff239c5b1c1.tar.gz
Reset optind so that getopt works in busybox applets called directly by sh.
Change the behavior of -c to correctly handle $1..$9.
Diffstat (limited to 'sh.c')
-rw-r--r--sh.c24
1 files changed, 7 insertions, 17 deletions
diff --git a/sh.c b/sh.c
index 50e4368..5a25473 100644
--- a/sh.c
+++ b/sh.c
@@ -1193,6 +1193,7 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int
char** argv=newJob->progs[i].argv;
for(argc_l=0;*argv!=NULL; argv++, argc_l++);
applet_name=a->name;
+ optind = 1;
exit((*(a->main)) (argc_l, newJob->progs[i].argv));
}
a++;
@@ -1393,26 +1394,15 @@ int shell_main(int argc_l, char **argv_l)
// builtin_source("/etc/profile");
//}
- while ((opt = getopt(argc, argv, "cx")) > 0) {
+ while ((opt = getopt(argc_l, argv_l, "cx")) > 0) {
switch (opt) {
case 'c':
input = NULL;
- local_pending_command = (char *) calloc(BUFSIZ, sizeof(char));
- if (local_pending_command == 0) {
- fatalError("sh: out of memory\n");
- }
- for(; optind<argc; optind++)
- {
- if (strlen(local_pending_command) + strlen(argv[optind]) >= BUFSIZ) {
- local_pending_command = realloc(local_pending_command,
- strlen(local_pending_command) + strlen(argv[optind]));
- if (local_pending_command==NULL)
- fatalError("command too long\n");
- }
- strcat(local_pending_command, argv[optind]);
- if ( (optind + 1) < argc)
- strcat(local_pending_command, " ");
- }
+ if (local_pending_command != 0)
+ fatalError("multiple -c arguments\n");
+ local_pending_command = xstrdup(argv[optind]);
+ optind++;
+ argv = argv+optind;
break;
#ifdef BB_FEATURE_SH_ENVIRONMENT
case 'x':