diff options
author | Matt Kraai <kraai@debian.org> | 2000-09-06 01:46:18 +0000 |
---|---|---|
committer | Matt Kraai <kraai@debian.org> | 2000-09-06 01:46:18 +0000 |
commit | 6085c72b6ee92d69642a85b6f5d2dff239c5b1c1 (patch) | |
tree | 6ad444d5f11a33d7f74104511c37438775dfb424 | |
parent | 9dd79791c89979caa40c14250b27016721b44b13 (diff) | |
download | busybox-w32-6085c72b6ee92d69642a85b6f5d2dff239c5b1c1.tar.gz busybox-w32-6085c72b6ee92d69642a85b6f5d2dff239c5b1c1.tar.bz2 busybox-w32-6085c72b6ee92d69642a85b6f5d2dff239c5b1c1.zip |
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 | |||
1193 | char** argv=newJob->progs[i].argv; | 1193 | char** argv=newJob->progs[i].argv; |
1194 | for(argc_l=0;*argv!=NULL; argv++, argc_l++); | 1194 | for(argc_l=0;*argv!=NULL; argv++, argc_l++); |
1195 | applet_name=a->name; | 1195 | applet_name=a->name; |
1196 | optind = 1; | ||
1196 | exit((*(a->main)) (argc_l, newJob->progs[i].argv)); | 1197 | exit((*(a->main)) (argc_l, newJob->progs[i].argv)); |
1197 | } | 1198 | } |
1198 | a++; | 1199 | a++; |
@@ -1393,26 +1394,15 @@ int shell_main(int argc_l, char **argv_l) | |||
1393 | // builtin_source("/etc/profile"); | 1394 | // builtin_source("/etc/profile"); |
1394 | //} | 1395 | //} |
1395 | 1396 | ||
1396 | while ((opt = getopt(argc, argv, "cx")) > 0) { | 1397 | while ((opt = getopt(argc_l, argv_l, "cx")) > 0) { |
1397 | switch (opt) { | 1398 | switch (opt) { |
1398 | case 'c': | 1399 | case 'c': |
1399 | input = NULL; | 1400 | input = NULL; |
1400 | local_pending_command = (char *) calloc(BUFSIZ, sizeof(char)); | 1401 | if (local_pending_command != 0) |
1401 | if (local_pending_command == 0) { | 1402 | fatalError("multiple -c arguments\n"); |
1402 | fatalError("sh: out of memory\n"); | 1403 | local_pending_command = xstrdup(argv[optind]); |
1403 | } | 1404 | optind++; |
1404 | for(; optind<argc; optind++) | 1405 | argv = argv+optind; |
1405 | { | ||
1406 | if (strlen(local_pending_command) + strlen(argv[optind]) >= BUFSIZ) { | ||
1407 | local_pending_command = realloc(local_pending_command, | ||
1408 | strlen(local_pending_command) + strlen(argv[optind])); | ||
1409 | if (local_pending_command==NULL) | ||
1410 | fatalError("command too long\n"); | ||
1411 | } | ||
1412 | strcat(local_pending_command, argv[optind]); | ||
1413 | if ( (optind + 1) < argc) | ||
1414 | strcat(local_pending_command, " "); | ||
1415 | } | ||
1416 | break; | 1406 | break; |
1417 | #ifdef BB_FEATURE_SH_ENVIRONMENT | 1407 | #ifdef BB_FEATURE_SH_ENVIRONMENT |
1418 | case 'x': | 1408 | case 'x': |
@@ -1193,6 +1193,7 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int | |||
1193 | char** argv=newJob->progs[i].argv; | 1193 | char** argv=newJob->progs[i].argv; |
1194 | for(argc_l=0;*argv!=NULL; argv++, argc_l++); | 1194 | for(argc_l=0;*argv!=NULL; argv++, argc_l++); |
1195 | applet_name=a->name; | 1195 | applet_name=a->name; |
1196 | optind = 1; | ||
1196 | exit((*(a->main)) (argc_l, newJob->progs[i].argv)); | 1197 | exit((*(a->main)) (argc_l, newJob->progs[i].argv)); |
1197 | } | 1198 | } |
1198 | a++; | 1199 | a++; |
@@ -1393,26 +1394,15 @@ int shell_main(int argc_l, char **argv_l) | |||
1393 | // builtin_source("/etc/profile"); | 1394 | // builtin_source("/etc/profile"); |
1394 | //} | 1395 | //} |
1395 | 1396 | ||
1396 | while ((opt = getopt(argc, argv, "cx")) > 0) { | 1397 | while ((opt = getopt(argc_l, argv_l, "cx")) > 0) { |
1397 | switch (opt) { | 1398 | switch (opt) { |
1398 | case 'c': | 1399 | case 'c': |
1399 | input = NULL; | 1400 | input = NULL; |
1400 | local_pending_command = (char *) calloc(BUFSIZ, sizeof(char)); | 1401 | if (local_pending_command != 0) |
1401 | if (local_pending_command == 0) { | 1402 | fatalError("multiple -c arguments\n"); |
1402 | fatalError("sh: out of memory\n"); | 1403 | local_pending_command = xstrdup(argv[optind]); |
1403 | } | 1404 | optind++; |
1404 | for(; optind<argc; optind++) | 1405 | argv = argv+optind; |
1405 | { | ||
1406 | if (strlen(local_pending_command) + strlen(argv[optind]) >= BUFSIZ) { | ||
1407 | local_pending_command = realloc(local_pending_command, | ||
1408 | strlen(local_pending_command) + strlen(argv[optind])); | ||
1409 | if (local_pending_command==NULL) | ||
1410 | fatalError("command too long\n"); | ||
1411 | } | ||
1412 | strcat(local_pending_command, argv[optind]); | ||
1413 | if ( (optind + 1) < argc) | ||
1414 | strcat(local_pending_command, " "); | ||
1415 | } | ||
1416 | break; | 1406 | break; |
1417 | #ifdef BB_FEATURE_SH_ENVIRONMENT | 1407 | #ifdef BB_FEATURE_SH_ENVIRONMENT |
1418 | case 'x': | 1408 | 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 | |||
1193 | char** argv=newJob->progs[i].argv; | 1193 | char** argv=newJob->progs[i].argv; |
1194 | for(argc_l=0;*argv!=NULL; argv++, argc_l++); | 1194 | for(argc_l=0;*argv!=NULL; argv++, argc_l++); |
1195 | applet_name=a->name; | 1195 | applet_name=a->name; |
1196 | optind = 1; | ||
1196 | exit((*(a->main)) (argc_l, newJob->progs[i].argv)); | 1197 | exit((*(a->main)) (argc_l, newJob->progs[i].argv)); |
1197 | } | 1198 | } |
1198 | a++; | 1199 | a++; |
@@ -1393,26 +1394,15 @@ int shell_main(int argc_l, char **argv_l) | |||
1393 | // builtin_source("/etc/profile"); | 1394 | // builtin_source("/etc/profile"); |
1394 | //} | 1395 | //} |
1395 | 1396 | ||
1396 | while ((opt = getopt(argc, argv, "cx")) > 0) { | 1397 | while ((opt = getopt(argc_l, argv_l, "cx")) > 0) { |
1397 | switch (opt) { | 1398 | switch (opt) { |
1398 | case 'c': | 1399 | case 'c': |
1399 | input = NULL; | 1400 | input = NULL; |
1400 | local_pending_command = (char *) calloc(BUFSIZ, sizeof(char)); | 1401 | if (local_pending_command != 0) |
1401 | if (local_pending_command == 0) { | 1402 | fatalError("multiple -c arguments\n"); |
1402 | fatalError("sh: out of memory\n"); | 1403 | local_pending_command = xstrdup(argv[optind]); |
1403 | } | 1404 | optind++; |
1404 | for(; optind<argc; optind++) | 1405 | argv = argv+optind; |
1405 | { | ||
1406 | if (strlen(local_pending_command) + strlen(argv[optind]) >= BUFSIZ) { | ||
1407 | local_pending_command = realloc(local_pending_command, | ||
1408 | strlen(local_pending_command) + strlen(argv[optind])); | ||
1409 | if (local_pending_command==NULL) | ||
1410 | fatalError("command too long\n"); | ||
1411 | } | ||
1412 | strcat(local_pending_command, argv[optind]); | ||
1413 | if ( (optind + 1) < argc) | ||
1414 | strcat(local_pending_command, " "); | ||
1415 | } | ||
1416 | break; | 1406 | break; |
1417 | #ifdef BB_FEATURE_SH_ENVIRONMENT | 1407 | #ifdef BB_FEATURE_SH_ENVIRONMENT |
1418 | case 'x': | 1408 | case 'x': |