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 ...@@ -8,6 +8,7 @@ QEMUSRC ?= ../mtrace
MTRACE ?= $(QEMU) MTRACE ?= $(QEMU)
HW ?= qemu HW ?= qemu
EXCEPTIONS ?= y EXCEPTIONS ?= y
RUN ?= $(empty)
O = o.$(HW) O = o.$(HW)
ifdef USE_CLANG ifdef USE_CLANG
...@@ -97,7 +98,8 @@ $(O)/fs.img: $(O)/tools/mkfs README $(UPROGS) ...@@ -97,7 +98,8 @@ $(O)/fs.img: $(O)/tools/mkfs README $(UPROGS)
## ##
QEMUOPTS = -smp $(QEMUSMP) -m 512 -serial mon:stdio -nographic \ QEMUOPTS = -smp $(QEMUSMP) -m 512 -serial mon:stdio -nographic \
-net user -net nic,model=e1000 \ -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: $(KERN)
$(QEMU) $(QEMUOPTS) -kernel $(KERN) $(QEMU) $(QEMUOPTS) -kernel $(KERN)
......
...@@ -43,6 +43,30 @@ startone(const char **argv) ...@@ -43,6 +43,30 @@ startone(const char **argv)
return pid; 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 int
main(void) main(void)
{ {
...@@ -63,6 +87,8 @@ main(void) ...@@ -63,6 +87,8 @@ main(void)
for (u32 i = 0; i < NELEM(app_argv); i++) for (u32 i = 0; i < NELEM(app_argv); i++)
startone(app_argv[i]); startone(app_argv[i]);
runcmdline();
for(;;){ for(;;){
pid = startone(sh_argv); pid = startone(sh_argv);
while((wpid=wait()) >= 0 && wpid != pid) while((wpid=wait()) >= 0 && wpid != pid)
......
...@@ -142,7 +142,7 @@ getcmd(char *buf, int nbuf) ...@@ -142,7 +142,7 @@ getcmd(char *buf, int nbuf)
} }
int int
main(void) main(int ac, char** av)
{ {
static char buf[100]; static char buf[100];
int fd; int fd;
...@@ -154,7 +154,30 @@ main(void) ...@@ -154,7 +154,30 @@ main(void)
break; 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. // Read and run input commands.
while(getcmd(buf, sizeof(buf)) >= 0){ while(getcmd(buf, sizeof(buf)) >= 0){
if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){ if(buf[0] == 'c' && buf[1] == 'd' && buf[2] == ' '){
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论