From 61d97215c317a4154df47fbfb882aab60b92fbab Mon Sep 17 00:00:00 2001 From: Radoslaw Pajak Date: Thu, 12 Dec 2013 11:40:11 +0100 Subject: [PATCH] ListNames and ListQueuedOwners updated to work with new kdbus org.freedesktop.DBus methods ListNames and ListQueuedOwners updated to work with upstream-merged kdbus. KDBUS_CMD_NAME_LIST_QUEUED ioctl had to be readded, because kdbus native listing queued owners through KDBUS_CMD_NAME_LIST with KDBUS_NAME_LIST_QUEUED flag has results different than DBus api defines. Kdbus version lists all queued owners on the bus, while KDBUS_NAME_LIST_QUEUED complies with DBus because it sends queued owners only for given well-known name. Change-Id: I43a42ef9db3c127bd34016e206ddbb13591d2a70 Signed-off-by: Radoslaw Pajak --- bus/kdbus-d.c | 118 ++++++++++++++++++++++++++-------------------------------- dbus/kdbus.h | 1 + 2 files changed, 54 insertions(+), 65 deletions(-) diff --git a/bus/kdbus-d.c b/bus/kdbus-d.c index a19261a..4e286a6 100644 --- a/bus/kdbus-d.c +++ b/bus/kdbus-d.c @@ -359,7 +359,7 @@ char* make_kdbus_bus(DBusBusType type, const char* address, DBusError *error) else snprintf(bus_make.name, sizeof(bus_make.name), "%u-kdbus-%u", getuid(), getpid()); - bus_make.n_type = KDBUS_MAKE_NAME; + bus_make.n_type = KDBUS_ITEM_MAKE_NAME; bus_make.n_size = KDBUS_PART_HEADER_SIZE + strlen(bus_make.name) + 1; bus_make.head.size = sizeof(struct kdbus_cmd_bus_make) + bus_make.n_size; @@ -549,15 +549,13 @@ dbus_bool_t kdbus_list_services (DBusConnection* connection, char ***listp, int struct kdbus_cmd_name_list __attribute__ ((__aligned__(8))) cmd; struct kdbus_name_list *name_list; struct kdbus_cmd_name *name; - DBusTransport *transport; + DBusTransport *transport = dbus_connection_get_transport(connection); dbus_bool_t ret_val = FALSE; char** list; int list_len = 0; int i = 0; int j; - transport = dbus_connection_get_transport(connection); - if(!_dbus_transport_get_socket_fd(transport, &fd)) return FALSE; @@ -571,7 +569,7 @@ again: else { _dbus_verbose("kdbus error asking for name list: err %d (%m)\n",errno); - goto out; + return FALSE; } } @@ -591,31 +589,33 @@ again: { list[i] = strdup(name->name); if(list[i] == NULL) - { - for(j=0; jsize = cmd_size; - pCmd->names[0].id = 0; - pCmd->names[0].size = sizeof(struct kdbus_cmd_name) + name_length; - memcpy(pCmd->names[0].name, name, name_length); + pCmd->id = 0; + memcpy(pCmd->name, name, name_length); - _dbus_verbose ("Asking for queued owners of %s\n", pCmd->names[0].name); + _dbus_verbose ("Asking for queued owners of %s\n", pCmd->name); - _dbus_transport_get_socket_fd(dbus_connection_get_transport(connection), &fd); + _dbus_transport_get_socket_fd(transport, &fd); again: - cmd_size = 0; - if(ioctl(fd, KDBUS_CMD_NAME_LIST, pCmd)) + if(ioctl(fd, KDBUS_CMD_NAME_LIST_QUEUED, pCmd)) { if(errno == EINTR) goto again; - if(errno == ENOBUFS) //buffer to small to put all names into it - cmd_size = pCmd->size; //here kernel tells how much memory it needs - else if(errno == ENOENT) + else if(errno == ESRCH) { dbus_set_error (error, DBUS_ERROR_NAME_HAS_NO_OWNER, "Could not get owners of name '%s': no such name", name); - free(pCmd); return FALSE; } else @@ -672,36 +668,32 @@ dbus_bool_t kdbus_list_queued (DBusConnection *connection, DBusList **return_li goto out; } } - if(cmd_size) //kernel needs more memory - { - pCmd = realloc(pCmd, cmd_size); //prepare memory - if(pCmd == NULL) - return FALSE; - goto again; //and try again - } - else - { - struct kdbus_cmd_name* pCmd_name; - for (pCmd_name = pCmd->names; (uint8_t *)(pCmd_name) < (uint8_t *)(pCmd) + pCmd->size; pCmd_name = KDBUS_PART_NEXT(pCmd_name)) - { - char *uname = NULL; + name_list = (struct kdbus_name_list *)((char*)dbus_transport_get_pool_pointer(transport) + pCmd->offset); - _dbus_verbose ("Got queued owner id: %llu\n", (unsigned long long)pCmd_name->id); - uname = malloc(snprintf(uname, 0, ":1.%llu0", (unsigned long long)pCmd_name->id)); - if(uname == NULL) - goto out; - sprintf(uname, ":1.%llu", (unsigned long long int)pCmd_name->id); - if (!_dbus_list_append (return_list, uname)) - goto out; - } + for (owner = name_list->names; (uint8_t *)(owner) < (uint8_t *)(name_list) + name_list->size; owner = KDBUS_PART_NEXT(owner)) + { + char *uname = NULL; + + _dbus_verbose ("Got queued owner id: %llu\n", (unsigned long long)owner->id); + uname = malloc(snprintf(uname, 0, ":1.%llu0", (unsigned long long)owner->id)); + if(uname == NULL) + goto out; + sprintf(uname, ":1.%llu", (unsigned long long int)owner->id); + if (!_dbus_list_append (return_list, uname)) + goto out; } ret_val = TRUE; out: - if(pCmd) - free(pCmd); + if (ioctl(fd, KDBUS_CMD_FREE, &pCmd->offset) < 0) + { + if(errno == EINTR) + goto out; + _dbus_verbose("kdbus error freeing pool: %d (%m)\n", errno); + ret_val = FALSE; + } if(ret_val == FALSE) { DBusList *link; @@ -723,11 +715,7 @@ dbus_bool_t kdbus_list_queued (DBusConnection *connection, DBusList **return_li } } - return ret_val;*/ - dbus_set_error (error, _dbus_error_from_errno (errno), - "Failed to list queued owners of \"%s\": %s", - name, "Function not implemented yet"); - return FALSE; + return ret_val; } /* diff --git a/dbus/kdbus.h b/dbus/kdbus.h index 13863ac..6d7913a 100644 --- a/dbus/kdbus.h +++ b/dbus/kdbus.h @@ -814,6 +814,7 @@ enum kdbus_ioctl_type { KDBUS_CMD_NAME_ACQUIRE = _IOWR(KDBUS_IOC_MAGIC, 0x50, struct kdbus_cmd_name), KDBUS_CMD_NAME_RELEASE = _IOW (KDBUS_IOC_MAGIC, 0x51, struct kdbus_cmd_name), KDBUS_CMD_NAME_LIST = _IOWR(KDBUS_IOC_MAGIC, 0x52, struct kdbus_cmd_name_list), + KDBUS_CMD_NAME_LIST_QUEUED = _IOWR(KDBUS_IOC_MAGIC, 0x58, struct kdbus_cmd_conn_info), KDBUS_CMD_CONN_INFO = _IOWR(KDBUS_IOC_MAGIC, 0x60, struct kdbus_cmd_conn_info), -- 2.7.4