commit 44265b29ce2da27a525c72e3e9b48f3233535ec1
parent 5b66e55a83fd9b7bceabbc043e50f77cfe048c35
Author: Michael Forney <mforney@mforney.org>
Date: Fri, 20 Oct 2017 12:30:20 -0700
which: Move executable check to helper function
Diffstat:
1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/which.c b/which.c
@@ -14,17 +14,24 @@
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] != '/')