sysdeps/squiid: Implement sys_open_dir(), sys_read_entries()
Signed-off-by: Christoph Heiss <contact@christoph-heiss.at>
This commit is contained in:
parent
d63130e30c
commit
27518a8cb0
|
@ -1,3 +1,4 @@
|
||||||
|
#include <dirent.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -291,6 +292,62 @@ int sys_waitpid(pid_t pid, int *status, int flags, pid_t *ret_pid)
|
||||||
return 0;
|
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
|
#endif // !MLIBC_BUILDING_RTDL
|
||||||
|
|
||||||
} // namespace mlibc
|
} // namespace mlibc
|
||||||
|
|
|
@ -54,7 +54,8 @@
|
||||||
#define SQ_STAT_FTYPE_SOCK 6
|
#define SQ_STAT_FTYPE_SOCK 6
|
||||||
#define SQ_STAT_FTYPE_FIFO 7
|
#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__
|
#ifndef __ASSEMBLER__
|
||||||
|
|
||||||
|
@ -66,9 +67,10 @@ struct __sq_timespec {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct __sq_sys_dirent {
|
struct __sq_sys_dirent {
|
||||||
|
__sq_u64 inode;
|
||||||
__sq_u32 type;
|
__sq_u32 type;
|
||||||
|
__sq_u32 entrylen;
|
||||||
__sq_u32 name_len;
|
__sq_u32 __pad0[4];
|
||||||
__sq_u8 name[0];
|
__sq_u8 name[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,9 @@
|
||||||
#define SQ_SYS_futex 12
|
#define SQ_SYS_futex 12
|
||||||
#define SQ_SYS_getcwd 13
|
#define SQ_SYS_getcwd 13
|
||||||
#define SQ_SYS_wait 14
|
#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)
|
#define __SQ_SYS_NUM (__SQ_SYS_LAST+1)
|
||||||
|
|
||||||
#ifndef __ASSEMBLER__
|
#ifndef __ASSEMBLER__
|
||||||
|
|
Loading…
Reference in a new issue