mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-28 13:18:22 +00:00
52 lines
873 B
C
52 lines
873 B
C
#include <kernel/syscalls.h>
|
|
#include <dirent.h>
|
|
#include <arch/cls.h>
|
|
#include <sys/stat.h>
|
|
#include <kernel/vmm.h>
|
|
|
|
syscallret syscall_getdirent(int ifd, void* buff, size_t max_size){
|
|
syscallret retv;
|
|
retv.ret = -1;
|
|
|
|
if(buff > USER_SPACE_END){
|
|
retv.errno = EFAULT;
|
|
return retv;
|
|
}
|
|
|
|
size_t readc = max_size / sizeof(dent_t);
|
|
|
|
if(readc == 0){
|
|
retv.errno = EINVAL;
|
|
return retv;
|
|
}
|
|
|
|
fd_t* fd;
|
|
|
|
retv.errno = fd_access(&arch_getcls()->thread->proc->fdtable, &fd, ifd);
|
|
|
|
if(retv.errno)
|
|
return retv;
|
|
|
|
if(GETTYPE(fd->node->st.st_mode) != TYPE_DIR){
|
|
retv.errno = ENOTDIR;
|
|
fd_release(fd);
|
|
return retv;
|
|
}
|
|
|
|
dent_t kbuff[readc];
|
|
|
|
retv.errno = vfs_getdirent(fd->node, kbuff, readc, fd->offset, &retv.ret);
|
|
|
|
|
|
fd->offset += retv.ret;
|
|
|
|
retv.ret *= sizeof(dent_t);
|
|
|
|
memcpy(buff, kbuff, retv.ret); // XXX use user memcpy
|
|
|
|
fd_release(fd);
|
|
|
|
return retv;
|
|
|
|
}
|