diff --git a/getdents.c b/getdents.c new file mode 100644 index 0000000..de118a1 --- /dev/null +++ b/getdents.c @@ -0,0 +1,96 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +struct linux_dirent { + long d_ino; + off_t d_off; + unsigned short d_reclen; + char d_name[14]; +}; + +int sys_getdents(unsigned int fd, struct linux_dirent *d, unsigned int count) +{ + struct file *f; + struct m_inode * m; + struct buffer_head * b; + struct dir_entry * dir; + int i,j,k,res; + struct linux_dirent usrd; + i=0; + res=0; + f=current->filp[fd]; + m=f->f_inode; + b=bread(m->i_dev,m->i_zone[0]); + dir=(struct dir_entry*)b->b_data; + while(dir[i].inode>0) + { + if(res+sizeof(struct linux_dirent)>count) + break; + usrd.d_ino=dir[i].inode; + usrd.d_off=0; + usrd.d_reclen=sizeof(struct linux_dirent); + for(j=0;j<14;j++) + usrd.d_name[j]=dir[i].name[j]; + for(k=0;kroot->i_dev; + inode=current->pwd; + inum=inode->i_num; + b=bread(dev,inode->i_zone[0]); + d=(struct dir_entry*) b->b_data; + i=0; + l=0; + while(inum!=1) + { + inode=iget(dev, d[1].inode); + b=bread(dev,inode->i_zone[0]); + d=(struct dir_entry*) b->b_data; + j=0; + while(d[j].inode!=inum) j++; + inum=inode->i_num; + path[i]=d[j].name; + i++; + } + while(i>0) + { + i--; + put_fs_byte('/',buf+l); + l++; + k=0; + while(path[i][k]!='\0') + { + put_fs_byte(path[i][k],buf+l); + l++; + if(l>=size) break; + k++; + } + if(l>=size) break; + } + return buf; +} + + +