int pager_open(bool no_pager, bool jump_to_end) {
_cleanup_close_pair_ int fd[2] = { -1, -1 };
+ _cleanup_strv_free_ char **pager_args = NULL;
const char *pager;
int r;
if (!pager)
pager = getenv("PAGER");
- /* If the pager is explicitly turned off, honour it */
- if (pager && STR_IN_SET(pager, "", "cat"))
- return 0;
+ if (pager) {
+ pager_args = strv_split(pager, WHITESPACE);
+ if (!pager_args)
+ return -ENOMEM;
+
+ /* If the pager is explicitly turned off, honour it */
+ if (strv_isempty(pager_args) || strv_equal(pager_args, STRV_MAKE("cat")))
+ return 0;
+ }
/* Determine and cache number of columns/lines before we spawn the pager so that we get the value from the
* actual tty */
setenv("LESSCHARSET", less_charset, 1) < 0)
_exit(EXIT_FAILURE);
- if (pager) {
- execlp(pager, pager, NULL);
- execl("/bin/sh", "sh", "-c", pager, NULL);
- }
+ if (pager_args)
+ execvp(pager_args[0], pager_args);
/* Debian's alternatives command for pagers is
* called 'pager'. Note that we do not call