summaryrefslogtreecommitdiff
path: root/sh.c
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-09-07 03:16:15 +0000
committerkaashoek <kaashoek>2006-09-07 03:16:15 +0000
commit44e6909a6d33689cefb283ecb91dfe1d874f8e0b (patch)
tree296c91f8fec3bc5f2a569ffc1b88bd82e0c7155c /sh.c
parente00baa9f5d15d745a26cbb0a9ae54e3ea4fb9696 (diff)
downloadxv6-labs-44e6909a6d33689cefb283ecb91dfe1d874f8e0b.tar.gz
xv6-labs-44e6909a6d33689cefb283ecb91dfe1d874f8e0b.tar.bz2
xv6-labs-44e6909a6d33689cefb283ecb91dfe1d874f8e0b.zip
more simplifying
Diffstat (limited to 'sh.c')
-rw-r--r--sh.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/sh.c b/sh.c
index 2a418bb..4a43b27 100644
--- a/sh.c
+++ b/sh.c
@@ -6,7 +6,7 @@
#define BUFSIZ 512
#define MAXARGS 10
-#define MAXNODE 2
+#define MAXIO 2
#define MAXCMD 2
// an embarrassingly naive shell
@@ -22,7 +22,7 @@ struct cmd {
char argv0buf[BUFSIZ];
int argc;
int token;
- struct ionode iolist[MAXNODE];
+ struct ionode iolist[MAXIO];
struct ionode *io;
};
struct cmd cmdlist[MAXCMD];
@@ -75,30 +75,28 @@ parse(char *s)
cmd->argv[cmd->argc++] = t;
break;
- case '<': // Input redirection
+ case '>': // Input and output redirection
+ case '<':
// Grab the filename from the argument list
if(gettoken(0, &t) != 'w') {
- printf(2, "syntax error: < not followed by word\n");
+ printf(2, "syntax error: > not followed by word\n");
return -1;
}
- cmd->io->token = '<';
- cmd->io->s = t;
- cmd->io++;
- break;
-
- case '>': // Output redirection
- // Grab the filename from the argument list
- if(gettoken(0, &t) != 'w') {
- printf(2, "syntax error: > not followed by word\n");
+ if(cmd->io - cmd->iolist >= MAXIO) {
+ printf(2, "too many redirections\n");
return -1;
}
- cmd->io->token = '>';
+ cmd->io->token = c;
cmd->io->s = t;
cmd->io++;
break;
case ';': // command sequence
case '|': // pipe
+ if(cmd->io - cmd->iolist >= MAXIO) {
+ printf(2, "too many redirections\n");
+ return -1;
+ }
cmd->token = c;
cmd++;
break;
@@ -114,7 +112,6 @@ parse(char *s)
}
}
-
void
runcmd(void)
{