diff options
author | Matt Kraai <kraai@debian.org> | 2000-09-06 05:46:18 +0400 |
---|---|---|
committer | Matt Kraai <kraai@debian.org> | 2000-09-06 05:46:18 +0400 |
commit | 6085c72b6ee92d69642a85b6f5d2dff239c5b1c1 (patch) | |
tree | 6ad444d5f11a33d7f74104511c37438775dfb424 | |
parent | 9dd79791c89979caa40c14250b27016721b44b13 (diff) |
Reset optind so that getopt works in busybox applets called directly by sh.
Change the behavior of -c to correctly handle $1..$9.
-rw-r--r-- | lash.c | 24 | ||||
-rw-r--r-- | sh.c | 24 | ||||
-rw-r--r-- | shell/lash.c | 24 |
3 files changed, 21 insertions, 51 deletions
@@ -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': @@ -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': diff --git a/shell/lash.c b/shell/lash.c index 50e4368db..5a2547368 100644 --- a/shell/lash.c +++ b/shell/lash.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': |