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 @@ sd_journal_get_fd + sd_journal_get_events sd_journal_reliable_fd sd_journal_process sd_journal_wait @@ -63,6 +64,11 @@ sd_journal* j + + int sd_journal_get_events + sd_journal* j + + int sd_journal_reliable_fd sd_journal* j @@ -87,26 +93,35 @@ sd_journal_get_fd() 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 - poll2 - 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 + poll2. Use + sd_journal_get_events() 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 sd_journal_reliable_fd(), below. + sd_journal_get_events() + will return the + poll2 + mask to wait for. This function will return a + combination of POLLIN and POLLOUT and similar to fill + into the .events field of + struct pollfd. + sd_journal_reliable_fd() may be used to check whether the wakeup events from the file descriptor returned by @@ -119,15 +134,15 @@ sd_journal_get_fd() are sufficient as only source for wake-ups. - After each POLLIN wake-up + After each poll() wake-up sd_journal_process() 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). A synchronous alternative for using sd_journal_get_fd(), + sd_journal_get_events(), sd_journal_reliable_fd() and sd_journal_process() is sd_journal_wait(). It will @@ -139,17 +154,23 @@ (uint64_t) -1 to wait indefinitely. Internally this call simply combines sd_journal_get_fd(), + sd_journal_get_events(), sd_journal_reliable_fd(), poll() and sd_journal_process() into one. - Return Value - sd_journal_get_fd() returns a valid file descriptor on success or a negative errno-style error + sd_journal_get_fd() returns + a valid file descriptor on success or a negative + errno-style error code. + + sd_journal_get_events() + returns a combination of POLLIN, POLLOUT and suchlike + on success or a negative errno-style error code. sd_journal_reliable_fd() @@ -184,6 +205,7 @@ Notes The sd_journal_get_fd(), + sd_journal_get_events(), sd_journal_reliable_fd(), sd_journal_process() and sd_journal_wait() 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); } - See Also 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 #include #include -#include #include #include #include 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);