diff options
-rw-r--r-- | man/sd_journal_get_fd.xml | 69 | ||||
-rw-r--r-- | src/journal/journalctl.c | 1 | ||||
-rw-r--r-- | src/journal/libsystemd-journal.sym | 5 | ||||
-rw-r--r-- | src/journal/sd-journal.c | 13 | ||||
-rw-r--r-- | src/systemd/sd-journal.h | 1 |
5 files changed, 64 insertions, 25 deletions
diff --git a/man/sd_journal_get_fd.xml b/man/sd_journal_get_fd.xml index 3fc9c5f5b5..e57431ea9e 100644 --- a/man/sd_journal_get_fd.xml +++ b/man/sd_journal_get_fd.xml @@ -44,6 +44,7 @@ <refnamediv> <refname>sd_journal_get_fd</refname> + <refname>sd_journal_get_events</refname> <refname>sd_journal_reliable_fd</refname> <refname>sd_journal_process</refname> <refname>sd_journal_wait</refname> @@ -64,6 +65,11 @@ </funcprototype> <funcprototype> + <funcdef>int <function>sd_journal_get_events</function></funcdef> + <paramdef>sd_journal* <parameter>j</parameter></paramdef> + </funcprototype> + + <funcprototype> <funcdef>int <function>sd_journal_reliable_fd</function></funcdef> <paramdef>sd_journal* <parameter>j</parameter></paramdef> </funcprototype> @@ -87,26 +93,35 @@ <para><function>sd_journal_get_fd()</function> returns a file descriptor that may be asynchronously polled in - an external event loop and is signaled readable as - soon as the journal changes, because new entries or - files were added, rotation took place, or files have - been deleted, and similar. The file descriptor is - suitable for usage in - <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry> - where it will yield POLLIN on changes. The call takes - one argument: the journal context object. Note that - not all file systems are capable of generating the - necessary events for wakeups from this file descriptor - to be enirely reliable. In particular network files - systems do not generate suitable file change events in - all cases. In such a case an application should not - rely alone on wake-ups from this file descriptor but - wake up and recheck the journal in regular time - intervals, for example every 2s. To detect - cases where this is necessary, use + an external event loop and is signaled as soon as the + journal changes, because new entries or files were + added, rotation took place, or files have been + deleted, and similar. The file descriptor is suitable + for usage in + <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry>. Use + <function>sd_journal_get_events()</function> for an + events mask to watch for. The call takes one argument: + the journal context object. Note that not all file + systems are capable of generating the necessary events + for wakeups from this file descriptor to be enirely + reliable. In particular network files systems do not + generate suitable file change events in all cases. In + such a case an application should not rely alone on + wake-ups from this file descriptor but wake up and + recheck the journal in regular time intervals, for + example every 2s. To detect cases where this is + necessary, use <function>sd_journal_reliable_fd()</function>, below.</para> + <para><function>sd_journal_get_events()</function> + will return the + <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry> + mask to wait for. This function will return a + combination of POLLIN and POLLOUT and similar to fill + into the <literal>.events</literal> field of + <literal>struct pollfd</literal>.</para> + <para><function>sd_journal_reliable_fd()</function> may be used to check whether the wakeup events from the file descriptor returned by @@ -119,15 +134,15 @@ <function>sd_journal_get_fd()</function> are sufficient as only source for wake-ups.</para> - <para>After each POLLIN wake-up + <para>After each <literal>poll()</literal> wake-up <function>sd_journal_process()</function> needs to be - called to process events and reset the readable state - of the file descriptor. This call will also indicate + called to process events. This call will also indicate what kind of change has been detected (see below; note that spurious wake-ups are possible).</para> <para>A synchronous alternative for using <function>sd_journal_get_fd()</function>, + <function>sd_journal_get_events()</function>, <function>sd_journal_reliable_fd()</function> and <function>sd_journal_process()</function> is <function>sd_journal_wait()</function>. It will @@ -139,17 +154,23 @@ <literal>(uint64_t) -1</literal> to wait indefinitely. Internally this call simply combines <function>sd_journal_get_fd()</function>, + <function>sd_journal_get_events()</function>, <function>sd_journal_reliable_fd()</function>, <function>poll()</function> and <function>sd_journal_process()</function> into one.</para> - </refsect1> <refsect1> <title>Return Value</title> - <para><function>sd_journal_get_fd()</function> returns a valid file descriptor on success or a negative errno-style error + <para><function>sd_journal_get_fd()</function> returns + a valid file descriptor on success or a negative + errno-style error code.</para> + + <para><function>sd_journal_get_events()</function> + returns a combination of POLLIN, POLLOUT and suchlike + on success or a negative errno-style error code.</para> <para><function>sd_journal_reliable_fd()</function> @@ -184,6 +205,7 @@ <title>Notes</title> <para>The <function>sd_journal_get_fd()</function>, + <function>sd_journal_get_events()</function>, <function>sd_journal_reliable_fd()</function>, <function>sd_journal_process()</function> and <function>sd_journal_wait()</function> interfaces are @@ -249,14 +271,13 @@ int main(int argc, char *argv[]) { int wait_for_changes(sd_journal *j) { struct pollfd pollfd; pollfd.fd = sd_journal_get_fd(j); - pollfd.events = POLLIN; + pollfd.events = sd_journal_get_events(j); poll(&pollfd, 1, sd_journal_reliable_fd(j) > 0 ? -1 : 2000); return sd_journal_process(j); } </programlisting> </refsect1> - <refsect1> <title>See Also</title> diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index 1f26787cf7..86895b8f5b 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -27,7 +27,6 @@ #include <stdio.h> #include <unistd.h> #include <stdlib.h> -#include <sys/poll.h> #include <time.h> #include <getopt.h> #include <signal.h> diff --git a/src/journal/libsystemd-journal.sym b/src/journal/libsystemd-journal.sym index fbe41501f0..e241318cb0 100644 --- a/src/journal/libsystemd-journal.sym +++ b/src/journal/libsystemd-journal.sym @@ -93,3 +93,8 @@ LIBSYSTEMD_JOURNAL_198 { global: sd_journal_reliable_fd; } LIBSYSTEMD_JOURNAL_196; + +LIBSYSTEMD_JOURNAL_201 { +global: + sd_journal_get_events; +} LIBSYSTEMD_JOURNAL_198; diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index bb99671934..3eba4cd0d1 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -1981,6 +1981,19 @@ _public_ int sd_journal_get_fd(sd_journal *j) { return j->inotify_fd; } +_public_ int sd_journal_get_events(sd_journal *j) { + int fd; + + if (!j) + return -EINVAL; + + fd = sd_journal_get_fd(j); + if (fd < 0) + return fd; + + return POLLIN; +} + static void process_inotify_event(sd_journal *j, struct inotify_event *e) { Directory *d; int r; diff --git a/src/systemd/sd-journal.h b/src/systemd/sd-journal.h index 2e8d2d882f..aa7693af70 100644 --- a/src/systemd/sd-journal.h +++ b/src/systemd/sd-journal.h @@ -127,6 +127,7 @@ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l); void sd_journal_restart_unique(sd_journal *j); int sd_journal_get_fd(sd_journal *j); +int sd_journal_get_events(sd_journal *j); int sd_journal_reliable_fd(sd_journal *j); int sd_journal_process(sd_journal *j); int sd_journal_wait(sd_journal *j, uint64_t timeout_usec); |