[systemd-commits] 2 commits - man/sd_journal_get_fd.xml man/sd_login_monitor_new.xml src/journal src/login src/systemd

Lennart Poettering lennart at kemper.freedesktop.org
Thu Apr 4 08:38:59 PDT 2013


 man/sd_journal_get_fd.xml          |   71 +++++++++++++++++++++++--------------
 man/sd_login_monitor_new.xml       |   43 +++++++++++++++++-----
 src/journal/journalctl.c           |    1 
 src/journal/libsystemd-journal.sym |    5 ++
 src/journal/sd-journal.c           |   13 ++++++
 src/login/libsystemd-login.sym     |    5 ++
 src/login/sd-login.c               |    9 ++++
 src/login/test-login.c             |    2 -
 src/systemd/sd-journal.h           |    1 
 src/systemd/sd-login.h             |    3 +
 10 files changed, 116 insertions(+), 37 deletions(-)

New commits:
commit dace83cbd0c2212fc0e25d36d50711b19f14b1b6
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Apr 4 17:38:08 2013 +0200

    login: add new public API call sd_login_monitor_get_events() to get poll() flags to wait for
    
    We should keep our options open, so that we can watch for POLLOUT later
    on if we wish to. CUrrently this call will always return POLLIN however.

diff --git a/man/sd_journal_get_fd.xml b/man/sd_journal_get_fd.xml
index e57431e..f29aeaa 100644
--- a/man/sd_journal_get_fd.xml
+++ b/man/sd_journal_get_fd.xml
@@ -115,11 +115,11 @@
                 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
+                will return the <function>poll()</function> mask to
+                wait for. This function will return a combination of
+                <literal>POLLIN</literal> and
+                <literal>POLLOUT</literal> and similar to fill into
+                the <literal>.events</literal> field of
                 <literal>struct pollfd</literal>.</para>
 
                 <para><function>sd_journal_reliable_fd()</function>
@@ -134,7 +134,7 @@
                 <function>sd_journal_get_fd()</function> are
                 sufficient as only source for wake-ups.</para>
 
-                <para>After each <literal>poll()</literal> wake-up
+                <para>After each <function>poll()</function> wake-up
                 <function>sd_journal_process()</function> needs to be
                 called to process events. This call will also indicate
                 what kind of change has been detected (see below; note
@@ -169,9 +169,9 @@
                 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>
+                returns a combination of <literal>POLLIN</literal>,
+                <literal>POLLOUT</literal> and suchlike on success or
+                a negative errno-style error code.</para>
 
                 <para><function>sd_journal_reliable_fd()</function>
                 returns a positive integer if the file descriptor
diff --git a/man/sd_login_monitor_new.xml b/man/sd_login_monitor_new.xml
index 2c4d05d..9442877 100644
--- a/man/sd_login_monitor_new.xml
+++ b/man/sd_login_monitor_new.xml
@@ -47,6 +47,7 @@
                 <refname>sd_login_monitor_unref</refname>
                 <refname>sd_login_monitor_flush</refname>
                 <refname>sd_login_monitor_get_fd</refname>
+                <refname>sd_login_monitor_get_events</refname>
                 <refname>sd_login_monitor</refname>
                 <refpurpose>Monitor login sessions, seats and users</refpurpose>
         </refnamediv>
@@ -76,6 +77,11 @@
                                 <paramdef>sd_login_monitor* <parameter>m</parameter></paramdef>
                         </funcprototype>
 
+                        <funcprototype>
+                                <funcdef>int <function>sd_login_monitor_get_events</function></funcdef>
+                                <paramdef>sd_login_monitor* <parameter>m</parameter></paramdef>
+                        </funcprototype>
+
                 </funcsynopsis>
         </refsynopsisdiv>
 
@@ -122,14 +128,24 @@
                 application defined event loop, based around
                 <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry>
                 or a similar interface. The application should include
-                the returned file descriptor as wake up source for
-                POLLIN events. Whenever a wake-up is triggered the
-                file descriptor needs to be reset via
+                the returned file descriptor as wake-up source for the
+                events mask returned by
+                <function>sd_login_monitor_get_events()</function>. Whenever
+                a wake-up is triggered the file descriptor needs to be
+                reset via
                 <function>sd_login_monitor_flush()</function>. An
                 application needs to reread the login state with a
                 function like
                 <citerefentry><refentrytitle>sd_get_seats</refentrytitle><manvolnum>3</manvolnum></citerefentry>
                 or similar to determine what changed.</para>
+
+                <para><function>sd_login_monitor_get_events()</function>
+                will return the <function>poll()</function> mask to
+                wait for. This function will return a combination of
+                <literal>POLLIN</literal>, <literal>POLLOUT</literal>
+                and similar to fill into the
+                <literal>.events</literal> field of <literal>struct
+                pollfd</literal>.</para>
         </refsect1>
 
         <refsect1>
@@ -140,8 +156,12 @@
                 <function>sd_login_monitor_flush()</function> return 0
                 or a positive integer. On success
                 <function>sd_login_monitor_get_fd()</function> returns
-                a Unix file descriptor. On failure, these calls return
-                a negative errno-style error code.</para>
+                a Unix file descriptor. On success
+                <function>sd_login_monitor_get_events()</function>
+                returns a combination of <literal>POLLIN</literal>,
+                <literal>POLLOUT</literal> and suchlike. On failure,
+                these calls return a negative errno-style error
+                code.</para>
 
                 <para><function>sd_login_monitor_unref()</function>
                 always returns NULL.</para>
@@ -151,10 +171,12 @@
                 <title>Notes</title>
 
                 <para>The <function>sd_login_monitor_new()</function>,
-                <function>sd_login_monitor_unref()</function>, <function>sd_login_monitor_flush()</function> and
-                <function>sd_login_monitor_get_fd()</function> interfaces
-                are available as shared library, which can be compiled
-                and linked to with the
+                <function>sd_login_monitor_unref()</function>,
+                <function>sd_login_monitor_flush()</function>,
+                <function>sd_login_monitor_get_fd()</function> and
+                <function>sd_login_monitor_get_events()</function>
+                interfaces are available as shared library, which can
+                be compiled and linked to with the
                 <literal>libsystemd-login</literal>
                 <citerefentry><refentrytitle>pkg-config</refentrytitle><manvolnum>1</manvolnum></citerefentry>
                 file.</para>
@@ -166,7 +188,8 @@
                 <para>
                         <citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
                         <citerefentry><refentrytitle>sd-login</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
-                        <citerefentry><refentrytitle>sd_get_seats</refentrytitle><manvolnum>3</manvolnum></citerefentry>
+                        <citerefentry><refentrytitle>sd_get_seats</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+                        <citerefentry><refentrytitle>poll</refentrytitle><manvolnum>2</manvolnum></citerefentry>
                 </para>
         </refsect1>
 
diff --git a/src/login/libsystemd-login.sym b/src/login/libsystemd-login.sym
index 272b0e2..55a8287 100644
--- a/src/login/libsystemd-login.sym
+++ b/src/login/libsystemd-login.sym
@@ -58,3 +58,8 @@ LIBSYSTEMD_LOGIN_198 {
 global:
         sd_session_get_tty;
 } LIBSYSTEMD_LOGIN_186;
+
+LIBSYSTEMD_LOGIN_201 {
+global:
+        sd_login_monitor_get_events;
+} LIBSYSTEMD_LOGIN_198;
diff --git a/src/login/sd-login.c b/src/login/sd-login.c
index 8867e8c..861a571 100644
--- a/src/login/sd-login.c
+++ b/src/login/sd-login.c
@@ -23,6 +23,7 @@
 #include <string.h>
 #include <errno.h>
 #include <sys/inotify.h>
+#include <sys/poll.h>
 
 #include "util.h"
 #include "cgroup-util.h"
@@ -797,3 +798,11 @@ _public_ int sd_login_monitor_get_fd(sd_login_monitor *m) {
 
         return MONITOR_TO_FD(m);
 }
+
+_public_ int sd_login_monitor_get_events(sd_login_monitor *m) {
+
+        if (!m)
+                return -EINVAL;
+
+        return POLLIN;
+}
diff --git a/src/login/test-login.c b/src/login/test-login.c
index 159ff3e..f639129 100644
--- a/src/login/test-login.c
+++ b/src/login/test-login.c
@@ -185,7 +185,7 @@ int main(int argc, char* argv[]) {
 
         zero(pollfd);
         pollfd.fd = sd_login_monitor_get_fd(m);
-        pollfd.events = POLLIN;
+        pollfd.events = sd_login_monitor_get_events(m);
 
         for (n = 0; n < 5; n++) {
                 r = poll(&pollfd, 1, -1);
diff --git a/src/systemd/sd-login.h b/src/systemd/sd-login.h
index 3746b45..57255bd 100644
--- a/src/systemd/sd-login.h
+++ b/src/systemd/sd-login.h
@@ -156,6 +156,9 @@ int sd_login_monitor_flush(sd_login_monitor *m);
 /* Get FD from monitor */
 int sd_login_monitor_get_fd(sd_login_monitor *m);
 
+/* Get poll() mask to monitor */
+int sd_login_monitor_get_events(sd_login_monitor *m);
+
 #ifdef __cplusplus
 }
 #endif

commit ee531d949c2f62374fc109252f8cbe61c2b8ee39
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Apr 4 17:22:28 2013 +0200

    journal: add public API call sd_journal_get_events()
    
    This function should be used when filling in "struct pollfd"'s .events
    field for watching the journal. It will always return POLLIN for now,
    but we should keep our options open to change this later on.
    
    This mimics libsystemd-bus' sd_bus_get_events() call with the same
    purpose.

diff --git a/man/sd_journal_get_fd.xml b/man/sd_journal_get_fd.xml
index 3fc9c5f..e57431e 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 1f26787..86895b8 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 fbe4150..e241318 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 bb99671..3eba4cd 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 2e8d2d8..aa7693a 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);



More information about the systemd-commits mailing list