blob: 5201234d85654821ed5d12fb76ac2a6de70a8530 [file] [log] [blame]
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +01001/* SPDX-License-Identifier: MIT */
Tom Gundersenc609cb92014-08-27 19:04:29 +02002
Tom Gundersenc609cb92014-08-27 19:04:29 +02003#include <stdlib.h>
Zbigniew Jędrzejewski-Szmek0760dfc2018-03-21 16:38:51 +01004#include <glib.h>
5#include <systemd/sd-event.h>
Tom Gundersenc609cb92014-08-27 19:04:29 +02006
Tom Gundersenc609cb92014-08-27 19:04:29 +02007typedef struct SDEventSource {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +01008 GSource source;
9 GPollFD pollfd;
10 sd_event *event;
Tom Gundersenc609cb92014-08-27 19:04:29 +020011} SDEventSource;
12
13static gboolean event_prepare(GSource *source, gint *timeout_) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010014 return sd_event_prepare(((SDEventSource *)source)->event) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020015}
16
17static gboolean event_check(GSource *source) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010018 return sd_event_wait(((SDEventSource *)source)->event, 0) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020019}
20
21static gboolean event_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010022 return sd_event_dispatch(((SDEventSource *)source)->event) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020023}
24
25static void event_finalize(GSource *source) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010026 sd_event_unref(((SDEventSource *)source)->event);
Tom Gundersenc609cb92014-08-27 19:04:29 +020027}
28
29static GSourceFuncs event_funcs = {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010030 .prepare = event_prepare,
31 .check = event_check,
32 .dispatch = event_dispatch,
33 .finalize = event_finalize,
Tom Gundersenc609cb92014-08-27 19:04:29 +020034};
35
36GSource *g_sd_event_create_source(sd_event *event) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010037 SDEventSource *source;
Tom Gundersenc609cb92014-08-27 19:04:29 +020038
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010039 source = (SDEventSource *)g_source_new(&event_funcs, sizeof(SDEventSource));
Tom Gundersenc609cb92014-08-27 19:04:29 +020040
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010041 source->event = sd_event_ref(event);
42 source->pollfd.fd = sd_event_get_fd(event);
43 source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
Tom Gundersenc609cb92014-08-27 19:04:29 +020044
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010045 g_source_add_poll((GSource *)source, &source->pollfd);
Tom Gundersenc609cb92014-08-27 19:04:29 +020046
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010047 return (GSource *)source;
Tom Gundersenc609cb92014-08-27 19:04:29 +020048}