Update sys.c_1.1

master
pt3oyfief 2 years ago
parent 7968a2c148
commit 6cb306445d

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

Loading…
Cancel
Save