You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
798 B
30 lines
798 B
2 years ago
|
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;
|
||
|
}
|