diff --git a/man/journalctl.xml b/man/journalctl.xml
index 144b54f663..91cc322604 100644
--- a/man/journalctl.xml
+++ b/man/journalctl.xml
@@ -332,7 +332,8 @@
(_SYSTEMD_UNIT=)
and additional matches for messages
from systemd and messages about
- coredumps for the specified unit.
+ coredumps for the specified unit.
+ This parameter can be specified multiple times.
@@ -346,7 +347,8 @@
and _UID=) and
additional matches for messages from
session systemd and messages about
- coredumps for the specified unit.
+ coredumps for the specified unit.
+ This parameter can be specified multiple times.
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index 2ebac405c2..68be369f30 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -80,8 +80,8 @@ static usec_t arg_interval = DEFAULT_FSS_INTERVAL_USEC;
#endif
static usec_t arg_since, arg_until;
static bool arg_since_set = false, arg_until_set = false;
-static const char *arg_unit = NULL;
-static bool arg_unit_system;
+static char **arg_system_units = NULL;
+static char **arg_user_units = NULL;
static const char *arg_field = NULL;
static bool arg_catalog = false;
static bool arg_reverse = false;
@@ -437,13 +437,15 @@ static int parse_argv(int argc, char *argv[]) {
break;
case 'u':
- arg_unit = optarg;
- arg_unit_system = true;
+ r = strv_extend(&arg_system_units, optarg);
+ if (r < 0)
+ return log_oom();
break;
case ARG_USER_UNIT:
- arg_unit = optarg;
- arg_unit_system = false;
+ r = strv_extend(&arg_user_units, optarg);
+ if (r < 0)
+ return log_oom();
break;
case '?':
@@ -611,25 +613,39 @@ static int add_this_boot(sd_journal *j) {
return 0;
}
-static int add_unit(sd_journal *j) {
+static int add_units(sd_journal *j) {
_cleanup_free_ char *u = NULL;
int r;
+ char **i;
assert(j);
- if (isempty(arg_unit))
- return 0;
-
- u = unit_name_mangle(arg_unit);
- if (!u)
- return log_oom();
-
- if (arg_unit_system)
+ STRV_FOREACH(i, arg_system_units) {
+ u = unit_name_mangle(*i);
+ if (!u)
+ return log_oom();
r = add_matches_for_unit(j, u);
- else
+ if (r < 0)
+ return r;
+ r = sd_journal_add_disjunction(j);
+ if (r < 0)
+ return r;
+ }
+
+ STRV_FOREACH(i, arg_user_units) {
+ u = unit_name_mangle(*i);
+ if (!u)
+ return log_oom();
+
r = add_matches_for_user_unit(j, u, getuid());
- if (r < 0)
- return r;
+ if (r < 0)
+ return r;
+
+ r = sd_journal_add_disjunction(j);
+ if (r < 0)
+ return r;
+
+ }
r = sd_journal_add_conjunction(j);
if (r < 0)
@@ -1113,7 +1129,10 @@ int main(int argc, char *argv[]) {
if (r < 0)
return EXIT_FAILURE;
- r = add_unit(j);
+ r = add_units(j);
+ strv_free(arg_system_units);
+ strv_free(arg_user_units);
+
if (r < 0)
return EXIT_FAILURE;