diff options
| -rw-r--r-- | src/dbus-common.c | 36 | ||||
| -rw-r--r-- | src/dbus-common.h | 3 | ||||
| -rw-r--r-- | src/dbus.c | 56 | ||||
| -rw-r--r-- | src/manager.c | 2 | 
4 files changed, 55 insertions, 42 deletions
| diff --git a/src/dbus-common.c b/src/dbus-common.c index 5db077b74f..c2650fdf33 100644 --- a/src/dbus-common.c +++ b/src/dbus-common.c @@ -27,6 +27,7 @@  #include <stdlib.h>  #include <dbus/dbus.h>  #include <string.h> +#include <sys/epoll.h>  #include "log.h"  #include "dbus-common.h" @@ -698,3 +699,38 @@ oom:          return NULL;  } + +uint32_t bus_flags_to_events(DBusWatch *bus_watch) { +        unsigned flags; +        uint32_t events = 0; + +        assert(bus_watch); + +        /* no watch flags for disabled watches */ +        if (!dbus_watch_get_enabled(bus_watch)) +                return 0; + +        flags = dbus_watch_get_flags(bus_watch); + +        if (flags & DBUS_WATCH_READABLE) +                events |= EPOLLIN; +        if (flags & DBUS_WATCH_WRITABLE) +                events |= EPOLLOUT; + +        return events | EPOLLHUP | EPOLLERR; +} + +unsigned bus_events_to_flags(uint32_t events) { +        unsigned flags = 0; + +        if (events & EPOLLIN) +                flags |= DBUS_WATCH_READABLE; +        if (events & EPOLLOUT) +                flags |= DBUS_WATCH_WRITABLE; +        if (events & EPOLLHUP) +                flags |= DBUS_WATCH_HANGUP; +        if (events & EPOLLERR) +                flags |= DBUS_WATCH_ERROR; + +        return flags; +} diff --git a/src/dbus-common.h b/src/dbus-common.h index a88cb13b1f..1e5545f383 100644 --- a/src/dbus-common.h +++ b/src/dbus-common.h @@ -153,4 +153,7 @@ const char *bus_errno_to_dbus(int error);  DBusMessage* bus_properties_changed_new(const char *path, const char *interface, const char *properties); +uint32_t bus_flags_to_events(DBusWatch *bus_watch); +unsigned bus_events_to_flags(uint32_t events); +  #endif diff --git a/src/dbus.c b/src/dbus.c index 187ed303b4..e153c35ab3 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -91,41 +91,6 @@ static void bus_dispatch_status(DBusConnection *bus, DBusDispatchStatus status,                  set_move_one(m->bus_connections_for_dispatch, m->bus_connections, bus);  } -static uint32_t bus_flags_to_events(DBusWatch *bus_watch) { -        unsigned flags; -        uint32_t events = 0; - -        assert(bus_watch); - -        /* no watch flags for disabled watches */ -        if (!dbus_watch_get_enabled(bus_watch)) -                return 0; - -        flags = dbus_watch_get_flags(bus_watch); - -        if (flags & DBUS_WATCH_READABLE) -                events |= EPOLLIN; -        if (flags & DBUS_WATCH_WRITABLE) -                events |= EPOLLOUT; - -        return events | EPOLLHUP | EPOLLERR; -} - -static unsigned events_to_bus_flags(uint32_t events) { -        unsigned flags = 0; - -        if (events & EPOLLIN) -                flags |= DBUS_WATCH_READABLE; -        if (events & EPOLLOUT) -                flags |= DBUS_WATCH_WRITABLE; -        if (events & EPOLLHUP) -                flags |= DBUS_WATCH_HANGUP; -        if (events & EPOLLERR) -                flags |= DBUS_WATCH_ERROR; - -        return flags; -} -  void bus_watch_event(Manager *m, Watch *w, int events) {          assert(m);          assert(w); @@ -136,7 +101,7 @@ void bus_watch_event(Manager *m, Watch *w, int events) {          if (!dbus_watch_get_enabled(w->data.bus_watch))                  return; -        dbus_watch_handle(w->data.bus_watch, events_to_bus_flags(events)); +        dbus_watch_handle(w->data.bus_watch, bus_events_to_flags(events));  }  static dbus_bool_t bus_add_watch(DBusWatch *bus_watch, void *data) { @@ -196,7 +161,8 @@ static void bus_remove_watch(DBusWatch *bus_watch, void *data) {          assert(bus_watch);          assert(m); -        if (!(w = dbus_watch_get_data(bus_watch))) +        w = dbus_watch_get_data(bus_watch); +        if (!w)                  return;          assert(w->type == WATCH_DBUS_WATCH); @@ -216,7 +182,10 @@ static void bus_toggle_watch(DBusWatch *bus_watch, void *data) {          assert(bus_watch);          assert(m); -        assert_se(w = dbus_watch_get_data(bus_watch)); +        w = dbus_watch_get_data(bus_watch); +        if (!w) +                return; +          assert(w->type == WATCH_DBUS_WATCH);          zero(ev); @@ -304,10 +273,12 @@ static void bus_remove_timeout(DBusTimeout *timeout, void *data) {          assert(timeout);          assert(m); -        if (!(w = dbus_timeout_get_data(timeout))) +        w = dbus_timeout_get_data(timeout); +        if (!w)                  return;          assert(w->type == WATCH_DBUS_TIMEOUT); +          assert_se(epoll_ctl(m->epoll_fd, EPOLL_CTL_DEL, w->fd, NULL) >= 0);          close_nointr_nofail(w->fd);          free(w); @@ -321,7 +292,10 @@ static void bus_toggle_timeout(DBusTimeout *timeout, void *data) {          assert(timeout);          assert(m); -        assert_se(w = dbus_timeout_get_data(timeout)); +        w = dbus_timeout_get_data(timeout); +        if (!w) +                return; +          assert(w->type == WATCH_DBUS_TIMEOUT);          if ((r = bus_timeout_arm(m, w)) < 0) @@ -819,7 +793,7 @@ static int bus_init_system(Manager *m) {          if (!dbus_connection_add_filter(m->system_bus, system_bus_message_filter, m, NULL)) {                  log_error("Not enough memory"); -                r = -EIO; +                r = -ENOMEM;                  goto fail;          } diff --git a/src/manager.c b/src/manager.c index 62451a0d9e..19172a2018 100644 --- a/src/manager.c +++ b/src/manager.c @@ -2260,7 +2260,7 @@ static int process_event(Manager *m, struct epoll_event *ev) {          assert(m);          assert(ev); -        assert(w = ev->data.ptr); +        assert_se(w = ev->data.ptr);          if (w->type == WATCH_INVALID)                  return 0; | 
