summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMirco Tischler <mt-ml@gmx.de>2013-01-17 18:55:07 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2013-01-18 11:14:00 -0500
commit1a6c43e94649b3f271502a88655f63ea85168fec (patch)
treec76814a5bbd2c2291f60bf41e9655bb1847d0b94
parentbbc9006e6b5665073149331d75c104a33224dc19 (diff)
logs-show: add show_journal_by_user_unit
Print the journal for a user session unit. For now this filters by _SYSTEMD_USER_UNIT and USER_UNIT and additionally _UID.
-rw-r--r--src/shared/logs-show.c205
-rw-r--r--src/shared/logs-show.h12
2 files changed, 159 insertions, 58 deletions
diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c
index c221af3de5..034fde6624 100644
--- a/src/shared/logs-show.c
+++ b/src/shared/logs-show.c
@@ -774,72 +774,22 @@ int output_journal(
return ret;
}
-int show_journal_by_unit(
- FILE *f,
- const char *unit,
- OutputMode mode,
- unsigned n_columns,
- usec_t not_before,
- unsigned how_many,
- OutputFlags flags) {
+static int show_journal(FILE *f,
+ sd_journal *j,
+ OutputMode mode,
+ unsigned n_columns,
+ usec_t not_before,
+ unsigned how_many,
+ OutputFlags flags) {
- _cleanup_free_ char *m1 = NULL, *m2 = NULL, *m3 = NULL;
- sd_journal *j = NULL;
int r;
unsigned line = 0;
bool need_seek = false;
int warn_cutoff = flags & OUTPUT_WARN_CUTOFF;
+ assert(j);
assert(mode >= 0);
assert(mode < _OUTPUT_MODE_MAX);
- assert(unit);
-
- if (!endswith(unit, ".service") &&
- !endswith(unit, ".socket") &&
- !endswith(unit, ".mount") &&
- !endswith(unit, ".swap"))
- return 0;
-
- if (how_many <= 0)
- return 0;
-
- if (asprintf(&m1, "_SYSTEMD_UNIT=%s", unit) < 0 ||
- asprintf(&m2, "COREDUMP_UNIT=%s", unit) < 0 ||
- asprintf(&m3, "UNIT=%s", unit) < 0) {
- r = -ENOMEM;
- goto finish;
- }
-
- r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM_ONLY);
- if (r < 0)
- goto finish;
-
- /* Look for messages from the service itself */
- r = sd_journal_add_match(j, m1, 0);
- if (r < 0)
- goto finish;
-
- /* Look for coredumps of the service */
- r = sd_journal_add_disjunction(j);
- if (r < 0)
- goto finish;
- r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", 0);
- if (r < 0)
- goto finish;
- r = sd_journal_add_match(j, m2, 0);
- if (r < 0)
- goto finish;
-
- /* Look for messages from PID 1 about this service */
- r = sd_journal_add_disjunction(j);
- if (r < 0)
- goto finish;
- r = sd_journal_add_match(j, "_PID=1", 0);
- if (r < 0)
- goto finish;
- r = sd_journal_add_match(j, m3, 0);
- if (r < 0)
- goto finish;
/* Seek to end */
r = sd_journal_seek_tail(j);
@@ -916,6 +866,145 @@ int show_journal_by_unit(
}
finish:
+ return r;
+}
+
+int show_journal_by_unit(
+ FILE *f,
+ const char *unit,
+ OutputMode mode,
+ unsigned n_columns,
+ usec_t not_before,
+ unsigned how_many,
+ OutputFlags flags) {
+
+ _cleanup_free_ char *m1 = NULL, *m2 = NULL, *m3 = NULL;
+ sd_journal *j = NULL;
+ int r;
+
+ assert(mode >= 0);
+ assert(mode < _OUTPUT_MODE_MAX);
+ assert(unit);
+
+ if (!endswith(unit, ".service") &&
+ !endswith(unit, ".socket") &&
+ !endswith(unit, ".mount") &&
+ !endswith(unit, ".swap"))
+ return 0;
+
+ if (how_many <= 0)
+ return 0;
+
+ if (asprintf(&m1, "_SYSTEMD_UNIT=%s", unit) < 0 ||
+ asprintf(&m2, "COREDUMP_UNIT=%s", unit) < 0 ||
+ asprintf(&m3, "UNIT=%s", unit) < 0) {
+ r = -ENOMEM;
+ goto finish;
+ }
+
+ r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM_ONLY);
+ if (r < 0)
+ goto finish;
+
+ /* Look for messages from the service itself */
+ r = sd_journal_add_match(j, m1, 0);
+ if (r < 0)
+ goto finish;
+
+ /* Look for coredumps of the service */
+ r = sd_journal_add_disjunction(j);
+ if (r < 0)
+ goto finish;
+ r = sd_journal_add_match(j, "MESSAGE_ID=fc2e22bc6ee647b6b90729ab34a250b1", 0);
+ if (r < 0)
+ goto finish;
+ r = sd_journal_add_match(j, m2, 0);
+ if (r < 0)
+ goto finish;
+
+ /* Look for messages from PID 1 about this service */
+ r = sd_journal_add_disjunction(j);
+ if (r < 0)
+ goto finish;
+ r = sd_journal_add_match(j, "_PID=1", 0);
+ if (r < 0)
+ goto finish;
+ r = sd_journal_add_match(j, m3, 0);
+ if (r < 0)
+ goto finish;
+
+ r = show_journal(f, j, mode, n_columns, not_before, how_many, flags);
+ if (r < 0)
+ goto finish;
+
+finish:
+ if (j)
+ sd_journal_close(j);
+
+ return r;
+}
+
+int show_journal_by_user_unit(
+ FILE *f,
+ const char *unit,
+ OutputMode mode,
+ unsigned n_columns,
+ usec_t not_before,
+ unsigned how_many,
+ uid_t uid,
+ OutputFlags flags) {
+
+ _cleanup_free_ char *m1 = NULL, *m2 = NULL, *m3 = NULL;
+ sd_journal *j = NULL;
+ int r;
+
+ assert(mode >= 0);
+ assert(mode < _OUTPUT_MODE_MAX);
+ assert(unit);
+
+ if (!endswith(unit, ".service") &&
+ !endswith(unit, ".socket"))
+
+ return 0;
+
+ if (how_many <= 0)
+ return 0;
+
+ if (asprintf(&m1, "_SYSTEMD_USER_UNIT=%s", unit) < 0 ||
+ asprintf(&m2, "USER_UNIT=%s", unit) < 0 ||
+ asprintf(&m3, "_UID=%d", uid) < 0) {
+ r = -ENOMEM;
+ goto finish;
+ }
+
+ r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
+ if (r < 0)
+ goto finish;
+
+ /* Look for messages from the user service itself */
+ r = sd_journal_add_match(j, m1, 0);
+ if (r < 0)
+ goto finish;
+ r = sd_journal_add_match(j, m3, 0);
+ if (r < 0)
+ goto finish;
+
+ /* Look for messages from systemd about this service */
+ r = sd_journal_add_disjunction(j);
+ if (r < 0)
+ goto finish;
+ r = sd_journal_add_match(j, m2, 0);
+ if (r < 0)
+ goto finish;
+ r = sd_journal_add_match(j, m3, 0);
+ if (r < 0)
+ goto finish;
+
+ r = show_journal(f, j, mode, n_columns, not_before, how_many, flags);
+ if (r < 0)
+ goto finish;
+
+finish:
if (j)
sd_journal_close(j);
diff --git a/src/shared/logs-show.h b/src/shared/logs-show.h
index 6c32aa7a72..a835112c99 100644
--- a/src/shared/logs-show.h
+++ b/src/shared/logs-show.h
@@ -22,6 +22,8 @@
***/
#include <stdbool.h>
+#include <unistd.h>
+#include <sys/types.h>
#include <systemd/sd-journal.h>
@@ -44,6 +46,16 @@ int show_journal_by_unit(
unsigned how_many,
OutputFlags flags);
+int show_journal_by_user_unit(
+ FILE *f,
+ const char *unit,
+ OutputMode mode,
+ unsigned n_columns,
+ usec_t not_before,
+ unsigned how_many,
+ uid_t uid,
+ OutputFlags flags);
+
void json_escape(
FILE *f,
const char* p,