[systemd-devel] [PATCH 02/17] journal: add ability to filter by current user

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Fri Jun 7 21:22:34 PDT 2013


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        | 42 ++++++++++++++++++++++++++++++++++++++----
 src/journal/journal-gatewayd.c |  2 +-
 src/journal/sd-journal.c       | 42 ++++++++++++++++++++++++++++++++++++------
 src/python-systemd/_reader.c   |  1 +
 src/shared/logs-show.c         |  2 +-
 src/systemd/sd-journal.h       |  4 +++-
 7 files changed, 90 insertions(+), 13 deletions(-)

diff --git a/Makefile-man.am b/Makefile-man.am
index 5888158..a31427e 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 76b857b..a905bc6 100644
--- a/man/sd_journal_open.xml
+++ b/man/sd_journal_open.xml
@@ -49,7 +49,9 @@
                 <refname>sd_journal</refname>
                 <refname>SD_JOURNAL_LOCAL_ONLY</refname>
                 <refname>SD_JOURNAL_RUNTIME_ONLY</refname>
+                <refname>SD_JOURNAL_SYSTEM</refname>
                 <refname>SD_JOURNAL_SYSTEM_ONLY</refname>
+                <refname>SD_JOURNAL_CURRENT_USER</refname>
                 <refpurpose>Open the system journal for reading</refpurpose>
         </refnamediv>
 
@@ -93,10 +95,14 @@
                 be opened. <literal>SD_JOURNAL_RUNTIME_ONLY</literal>
                 makes sure only volatile journal files will be opened,
                 excluding those which are stored on persistent
-                storage. <literal>SD_JOURNAL_SYSTEM_ONLY</literal>
-                will ensure that only journal files of system services
-                and the kernel (in opposition to user session processes) will
-                be opened.</para>
+                storage. <literal>SD_JOURNAL_SYSTEM</literal>
+                will cause journal files of system services and the
+                kernel (in opposition to user session processes) to
+                be opened. <literal>SD_JOURNAL_CURRENT_USER</literal>
+                will cause journal files of the current user to be
+                opened. If neither <literal>SD_JOURNAL_SYSTEM</literal>
+                nor <literal>SD_JOURNAL_CURRENT_USER</literal> are
+                specified, all journal file types will be opened.</para>
 
                 <para><function>sd_journal_open_directory()</function>
                 is similar to <function>sd_journal_open()</function>
@@ -171,6 +177,34 @@
         </refsect1>
 
         <refsect1>
+                <title>Deprecated</title>
+
+                <para><literal>SD_JOURNAL_SYSTEM_ONLY</literal> is a
+                deprecated alias to <literal>SD_JOURNAL_SYSTEM</literal>,
+                and will cause only system journal files to be opened
+                if specified alone (sans <literal>SD_JOURNAL_CURRENT_USER</literal>).
+                </para>
+        </refsect1>
+
+        <refsect1>
+                <title>History</title>
+
+                <para><function>sd_journal_open()</function>,
+                <function>sd_journal_close()</function>,
+                <literal>SD_JOURNAL_LOCAL_ONLY</literal>,
+                <literal>SD_JOURNAL_RUNTIME_ONLY</literal>,
+                <literal>SD_JOURNAL_SYSTEM_ONLY</literal> were added
+                in systemd-38.</para>
+
+                <para><function>sd_journal_open_directory()</function>
+                was added in systemd-187.</para>
+
+                <para><literal>SD_JOURNAL_SYSTEM</literal> and
+                <literal>SD_JOURNAL_CURRENT_USER</literal> were added
+                in systemd-205.</para>
+        </refsect1>
+
+        <refsect1>
                 <title>See Also</title>
 
                 <para>
diff --git a/src/journal/journal-gatewayd.c b/src/journal/journal-gatewayd.c
index 745f45f..86338c6 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 2bad243..e5b6968 100644
--- a/src/journal/sd-journal.c
+++ b/src/journal/sd-journal.c
@@ -1249,6 +1249,39 @@ 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 = strappend(prefix, ".journal");
+        const char *tilded = strappenda(full, "~");
+        const char *atted = strappenda(prefix, "@");
+
+        return streq(filename, full) ||
+                streq(filename, tilded) ||
+                (startswith(filename, atted) &&
+                 (endswith(filename, ".journal") || endswith(filename, ".journal~")));
+}
+
+static bool file_type_wanted(int flags, const char *filename) {
+        /* no flags set → every type is OK */
+        if (!(flags & (SD_JOURNAL_SYSTEM | SD_JOURNAL_CURRENT_USER)))
+                return true;
+        // why are file suffixes not checked here?
+
+        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 +1291,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 +1648,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 c4c4fdf..2c69963 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 79a977c..a6cd9f6 100644
--- a/src/shared/logs-show.c
+++ b/src/shared/logs-show.c
@@ -971,7 +971,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 5375d49..99a4df5 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,
+        SD_JOURNAL_CURRENT_USER = 8,
 };
 
 /* Wakeup event types */
-- 
1.8.2.562.g931e949



More information about the systemd-devel mailing list