diff --git a/sys.c_1.1 b/sys.c_1.1 index 169bd8a..ee46e6a 100644 --- a/sys.c_1.1 +++ b/sys.c_1.1 @@ -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) { - 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可以到这个目录项 d_entry = (struct dir_entry *)(bufhd->b_data + d); - + //printk("&&&\n"); //读到了目录的最后一项,则返回0 - if(!d_entry->inode) return 0; + if(!d_entry->inode) continue; //将目录项信息从dir_entry转移到dirp_tmp //d_entry(dir_entry)----->dirp_tmp(linux_dirent) 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); //利用put_fs_byte将buf(在核心数据段)逐字节存入dirp(在用户数据段,段基址在fs,即fs:[addr]) 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; } + return l; }