From 78ff76d8333744ea1c3d6630b90c9fd2330d2a6d Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Sun, 3 Dec 2023 01:23:04 -0800 Subject: [PATCH] caller.py: implement readlink/readlinkat syscalls --- src/openpower/decoder/isa/caller.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/openpower/decoder/isa/caller.py b/src/openpower/decoder/isa/caller.py index ab931317..2385ecf0 100644 --- a/src/openpower/decoder/isa/caller.py +++ b/src/openpower/decoder/isa/caller.py @@ -1251,6 +1251,27 @@ class SyscallEmulator(openpower.syscalls.Dispatcher): sysname, nodename, release, version, machine, domainname) return 0 + def sys_readlink(self, pathname, buf, bufsiz, *rest): + dirfd = ppc_flags.AT_FDCWD + return self.sys_readlinkat(dirfd, pathname, buf, bufsiz) + + def sys_readlinkat(self, dirfd, pathname, buf, bufsiz, *rest): + try: + path = self.__isacaller.mem.read_cstr(pathname) + buf = self.__isacaller.mem.get_ctypes(buf, bufsiz, is_write=True) + except (ValueError, MemException): + return -errno.EFAULT + try: + if dirfd == ppc_flags.AT_FDCWD: + result = os.readlink(path) + else: + result = os.readlink(path, dir_fd=dirfd) + retval = min(len(result), len(buf)) + buf[:retval] = result[:retval] + return retval + except OSError as e: + return -e.errno + class ISACaller(ISACallerHelper, ISAFPHelpers, StepLoop): # decoder2 - an instance of power_decoder2 -- 2.30.2