summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/pager.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/pager.c b/lib/pager.c
index 24284d605..b90d6398a 100644
--- a/lib/pager.c
+++ b/lib/pager.c
@@ -170,6 +170,39 @@ static void wait_for_pager_signal(int signo)
raise(signo);
}
+static int has_command(const char *cmd)
+{
+ const char *path;
+ char *p, *s;
+ int rc = 0;
+
+ if (!cmd)
+ goto done;
+ if (*cmd == '/') {
+ rc = access(cmd, X_OK) == 0;
+ goto done;
+ }
+
+ path = getenv("PATH");
+ if (!path)
+ goto done;
+ p = strdup(path);
+ if (!p)
+ goto done;
+
+ for(s = strtok(p, ":"); s; s = strtok(NULL, ":")) {
+ int fd = open(s, O_RDONLY|O_CLOEXEC);
+ rc = faccessat(fd, cmd, X_OK, 0) == 0;
+ close(fd);
+ if (rc)
+ break;
+ }
+ free(p);
+done:
+ /*fprintf(stderr, "has PAGER %s rc=%d\n", cmd, rc);*/
+ return rc;
+}
+
static void __setup_pager(void)
{
const char *pager = getenv("PAGER");
@@ -183,6 +216,9 @@ static void __setup_pager(void)
else if (!*pager || !strcmp(pager, "cat"))
return;
+ if (!has_command(pager))
+ return;
+
/* spawn the pager */
pager_argv[2] = pager;
pager_process.argv = pager_argv;