Skip to content

Commit

Permalink
Merge pull request #9462 from yuwata/strv_split
Browse files Browse the repository at this point in the history
make strv_split() accept empty string and use it in pager_open()
  • Loading branch information
poettering committed Jul 13, 2018
2 parents 20d4ee2 + 70d6e5b commit 99352de
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 15 deletions.
19 changes: 12 additions & 7 deletions src/basic/pager.c
Expand Up @@ -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;

Expand All @@ -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 */
Expand Down Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions src/basic/strv.c
Expand Up @@ -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++;
Expand Down
8 changes: 3 additions & 5 deletions src/systemctl/systemctl.c
Expand Up @@ -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;

Expand Down
26 changes: 23 additions & 3 deletions src/test/test-strv.c
Expand Up @@ -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) {
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 99352de

Please sign in to comment.