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.
This commit is contained in:
Lennart Poettering 2013-04-04 17:38:08 +02:00
parent ee531d949c
commit dace83cbd0
6 changed files with 60 additions and 20 deletions

View file

@ -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

View file

@ -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>

View file

@ -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;

View file

@ -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;
}

View file

@ -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);

View file

@ -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