|
|
2b72d0 |
From 88a7b31ca7d1ec38b68e7bfd99e2e53afe96cfcf Mon Sep 17 00:00:00 2001
|
|
|
2b72d0 |
From: Mikel Astiz <mikel.astiz@bmw-carit.de>
|
|
|
2b72d0 |
Date: Wed, 30 Jan 2013 09:30:30 +0100
|
|
|
2b72d0 |
Subject: [PATCH 6/7] reserve: Move get_name_owner() to the public rd_device
|
|
|
2b72d0 |
API
|
|
|
2b72d0 |
|
|
|
2b72d0 |
The function is interesting for both rd_device and rd_monitor so make
|
|
|
2b72d0 |
it part of the rd_device public API to avoid duplicated code.
|
|
|
2b72d0 |
|
|
|
2b72d0 |
The decision to move the function to reserve.c is motivated by the fact
|
|
|
2b72d0 |
that other projects (i.e. jack) use reserve.c only. Therefore, adding a
|
|
|
2b72d0 |
reserve->reserve-monitor dependency should be avoided.
|
|
|
2b72d0 |
---
|
|
|
2b72d0 |
src/modules/reserve-monitor.c | 59 ++-----------------------------------------
|
|
|
2b72d0 |
src/modules/reserve.c | 56 ++++++++++++++++++++++++++++++++++++++++
|
|
|
2b72d0 |
src/modules/reserve.h | 9 +++++++
|
|
|
2b72d0 |
3 files changed, 67 insertions(+), 57 deletions(-)
|
|
|
2b72d0 |
|
|
|
2b72d0 |
diff --git a/src/modules/reserve-monitor.c b/src/modules/reserve-monitor.c
|
|
|
2b72d0 |
index 4aa4a2b..70de870 100644
|
|
|
2b72d0 |
--- a/src/modules/reserve-monitor.c
|
|
|
2b72d0 |
+++ b/src/modules/reserve-monitor.c
|
|
|
2b72d0 |
@@ -32,6 +32,7 @@
|
|
|
2b72d0 |
#include <assert.h>
|
|
|
2b72d0 |
|
|
|
2b72d0 |
#include "reserve-monitor.h"
|
|
|
2b72d0 |
+#include "reserve.h"
|
|
|
2b72d0 |
|
|
|
2b72d0 |
struct rm_monitor {
|
|
|
2b72d0 |
int ref;
|
|
|
2b72d0 |
@@ -120,62 +121,6 @@ invalid:
|
|
|
2b72d0 |
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
|
|
|
2b72d0 |
}
|
|
|
2b72d0 |
|
|
|
2b72d0 |
-static int get_name_owner(
|
|
|
2b72d0 |
- DBusConnection *connection,
|
|
|
2b72d0 |
- const char *name,
|
|
|
2b72d0 |
- char **name_owner,
|
|
|
2b72d0 |
- DBusError *error) {
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- DBusMessage *msg, *reply;
|
|
|
2b72d0 |
- int r;
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- *name_owner = NULL;
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- if (!(msg = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "GetNameOwner"))) {
|
|
|
2b72d0 |
- r = -ENOMEM;
|
|
|
2b72d0 |
- goto fail;
|
|
|
2b72d0 |
- }
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) {
|
|
|
2b72d0 |
- r = -ENOMEM;
|
|
|
2b72d0 |
- goto fail;
|
|
|
2b72d0 |
- }
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- reply = dbus_connection_send_with_reply_and_block(connection, msg, DBUS_TIMEOUT_USE_DEFAULT, error);
|
|
|
2b72d0 |
- dbus_message_unref(msg);
|
|
|
2b72d0 |
- msg = NULL;
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- if (reply) {
|
|
|
2b72d0 |
- if (!dbus_message_get_args(reply, error, DBUS_TYPE_STRING, name_owner, DBUS_TYPE_INVALID)) {
|
|
|
2b72d0 |
- dbus_message_unref(reply);
|
|
|
2b72d0 |
- r = -EIO;
|
|
|
2b72d0 |
- goto fail;
|
|
|
2b72d0 |
- }
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- *name_owner = strdup(*name_owner);
|
|
|
2b72d0 |
- dbus_message_unref(reply);
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- if (!*name_owner) {
|
|
|
2b72d0 |
- r = -ENOMEM;
|
|
|
2b72d0 |
- goto fail;
|
|
|
2b72d0 |
- }
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- } else if (dbus_error_has_name(error, "org.freedesktop.DBus.Error.NameHasNoOwner"))
|
|
|
2b72d0 |
- dbus_error_free(error);
|
|
|
2b72d0 |
- else {
|
|
|
2b72d0 |
- r = -EIO;
|
|
|
2b72d0 |
- goto fail;
|
|
|
2b72d0 |
- }
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- return 0;
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
-fail:
|
|
|
2b72d0 |
- if (msg)
|
|
|
2b72d0 |
- dbus_message_unref(msg);
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
- return r;
|
|
|
2b72d0 |
-}
|
|
|
2b72d0 |
-
|
|
|
2b72d0 |
int rm_watch(
|
|
|
2b72d0 |
rm_monitor **_m,
|
|
|
2b72d0 |
DBusConnection *connection,
|
|
|
2b72d0 |
@@ -243,7 +188,7 @@ int rm_watch(
|
|
|
2b72d0 |
|
|
|
2b72d0 |
m->matching = 1;
|
|
|
2b72d0 |
|
|
|
2b72d0 |
- if ((r = get_name_owner(m->connection, m->service_name, &name_owner, error)) < 0)
|
|
|
2b72d0 |
+ if ((r = rd_dbus_get_name_owner(m->connection, m->service_name, &name_owner, error)) < 0)
|
|
|
2b72d0 |
goto fail;
|
|
|
2b72d0 |
|
|
|
2b72d0 |
m->busy = get_busy(m->connection, name_owner);
|
|
|
2b72d0 |
diff --git a/src/modules/reserve.c b/src/modules/reserve.c
|
|
|
2b72d0 |
index b4c168c..bbb6773 100644
|
|
|
2b72d0 |
--- a/src/modules/reserve.c
|
|
|
2b72d0 |
+++ b/src/modules/reserve.c
|
|
|
2b72d0 |
@@ -606,3 +606,59 @@ void* rd_get_userdata(rd_device *d) {
|
|
|
2b72d0 |
|
|
|
2b72d0 |
return d->userdata;
|
|
|
2b72d0 |
}
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+int rd_dbus_get_name_owner(
|
|
|
2b72d0 |
+ DBusConnection *connection,
|
|
|
2b72d0 |
+ const char *name,
|
|
|
2b72d0 |
+ char **name_owner,
|
|
|
2b72d0 |
+ DBusError *error) {
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ DBusMessage *msg, *reply;
|
|
|
2b72d0 |
+ int r;
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ *name_owner = NULL;
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ if (!(msg = dbus_message_new_method_call(DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS, "GetNameOwner"))) {
|
|
|
2b72d0 |
+ r = -ENOMEM;
|
|
|
2b72d0 |
+ goto fail;
|
|
|
2b72d0 |
+ }
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) {
|
|
|
2b72d0 |
+ r = -ENOMEM;
|
|
|
2b72d0 |
+ goto fail;
|
|
|
2b72d0 |
+ }
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ reply = dbus_connection_send_with_reply_and_block(connection, msg, DBUS_TIMEOUT_USE_DEFAULT, error);
|
|
|
2b72d0 |
+ dbus_message_unref(msg);
|
|
|
2b72d0 |
+ msg = NULL;
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ if (reply) {
|
|
|
2b72d0 |
+ if (!dbus_message_get_args(reply, error, DBUS_TYPE_STRING, name_owner, DBUS_TYPE_INVALID)) {
|
|
|
2b72d0 |
+ dbus_message_unref(reply);
|
|
|
2b72d0 |
+ r = -EIO;
|
|
|
2b72d0 |
+ goto fail;
|
|
|
2b72d0 |
+ }
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ *name_owner = strdup(*name_owner);
|
|
|
2b72d0 |
+ dbus_message_unref(reply);
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ if (!*name_owner) {
|
|
|
2b72d0 |
+ r = -ENOMEM;
|
|
|
2b72d0 |
+ goto fail;
|
|
|
2b72d0 |
+ }
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ } else if (dbus_error_has_name(error, "org.freedesktop.DBus.Error.NameHasNoOwner"))
|
|
|
2b72d0 |
+ dbus_error_free(error);
|
|
|
2b72d0 |
+ else {
|
|
|
2b72d0 |
+ r = -EIO;
|
|
|
2b72d0 |
+ goto fail;
|
|
|
2b72d0 |
+ }
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ return 0;
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+fail:
|
|
|
2b72d0 |
+ if (msg)
|
|
|
2b72d0 |
+ dbus_message_unref(msg);
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
+ return r;
|
|
|
2b72d0 |
+}
|
|
|
2b72d0 |
diff --git a/src/modules/reserve.h b/src/modules/reserve.h
|
|
|
2b72d0 |
index bc50870..6527bd7 100644
|
|
|
2b72d0 |
--- a/src/modules/reserve.h
|
|
|
2b72d0 |
+++ b/src/modules/reserve.h
|
|
|
2b72d0 |
@@ -72,6 +72,15 @@ void rd_set_userdata(rd_device *d, void *userdata);
|
|
|
2b72d0 |
* userdata was set. */
|
|
|
2b72d0 |
void* rd_get_userdata(rd_device *d);
|
|
|
2b72d0 |
|
|
|
2b72d0 |
+/* Helper function to get the unique connection name owning a given
|
|
|
2b72d0 |
+ * name. Returns 0 on success, a negative errno style return value on
|
|
|
2b72d0 |
+ * error. */
|
|
|
2b72d0 |
+int rd_dbus_get_name_owner(
|
|
|
2b72d0 |
+ DBusConnection *connection,
|
|
|
2b72d0 |
+ const char *name,
|
|
|
2b72d0 |
+ char **name_owner,
|
|
|
2b72d0 |
+ DBusError *error);
|
|
|
2b72d0 |
+
|
|
|
2b72d0 |
#ifdef __cplusplus
|
|
|
2b72d0 |
}
|
|
|
2b72d0 |
#endif
|
|
|
2b72d0 |
--
|
|
|
2b72d0 |
1.8.1.4
|
|
|
2b72d0 |
|