blob: 6349485b3a3962bdc23320a18d5f076916a4c869 [file] [log] [blame]
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +01001/* SPDX-License-Identifier: MIT */
2/* Copyright 2014 Tom Gundersen */
Tom Gundersenc609cb92014-08-27 19:04:29 +02003
Tom Gundersenc609cb92014-08-27 19:04:29 +02004#include <stdlib.h>
Zbigniew Jędrzejewski-Szmek0760dfc2018-03-21 16:38:51 +01005#include <glib.h>
6#include <systemd/sd-event.h>
Tom Gundersenc609cb92014-08-27 19:04:29 +02007
Tom Gundersenc609cb92014-08-27 19:04:29 +02008typedef struct SDEventSource {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +01009 GSource source;
10 GPollFD pollfd;
11 sd_event *event;
Tom Gundersenc609cb92014-08-27 19:04:29 +020012} SDEventSource;
13
14static gboolean event_prepare(GSource *source, gint *timeout_) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010015 return sd_event_prepare(((SDEventSource *)source)->event) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020016}
17
18static gboolean event_check(GSource *source) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010019 return sd_event_wait(((SDEventSource *)source)->event, 0) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020020}
21
22static gboolean event_dispatch(GSource *source, GSourceFunc callback, gpointer user_data) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010023 return sd_event_dispatch(((SDEventSource *)source)->event) > 0;
Tom Gundersenc609cb92014-08-27 19:04:29 +020024}
25
26static void event_finalize(GSource *source) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010027 sd_event_unref(((SDEventSource *)source)->event);
Tom Gundersenc609cb92014-08-27 19:04:29 +020028}
29
30static GSourceFuncs event_funcs = {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010031 .prepare = event_prepare,
32 .check = event_check,
33 .dispatch = event_dispatch,
34 .finalize = event_finalize,
Tom Gundersenc609cb92014-08-27 19:04:29 +020035};
36
37GSource *g_sd_event_create_source(sd_event *event) {
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010038 SDEventSource *source;
Tom Gundersenc609cb92014-08-27 19:04:29 +020039
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010040 source = (SDEventSource *)g_source_new(&event_funcs, sizeof(SDEventSource));
Tom Gundersenc609cb92014-08-27 19:04:29 +020041
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010042 source->event = sd_event_ref(event);
43 source->pollfd.fd = sd_event_get_fd(event);
44 source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
Tom Gundersenc609cb92014-08-27 19:04:29 +020045
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010046 g_source_add_poll((GSource *)source, &source->pollfd);
Tom Gundersenc609cb92014-08-27 19:04:29 +020047
Zbigniew Jędrzejewski-Szmekc0be0352018-03-21 20:02:49 +010048 return (GSource *)source;
Tom Gundersenc609cb92014-08-27 19:04:29 +020049}