summaryrefslogtreecommitdiff
path: root/syscall.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 /syscall.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 'syscall.c')
-rw-r--r--syscall.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/syscall.c b/syscall.c
index 0a017c7..31b6189 100644
--- a/syscall.c
+++ b/syscall.c
@@ -309,7 +309,8 @@ sys_mkdir(void)
return -1;
nip = mknod (cp->mem + arg0, T_DIR, 0, 0);
-
+
+ memset (de.name, '\0', DIRSIZ);
de.name[0] = '.';
de.inum = nip->inum;
writei (nip, (char *) &de, 0, sizeof(de));
@@ -324,6 +325,43 @@ sys_mkdir(void)
return (nip == 0) ? -1 : 0;
}
+
+int
+sys_chdir(void)
+{
+ struct proc *cp = curproc[cpu()];
+ struct inode *ip;
+ uint arg0;
+ int l;
+
+ if(fetcharg(0, &arg0) < 0)
+ return -1;
+
+ if((l = checkstring(arg0)) < 0)
+ return -1;
+
+ if(l >= DIRSIZ)
+ return -1;
+
+ if ((ip = namei(cp->mem + arg0, NAMEI_LOOKUP, 0)) == 0)
+ return -1;
+
+ if (ip == cp->cwd) {
+ iput (ip);
+ return 0;
+ }
+
+ if (ip->type != T_DIR) {
+ iput(ip);
+ return 0;
+ }
+
+ idecref(cp->cwd);
+ cp->cwd = ip;
+ iunlock(cp->cwd);
+ return 0;
+}
+
int
sys_unlink(void)
{
@@ -599,6 +637,9 @@ syscall(void)
case SYS_mkdir:
ret = sys_mkdir();
break;
+ case SYS_chdir:
+ ret = sys_chdir();
+ break;
default:
cprintf("unknown sys call %d\n", num);
// XXX fault