aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Kraai <kraai@debian.org>2000-09-06 01:46:18 +0000
committerMatt Kraai <kraai@debian.org>2000-09-06 01:46:18 +0000
commit6085c72b6ee92d69642a85b6f5d2dff239c5b1c1 (patch)
tree6ad444d5f11a33d7f74104511c37438775dfb424
parent9dd79791c89979caa40c14250b27016721b44b13 (diff)
downloadbusybox-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.c24
-rw-r--r--sh.c24
-rw-r--r--shell/lash.c24
3 files changed, 21 insertions, 51 deletions
diff --git a/lash.c b/lash.c
index 50e4368db..5a2547368 100644
--- a/lash.c
+++ b/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':
diff --git a/sh.c b/sh.c
index 50e4368db..5a2547368 100644
--- a/sh.c
+++ b/sh.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':
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':