diff options
-rw-r--r-- | fesvr/syscall.cc | 14 | ||||
-rw-r--r-- | fesvr/syscall.h | 1 |
2 files changed, 15 insertions, 0 deletions
diff --git a/fesvr/syscall.cc b/fesvr/syscall.cc index e277be1..162cbfc 100644 --- a/fesvr/syscall.cc +++ b/fesvr/syscall.cc @@ -161,6 +161,7 @@ syscall_t::syscall_t(htif_t* htif) table[64] = &syscall_t::sys_write; table[67] = &syscall_t::sys_pread; table[68] = &syscall_t::sys_pwrite; + table[78] = &syscall_t::sys_readlinkat; table[79] = &syscall_t::sys_fstatat; table[80] = &syscall_t::sys_fstat; table[93] = &syscall_t::sys_exit; @@ -512,3 +513,16 @@ void syscall_t::set_chroot(const char* where) chroot = buf2; } + +reg_t syscall_t::sys_readlinkat(reg_t dirfd, reg_t ppathname, reg_t ppathname_size, + reg_t pbuf, reg_t bufsiz, reg_t a5, reg_t a6) +{ + std::vector<char> pathname(ppathname_size); + memif->read(ppathname, ppathname_size, pathname.data()); + + std::vector<char> buf(bufsiz); + ssize_t ret = sysret_errno(AT_SYSCALL(readlinkat, dirfd, pathname.data(), buf.data(), bufsiz)); + if (ret > 0) + memif->write(pbuf, ret, buf.data()); + return ret; +} diff --git a/fesvr/syscall.h b/fesvr/syscall.h index c002e6c..f711170 100644 --- a/fesvr/syscall.h +++ b/fesvr/syscall.h @@ -70,6 +70,7 @@ class syscall_t : public device_t reg_t sys_getcwd(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t); reg_t sys_getmainvars(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t); reg_t sys_chdir(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t); + reg_t sys_readlinkat(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t); }; #endif |