diff options
author | Lennart Poettering <lennart@poettering.net> | 2013-12-13 05:13:59 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2013-12-13 15:30:12 +0100 |
commit | 30caf8f3afd29da8507c0edbcead7935604c9f3e (patch) | |
tree | 091fe921631a9a9675608e46f8a71490219197d6 /src | |
parent | 8f726607ece2b49980152a53845aefde858768a5 (diff) |
event: add ability to change fd of an active event source
Diffstat (limited to 'src')
-rw-r--r-- | src/libsystemd-bus/sd-event.c | 36 | ||||
-rw-r--r-- | src/systemd/sd-event.h | 1 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/libsystemd-bus/sd-event.c b/src/libsystemd-bus/sd-event.c index 65ee12d5ff..2b75c6ae9c 100644 --- a/src/libsystemd-bus/sd-event.c +++ b/src/libsystemd-bus/sd-event.c @@ -1036,6 +1036,42 @@ _public_ int sd_event_source_get_io_fd(sd_event_source *s) { return s->io.fd; } +_public_ int sd_event_source_set_io_fd(sd_event_source *s, int fd) { + int r; + + assert_return(s, -EINVAL); + assert_return(fd >= 0, -EINVAL); + assert_return(s->type == SOURCE_IO, -EDOM); + assert_return(!event_pid_changed(s->event), -ECHILD); + + if (s->io.fd == fd) + return 0; + + if (s->enabled == SD_EVENT_OFF) { + s->io.fd = fd; + s->io.registered = false; + } else { + int saved_fd; + + saved_fd = s->io.fd; + assert(s->io.registered); + + s->io.fd = fd; + s->io.registered = false; + + r = source_io_register(s, s->enabled, s->io.events); + if (r < 0) { + s->io.fd = saved_fd; + s->io.registered = true; + return r; + } + + epoll_ctl(s->event->epoll_fd, EPOLL_CTL_DEL, saved_fd, NULL); + } + + return 0; +} + _public_ int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events) { assert_return(s, -EINVAL); assert_return(events, -EINVAL); diff --git a/src/systemd/sd-event.h b/src/systemd/sd-event.h index cf949be97d..4c1fbf2c33 100644 --- a/src/systemd/sd-event.h +++ b/src/systemd/sd-event.h @@ -108,6 +108,7 @@ int sd_event_source_set_enabled(sd_event_source *s, int enabled); void* sd_event_source_get_userdata(sd_event_source *s); void* sd_event_source_set_userdata(sd_event_source *s, void *userdata); int sd_event_source_get_io_fd(sd_event_source *s); +int sd_event_source_set_io_fd(sd_event_source *s, int fd); int sd_event_source_get_io_events(sd_event_source *s, uint32_t* events); int sd_event_source_set_io_events(sd_event_source *s, uint32_t events); int sd_event_source_get_io_revents(sd_event_source *s, uint32_t* revents); |