Merge pull request #9462 from yuwata/strv_split

make strv_split() accept empty string and use it in pager_open()
This commit is contained in:
Lennart Poettering 2018-07-13 20:32:37 +02:00 committed by GitHub
commit 99352de644
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 43 additions and 16 deletions

View file

@ -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

View file

@ -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++;

View file

@ -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;

View file

@ -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) {
STRV_FOREACH(s, l)
assert_se(streq(*s, input_table_multiple[i++]));
}
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();