From 8787cd01dfa6080d219f3dd7bbf03f3eb988a74e Mon Sep 17 00:00:00 2001 From: kaashoek Date: Sat, 19 Aug 2006 23:41:34 +0000 Subject: chdir cd in shell nits in mkdir, ls, etc. --- syscall.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) (limited to 'syscall.c') 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 -- cgit v1.2.3