sysdeps/squiid: Implement sys_open_dir(), sys_read_entries()

Signed-off-by: Christoph Heiss <contact@christoph-heiss.at>
This commit is contained in:
Christoph Heiss 2022-01-23 13:27:03 +01:00
parent d63130e30c
commit 27518a8cb0
Signed by: c8h4
GPG key ID: 9C82009BEEDEA0FF
3 changed files with 64 additions and 4 deletions

View file

@ -1,3 +1,4 @@
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
@ -291,6 +292,62 @@ int sys_waitpid(pid_t pid, int *status, int flags, pid_t *ret_pid)
return 0;
}
int sys_open_dir(const char *path, int *handle)
{
int ret = __sq_syscall3(SQ_SYS_open, (__sq_u64)path, 0, 0);
if (ret < 0) {
return -ret;
}
*handle = ret;
return 0;
}
int sys_read_entries(int handle, void *buffer, size_t max_size, size_t *bytes_read)
{
__ensure(max_size >= sizeof(dirent));
static char sysbuf[sizeof(__sq_sys_dirent) + _SQ_FILENAME_MAXLEN];
static size_t sysbuf_offset = 0;
static size_t sysbuf_size = 0;
*bytes_read = 0;
// We might still have some entries in our sysbuf, read them out first
if (sysbuf_offset == 0) {
long ret = __sq_syscall3(SQ_SYS_readdir, handle, (__sq_u64)sysbuf, sizeof(sysbuf));
if (ret <= 0) {
return -ret;
}
sysbuf_size = ret;
}
dirent *dent = (dirent*)buffer;
while (*bytes_read + sizeof(dirent) < max_size) {
__sq_sys_dirent *sysdent = reinterpret_cast<__sq_sys_dirent*>(sysbuf + sysbuf_offset);
dent->d_ino = sysdent->inode;
dent->d_off = 0;
dent->d_reclen = sizeof(dirent);
dent->d_type = sysdent->type;
strncpy(dent->d_name, (const char*)sysdent->name, sizeof(dent->d_name));
*bytes_read = *bytes_read + dent->d_reclen;
sysbuf_offset += sysdent->entrylen;
dent++;
if (sysbuf_offset >= sysbuf_size) {
sysbuf_offset = 0;
break;
}
}
return 0;
}
#endif // !MLIBC_BUILDING_RTDL
} // namespace mlibc

View file

@ -54,7 +54,8 @@
#define SQ_STAT_FTYPE_SOCK 6
#define SQ_STAT_FTYPE_FIFO 7
#define _SQ_PATH_MAX 2048
#define _SQ_FILENAME_MAXLEN 1024 /* including NUL */
#define _SQ_PATH_MAXLEN 4096
#ifndef __ASSEMBLER__
@ -66,9 +67,10 @@ struct __sq_timespec {
};
struct __sq_sys_dirent {
__sq_u64 inode;
__sq_u32 type;
__sq_u32 name_len;
__sq_u32 entrylen;
__sq_u32 __pad0[4];
__sq_u8 name[0];
};

View file

@ -16,8 +16,9 @@
#define SQ_SYS_futex 12
#define SQ_SYS_getcwd 13
#define SQ_SYS_wait 14
#define SQ_SYS_readdir 15
#define __SQ_SYS_LAST SQ_SYS_wait
#define __SQ_SYS_LAST SQ_SYS_readdir
#define __SQ_SYS_NUM (__SQ_SYS_LAST+1)
#ifndef __ASSEMBLER__