summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukasz Stempien <l.stempien@samsung.com>2013-12-12 14:57:22 +0100
committerLubomir Rintel <lkundrak@v3.sk>2015-02-11 11:55:29 +0100
commit4ac5b85fb3d69ca781bf4a4f98e072f2c5602550 (patch)
tree05743eb38e7b5e4a10f31f988051af7ef6475aa6
parent1363fd023ac6b8105038c7264c419ccd3c660450 (diff)
[Daemon-fix][Upstream merge] make_kdbus_bus fixed
Fix was needed due to struct kdbus_cmd_bus_make change Signed-off-by: Lukasz Stempien <l.stempien@samsung.com> Change-Id: I860ec8f976433dc6d30de7c1fad38b8d0c04ad96
-rw-r--r--bus/kdbus-d.c119
1 files changed, 67 insertions, 52 deletions
diff --git a/bus/kdbus-d.c b/bus/kdbus-d.c
index eca2f168..f93fa9b9 100644
--- a/bus/kdbus-d.c
+++ b/bus/kdbus-d.c
@@ -312,74 +312,89 @@ int kdbus_NameQuery(const char* name, DBusTransport* transport, struct nameInfo*
*/
char* make_kdbus_bus(DBusBusType type, const char* address, DBusError *error)
{
- struct {
- struct kdbus_cmd_bus_make head;
- uint64_t n_size;
- uint64_t n_type;
- char name[64];
- } __attribute__ ((__aligned__(8))) bus_make;
-
- int fdc, ret;
- char *bus;
- char *addr_value;
-
- _dbus_verbose("Opening /dev/kdbus/control\n");
- fdc = open("/dev/kdbus/control", O_RDWR|O_CLOEXEC);
- if (fdc < 0)
+ struct kdbus_cmd_bus_make *bus_make;
+ struct kdbus_item *item;
+ __u64 name_size, item_size, bus_make_size;
+ int fdc, ret;
+ char *addr_value = NULL;
+ char *bus = NULL;
+ char *name = NULL;
+
+ if(type == DBUS_BUS_SYSTEM)
+ name_size = snprintf(name, 0, "%u-kdbus-%s", getuid(), "system") + 1;
+ else if(type == DBUS_BUS_SESSION)
+ name_size = snprintf(name, 0, "%u-kdbus", getuid()) + 1;
+ else
+ name_size = snprintf(name, 0, "%u-kdbus-%u", getuid(), getpid()) + 1;
+
+ item_size = KDBUS_PART_HEADER_SIZE + name_size;
+ bus_make_size = sizeof(struct kdbus_cmd_bus_make) + item_size;
+
+ bus_make = alloca(bus_make_size);
+ if (!bus_make)
{
- _dbus_verbose("--- error %d (%m)\n", fdc);
- dbus_set_error(error, DBUS_ERROR_FAILED, "Opening /dev/kdbus/control failed: %d (%m)", fdc);
- return NULL;
+ return NULL;
}
- addr_value = strchr(address, ':') + 1;
+ item = bus_make->items;
+ item->size = item_size;
+ item->type = KDBUS_ITEM_MAKE_NAME;
+
+ if(type == DBUS_BUS_SYSTEM)
+ sprintf(item->str, "%u-kdbus-%s", getuid(), "system");
+ else if(type == DBUS_BUS_SESSION)
+ sprintf(item->str, "%u-kdbus", getuid());
+ else
+ sprintf(item->str, "%u-kdbus-%u", getuid(), getpid());
+
+ bus_make->bloom_size = 64;
+ bus_make->size = bus_make_size;
- memset(&bus_make, 0, sizeof(bus_make));
- bus_make.head.bloom_size = 64;
#ifdef POLICY_TO_KDBUS
- bus_make.head.flags = KDBUS_MAKE_ACCESS_WORLD;
+ bus_make->flags = KDBUS_MAKE_ACCESS_WORLD;
#else
- bus_make.head.flags = KDBUS_MAKE_POLICY_OPEN;
+ bus_make->flags = KDBUS_MAKE_POLICY_OPEN;
#endif
- if(*addr_value)
- {
- if(!strcmp(addr_value, "sbb"))
- bus_make.head.flags |= KDBUS_MAKE_SBB_OFFSET;
- else
- {
- dbus_set_error_const(error, DBUS_ERROR_BAD_ADDRESS, "Invalid address parameter.");
- return NULL;
- }
- }
- if(type == DBUS_BUS_SYSTEM)
- snprintf(bus_make.name, sizeof(bus_make.name), "%u-kdbus-%s", getuid(), "system");
- else if(type == DBUS_BUS_SESSION)
- snprintf(bus_make.name, sizeof(bus_make.name), "%u-kdbus", getuid());
- else
- snprintf(bus_make.name, sizeof(bus_make.name), "%u-kdbus-%u", getuid(), getpid());
+ addr_value = strchr(address, ':') + 1;
+ if(*addr_value)
+ {
+ if(!strcmp(addr_value, "sbb"))
+ bus_make->flags |= KDBUS_MAKE_SBB_OFFSET;
+ else
+ {
+ dbus_set_error_const(error, DBUS_ERROR_BAD_ADDRESS, "Invalid address parameter.");
+ return NULL;
+ }
+ }
- 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;
+ _dbus_verbose("Opening /dev/kdbus/control\n");
+ fdc = open("/dev/kdbus/control", O_RDWR|O_CLOEXEC);
+ if (fdc < 0)
+ {
+ _dbus_verbose("--- error %d (%m)\n", fdc);
+ dbus_set_error(error, DBUS_ERROR_FAILED, "Opening /dev/kdbus/control failed: %d (%m)", fdc);
+ return NULL;
+ }
- _dbus_verbose("Creating bus '%s'\n", bus_make.name);
- ret = ioctl(fdc, KDBUS_CMD_BUS_MAKE, &bus_make);
- if (ret)
+ _dbus_verbose("Creating bus '%s'\n", (bus_make->items[0]).str);
+ ret = ioctl(fdc, KDBUS_CMD_BUS_MAKE, bus_make);
+ if (ret)
{
- _dbus_verbose("--- error %d (%m)\n", ret);
- dbus_set_error(error, DBUS_ERROR_FAILED, "Creating bus '%s' failed: %d (%m)", bus_make.name, fdc);
- return NULL;
+ _dbus_verbose("--- error %d (%m)\n", errno);
+ dbus_set_error(error, DBUS_ERROR_FAILED, "Creating bus '%s' failed: %d (%m)",
+ (bus_make->items[0]).str, errno);
+ return NULL;
}
- if (asprintf(&bus, "kdbus:path=/dev/kdbus/%s/bus", bus_make.name) < 0)
+ if (asprintf(&bus, "kdbus:path=/dev/kdbus/%s/bus", (bus_make->items[0]).str) < 0)
{
- BUS_SET_OOM (error);
- return NULL;
+ BUS_SET_OOM (error);
+ return NULL;
}
- _dbus_verbose("Return value '%s'\n", bus);
- return bus;
+ _dbus_verbose("Return value '%s'\n", bus);
+ return bus;
}
/*