diff --git a/fs/namei.c b/fs/namei.c index b95da94a6e33c4347fea80d443b8d15911a54cf1..e160a2cc6918c167d63bbbcacb9aaf37a256060f 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -236,6 +236,40 @@ int open_namei(const char * pathname, int flag, int mode, return 0; } +struct m_inode * _namei(const char * pathname, struct m_inode * base, + int follow_links) { + const char * basename; + int inr,namelen; + struct m_inode * inode; + struct buffer_head * bh; + struct dir_entry * de; + + if (!(base = dir_namei(pathname,&namelen,&basename,base))) + return NULL; + + if (!namelen) + return base; + + bh = find_entry(&base,basename,namelen,&de); + if (!bh) { + iput(base); + return NULL; + } + + inr = de->inode; + brelse(bh); + if (!(inode = iget(base->i_dev,inr))) { + iput(base); + return NULL; + } + + return inode; +} + +struct m_inode * namei(const char * pathname) { + return _namei(pathname,NULL,1); +} + int sys_mkdir(const char * pathname, int mode) { const char * basename; int namelen; diff --git a/fs/open.c b/fs/open.c index 45ef7621f8bcd481701d4f672afc0bf5afdc7b95..0199bc240c4ffc91adb7a9a2ff5e77ddefc68185 100644 --- a/fs/open.c +++ b/fs/open.c @@ -9,6 +9,21 @@ #include +int sys_chdir(const char * filename) { + struct m_inode * inode; + if (!(inode = namei(filename))) + return -ENOENT; + + if (!S_ISDIR(inode->i_mode)) { + iput(inode); + return -ENOTDIR; + } + + iput(current->pwd); + current->pwd = inode; + return (0); +} + int sys_open(const char * filename,int flag,int mode) { struct m_inode * inode; struct file * f; @@ -55,7 +70,7 @@ int sys_fstat() { int entries; struct buffer_head * bh; struct dir_entry * de; - struct m_inode* inode = current->root; + struct m_inode* inode = current->pwd; if (S_ISDIR(inode->i_mode)) { entries = inode->i_size / (sizeof (struct dir_entry)); diff --git a/include/linux/sys.h b/include/linux/sys.h index 052c2f59a5beb6eebf265cb70d7cd962e794e2f4..36f5fd9c4bd7439c380e56352f0bed979b55ec8e 100644 --- a/include/linux/sys.h +++ b/include/linux/sys.h @@ -10,7 +10,7 @@ extern int sys_open(); //extern int sys_link(); //extern int sys_unlink(); //extern int sys_execve(); -//extern int sys_chdir(); +extern int sys_chdir(); //extern int sys_time(); //extern int sys_mknod(); //extern int sys_chmod(); @@ -34,7 +34,7 @@ extern int sys_fstat(); //extern int sys_access(); //extern int sys_nice(); //extern int sys_ftime(); -//extern int sys_sync(); +extern int sys_sync(); //extern int sys_kill(); //extern int sys_rename(); extern int sys_mkdir(); @@ -100,7 +100,7 @@ fn_ptr sys_call_table[] = { 0, //sys_unlink, 0, //sys_execve, - 0, //sys_chdir, + sys_chdir, 0, //sys_time, 0, //sys_mknod, 0, //sys_chmod, @@ -128,7 +128,7 @@ fn_ptr sys_call_table[] = { 0, //sys_nice, 0, //sys_ftime, - 0, //sys_sync, + sys_sync, 0, //sys_kill, 0, //sys_rename, sys_mkdir, diff --git a/kernel/blk_drv/floppy.c b/kernel/blk_drv/floppy.c index 4786c69892de3fea26a44bf9ef481d9dbd966cf7..8a11b10f6866ea2b971832dd74b27988d970ba42 100644 --- a/kernel/blk_drv/floppy.c +++ b/kernel/blk_drv/floppy.c @@ -199,10 +199,10 @@ void unexpected_floppy_interrupt() { output_byte(FD_SENSEI); int res = result(); printk("unexpected floppy interrupt %d, %d\n", res, ST0); - if (res != 2 || (ST0 & 0xE0) == 0x60) + //if (res != 2 || (ST0 & 0xE0) == 0x60) reset = 1; - else - recalibrate = 1; + //else + // recalibrate = 1; } void transfer() { diff --git a/kernel/main.c b/kernel/main.c index 718db9d3314f6e97da57b024e5b6d7ba9d54e842..90b9e787dac2631f3697c7e570bfcaee814f5c84 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -119,6 +119,9 @@ void init() { else if (strcmp(a, "rm") == 0) { printf("%d\n", rmdir("/hinusDocs")); } + else if (strcmp(a, "ch") == 0) { + chdir("/bin/"); + } else if (strcmp(a, "ls") == 0) { fstat(); } diff --git a/lib/write.c b/lib/write.c index c5bb1f99b51d21f00b7b880f3186b25ece5c9d55..cbade07acd4be9ce1fb888165f5c12f54ac50c8b 100644 --- a/lib/write.c +++ b/lib/write.c @@ -6,4 +6,5 @@ _syscall3(int,read,int,fd,const char *,buf,off_t,count) _syscall0(int, fstat) _syscall2(int, mkdir, const char *, pathname, mode_t, mode) _syscall1(int, rmdir, const char *, pathname) +_syscall1(int, chdir, const char *, filename)