mirror of
https://github.com/SmallPond/MIT6.828_OS.git
synced 2026-04-28 21:01:11 +08:00
my solution to lab5
This commit is contained in:
85
lab/user/testshell.c
Normal file
85
lab/user/testshell.c
Normal file
@@ -0,0 +1,85 @@
|
||||
#include <inc/x86.h>
|
||||
#include <inc/lib.h>
|
||||
|
||||
void wrong(int, int, int);
|
||||
|
||||
void
|
||||
umain(int argc, char **argv)
|
||||
{
|
||||
char c1, c2;
|
||||
int r, rfd, wfd, kfd, n1, n2, off, nloff;
|
||||
int pfds[2];
|
||||
|
||||
close(0);
|
||||
close(1);
|
||||
opencons();
|
||||
opencons();
|
||||
|
||||
if ((rfd = open("testshell.sh", O_RDONLY)) < 0)
|
||||
panic("open testshell.sh: %e", rfd);
|
||||
if ((wfd = pipe(pfds)) < 0)
|
||||
panic("pipe: %e", wfd);
|
||||
wfd = pfds[1];
|
||||
|
||||
cprintf("running sh -x < testshell.sh | cat\n");
|
||||
if ((r = fork()) < 0)
|
||||
panic("fork: %e", r);
|
||||
if (r == 0) {
|
||||
dup(rfd, 0);
|
||||
dup(wfd, 1);
|
||||
close(rfd);
|
||||
close(wfd);
|
||||
if ((r = spawnl("/sh", "sh", "-x", 0)) < 0)
|
||||
panic("spawn: %e", r);
|
||||
close(0);
|
||||
close(1);
|
||||
wait(r);
|
||||
exit();
|
||||
}
|
||||
close(rfd);
|
||||
close(wfd);
|
||||
|
||||
rfd = pfds[0];
|
||||
if ((kfd = open("testshell.key", O_RDONLY)) < 0)
|
||||
panic("open testshell.key for reading: %e", kfd);
|
||||
|
||||
nloff = 0;
|
||||
for (off=0;; off++) {
|
||||
n1 = read(rfd, &c1, 1);
|
||||
n2 = read(kfd, &c2, 1);
|
||||
if (n1 < 0)
|
||||
panic("reading testshell.out: %e", n1);
|
||||
if (n2 < 0)
|
||||
panic("reading testshell.key: %e", n2);
|
||||
if (n1 == 0 && n2 == 0)
|
||||
break;
|
||||
if (n1 != 1 || n2 != 1 || c1 != c2)
|
||||
wrong(rfd, kfd, nloff);
|
||||
if (c1 == '\n')
|
||||
nloff = off+1;
|
||||
}
|
||||
cprintf("shell ran correctly\n");
|
||||
|
||||
breakpoint();
|
||||
}
|
||||
|
||||
void
|
||||
wrong(int rfd, int kfd, int off)
|
||||
{
|
||||
char buf[100];
|
||||
int n;
|
||||
|
||||
seek(rfd, off);
|
||||
seek(kfd, off);
|
||||
|
||||
cprintf("shell produced incorrect output.\n");
|
||||
cprintf("expected:\n===\n");
|
||||
while ((n = read(kfd, buf, sizeof buf-1)) > 0)
|
||||
sys_cputs(buf, n);
|
||||
cprintf("===\ngot:\n===\n");
|
||||
while ((n = read(rfd, buf, sizeof buf-1)) > 0)
|
||||
sys_cputs(buf, n);
|
||||
cprintf("===\n");
|
||||
exit();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user