summaryrefslogtreecommitdiff
path: root/src/dbus.c
diff options
context:
space:
mode:
authorDavid Herrmann <dh.herrmann@gmail.com>2013-10-22 00:28:07 +0200
committerKristian Høgsberg <krh@bitplanet.net>2013-10-21 16:07:10 -0700
commit814d49f0b4998e4f9d2aa89741ad8acd699d706b (patch)
tree69cc05022f342d1cac68449641d457af632214ad /src/dbus.c
parent59ab90049f54a8371cf3ab14057f6a513b0cc7ea (diff)
downloadweston-814d49f0b4998e4f9d2aa89741ad8acd699d706b.tar.gz
dbus: add dbus-match helpers
These helpers simplify adding dbus-matches by allowing var-arg arguments to assemble the matching rules.
Diffstat (limited to 'src/dbus.c')
-rw-r--r--src/dbus.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/dbus.c b/src/dbus.c
index 4de8c9c4..a1abbd54 100644
--- a/src/dbus.c
+++ b/src/dbus.c
@@ -334,3 +334,71 @@ void weston_dbus_close(DBusConnection *c, struct wl_event_source *ctx)
dbus_connection_close(c);
dbus_connection_unref(c);
}
+
+int weston_dbus_add_match(DBusConnection *c, const char *format, ...)
+{
+ DBusError err;
+ int r;
+ va_list list;
+ char *str;
+
+ va_start(list, format);
+ r = vasprintf(&str, format, list);
+ va_end(list);
+
+ if (r < 0)
+ return -ENOMEM;
+
+ dbus_error_init(&err);
+ dbus_bus_add_match(c, str, &err);
+ free(str);
+ if (dbus_error_is_set(&err)) {
+ dbus_error_free(&err);
+ return -EIO;
+ }
+
+ return 0;
+}
+
+int weston_dbus_add_match_signal(DBusConnection *c, const char *sender,
+ const char *iface, const char *member,
+ const char *path)
+{
+ return weston_dbus_add_match(c,
+ "type='signal',"
+ "sender='%s',"
+ "interface='%s',"
+ "member='%s',"
+ "path='%s'",
+ sender, iface, member, path);
+}
+
+void weston_dbus_remove_match(DBusConnection *c, const char *format, ...)
+{
+ int r;
+ va_list list;
+ char *str;
+
+ va_start(list, format);
+ r = vasprintf(&str, format, list);
+ va_end(list);
+
+ if (r < 0)
+ return;
+
+ dbus_bus_remove_match(c, str, NULL);
+ free(str);
+}
+
+void weston_dbus_remove_match_signal(DBusConnection *c, const char *sender,
+ const char *iface, const char *member,
+ const char *path)
+{
+ return weston_dbus_remove_match(c,
+ "type='signal',"
+ "sender='%s',"
+ "interface='%s',"
+ "member='%s',"
+ "path='%s'",
+ sender, iface, member, path);
+}