From 667c24a6a86a5a26a906b7477ae81dcf4c73e64e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 4 Apr 2013 18:31:22 +0200 Subject: login: add sd_login_monitor_get_timeout() public api call We don't need this right now, but we should keep our options open, in case we need more than just an fd for waking up. --- man/sd_login_monitor_new.xml | 61 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 7 deletions(-) (limited to 'man') diff --git a/man/sd_login_monitor_new.xml b/man/sd_login_monitor_new.xml index 94428771a8..b187ad0dbe 100644 --- a/man/sd_login_monitor_new.xml +++ b/man/sd_login_monitor_new.xml @@ -48,6 +48,7 @@ sd_login_monitor_flush sd_login_monitor_get_fd sd_login_monitor_get_events + sd_login_monitor_get_timeout sd_login_monitor Monitor login sessions, seats and users @@ -82,6 +83,12 @@ sd_login_monitor* m + + int sd_login_monitor_get_timeout + sd_login_monitor* m + uint64_t* timeout_usec + + @@ -130,7 +137,9 @@ or a similar interface. The application should include the returned file descriptor as wake-up source for the events mask returned by - sd_login_monitor_get_events(). Whenever + sd_login_monitor_get_events(). It + should pass a timeout value as returned by + sd_login_monitor_get_timeout(). Whenever a wake-up is triggered the file descriptor needs to be reset via sd_login_monitor_flush(). An @@ -146,15 +155,51 @@ and similar to fill into the .events field of struct pollfd. + + sd_login_monitor_get_timeout() + will return a timeout value for usage in + poll(). This returns a value in + microseconds since the epoch of CLOCK_MONOTONIC for + timing out poll() in + timeout_usec. See + clock_gettime2 + for details about + CLOCK_MONOTONIC. If there's no + timeout to wait for this will fill in + (uint64_t) -1 instead. Note that + poll() takes a relative timeout + in milliseconds rather than an absolute timeout in + microseconds. To convert the absolute 'us' timeout into + relative 'ms', use code like the following: + + uint64_t t; +int msec; +sd_login_monitor_get_timeout(m, &t); +if (t == (uint64_t) -1) + msec = -1; +else { + struct timespec ts; + uint64_t n; + clock_getttime(CLOCK_MONOTONIC, &ts); + n = (uint64_t) ts.tv_sec * 1000000 + ts.tv_nsec / 1000; + msec = t > n ? (int) ((t - n + 999) / 1000) : 0; +} + + The code above does not do any error checking + for brevity's sake. The calculated msec + integer can be passed directly as + poll()'s timeout + parameter. Return Value On success - sd_login_monitor_new() and - sd_login_monitor_flush() return 0 - or a positive integer. On success + sd_login_monitor_new(), + sd_login_monitor_flush() and + sd_login_monitor_get_timeout() + return 0 or a positive integer. On success sd_login_monitor_get_fd() returns a Unix file descriptor. On success sd_login_monitor_get_events() @@ -173,8 +218,9 @@ The sd_login_monitor_new(), sd_login_monitor_unref(), sd_login_monitor_flush(), - sd_login_monitor_get_fd() and - sd_login_monitor_get_events() + sd_login_monitor_get_fd(), + sd_login_monitor_get_events() and + sd_login_monitor_get_timeout() interfaces are available as shared library, which can be compiled and linked to with the libsystemd-login @@ -189,7 +235,8 @@ systemd1, sd-login3, sd_get_seats3, - poll2 + poll2, + clock_gettime2 -- cgit v1.2.3-54-g00ecf