[daemon-dev] Start of daemon with kdbus
authorLukasz Stempien <l.stempien@samsung.com>
Thu, 5 Sep 2013 13:23:23 +0000 (15:23 +0200)
committerGerrit Code Review <gerrit2@localhost>
Fri, 6 Sep 2013 05:57:32 +0000 (14:57 +0900)
- make_kdbus_bus function implementation added
- KDBUS_PART_HEADER_SIZE definition moved from dbus-transport-kdbus.c to kdbus.h

Change-Id: I49644cf38affad7b74e60338f9e2e807612fd451

bus/kdbus-d.c
bus/kdbus-d.h
dbus/dbus-transport-kdbus.c
dbus/kdbus.h

index 5fa6cf3..033eb2b 100644 (file)
@@ -9,12 +9,63 @@
  */
 
 #include <kdbus-d.h>
+#include <dbus/kdbus.h>
 #include <dbus/dbus-connection-internal.h>
 
-dbus_bool_t make_kdbus_bus(DBusBusType type, DBusError *error)
+#include <utils.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+char* make_kdbus_bus(DBusBusType type, 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;
+
+    /*TODO Distinguish session and system bus make*/
+    /*TODO Add dbus_set_error(error, DBUS_ERROR_FAILED,  "...") (?)*/
+
+    _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);
+        return NULL;
+    }
+
+    memset(&bus_make, 0, sizeof(bus_make));
+    bus_make.head.bloom_size = 64;
+    bus_make.head.flags = KDBUS_MAKE_ACCESS_WORLD;
+
+    snprintf(bus_make.name, sizeof(bus_make.name), "%u-kdbus", getuid());
+    bus_make.n_type = KDBUS_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("Creating bus '%s'\n", bus_make.name);
+    ret = ioctl(fdc, KDBUS_CMD_BUS_MAKE, &bus_make);
+    if (ret)
+    {
+        _dbus_verbose("--- error %d (%m)\n", ret);
+        return NULL;
+    }
+
+    if (asprintf(&bus, "kdbus:path=/dev/kdbus/%s/bus", bus_make.name) < 0)
+    {
+        BUS_SET_OOM (error);
+        return NULL;
+    }
 
-       return TRUE;
+    _dbus_verbose("Return value '%s'\n", bus);
+       return bus;
 }
 
 DBusConnection* daemon_as_client(DBusBusType type, DBusError *error)
index 34705aa..63331e8 100644 (file)
 #ifndef KDBUS_D_H_
 #define KDBUS_D_H_
 
+
 #include <dbus/dbus-bus.h>
 #include <bus.h>
 
-dbus_bool_t make_kdbus_bus(DBusBusType type, DBusError *error);
+
+char* make_kdbus_bus(DBusBusType type, DBusError *error);
 DBusConnection* daemon_as_client(DBusBusType type, DBusError *error);
 
 
index fd5e091..3afbd08 100644 (file)
@@ -32,7 +32,6 @@
 #include <openssl/md5.h>
 
 #define KDBUS_ALIGN8(l) (((l) + 7) & ~7)
-#define KDBUS_PART_HEADER_SIZE offsetof(struct kdbus_item, data)
 #define KDBUS_ITEM_SIZE(s) KDBUS_ALIGN8((s) + KDBUS_PART_HEADER_SIZE)
 
 #define KDBUS_PART_NEXT(part) \
index 3cf01d3..368cec3 100644 (file)
@@ -40,6 +40,8 @@
                __u64 type;                                             \
        }
 
+#define KDBUS_PART_HEADER_SIZE offsetof(struct kdbus_item, data)
+
 /* Message sent from kernel to userspace, when the owner or starter of
  * a well-known name changes */
 struct kdbus_manager_msg_name_change {