summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-05-23 21:36:52 +0200
committerLennart Poettering <lennart@poettering.net>2011-06-21 19:29:43 +0200
commit3df5bf612325b0f6a19acb67befe28d6b07d3804 (patch)
tree9b46afe30a073f303227d3af2606857476cacdbe
parent3661ac04b4f2840d3345605aa35963bbde3c469d (diff)
dbus: make bus_flags_to_events() and friends generally useful
-rw-r--r--src/dbus-common.c36
-rw-r--r--src/dbus-common.h3
-rw-r--r--src/dbus.c56
-rw-r--r--src/manager.c2
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;