4 * Created on: Sep 4, 2013
7 * kdbus add-on to dbus daemon
12 #include <dbus/kdbus.h>
13 #include <dbus/dbus-connection-internal.h>
14 #include <dbus/dbus-bus.h>
23 char* make_kdbus_bus(DBusBusType type, DBusError *error)
26 struct kdbus_cmd_bus_make head;
30 } __attribute__ ((__aligned__(8))) bus_make;
35 /*TODO Distinguish session and system bus make*/
36 /*TODO Add dbus_set_error(error, DBUS_ERROR_FAILED, "...") (?)*/
38 _dbus_verbose("Opening /dev/kdbus/control\n");
39 fdc = open("/dev/kdbus/control", O_RDWR|O_CLOEXEC);
42 _dbus_verbose("--- error %d (%m)\n", fdc);
46 memset(&bus_make, 0, sizeof(bus_make));
47 bus_make.head.bloom_size = 64;
48 bus_make.head.flags = KDBUS_MAKE_ACCESS_WORLD;
50 snprintf(bus_make.name, sizeof(bus_make.name), "%u-kdbus", getuid());
51 bus_make.n_type = KDBUS_MAKE_NAME;
52 bus_make.n_size = KDBUS_PART_HEADER_SIZE + strlen(bus_make.name) + 1;
53 bus_make.head.size = sizeof(struct kdbus_cmd_bus_make) + bus_make.n_size;
55 _dbus_verbose("Creating bus '%s'\n", bus_make.name);
56 ret = ioctl(fdc, KDBUS_CMD_BUS_MAKE, &bus_make);
59 _dbus_verbose("--- error %d (%m)\n", ret);
63 if (asprintf(&bus, "kdbus:path=/dev/kdbus/%s/bus", bus_make.name) < 0)
69 _dbus_verbose("Return value '%s'\n", bus);
73 DBusServer* empty_server_init(char* address)
75 return dbus_server_init_mini(address);
78 DBusConnection* daemon_as_client(DBusBusType type, char* address, DBusError *error)
80 DBusConnection* connection;
82 dbus_bus_set_bus_connection_address(type, address);
84 connection = dbus_bus_get(type, error);
85 if(connection == NULL)
88 if(dbus_bus_request_name(connection, DBUS_SERVICE_DBUS, 0, error) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
91 dbus_bus_add_match(connection, "type='signal', member='NameAcquired'", error);
92 dbus_bus_add_match(connection, "type='signal', member='NameLost'", error);
93 if(dbus_error_is_set(error))
96 _dbus_connection_close_possibly_shared (connection);
97 dbus_connection_unref (connection);
101 _dbus_verbose ("Daemon connected as kdbus client.\n");