mirror of
https://github.com/systemd/systemd.git
synced 2025-05-27 21:05:55 +03:00
journalctl-filter: modernize add_units()
- add missing assertions, - use set_ensure_consume() and strv_consume(), - use string_hash_ops_free and _cleanup_set_free_, - use strv_fnmatch_full(), - replace unused counter with a boolean flag, - return earlier if no unit filtering is requested.
This commit is contained in:
parent
17c512f1cc
commit
5d53eef97b
@ -85,14 +85,14 @@ static int get_possible_units(
|
||||
sd_journal *j,
|
||||
const char *fields,
|
||||
char **patterns,
|
||||
Set **units) {
|
||||
Set **ret) {
|
||||
|
||||
_cleanup_set_free_free_ Set *found = NULL;
|
||||
_cleanup_set_free_ Set *found = NULL;
|
||||
int r;
|
||||
|
||||
found = set_new(&string_hash_ops);
|
||||
if (!found)
|
||||
return -ENOMEM;
|
||||
assert(j);
|
||||
assert(fields);
|
||||
assert(ret);
|
||||
|
||||
NULSTR_FOREACH(field, fields) {
|
||||
const void *data;
|
||||
@ -103,36 +103,31 @@ static int get_possible_units(
|
||||
return r;
|
||||
|
||||
SD_JOURNAL_FOREACH_UNIQUE(j, data, size) {
|
||||
char *eq;
|
||||
size_t prefix;
|
||||
_cleanup_free_ char *u = NULL;
|
||||
char *eq;
|
||||
|
||||
eq = memchr(data, '=', size);
|
||||
if (eq)
|
||||
prefix = eq - (char*) data + 1;
|
||||
else
|
||||
prefix = 0;
|
||||
if (eq) {
|
||||
size -= eq - (char*) data + 1;
|
||||
data = ++eq;
|
||||
}
|
||||
|
||||
u = strndup((char*) data + prefix, size - prefix);
|
||||
u = strndup(data, size);
|
||||
if (!u)
|
||||
return -ENOMEM;
|
||||
|
||||
STRV_FOREACH(pattern, patterns)
|
||||
if (fnmatch(*pattern, u, FNM_NOESCAPE) == 0) {
|
||||
log_debug("Matched %s with pattern %s=%s", u, field, *pattern);
|
||||
size_t i;
|
||||
if (!strv_fnmatch_full(patterns, u, FNM_NOESCAPE, &i))
|
||||
continue;
|
||||
|
||||
r = set_consume(found, u);
|
||||
u = NULL;
|
||||
if (r < 0 && r != -EEXIST)
|
||||
return r;
|
||||
|
||||
break;
|
||||
}
|
||||
log_debug("Matched %s with pattern %s=%s", u, field, patterns[i]);
|
||||
r = set_ensure_consume(&found, &string_hash_ops_free, TAKE_PTR(u));
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
*units = TAKE_PTR(found);
|
||||
|
||||
*ret = TAKE_PTR(found);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -155,10 +150,14 @@ static int get_possible_units(
|
||||
|
||||
static int add_units(sd_journal *j) {
|
||||
_cleanup_strv_free_ char **patterns = NULL;
|
||||
int r, count = 0;
|
||||
bool added = false;
|
||||
int r;
|
||||
|
||||
assert(j);
|
||||
|
||||
if (strv_isempty(arg_system_units) && strv_isempty(arg_user_units))
|
||||
return 0;
|
||||
|
||||
STRV_FOREACH(i, arg_system_units) {
|
||||
_cleanup_free_ char *u = NULL;
|
||||
|
||||
@ -167,10 +166,9 @@ static int add_units(sd_journal *j) {
|
||||
return r;
|
||||
|
||||
if (string_is_glob(u)) {
|
||||
r = strv_push(&patterns, u);
|
||||
r = strv_consume(&patterns, TAKE_PTR(u));
|
||||
if (r < 0)
|
||||
return r;
|
||||
u = NULL;
|
||||
} else {
|
||||
r = add_matches_for_unit(j, u);
|
||||
if (r < 0)
|
||||
@ -178,12 +176,12 @@ static int add_units(sd_journal *j) {
|
||||
r = sd_journal_add_disjunction(j);
|
||||
if (r < 0)
|
||||
return r;
|
||||
count++;
|
||||
added = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!strv_isempty(patterns)) {
|
||||
_cleanup_set_free_free_ Set *units = NULL;
|
||||
_cleanup_set_free_ Set *units = NULL;
|
||||
char *u;
|
||||
|
||||
r = get_possible_units(j, SYSTEM_UNITS, patterns, &units);
|
||||
@ -197,7 +195,7 @@ static int add_units(sd_journal *j) {
|
||||
r = sd_journal_add_disjunction(j);
|
||||
if (r < 0)
|
||||
return r;
|
||||
count++;
|
||||
added = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -211,10 +209,9 @@ static int add_units(sd_journal *j) {
|
||||
return r;
|
||||
|
||||
if (string_is_glob(u)) {
|
||||
r = strv_push(&patterns, u);
|
||||
r = strv_consume(&patterns, TAKE_PTR(u));
|
||||
if (r < 0)
|
||||
return r;
|
||||
u = NULL;
|
||||
} else {
|
||||
r = add_matches_for_user_unit(j, u, getuid());
|
||||
if (r < 0)
|
||||
@ -222,12 +219,12 @@ static int add_units(sd_journal *j) {
|
||||
r = sd_journal_add_disjunction(j);
|
||||
if (r < 0)
|
||||
return r;
|
||||
count++;
|
||||
added = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!strv_isempty(patterns)) {
|
||||
_cleanup_set_free_free_ Set *units = NULL;
|
||||
_cleanup_set_free_ Set *units = NULL;
|
||||
char *u;
|
||||
|
||||
r = get_possible_units(j, USER_UNITS, patterns, &units);
|
||||
@ -241,20 +238,16 @@ static int add_units(sd_journal *j) {
|
||||
r = sd_journal_add_disjunction(j);
|
||||
if (r < 0)
|
||||
return r;
|
||||
count++;
|
||||
added = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* Complain if the user request matches but nothing whatsoever was
|
||||
* found, since otherwise everything would be matched. */
|
||||
if (!(strv_isempty(arg_system_units) && strv_isempty(arg_user_units)) && count == 0)
|
||||
/* Complain if the user request matches but nothing whatsoever was found, since otherwise everything
|
||||
* would be matched. */
|
||||
if (!added)
|
||||
return -ENODATA;
|
||||
|
||||
r = sd_journal_add_conjunction(j);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
return 0;
|
||||
return sd_journal_add_conjunction(j);
|
||||
}
|
||||
|
||||
static int add_syslog_identifier(sd_journal *j) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user