summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/basic/pager.c19
-rw-r--r--src/basic/strv.c4
-rw-r--r--src/systemctl/systemctl.c8
-rw-r--r--src/test/test-strv.c26
4 files changed, 42 insertions, 15 deletions
diff --git a/src/basic/pager.c b/src/basic/pager.c
index f241261119..7d698666e9 100644
--- a/src/basic/pager.c
+++ b/src/basic/pager.c
@@ -43,6 +43,7 @@ _noreturn_ static void pager_fallback(void) {
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;
@@ -62,9 +63,15 @@ int pager_open(bool no_pager, bool jump_to_end) {
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 */
@@ -104,10 +111,8 @@ int pager_open(bool no_pager, bool jump_to_end) {
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
diff --git a/src/basic/strv.c b/src/basic/strv.c
index b3716233b5..abf3fc4c7b 100644
--- a/src/basic/strv.c
+++ b/src/basic/strv.c
@@ -253,6 +253,10 @@ char **strv_split(const char *s, const char *separator) {
assert(s);
+ s += strspn(s, separator);
+ if (isempty(s))
+ return new0(char*, 1);
+
n = 0;
FOREACH_WORD_SEPARATOR(word, l, s, separator, state)
n++;
diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c
index 8f337b78a2..e8722f5017 100644
--- a/src/systemctl/systemctl.c
+++ b/src/systemctl/systemctl.c
@@ -6785,11 +6785,9 @@ static int run_editor(char **paths) {
if (r < 0)
return r;
if (r == 0) {
- const char **args;
- char *editor, **editor_args = NULL;
- char **tmp_path, **original_path, *p;
- size_t n_editor_args = 0, i = 1;
- size_t argc;
+ char **editor_args = NULL, **tmp_path, **original_path, *p;
+ size_t n_editor_args = 0, i = 1, argc;
+ const char **args, *editor;
argc = strv_length(paths)/2 + 1;
diff --git a/src/test/test-strv.c b/src/test/test-strv.c
index 1c192239a2..340b5628f9 100644
--- a/src/test/test-strv.c
+++ b/src/test/test-strv.c
@@ -180,12 +180,31 @@ static void test_strv_split(void) {
const char str[] = "one,two,three";
l = strv_split(str, ",");
-
assert_se(l);
+ STRV_FOREACH(s, l)
+ assert_se(streq(*s, input_table_multiple[i++]));
- STRV_FOREACH(s, l) {
+ i = 0;
+ strv_free(l);
+
+ l = strv_split(" one two\t three", WHITESPACE);
+ assert_se(l);
+ STRV_FOREACH(s, l)
assert_se(streq(*s, input_table_multiple[i++]));
- }
+}
+
+static void test_strv_split_empty(void) {
+ _cleanup_strv_free_ char **l = NULL;
+
+ l = strv_split("", WHITESPACE);
+ assert_se(l);
+ assert_se(strv_isempty(l));
+
+ strv_free(l);
+ l = strv_split(" ", WHITESPACE);
+ assert_se(l);
+ assert_se(strv_isempty(l));
+
}
static void test_strv_split_extract(void) {
@@ -733,6 +752,7 @@ int main(int argc, char *argv[]) {
test_invalid_unquote("'x'y'g");
test_strv_split();
+ test_strv_split_empty();
test_strv_split_extract();
test_strv_split_newlines();
test_strv_split_nulstr();