#include #include #include #include #include struct linux_dirent { long d_ino; off_t d_off; unsigned short d_reclen; char d_name[]; }; int sys_getdents(unsigned int fd, struct linux_dirent * dirp, unsigned int count) { int i, size, n; struct file * f = current->filp[fd]; struct m_inode * in = f->f_inode; struct buffer_head * bh = bread(in->i_dev, in->i_zone[0]); struct dir_entry * de = (struct dir_entry *) bh->b_data; struct linux_dirent* dirp2 = dirp; for(n = 0, size = 0; de[n].inode > 0; n++) { if(size + sizeof(struct linux_dirent) > count) break; dirp2[n].d_ino = de[n].inode; dirp2[n].d_off = 0; dirp2[n].d_reclen = sizeof(struct linux_dirent); for(i = 0; i < NAME_LEN; i++) { dirp2[n].d_name[i] = de[n].name[i]; } size += sizeof(struct linux_dirent); } for(n = 0; n < count; n++) { put_fs_byte(((char*)dirp2)[n], (char*)dirp+n); } return size; }