diff options
author | johannst <johannes.stoelp@gmail.com> | 2021-04-17 23:41:17 +0200 |
---|---|---|
committer | johannst <johannes.stoelp@gmail.com> | 2021-04-17 23:41:17 +0200 |
commit | 26088bf37ef85681cf2158fdff82233b1b0c9bfd (patch) | |
tree | f0e9e3ac1f123b3fd5446e1fafe01e491da9ebbb /lib/src/syscalls.c | |
parent | 9b4b10a31954c00813a7cbf9411d30bc84eccea8 (diff) | |
download | dynld-26088bf37ef85681cf2158fdff82233b1b0c9bfd.tar.gz dynld-26088bf37ef85681cf2158fdff82233b1b0c9bfd.zip |
added close,access,write,pread,mmap,munmap syscalls + syscall ret handler
Diffstat (limited to 'lib/src/syscalls.c')
-rw-r--r-- | lib/src/syscalls.c | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/lib/src/syscalls.c b/lib/src/syscalls.c index d6ac1a5..074fced 100644 --- a/lib/src/syscalls.c +++ b/lib/src/syscalls.c @@ -4,16 +4,56 @@ #include <syscall.h> #include <syscalls.h> +// Storage for `dynld_errno`. +int dynld_errno; + +// Convert return value to errno/ret. +static long syscall_ret(unsigned long ret) { + if (ret > (unsigned long)-4096ul) { + dynld_errno = -ret; + return -1; + } + return ret; +} + int open(const char* path, int flags) { - return syscall2(__NR_open, path, flags); + long ret = syscall2(__NR_open, path, flags); + return syscall_ret(ret); +} + +int close(int fd) { + long ret = syscall1(__NR_close, fd); + return syscall_ret(ret); +} + +int access(const char* path, int mode) { + long ret = syscall2(__NR_access, path, mode); + return syscall_ret(ret); +} + +ssize_t write(int fd, const void* buf, size_t count) { + long ret = syscall3(__NR_write, fd, buf, count); + return syscall_ret(ret); } ssize_t read(int fd, void* buf, size_t count) { - return syscall3(__NR_read, fd, buf, count); + long ret = syscall3(__NR_read, fd, buf, count); + return syscall_ret(ret); +} + +ssize_t pread(int fd, void* buf, size_t count, off_t offset) { + long ret = syscall4(__NR_read, fd, buf, count, offset); + return syscall_ret(ret); +} + +void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) { + long ret = syscall6(__NR_mmap, addr, length, prot, flags, fd, offset); + return (void*)syscall_ret(ret); } -off_t lseek(int fd, off_t offset, int whence) { - return syscall3(__NR_lseek, fd, offset, whence); +int munmap(void* addr, size_t length) { + long ret = syscall2(__NR_munmap, addr, length); + return syscall_ret(ret); } void _exit(int status) { |