|
|
@ -365,13 +365,14 @@ int sys_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)
|
|
|
|
|
|
|
|
|
|
|
|
for( ; d < inode->i_size ; d += dir_entry_size)
|
|
|
|
for( ; d < inode->i_size ; d += dir_entry_size)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(l >= count - linux_dirent_size) return l;//dirp已经满了,返回读取的字节数
|
|
|
|
//printk("***\n");
|
|
|
|
|
|
|
|
if(l >= count - linux_dirent_size) break;//dirp已经满了,返回读取的字节数 //buggy
|
|
|
|
|
|
|
|
|
|
|
|
//bufhd->b_data 是char*类型的指针(char为一字节),因此+d可以到这个目录项
|
|
|
|
//bufhd->b_data 是char*类型的指针(char为一字节),因此+d可以到这个目录项
|
|
|
|
d_entry = (struct dir_entry *)(bufhd->b_data + d);
|
|
|
|
d_entry = (struct dir_entry *)(bufhd->b_data + d);
|
|
|
|
|
|
|
|
//printk("&&&\n");
|
|
|
|
//读到了目录的最后一项,则返回0
|
|
|
|
//读到了目录的最后一项,则返回0
|
|
|
|
if(!d_entry->inode) return 0;
|
|
|
|
if(!d_entry->inode) continue;
|
|
|
|
|
|
|
|
|
|
|
|
//将目录项信息从dir_entry转移到dirp_tmp //d_entry(dir_entry)----->dirp_tmp(linux_dirent)
|
|
|
|
//将目录项信息从dir_entry转移到dirp_tmp //d_entry(dir_entry)----->dirp_tmp(linux_dirent)
|
|
|
|
dirp_tmp->d_ino = d_entry->inode;
|
|
|
|
dirp_tmp->d_ino = d_entry->inode;
|
|
|
@ -383,10 +384,11 @@ int sys_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)
|
|
|
|
memcpy(buf,dirp_tmp,linux_dirent_size);
|
|
|
|
memcpy(buf,dirp_tmp,linux_dirent_size);
|
|
|
|
//利用put_fs_byte将buf(在核心数据段)逐字节存入dirp(在用户数据段,段基址在fs,即fs:[addr])
|
|
|
|
//利用put_fs_byte将buf(在核心数据段)逐字节存入dirp(在用户数据段,段基址在fs,即fs:[addr])
|
|
|
|
for(i=0 ; i < linux_dirent_size ; i++){ //buf(char)--->dirp数组(linux_dirent)
|
|
|
|
for(i=0 ; i < linux_dirent_size ; i++){ //buf(char)--->dirp数组(linux_dirent)
|
|
|
|
put_fs_byte(*(buf+i), ((char*)dirp)+i+l);
|
|
|
|
put_fs_byte(*(buf+i), ((char*)dirp)+l+i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
l += linux_dirent_size;
|
|
|
|
l += linux_dirent_size;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|