Update file_dev.c

master
psztmew5x 5 years ago
parent 29c10bfed5
commit 84dbdc40d4

@ -116,29 +116,32 @@ int sys_getdents(unsigned int fd, struct linux_dirent *d, unsigned int count)
return ENOTDIR;
inode = file->f_inode;
block = bread(inode->i_dev,inode->i_zone[0]);
for (i = 0; i <= inode->i_size/0x400; i++)
{
block = bread(inode->i_dev,inode->i_zone[i]);
/* count: size of linux_dirent[], target
* dd_size: size of dir_entry[], block 400?
*/
for (dpos = 0,bpos = 0;bpos<inode->i_size;bpos += sizeof(struct dir_entry)) {
if (dpos >= (count-ld_size))
return 0; /* d full */
ptr = (struct dir_entry *) (bpos + block->b_data);
if (!ptr -> inode)
continue; /* when it 's empty inode, jump it */
tmp.d_ino = ptr -> inode;
for (i = 0; i < 14; i++) tmp.d_name[i] = ptr -> name[i];
tmp.d_reclen = sizeof(tmp);
tmp.d_off = 0;
/* count: size of linux_dirent[], target
* dd_size: size of dir_entry[], block 400?
*/
for (dpos = 0,bpos = 0;bpos<inode->i_size;bpos += sizeof(struct dir_entry)) {
if (dpos >= (count-ld_size))
return 0; /* d full */
ptr = (struct dir_entry *) (bpos + block->b_data);
if (!ptr -> inode)
continue; /* when it 's empty inode, jump it */
tmp.d_ino = ptr -> inode;
for (i = 0; i < 14; i++) tmp.d_name[i] = ptr -> name[i];
tmp.d_reclen = sizeof(tmp);
tmp.d_off = 0;
buf = &tmp;
for (i = 0; i < tmp.d_reclen; i++){
put_fs_byte(*(buf+i),((char*)d)+i+dpos); /* move data from kernel to user */
}
dpos += tmp.d_reclen;
}
buf = &tmp;
for (i = 0; i < tmp.d_reclen; i++){
put_fs_byte(*(buf+i),((char*)d)+i+dpos); /* move data from kernel to user */
}
dpos += tmp.d_reclen;
}
}
return dpos;
}

Loading…
Cancel
Save