* [PATCH 2/5] dbus: kdbus driver->name_acquire implementation
2016-03-28 22:09 [PATCH 1/5] dbus: l_dbus_name_acquire public API and driver declarations Andrew Zaborowski
@ 2016-03-28 22:09 ` Andrew Zaborowski
2016-03-28 22:09 ` [PATCH 3/5] dbus: Classic " Andrew Zaborowski
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Andrew Zaborowski @ 2016-03-28 22:09 UTC (permalink / raw)
To: ell
[-- Attachment #1: Type: text/plain, Size: 3220 bytes --]
---
ell/dbus-kernel.c | 13 ++++++++++++-
ell/dbus-private.h | 4 +++-
ell/dbus.c | 28 ++++++++++++++++++++++++++++
3 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/ell/dbus-kernel.c b/ell/dbus-kernel.c
index b47f973..9bc99d7 100644
--- a/ell/dbus-kernel.c
+++ b/ell/dbus-kernel.c
@@ -626,7 +626,8 @@ int _dbus_kernel_recv(int fd, void *kdbus_pool,
return r;
}
-int _dbus_kernel_name_acquire(int fd, const char *name)
+int _dbus_kernel_name_acquire(int fd, const char *name, bool allow_replacement,
+ bool replace_existing, bool queue, bool *queued)
{
struct {
struct kdbus_cmd head;
@@ -651,9 +652,19 @@ int _dbus_kernel_name_acquire(int fd, const char *name)
item->type = KDBUS_ITEM_NAME;
strcpy(item->str, name);
+ if (replace_existing)
+ cmd_name.head.flags |= KDBUS_NAME_REPLACE_EXISTING;
+ if (allow_replacement)
+ cmd_name.head.flags |= KDBUS_NAME_ALLOW_REPLACEMENT;
+ if (queue)
+ cmd_name.head.flags |= KDBUS_NAME_QUEUE;
+
if (ioctl(fd, KDBUS_CMD_NAME_ACQUIRE, &cmd_name) < 0)
return -errno;
+ if (queued)
+ *queued = !!(cmd_name.head.flags & KDBUS_NAME_IN_QUEUE);
+
return 0;
}
diff --git a/ell/dbus-private.h b/ell/dbus-private.h
index 0ae4c69..764ed42 100644
--- a/ell/dbus-private.h
+++ b/ell/dbus-private.h
@@ -242,7 +242,9 @@ int _dbus_kernel_recv(int fd, void *kdbus_pool,
_dbus_name_owner_change_func_t name_owner_change_func,
void *user_data);
-int _dbus_kernel_name_acquire(int fd, const char *name);
+int _dbus_kernel_name_acquire(int fd, const char *name, bool allow_replacement,
+ bool replace_existing, bool queue,
+ bool *queued);
int _dbus_kernel_add_match(int fd, uint64_t bloom_size, uint64_t bloom_n_hash,
const struct _dbus_filter_condition *rule,
int rule_len, unsigned int id);
diff --git a/ell/dbus.c b/ell/dbus.c
index 7d873ff..b9987a2 100644
--- a/ell/dbus.c
+++ b/ell/dbus.c
@@ -33,6 +33,7 @@
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
+#include <errno.h>
#include "util.h"
#include "io.h"
@@ -1087,6 +1088,32 @@ static bool kdbus_get_name_owner(struct l_dbus *dbus, const char *name)
return true;
}
+static uint32_t kdbus_name_acquire(struct l_dbus *dbus, const char *name,
+ bool allow_replacement,
+ bool replace_existing, bool queue,
+ l_dbus_name_acquire_func_t callback,
+ void *user_data)
+{
+ int fd = l_io_get_fd(dbus->io);
+ bool queued = false;
+ bool result;
+ int r;
+
+ r = _dbus_kernel_name_acquire(fd, name, allow_replacement,
+ replace_existing, queue, &queued);
+
+ result = r >= 0 || r == -EALREADY;
+
+ if (!result)
+ l_util_debug(dbus->debug_handler,
+ dbus->debug_data, strerror(-r));
+
+ if (callback)
+ callback(dbus, result, queued, user_data);
+
+ return 0;
+}
+
static const struct l_dbus_ops kdbus_ops = {
.version = 2,
.free = kdbus_free,
@@ -1097,6 +1124,7 @@ static const struct l_dbus_ops kdbus_ops = {
.remove_match = kdbus_remove_match,
.get_name_owner = kdbus_get_name_owner,
},
+ .name_acquire = kdbus_name_acquire,
};
static struct l_dbus *setup_kdbus(int fd)
--
2.5.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 3/5] dbus: Classic driver->name_acquire implementation
2016-03-28 22:09 [PATCH 1/5] dbus: l_dbus_name_acquire public API and driver declarations Andrew Zaborowski
2016-03-28 22:09 ` [PATCH 2/5] dbus: kdbus driver->name_acquire implementation Andrew Zaborowski
@ 2016-03-28 22:09 ` Andrew Zaborowski
2016-03-28 22:09 ` [PATCH 4/5] unit: Use l_dbus_name_acquire to acquire well-known name Andrew Zaborowski
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Andrew Zaborowski @ 2016-03-28 22:09 UTC (permalink / raw)
To: ell
[-- Attachment #1: Type: text/plain, Size: 2920 bytes --]
---
ell/dbus.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/ell/dbus.c b/ell/dbus.c
index b9987a2..dfeacbc 100644
--- a/ell/dbus.c
+++ b/ell/dbus.c
@@ -784,6 +784,84 @@ static bool classic_get_name_owner(struct l_dbus *bus, const char *name)
return true;
}
+struct name_request {
+ l_dbus_name_acquire_func_t callback;
+ void *user_data;
+ struct l_dbus *dbus;
+};
+
+enum dbus_name_flag {
+ DBUS_NAME_FLAG_ALLOW_REPLACEMENT = 0x1,
+ DBUS_NAME_FLAG_REPLACE_EXISTING = 0x2,
+ DBUS_NAME_FLAG_DO_NOT_QUEUE = 0x4,
+};
+
+enum dbus_name_reply {
+ DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER = 1,
+ DBUS_REQUEST_NAME_REPLY_IN_QUEUE = 2,
+ DBUS_REQUEST_NAME_REPLY_EXISTS = 3,
+ DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER = 4,
+};
+
+static void request_name_reply_cb(struct l_dbus_message *reply, void *user_data)
+{
+ struct name_request *req = user_data;
+ bool success = false, queued = false;
+ uint32_t retval;
+
+ if (!req->callback)
+ return;
+
+ /* No name owner yet */
+ if (l_dbus_message_is_error(reply))
+ goto call_back;
+
+ /* Shouldn't happen */
+ if (!l_dbus_message_get_arguments(reply, "u", &retval))
+ goto call_back;
+
+ success = (retval == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) ||
+ (retval == DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER) ||
+ (retval == DBUS_REQUEST_NAME_REPLY_IN_QUEUE);
+ queued = (retval == DBUS_REQUEST_NAME_REPLY_IN_QUEUE);
+
+call_back:
+ req->callback(req->dbus, success, queued, req->user_data);
+}
+
+static uint32_t classic_name_acquire(struct l_dbus *dbus, const char *name,
+ bool allow_replacement,
+ bool replace_existing, bool queue,
+ l_dbus_name_acquire_func_t callback,
+ void *user_data)
+{
+ struct name_request *req;
+ struct l_dbus_message *message;
+ uint32_t flags = 0;
+
+ req = l_new(struct name_request, 1);
+ req->dbus = dbus;
+ req->user_data = user_data;
+ req->callback = callback;
+
+ message = l_dbus_message_new_method_call(dbus, DBUS_SERVICE_DBUS,
+ DBUS_PATH_DBUS,
+ L_DBUS_INTERFACE_DBUS,
+ "RequestName");
+
+ if (allow_replacement)
+ flags |= DBUS_NAME_FLAG_ALLOW_REPLACEMENT;
+ if (replace_existing)
+ flags |= DBUS_NAME_FLAG_REPLACE_EXISTING;
+ if (!queue)
+ flags |= DBUS_NAME_FLAG_DO_NOT_QUEUE;
+
+ l_dbus_message_set_arguments(message, "su", name, flags);
+
+ return send_message(dbus, false, message, request_name_reply_cb,
+ req, free);
+}
+
static const struct l_dbus_ops classic_ops = {
.version = 1,
.send_message = classic_send_message,
@@ -794,6 +872,7 @@ static const struct l_dbus_ops classic_ops = {
.remove_match = classic_remove_match,
.get_name_owner = classic_get_name_owner,
},
+ .name_acquire = classic_name_acquire,
};
static void name_owner_changed_cb(struct l_dbus_message *message,
--
2.5.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 4/5] unit: Use l_dbus_name_acquire to acquire well-known name
2016-03-28 22:09 [PATCH 1/5] dbus: l_dbus_name_acquire public API and driver declarations Andrew Zaborowski
2016-03-28 22:09 ` [PATCH 2/5] dbus: kdbus driver->name_acquire implementation Andrew Zaborowski
2016-03-28 22:09 ` [PATCH 3/5] dbus: Classic " Andrew Zaborowski
@ 2016-03-28 22:09 ` Andrew Zaborowski
2016-03-28 22:09 ` [PATCH 5/5] examples: " Andrew Zaborowski
2016-03-29 1:00 ` [PATCH 1/5] dbus: l_dbus_name_acquire public API and driver declarations Denis Kenzior
4 siblings, 0 replies; 6+ messages in thread
From: Andrew Zaborowski @ 2016-03-28 22:09 UTC (permalink / raw)
To: ell
[-- Attachment #1: Type: text/plain, Size: 2754 bytes --]
---
unit/test-dbus-properties.c | 36 ++++++------------------------------
unit/test-kdbus.c | 14 +++++++++-----
2 files changed, 15 insertions(+), 35 deletions(-)
diff --git a/unit/test-dbus-properties.c b/unit/test-dbus-properties.c
index be91dd3..c7ed384 100644
--- a/unit/test-dbus-properties.c
+++ b/unit/test-dbus-properties.c
@@ -152,32 +152,11 @@ static void test_next()
} \
} while (0)
-static void request_name_setup(struct l_dbus_message *message, void *user_data)
+static void request_name_callback(struct l_dbus *dbus, bool success,
+ bool queued, void *user_data)
{
- const char *name = "org.test";
-
- l_dbus_message_set_arguments(message, "su", name, 0);
-}
-
-static void request_name_callback(struct l_dbus_message *message,
- void *user_data)
-{
- const char *error, *text;
- uint32_t result;
-
- if (l_dbus_message_get_error(message, &error, &text)) {
- l_error("error=%s", error);
- l_error("message=%s", text);
- l_main_quit();
- return;
- }
-
- if (!l_dbus_message_get_arguments(message, "u", &result)) {
- l_main_quit();
- return;
- }
-
- l_info("request name result=%d", result);
+ l_info("request name result=%s",
+ success ? (queued ? "queued" : "success") : "failed");
test_next();
}
@@ -938,11 +917,8 @@ int main(int argc, char *argv[])
l_dbus_set_ready_handler(dbus, ready_callback, dbus, NULL);
l_dbus_set_disconnect_handler(dbus, disconnect_callback, NULL, NULL);
- l_dbus_method_call(dbus, "org.freedesktop.DBus",
- "/org/freedesktop/DBus",
- "org.freedesktop.DBus", "RequestName",
- request_name_setup,
- request_name_callback, NULL, NULL);
+ l_dbus_name_acquire(dbus, "org.test", false, false, false,
+ request_name_callback, NULL);
if (!l_dbus_register_interface(dbus, "org.test", setup_test_interface,
NULL, true)) {
diff --git a/unit/test-kdbus.c b/unit/test-kdbus.c
index dde2596..8cac761 100644
--- a/unit/test-kdbus.c
+++ b/unit/test-kdbus.c
@@ -97,16 +97,20 @@ static void client_ready_callback(void *user_data)
NULL, NULL, NULL);
}
+static void service_name_acquire_callback(struct l_dbus *dbus, bool success,
+ bool queued, void *user_data)
+{
+ if (!success)
+ l_info("Failed to acquire name");
+}
+
static void service_ready_callback(void *user_data)
{
struct l_dbus *dbus = user_data;
struct l_dbus_message *message;
- int fd = _dbus_get_fd(dbus);
- int r;
- r = _dbus_kernel_name_acquire(fd, "org.test");
- if (r < 0)
- l_info("Failed to acquire name: %s", strerror(-r));
+ l_dbus_name_acquire(dbus, "org.test", false, false, false,
+ service_name_acquire_callback, NULL);
l_info("service ready");
--
2.5.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* [PATCH 5/5] examples: Use l_dbus_name_acquire to acquire well-known name
2016-03-28 22:09 [PATCH 1/5] dbus: l_dbus_name_acquire public API and driver declarations Andrew Zaborowski
` (2 preceding siblings ...)
2016-03-28 22:09 ` [PATCH 4/5] unit: Use l_dbus_name_acquire to acquire well-known name Andrew Zaborowski
@ 2016-03-28 22:09 ` Andrew Zaborowski
2016-03-29 1:00 ` [PATCH 1/5] dbus: l_dbus_name_acquire public API and driver declarations Denis Kenzior
4 siblings, 0 replies; 6+ messages in thread
From: Andrew Zaborowski @ 2016-03-28 22:09 UTC (permalink / raw)
To: ell
[-- Attachment #1: Type: text/plain, Size: 1836 bytes --]
---
examples/dbus-service.c | 33 ++++++---------------------------
1 file changed, 6 insertions(+), 27 deletions(-)
diff --git a/examples/dbus-service.c b/examples/dbus-service.c
index 347faae..51b7e4f 100644
--- a/examples/dbus-service.c
+++ b/examples/dbus-service.c
@@ -50,29 +50,11 @@ static void signal_handler(struct l_signal *signal, uint32_t signo,
}
}
-static void request_name_setup(struct l_dbus_message *message, void *user_data)
+static void request_name_callback(struct l_dbus *dbus, bool success,
+ bool queued, void *user_data)
{
- const char *name = "org.test";
-
- l_dbus_message_set_arguments(message, "su", name, 0);
-}
-
-static void request_name_callback(struct l_dbus_message *message,
- void *user_data)
-{
- const char *error, *text;
- uint32_t result;
-
- if (l_dbus_message_get_error(message, &error, &text)) {
- l_error("error=%s", error);
- l_error("message=%s", text);
- return;
- }
-
- if (!l_dbus_message_get_arguments(message, "u", &result))
- return;
-
- l_info("request name result=%d", result);
+ l_info("request name result=%s",
+ success ? (queued ? "queued" : "success") : "failed");
}
static void ready_callback(void *user_data)
@@ -211,11 +193,8 @@ int main(int argc, char *argv[])
l_dbus_set_ready_handler(dbus, ready_callback, dbus, NULL);
l_dbus_set_disconnect_handler(dbus, disconnect_callback, NULL, NULL);
- l_dbus_method_call(dbus, "org.freedesktop.DBus",
- "/org/freedesktop/DBus",
- L_DBUS_INTERFACE_DBUS, "RequestName",
- request_name_setup,
- request_name_callback, NULL, NULL);
+ l_dbus_name_acquire(dbus, "org.test", false, false, false,
+ request_name_callback, NULL);
if (!l_dbus_object_manager_enable(dbus)) {
l_info("Unable to enable Object Manager");
--
2.5.0
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH 1/5] dbus: l_dbus_name_acquire public API and driver declarations
2016-03-28 22:09 [PATCH 1/5] dbus: l_dbus_name_acquire public API and driver declarations Andrew Zaborowski
` (3 preceding siblings ...)
2016-03-28 22:09 ` [PATCH 5/5] examples: " Andrew Zaborowski
@ 2016-03-29 1:00 ` Denis Kenzior
4 siblings, 0 replies; 6+ messages in thread
From: Denis Kenzior @ 2016-03-29 1:00 UTC (permalink / raw)
To: ell
[-- Attachment #1: Type: text/plain, Size: 257 bytes --]
Hi Andrew,
On 03/28/2016 05:09 PM, Andrew Zaborowski wrote:
> ---
> ell/dbus.c | 34 ++++++++++++++++++++++++++++++++++
> ell/dbus.h | 8 ++++++++
> 2 files changed, 42 insertions(+)
All 5 patches were applied, thanks.
Regards,
-Denis
^ permalink raw reply [flat|nested] 6+ messages in thread