summaryrefslogtreecommitdiffstats
path: root/lib/pager.c
diff options
context:
space:
mode:
authorKarel Zak2017-06-01 14:20:20 +0200
committerKarel Zak2017-06-01 14:20:20 +0200
commit535a4090b46395d86fa4a1bafb199e56c3968c95 (patch)
treef23c01be403cdd8afb6c9f4fc786e0fa1ab9ea24 /lib/pager.c
parentMerge branch 'travis-test' of https://github.com/rudimeier/util-linux (diff)
downloadkernel-qcow2-util-linux-535a4090b46395d86fa4a1bafb199e56c3968c95.tar.gz
kernel-qcow2-util-linux-535a4090b46395d86fa4a1bafb199e56c3968c95.tar.xz
kernel-qcow2-util-linux-535a4090b46395d86fa4a1bafb199e56c3968c95.zip
lib/pager: don't use pager if command not available
for example: # PAGER=foo dmesg -H sh: foo: command not found the same problem is we have with fdisk 'l' command: # PAGER=foo fdisk /dev/sda Welcome to fdisk (util-linux 2.30-rc2-33-41b71). ... Command (m for help): l sh: foo: command not found It seems better to don't use pager at all if not available. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'lib/pager.c')
-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;