From 5a914de9b6cb2fd66f4a2ba99ab7c9e2300f3ffa Mon Sep 17 00:00:00 2001 From: pl5jn4byo <2231260694@qq.com> Date: Sun, 26 Jun 2022 22:11:20 +0800 Subject: [PATCH] ADD file via upload --- getdents.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 getdents.c diff --git a/getdents.c b/getdents.c new file mode 100644 index 0000000..2de944e --- /dev/null +++ b/getdents.c @@ -0,0 +1,30 @@ +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; +}