#define BUFSIZ 512
#define MAXARGS 10
-#define MAXNODE 2
+#define MAXIO 2
#define MAXCMD 2
// an embarrassingly naive shell
char argv0buf[BUFSIZ];
int argc;
int token;
- struct ionode iolist[MAXNODE];
+ struct ionode iolist[MAXIO];
struct ionode *io;
};
struct cmd cmdlist[MAXCMD];
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;
}
}
-
void
runcmd(void)
{