Skip to content

Commit

Permalink
Add compat wrapper for readlinkat
Browse files Browse the repository at this point in the history
  • Loading branch information
BenBE committed Nov 9, 2020
1 parent 84dad4c commit 2d6da2e
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 19 deletions.
26 changes: 24 additions & 2 deletions Compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ in the source distribution for its full text.
#include <sys/stat.h>

#include "Compat.h"
#ifndef HAVE_FSTATAT
#include "XUtils.h"
#endif


int Compat_fstatat(int dirfd,
Expand Down Expand Up @@ -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
}
7 changes: 7 additions & 0 deletions Compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Released under the GNU GPLv2, see the COPYING file
in the source distribution for its full text.
*/

#include <stddef.h>
#include <sys/stat.h>


Expand All @@ -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 */
20 changes: 3 additions & 17 deletions linux/ProcessLocksScreen.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ in the source distribution for its full text.
#include <sys/wait.h>

#include "CRT.h"
#include "Compat.h"
#include "FunctionBar.h"
#include "IncSet.h"
#include "ProcessList.h"
Expand Down Expand Up @@ -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)
continue;
#else
if (!stat(filepath, &sb)) && inode != sb.st_ino)
if (!Compat_fstatat(fd, path, de->d_name, &sb, 0) && inode != sb.st_ino)
continue;
#endif

#ifdef HAVE_READLINKAT
if ((len = readlinkat(fd, de->d_name, sym, sizeof(sym) - 1)) < 1)
goto out;
#else
if ((len = readlink(filepath, sym, sizeof(sym) - 1)) < 1)
if ((len = Compat_readlinkat(fd, path, de->d_name, sym, sizeof(sym) - 1)) < 1)
goto out;
#endif

sym[len] = '\0';

Expand Down

0 comments on commit 2d6da2e

Please sign in to comment.