From a041028d8efb1c519483414cb8e267235ebdfffa 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 2cf113e5..12970c55 100644 --- a/src/openpower/decoder/isa/caller.py +++ b/src/openpower/decoder/isa/caller.py @@ -1260,6 +1260,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