From 2d6da2e52066067e4c82a2e16f73438319e1db81 Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Thu, 29 Oct 2020 23:02:57 +0100 Subject: [PATCH] Add compat wrapper for readlinkat --- Compat.c | 26 ++++++++++++++++++++++++-- Compat.h | 7 +++++++ linux/ProcessLocksScreen.c | 20 +++----------------- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/Compat.c b/Compat.c index 25aa9f73..6401f696 100644 --- a/Compat.c +++ b/Compat.c @@ -13,9 +13,7 @@ in the source distribution for its full text. #include #include "Compat.h" -#ifndef HAVE_FSTATAT #include "XUtils.h" -#endif int Compat_fstatat(int dirfd, @@ -44,3 +42,27 @@ int Compat_fstatat(int dirfd, #endif } + +int Compat_readlinkat(int dirfd, + const char* dirpath, + const char* pathname, + char* buf, + size_t bufsize) { + +#ifdef HAVE_READLINKAT + + (void)dirpath; + + return readlinkat(dirfd, pathname, buf, bufsize); + +#else + + (void)dirfd; + + char path[4096]; + xSnprintf(path, sizeof(path), "%s/%s", dirpath, pathname); + + return readlink(path, buf, bufsize); + +#endif +} diff --git a/Compat.h b/Compat.h index c9fd0e62..c0085d5c 100644 --- a/Compat.h +++ b/Compat.h @@ -7,6 +7,7 @@ Released under the GNU GPLv2, see the COPYING file in the source distribution for its full text. */ +#include #include @@ -16,4 +17,10 @@ int Compat_fstatat(int dirfd, struct stat* statbuf, int flags); +int Compat_readlinkat(int dirfd, + const char* dirpath, + const char* pathname, + char* buf, + size_t bufsize); + #endif /* HEADER_Compat */ diff --git a/linux/ProcessLocksScreen.c b/linux/ProcessLocksScreen.c index bdbf22ff..c93d2845 100644 --- a/linux/ProcessLocksScreen.c +++ b/linux/ProcessLocksScreen.c @@ -23,6 +23,7 @@ in the source distribution for its full text. #include #include "CRT.h" +#include "Compat.h" #include "FunctionBar.h" #include "IncSet.h" #include "ProcessList.h" @@ -104,26 +105,11 @@ static char *ProcessLocksScreen_getInodeFilename(pid_t pid, ino_t inode) { if (!strtoull(de->d_name, (char **) NULL, 10)) continue; -#if !defined(HAVE_FSTATAT) || !defined(HAVE_READLINKAT) - char filepath[PATH_MAX + 1]; - xSnprintf(filepath, sizeof(filepath), "%s/%s", path, de->d_name); -#endif - -#ifdef HAVE_FSTATAT - if (!fstatat(fd, de->d_name, &sb, 0) && inode != sb.st_ino) + if (!Compat_fstatat(fd, path, de->d_name, &sb, 0) && inode != sb.st_ino) continue; -#else - if (!stat(filepath, &sb)) && inode != sb.st_ino) - continue; -#endif -#ifdef HAVE_READLINKAT - if ((len = readlinkat(fd, de->d_name, sym, sizeof(sym) - 1)) < 1) + if ((len = Compat_readlinkat(fd, path, de->d_name, sym, sizeof(sym) - 1)) < 1) goto out; -#else - if ((len = readlink(filepath, sym, sizeof(sym) - 1)) < 1) - goto out; -#endif sym[len] = '\0';