Skip to content

Commit 1a17adb

Browse files
committed
Implement syscall readlinkat
1 parent 2e86ec4 commit 1a17adb

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

fesvr/syscall.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ syscall_t::syscall_t(htif_t* htif)
161161
table[64] = &syscall_t::sys_write;
162162
table[67] = &syscall_t::sys_pread;
163163
table[68] = &syscall_t::sys_pwrite;
164+
table[78] = &syscall_t::sys_readlinkat;
164165
table[79] = &syscall_t::sys_fstatat;
165166
table[80] = &syscall_t::sys_fstat;
166167
table[93] = &syscall_t::sys_exit;
@@ -512,3 +513,16 @@ void syscall_t::set_chroot(const char* where)
512513

513514
chroot = buf2;
514515
}
516+
517+
reg_t syscall_t::sys_readlinkat(reg_t dirfd, reg_t ppathname, reg_t ppathname_size,
518+
reg_t pbuf, reg_t bufsiz, reg_t a5, reg_t a6)
519+
{
520+
std::vector<char> pathname(ppathname_size);
521+
memif->read(ppathname, ppathname_size, pathname.data());
522+
523+
std::vector<char> buf(bufsiz);
524+
ssize_t ret = sysret_errno(AT_SYSCALL(readlinkat, dirfd, pathname.data(), buf.data(), bufsiz));
525+
if (ret > 0)
526+
memif->write(pbuf, ret, buf.data());
527+
return ret;
528+
}

fesvr/syscall.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class syscall_t : public device_t
7070
reg_t sys_getcwd(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t);
7171
reg_t sys_getmainvars(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t);
7272
reg_t sys_chdir(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t);
73+
reg_t sys_readlinkat(reg_t, reg_t, reg_t, reg_t, reg_t, reg_t, reg_t);
7374
};
7475

7576
#endif

0 commit comments

Comments
 (0)