|
|
@ -161,6 +161,7 @@ syscall_t::syscall_t(htif_t* htif) |
|
|
table[64] = &syscall_t::sys_write; |
|
|
table[64] = &syscall_t::sys_write; |
|
|
table[67] = &syscall_t::sys_pread; |
|
|
table[67] = &syscall_t::sys_pread; |
|
|
table[68] = &syscall_t::sys_pwrite; |
|
|
table[68] = &syscall_t::sys_pwrite; |
|
|
|
|
|
table[78] = &syscall_t::sys_readlinkat; |
|
|
table[79] = &syscall_t::sys_fstatat; |
|
|
table[79] = &syscall_t::sys_fstatat; |
|
|
table[80] = &syscall_t::sys_fstat; |
|
|
table[80] = &syscall_t::sys_fstat; |
|
|
table[93] = &syscall_t::sys_exit; |
|
|
table[93] = &syscall_t::sys_exit; |
|
|
@ -512,3 +513,16 @@ void syscall_t::set_chroot(const char* where) |
|
|
|
|
|
|
|
|
chroot = buf2; |
|
|
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; |
|
|
|
|
|
} |
|
|
|