From 44265b29ce2da27a525c72e3e9b48f3233535ec1 Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Fri, 20 Oct 2017 12:30:20 -0700 Subject: [PATCH] which: Move executable check to helper function --- which.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/which.c b/which.c index dfc1551..e47aa63 100644 --- a/which.c +++ b/which.c @@ -13,18 +13,25 @@ static int aflag; +static int +canexec(int fd, const char *name) +{ + struct stat st; + + if (fstatat(fd, name, &st, 0) < 0 || !S_ISREG(st.st_mode)) + return 0; + return faccessat(fd, name, X_OK, 0) == 0; +} + static int which(const char *path, const char *name) { char *ptr, *p; size_t i, len; - struct stat st; int dirfd, found = 0; if (strchr(name, '/')) { - if (!fstatat(AT_FDCWD, name, &st, 0) && - S_ISREG(st.st_mode) && - !access(name, X_OK)) { + if (canexec(AT_FDCWD, name)) { puts(name); return 1; } @@ -37,9 +44,7 @@ which(const char *path, const char *name) continue; ptr[i] = '\0'; if ((dirfd = open(p, O_RDONLY, 0)) >= 0) { - if (!fstatat(dirfd, name, &st, 0) && - S_ISREG(st.st_mode) && - !faccessat(dirfd, name, X_OK, 0)) { + if (canexec(dirfd, name)) { found = 1; fputs(p, stdout); if (i && ptr[i - 1] != '/')