summaryrefslogtreecommitdiff
path: root/sh.c
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-08-19 23:41:34 +0000
committerkaashoek <kaashoek>2006-08-19 23:41:34 +0000
commit8787cd01dfa6080d219f3dd7bbf03f3eb988a74e (patch)
tree7b1d86071a74d01013995508be4c5a267d0f23e2 /sh.c
parentceb0e427962d0656e672955585c04093b9efda90 (diff)
downloadxv6-labs-8787cd01dfa6080d219f3dd7bbf03f3eb988a74e.tar.gz
xv6-labs-8787cd01dfa6080d219f3dd7bbf03f3eb988a74e.tar.bz2
xv6-labs-8787cd01dfa6080d219f3dd7bbf03f3eb988a74e.zip
chdir
cd in shell nits in mkdir, ls, etc.
Diffstat (limited to 'sh.c')
-rw-r--r--sh.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/sh.c b/sh.c
index e2b8959..9e0cb3f 100644
--- a/sh.c
+++ b/sh.c
@@ -15,15 +15,20 @@ main(void)
while(1){
puts("$ ");
+ memset (buf, '\0', sizeof(buf));
gets(buf, sizeof(buf));
if(buf[0] == '\0')
continue;
pid = fork();
if(pid == 0){
parse(buf);
- exec(buf, args);
- printf(1, "%s: not found\n", buf);
- exit();
+ if (buf[0] == 'c' && buf[1] == 'd' && buf[2] == '\0') { // cd
+ chdir(&buf[3]);
+ } else {
+ exec(buf, args);
+ printf(1, "%s: not found\n", buf);
+ exit();
+ }
}
if(pid > 0)
wait();
@@ -39,11 +44,12 @@ parse(char buf[])
for (i = 0; buf[i] != '\0'; i++) {
if (buf[i] == ' ') {
buf[i] = '\0';
- args[j++] = buf + i+1;
+ args[j++] = buf + i + 1;
if (j >= 100) {
printf(2, "too many args\n");
exit();
}
}
}
+ args[j] = '\0';
}