diff options
author | Lukasz Stempien <l.stempien@samsung.com> | 2013-12-12 14:57:22 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2015-02-11 11:55:29 +0100 |
commit | 4ac5b85fb3d69ca781bf4a4f98e072f2c5602550 (patch) | |
tree | 05743eb38e7b5e4a10f31f988051af7ef6475aa6 | |
parent | 1363fd023ac6b8105038c7264c419ccd3c660450 (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.c | 119 |
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; } /* |