You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
5.1 KiB
125 lines
5.1 KiB
7 months ago
|
From 90d73383f5ade7b9a320b7636187cd846d60c9a4 Mon Sep 17 00:00:00 2001
|
||
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
||
|
Date: Sun, 28 May 2023 14:20:27 +0900
|
||
|
Subject: [PATCH] sd-journal: introduce sd_journal_step_one()
|
||
|
|
||
|
After the commit 7a4ee861615101ddd2f95056cf30e69e41da86ce,
|
||
|
sd_journal_next() following sd_journal_seek_tail() takes no-op,
|
||
|
and we need to call sd_journal_previous(). This may be useful in
|
||
|
some cases, e.g. to fix the issue explained in the previous commit.
|
||
|
|
||
|
(cherry picked from commit b78f9481bc03455eafd9239c33fc2f124779760c)
|
||
|
|
||
|
Related: RHEL-11591
|
||
|
---
|
||
|
man/rules/meson.build | 3 ++-
|
||
|
man/sd_journal_next.xml | 17 +++++++++++++++++
|
||
|
src/libsystemd/libsystemd.sym | 6 ++++++
|
||
|
src/libsystemd/sd-journal/sd-journal.c | 10 ++++++++++
|
||
|
src/systemd/sd-journal.h | 1 +
|
||
|
5 files changed, 36 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/man/rules/meson.build b/man/rules/meson.build
|
||
|
index 65a16b1e2a..9c0d773e51 100644
|
||
|
--- a/man/rules/meson.build
|
||
|
+++ b/man/rules/meson.build
|
||
|
@@ -726,7 +726,8 @@ manpages = [
|
||
|
'SD_JOURNAL_FOREACH_BACKWARDS',
|
||
|
'sd_journal_next_skip',
|
||
|
'sd_journal_previous',
|
||
|
- 'sd_journal_previous_skip'],
|
||
|
+ 'sd_journal_previous_skip',
|
||
|
+ 'sd_journal_step_one'],
|
||
|
''],
|
||
|
['sd_journal_open',
|
||
|
'3',
|
||
|
diff --git a/man/sd_journal_next.xml b/man/sd_journal_next.xml
|
||
|
index 628abb296c..cc267fa1bd 100644
|
||
|
--- a/man/sd_journal_next.xml
|
||
|
+++ b/man/sd_journal_next.xml
|
||
|
@@ -18,6 +18,7 @@
|
||
|
<refnamediv>
|
||
|
<refname>sd_journal_next</refname>
|
||
|
<refname>sd_journal_previous</refname>
|
||
|
+ <refname>sd_journal_step_one</refname>
|
||
|
<refname>sd_journal_next_skip</refname>
|
||
|
<refname>sd_journal_previous_skip</refname>
|
||
|
<refname>SD_JOURNAL_FOREACH</refname>
|
||
|
@@ -39,6 +40,12 @@
|
||
|
<paramdef>sd_journal *<parameter>j</parameter></paramdef>
|
||
|
</funcprototype>
|
||
|
|
||
|
+ <funcprototype>
|
||
|
+ <funcdef>int <function>sd_journal_step_one</function></funcdef>
|
||
|
+ <paramdef>sd_journal *<parameter>j</parameter></paramdef>
|
||
|
+ <paramdef>int <parameter>advanced</parameter></paramdef>
|
||
|
+ </funcprototype>
|
||
|
+
|
||
|
<funcprototype>
|
||
|
<funcdef>int <function>sd_journal_next_skip</function></funcdef>
|
||
|
<paramdef>sd_journal *<parameter>j</parameter></paramdef>
|
||
|
@@ -77,6 +84,16 @@
|
||
|
<para>Similarly, <function>sd_journal_previous()</function> sets
|
||
|
the read pointer back one entry.</para>
|
||
|
|
||
|
+ <para><function>sd_journal_step_one()</function> also moves the read pointer. If the current location
|
||
|
+ is the head of the journal, e.g. when this is called following
|
||
|
+ <function>sd_journal_seek_head()</function>, then this is equivalent to
|
||
|
+ <function>sd_journal_next()</function>, and the argument <varname>advanced</varname> will be ignored.
|
||
|
+ Similary, if the current location is the tail of the journal, e.g. when this is called following
|
||
|
+ <function>sd_journal_seek_tail()</function>, then this is equivalent to
|
||
|
+ <function>sd_journal_previous()</function>, and <varname>advanced</varname> will be ignored. Otherwise,
|
||
|
+ this is equivalent to <function>sd_journal_next()</function> when <varname>advanced</varname> is
|
||
|
+ non-zero, and <function>sd_journal_previous()</function> when <varname>advanced</varname> is zero.</para>
|
||
|
+
|
||
|
<para><function>sd_journal_next_skip()</function> and
|
||
|
<function>sd_journal_previous_skip()</function> advance/set back the read pointer by multiple
|
||
|
entries at once, as specified in the <varname>skip</varname> parameter. The <varname>skip</varname>
|
||
|
diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym
|
||
|
index 3b72320f0c..26054ed2d4 100644
|
||
|
--- a/src/libsystemd/libsystemd.sym
|
||
|
+++ b/src/libsystemd/libsystemd.sym
|
||
|
@@ -796,3 +796,9 @@ global:
|
||
|
|
||
|
sd_hwdb_new_from_path;
|
||
|
} LIBSYSTEMD_251;
|
||
|
+
|
||
|
+
|
||
|
+LIBSYSTEMD_254 {
|
||
|
+global:
|
||
|
+ sd_journal_step_one;
|
||
|
+} LIBSYSTEMD_252;
|
||
|
diff --git a/src/libsystemd/sd-journal/sd-journal.c b/src/libsystemd/sd-journal/sd-journal.c
|
||
|
index 1e4d128f05..9ab31fbbc8 100644
|
||
|
--- a/src/libsystemd/sd-journal/sd-journal.c
|
||
|
+++ b/src/libsystemd/sd-journal/sd-journal.c
|
||
|
@@ -874,6 +874,16 @@ _public_ int sd_journal_previous(sd_journal *j) {
|
||
|
return real_journal_next(j, DIRECTION_UP);
|
||
|
}
|
||
|
|
||
|
+_public_ int sd_journal_step_one(sd_journal *j, int advanced) {
|
||
|
+ assert_return(j, -EINVAL);
|
||
|
+
|
||
|
+ if (j->current_location.type == LOCATION_HEAD)
|
||
|
+ return sd_journal_next(j);
|
||
|
+ if (j->current_location.type == LOCATION_TAIL)
|
||
|
+ return sd_journal_previous(j);
|
||
|
+ return real_journal_next(j, advanced ? DIRECTION_DOWN : DIRECTION_UP);
|
||
|
+}
|
||
|
+
|
||
|
static int real_journal_next_skip(sd_journal *j, direction_t direction, uint64_t skip) {
|
||
|
int c = 0, r;
|
||
|
|
||
|
diff --git a/src/systemd/sd-journal.h b/src/systemd/sd-journal.h
|
||
|
index 24638f1e0a..e34abc3a65 100644
|
||
|
--- a/src/systemd/sd-journal.h
|
||
|
+++ b/src/systemd/sd-journal.h
|
||
|
@@ -93,6 +93,7 @@ void sd_journal_close(sd_journal *j);
|
||
|
|
||
|
int sd_journal_previous(sd_journal *j);
|
||
|
int sd_journal_next(sd_journal *j);
|
||
|
+int sd_journal_step_one(sd_journal *j, int advanced);
|
||
|
|
||
|
int sd_journal_previous_skip(sd_journal *j, uint64_t skip);
|
||
|
int sd_journal_next_skip(sd_journal *j, uint64_t skip);
|