diff options
author | Karel Zak | 2017-06-01 14:20:20 +0200 |
---|---|---|
committer | Karel Zak | 2017-06-01 14:20:20 +0200 |
commit | 535a4090b46395d86fa4a1bafb199e56c3968c95 (patch) | |
tree | f23c01be403cdd8afb6c9f4fc786e0fa1ab9ea24 | |
parent | Merge branch 'travis-test' of https://github.com/rudimeier/util-linux (diff) | |
download | kernel-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>
-rw-r--r-- | lib/pager.c | 36 |
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; |