From a688baa8b71f9c74500f7883dfb137194874266a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Tue, 4 Jun 2013 22:31:05 -0400 Subject: [PATCH] journal: add ability to filter by current user This is the just the library part. SD_JOURNAL_CURRENT_USER flags is added to sd_j_open(), to open files from current user. SD_JOURNAL_SYSTEM_ONLY is renamed to SD_JOURNAL_SYSTEM, and changed to mean to (also) open system files. This way various flags can be combined, which gives them nicer semantics, especially if other ones are added later. Backwards compatibility is kept, because SD_JOURNAL_SYSTEM_ONLY is equivalent to SD_JOURNAL_SYSTEM if used alone, and before there we no other flags. --- Makefile-man.am | 10 ++++++++ man/sd_journal_open.xml | 35 ++++++++++++++++++++++---- src/journal/journal-gatewayd.c | 2 +- src/journal/sd-journal.c | 45 +++++++++++++++++++++++++++++----- src/python-systemd/_reader.c | 1 + src/shared/logs-show.c | 2 +- src/systemd/sd-journal.h | 4 ++- 7 files changed, 85 insertions(+), 14 deletions(-) diff --git a/Makefile-man.am b/Makefile-man.am index 58881586c..a31427e9b 100644 --- a/Makefile-man.am +++ b/Makefile-man.am @@ -107,6 +107,7 @@ MANPAGES_ALIAS += \ man/SD_ID128_MAKE.3 \ man/SD_INFO.3 \ man/SD_JOURNAL_APPEND.3 \ + man/SD_JOURNAL_CURRENT_USER.3 \ man/SD_JOURNAL_FOREACH.3 \ man/SD_JOURNAL_FOREACH_BACKWARDS.3 \ man/SD_JOURNAL_FOREACH_DATA.3 \ @@ -116,6 +117,7 @@ MANPAGES_ALIAS += \ man/SD_JOURNAL_NOP.3 \ man/SD_JOURNAL_RUNTIME_ONLY.3 \ man/SD_JOURNAL_SUPPRESS_LOCATION.3 \ + man/SD_JOURNAL_SYSTEM.3 \ man/SD_JOURNAL_SYSTEM_ONLY.3 \ man/SD_LISTEN_FDS_START.3 \ man/SD_NOTICE.3 \ @@ -205,6 +207,7 @@ man/SD_ID128_FORMAT_VAL.3: man/sd-id128.3 man/SD_ID128_MAKE.3: man/sd-id128.3 man/SD_INFO.3: man/sd-daemon.3 man/SD_JOURNAL_APPEND.3: man/sd_journal_get_fd.3 +man/SD_JOURNAL_CURRENT_USER.3: man/sd_journal_open.3 man/SD_JOURNAL_FOREACH.3: man/sd_journal_next.3 man/SD_JOURNAL_FOREACH_BACKWARDS.3: man/sd_journal_next.3 man/SD_JOURNAL_FOREACH_DATA.3: man/sd_journal_get_data.3 @@ -214,6 +217,7 @@ man/SD_JOURNAL_LOCAL_ONLY.3: man/sd_journal_open.3 man/SD_JOURNAL_NOP.3: man/sd_journal_get_fd.3 man/SD_JOURNAL_RUNTIME_ONLY.3: man/sd_journal_open.3 man/SD_JOURNAL_SUPPRESS_LOCATION.3: man/sd_journal_print.3 +man/SD_JOURNAL_SYSTEM.3: man/sd_journal_open.3 man/SD_JOURNAL_SYSTEM_ONLY.3: man/sd_journal_open.3 man/SD_LISTEN_FDS_START.3: man/sd_listen_fds.3 man/SD_NOTICE.3: man/sd-daemon.3 @@ -325,6 +329,9 @@ man/SD_INFO.html: man/sd-daemon.html man/SD_JOURNAL_APPEND.html: man/sd_journal_get_fd.html $(html-alias) +man/SD_JOURNAL_CURRENT_USER.html: man/sd_journal_open.html + $(html-alias) + man/SD_JOURNAL_FOREACH.html: man/sd_journal_next.html $(html-alias) @@ -352,6 +359,9 @@ man/SD_JOURNAL_RUNTIME_ONLY.html: man/sd_journal_open.html man/SD_JOURNAL_SUPPRESS_LOCATION.html: man/sd_journal_print.html $(html-alias) +man/SD_JOURNAL_SYSTEM.html: man/sd_journal_open.html + $(html-alias) + man/SD_JOURNAL_SYSTEM_ONLY.html: man/sd_journal_open.html $(html-alias) diff --git a/man/sd_journal_open.xml b/man/sd_journal_open.xml index 76b857b99..dd2f32d81 100644 --- a/man/sd_journal_open.xml +++ b/man/sd_journal_open.xml @@ -49,7 +49,8 @@ sd_journal SD_JOURNAL_LOCAL_ONLY SD_JOURNAL_RUNTIME_ONLY - SD_JOURNAL_SYSTEM_ONLY + SD_JOURNAL_SYSTEM + SD_JOURNAL_CURRENT_USER Open the system journal for reading @@ -93,10 +94,14 @@ be opened. SD_JOURNAL_RUNTIME_ONLY makes sure only volatile journal files will be opened, excluding those which are stored on persistent - storage. SD_JOURNAL_SYSTEM_ONLY - will ensure that only journal files of system services - and the kernel (in opposition to user session processes) will - be opened. + storage. SD_JOURNAL_SYSTEM + will cause journal files of system services and the + kernel (in opposition to user session processes) to + be opened. SD_JOURNAL_CURRENT_USER + will cause journal files of the current user to be + opened. If neither SD_JOURNAL_SYSTEM + nor SD_JOURNAL_CURRENT_USER are + specified, all journal file types will be opened. sd_journal_open_directory() is similar to sd_journal_open() @@ -170,6 +175,26 @@ file. + + History + + sd_journal_open(), + sd_journal_close(), + SD_JOURNAL_LOCAL_ONLY, + SD_JOURNAL_RUNTIME_ONLY, + SD_JOURNAL_SYSTEM_ONLY were added + in systemd-38. + + sd_journal_open_directory() + was added in systemd-187. + + SD_JOURNAL_SYSTEM and + SD_JOURNAL_CURRENT_USER were added + in systemd-205. + SD_JOURNAL_SYSTEM_ONLY + was deprecated. + + See Also diff --git a/src/journal/journal-gatewayd.c b/src/journal/journal-gatewayd.c index 745f45f93..86338c66f 100644 --- a/src/journal/journal-gatewayd.c +++ b/src/journal/journal-gatewayd.c @@ -109,7 +109,7 @@ static int open_journal(RequestMeta *m) { if (m->journal) return 0; - return sd_journal_open(&m->journal, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM_ONLY); + return sd_journal_open(&m->journal, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM); } static int respond_oom_internal(struct MHD_Connection *connection) { diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 2bad243ea..46511df6b 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -1249,6 +1249,42 @@ static void check_network(sd_journal *j, int fd) { F_TYPE_CMP(sfs.f_type, SMB_SUPER_MAGIC); } +static bool file_has_type_prefix(const char *prefix, const char *filename) { + const char *full, *tilded, *atted; + + full = strappend(prefix, ".journal"); + tilded = strappenda(full, "~"); + atted = strappenda(prefix, "@"); + + return streq(filename, full) || + streq(filename, tilded) || + startswith(filename, atted); +} + +static bool file_type_wanted(int flags, const char *filename) { + if (!endswith(filename, ".journal") && !endswith(filename, ".journal~")) + return false; + + /* no flags set → every type is OK */ + if (!(flags & (SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER))) + return true; + + if (flags & SD_JOURNAL_SYSTEM && file_has_type_prefix("system", filename)) + return true; + + if (flags & SD_JOURNAL_CURRENT_USER) { + char prefix[5 + DECIMAL_STR_MAX(uid_t) + 1]; + + assert_se(snprintf(prefix, sizeof(prefix), "user-%lu", (unsigned long) getuid()) + < (int) sizeof(prefix)); + + if (file_has_type_prefix(prefix, filename)) + return true; + } + + return false; +} + static int add_file(sd_journal *j, const char *prefix, const char *filename) { _cleanup_free_ char *path = NULL; int r; @@ -1258,11 +1294,7 @@ static int add_file(sd_journal *j, const char *prefix, const char *filename) { assert(prefix); assert(filename); - if ((j->flags & SD_JOURNAL_SYSTEM_ONLY) && - !(streq(filename, "system.journal") || - streq(filename, "system.journal~") || - (startswith(filename, "system@") && - (endswith(filename, ".journal") || endswith(filename, ".journal~"))))) + if (!file_type_wanted(j->flags, filename)) return 0; path = strjoin(prefix, "/", filename, NULL); @@ -1619,7 +1651,8 @@ _public_ int sd_journal_open(sd_journal **ret, int flags) { if (flags & ~(SD_JOURNAL_LOCAL_ONLY| SD_JOURNAL_RUNTIME_ONLY| - SD_JOURNAL_SYSTEM_ONLY)) + SD_JOURNAL_SYSTEM| + SD_JOURNAL_CURRENT_USER)) return -EINVAL; j = journal_new(flags, NULL); diff --git a/src/python-systemd/_reader.c b/src/python-systemd/_reader.c index c4c4fdfe1..2c699630c 100644 --- a/src/python-systemd/_reader.c +++ b/src/python-systemd/_reader.c @@ -1097,6 +1097,7 @@ init_reader(void) PyModule_AddIntConstant(m, "INVALIDATE", SD_JOURNAL_INVALIDATE) || PyModule_AddIntConstant(m, "LOCAL_ONLY", SD_JOURNAL_LOCAL_ONLY) || PyModule_AddIntConstant(m, "RUNTIME_ONLY", SD_JOURNAL_RUNTIME_ONLY) || + PyModule_AddIntConstant(m, "SYSTEM", SD_JOURNAL_SYSTEM) || PyModule_AddIntConstant(m, "SYSTEM_ONLY", SD_JOURNAL_SYSTEM_ONLY) || PyModule_AddStringConstant(m, "__version__", PACKAGE_VERSION)) { #if PY_MAJOR_VERSION >= 3 diff --git a/src/shared/logs-show.c b/src/shared/logs-show.c index 7947df3a8..013a281ea 100644 --- a/src/shared/logs-show.c +++ b/src/shared/logs-show.c @@ -1010,7 +1010,7 @@ int show_journal_by_unit( _cleanup_journal_close_ sd_journal*j = NULL; int r; - int jflags = SD_JOURNAL_LOCAL_ONLY | system * SD_JOURNAL_SYSTEM_ONLY; + int jflags = SD_JOURNAL_LOCAL_ONLY | system * SD_JOURNAL_SYSTEM; assert(mode >= 0); assert(mode < _OUTPUT_MODE_MAX); diff --git a/src/systemd/sd-journal.h b/src/systemd/sd-journal.h index 5375d4996..cf105cde7 100644 --- a/src/systemd/sd-journal.h +++ b/src/systemd/sd-journal.h @@ -86,7 +86,9 @@ typedef struct sd_journal sd_journal; enum { SD_JOURNAL_LOCAL_ONLY = 1, SD_JOURNAL_RUNTIME_ONLY = 2, - SD_JOURNAL_SYSTEM_ONLY = 4 + SD_JOURNAL_SYSTEM = 4, + SD_JOURNAL_SYSTEM_ONLY = SD_JOURNAL_SYSTEM, /* deprecated */ + SD_JOURNAL_CURRENT_USER = 8, }; /* Wakeup event types */ -- 2.30.2