parent
c1abd5f7ea
commit
5a914de9b6
@ -0,0 +1,30 @@
|
||||
int sys_getdents(unsigned int fd, struct linux_dirent* dirp, unsigned int count)
|
||||
{
|
||||
struct buffer_head* bh;
|
||||
struct m_inode* inode = current->filp[fd]->f_inode;
|
||||
struct linux_dirent m;
|
||||
struct dir_entry* dir;
|
||||
char* buf;
|
||||
int k, n = 0, i;
|
||||
if (count <= 0)return -1;
|
||||
bh = bread(inode->i_dev, inode->i_zone[0]);
|
||||
for (k = 0; k < inode->i_size; k += sizeof(struct linux_dirent))
|
||||
{
|
||||
if (n + sizeof(struct linux_dirent) > count)return 0;
|
||||
dir = (struct dir_entry*)(bh->b_data + k);
|
||||
if (dir->inode)
|
||||
{
|
||||
m.d_ino = dir->inode;
|
||||
for (i = 0; i < NAME_LEN; i++)m.d_name[i] = dir->name[i];
|
||||
m.d_off = 0;
|
||||
m.d_reclen = sizeof(struct linux_dirent);
|
||||
buf = &m;
|
||||
for (i = 0; i < m.d_reclen; i++)
|
||||
put_fs_byte(*(buf + i), (char*)(dirp)+n + i);
|
||||
n += sizeof(struct linux_dirent);
|
||||
}
|
||||
else continue;
|
||||
}
|
||||
brelse(bh);
|
||||
return n;
|
||||
}
|
Loading…
Reference in new issue