Reset optind so that getopt works in busybox applets called directly by sh.
Change the behavior of -c to correctly handle $1..$9.
This commit is contained in:
parent
9dd79791c8
commit
6085c72b6e
24
lash.c
24
lash.c
@ -1193,6 +1193,7 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int
|
|||||||
char** argv=newJob->progs[i].argv;
|
char** argv=newJob->progs[i].argv;
|
||||||
for(argc_l=0;*argv!=NULL; argv++, argc_l++);
|
for(argc_l=0;*argv!=NULL; argv++, argc_l++);
|
||||||
applet_name=a->name;
|
applet_name=a->name;
|
||||||
|
optind = 1;
|
||||||
exit((*(a->main)) (argc_l, newJob->progs[i].argv));
|
exit((*(a->main)) (argc_l, newJob->progs[i].argv));
|
||||||
}
|
}
|
||||||
a++;
|
a++;
|
||||||
@ -1393,26 +1394,15 @@ int shell_main(int argc_l, char **argv_l)
|
|||||||
// builtin_source("/etc/profile");
|
// builtin_source("/etc/profile");
|
||||||
//}
|
//}
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "cx")) > 0) {
|
while ((opt = getopt(argc_l, argv_l, "cx")) > 0) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'c':
|
case 'c':
|
||||||
input = NULL;
|
input = NULL;
|
||||||
local_pending_command = (char *) calloc(BUFSIZ, sizeof(char));
|
if (local_pending_command != 0)
|
||||||
if (local_pending_command == 0) {
|
fatalError("multiple -c arguments\n");
|
||||||
fatalError("sh: out of memory\n");
|
local_pending_command = xstrdup(argv[optind]);
|
||||||
}
|
optind++;
|
||||||
for(; optind<argc; optind++)
|
argv = argv+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, " ");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#ifdef BB_FEATURE_SH_ENVIRONMENT
|
#ifdef BB_FEATURE_SH_ENVIRONMENT
|
||||||
case 'x':
|
case 'x':
|
||||||
|
24
sh.c
24
sh.c
@ -1193,6 +1193,7 @@ static int runCommand(struct job *newJob, struct jobSet *jobList, int inBg, int
|
|||||||
char** argv=newJob->progs[i].argv;
|
char** argv=newJob->progs[i].argv;
|
||||||
for(argc_l=0;*argv!=NULL; argv++, argc_l++);
|
for(argc_l=0;*argv!=NULL; argv++, argc_l++);
|
||||||
applet_name=a->name;
|
applet_name=a->name;
|
||||||
|
optind = 1;
|
||||||
exit((*(a->main)) (argc_l, newJob->progs[i].argv));
|
exit((*(a->main)) (argc_l, newJob->progs[i].argv));
|
||||||
}
|
}
|
||||||
a++;
|
a++;
|
||||||
@ -1393,26 +1394,15 @@ int shell_main(int argc_l, char **argv_l)
|
|||||||
// builtin_source("/etc/profile");
|
// builtin_source("/etc/profile");
|
||||||
//}
|
//}
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "cx")) > 0) {
|
while ((opt = getopt(argc_l, argv_l, "cx")) > 0) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'c':
|
case 'c':
|
||||||
input = NULL;
|
input = NULL;
|
||||||
local_pending_command = (char *) calloc(BUFSIZ, sizeof(char));
|
if (local_pending_command != 0)
|
||||||
if (local_pending_command == 0) {
|
fatalError("multiple -c arguments\n");
|
||||||
fatalError("sh: out of memory\n");
|
local_pending_command = xstrdup(argv[optind]);
|
||||||
}
|
optind++;
|
||||||
for(; optind<argc; optind++)
|
argv = argv+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, " ");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#ifdef BB_FEATURE_SH_ENVIRONMENT
|
#ifdef BB_FEATURE_SH_ENVIRONMENT
|
||||||
case 'x':
|
case 'x':
|
||||||
|
24
shell/lash.c
24
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;
|
char** argv=newJob->progs[i].argv;
|
||||||
for(argc_l=0;*argv!=NULL; argv++, argc_l++);
|
for(argc_l=0;*argv!=NULL; argv++, argc_l++);
|
||||||
applet_name=a->name;
|
applet_name=a->name;
|
||||||
|
optind = 1;
|
||||||
exit((*(a->main)) (argc_l, newJob->progs[i].argv));
|
exit((*(a->main)) (argc_l, newJob->progs[i].argv));
|
||||||
}
|
}
|
||||||
a++;
|
a++;
|
||||||
@ -1393,26 +1394,15 @@ int shell_main(int argc_l, char **argv_l)
|
|||||||
// builtin_source("/etc/profile");
|
// builtin_source("/etc/profile");
|
||||||
//}
|
//}
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "cx")) > 0) {
|
while ((opt = getopt(argc_l, argv_l, "cx")) > 0) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'c':
|
case 'c':
|
||||||
input = NULL;
|
input = NULL;
|
||||||
local_pending_command = (char *) calloc(BUFSIZ, sizeof(char));
|
if (local_pending_command != 0)
|
||||||
if (local_pending_command == 0) {
|
fatalError("multiple -c arguments\n");
|
||||||
fatalError("sh: out of memory\n");
|
local_pending_command = xstrdup(argv[optind]);
|
||||||
}
|
optind++;
|
||||||
for(; optind<argc; optind++)
|
argv = argv+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, " ");
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
#ifdef BB_FEATURE_SH_ENVIRONMENT
|
#ifdef BB_FEATURE_SH_ENVIRONMENT
|
||||||
case 'x':
|
case 'x':
|
||||||
|
Loading…
Reference in New Issue
Block a user