#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; }