Run sh commands specified on the host command line.

E.g. make RUN="avar on; ls; avar off; halt"
上级 dca2a740
......@@ -8,6 +8,7 @@ QEMUSRC ?= ../mtrace
MTRACE ?= $(QEMU)
HW ?= qemu
EXCEPTIONS ?= y
RUN ?= $(empty)
O = o.$(HW)
ifdef USE_CLANG
......@@ -97,7 +98,8 @@ $(O)/fs.img: $(O)/tools/mkfs README $(UPROGS)
##
QEMUOPTS = -smp $(QEMUSMP) -m 512 -serial mon:stdio -nographic \
-net user -net nic,model=e1000 \
-redir tcp:2323::23 -redir tcp:8080::80
-redir tcp:2323::23 -redir tcp:8080::80 \
$(if $(RUN),-append "\$$ $(RUN)",)
qemu: $(KERN)
$(QEMU) $(QEMUOPTS) -kernel $(KERN)
......
......@@ -43,6 +43,30 @@ startone(const char **argv)
return pid;
}
static void
runcmdline(void)
{
const char* argv[3] = { "sh", 0, 0 };
char buf[256];
char* b;
long r;
int fd;
fd = open("/dev/cmdline", O_RDONLY);
if (fd < 0)
return;
r = read(fd, buf, sizeof(buf)-1);
if (r < 0)
return;
buf[r] = 0;
if ((b = strchr(buf, '$'))) {
argv[1] = b+1;
startone(argv);
}
}
int
main(void)
{
......@@ -63,6 +87,8 @@ main(void)
for (u32 i = 0; i < NELEM(app_argv); i++)
startone(app_argv[i]);
runcmdline();
for(;;){
pid = startone(sh_argv);
while((wpid=wait()) >= 0 && wpid != pid)
......
......@@ -142,7 +142,7 @@ getcmd(char *buf, int nbuf)
}
int
main(void)
main(int ac, char** av)
{
static char buf[100];
int fd;
......@@ -154,7 +154,30 @@ main(void)
break;
}
}
// If args, concatenate them parse as a command.
if (ac > 1) {
char* b = buf;
char* e = b+sizeof(buf);
for (int i = 1; i < ac; i++) {
int n;
n = strlen(av[i]);
if (b+n+1 > e)
die("sh: too long");
strcpy(b, av[i]);
b += n;
if (b+1+1 > e)
die("sh: too long");
strcpy(b, " ");
b++;
}
if(fork1() == 0)
runcmd(parsecmd(buf));
wait();
exit();
}
// Read and run input commands.
while(getcmd(buf, sizeof(buf)) >= 0){
if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论