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>
22 char* make_kdbus_bus(DBusBusType type, DBusError *error)
25 struct kdbus_cmd_bus_make head;
29 } __attribute__ ((__aligned__(8))) bus_make;
34 /*TODO Distinguish session and system bus make*/
35 /*TODO Add dbus_set_error(error, DBUS_ERROR_FAILED, "...") (?)*/
37 _dbus_verbose("Opening /dev/kdbus/control\n");
38 fdc = open("/dev/kdbus/control", O_RDWR|O_CLOEXEC);
41 _dbus_verbose("--- error %d (%m)\n", fdc);
45 memset(&bus_make, 0, sizeof(bus_make));
46 bus_make.head.bloom_size = 64;
47 bus_make.head.flags = KDBUS_MAKE_ACCESS_WORLD;
49 snprintf(bus_make.name, sizeof(bus_make.name), "%u-kdbus", getuid());
50 bus_make.n_type = KDBUS_MAKE_NAME;
51 bus_make.n_size = KDBUS_PART_HEADER_SIZE + strlen(bus_make.name) + 1;
52 bus_make.head.size = sizeof(struct kdbus_cmd_bus_make) + bus_make.n_size;
54 _dbus_verbose("Creating bus '%s'\n", bus_make.name);
55 ret = ioctl(fdc, KDBUS_CMD_BUS_MAKE, &bus_make);
58 _dbus_verbose("--- error %d (%m)\n", ret);
62 if (asprintf(&bus, "kdbus:path=/dev/kdbus/%s/bus", bus_make.name) < 0)
68 _dbus_verbose("Return value '%s'\n", bus);
72 DBusServer* fake_server(char* address)
74 return dbus_server_init_mini(address);
77 DBusConnection* daemon_as_client(DBusBusType type, char* address, DBusError *error)
79 DBusConnection* connection;
81 dbus_bus_set_bus_connection_address(type, address);
83 connection = dbus_bus_get(type, error);
84 if(connection == NULL)
87 if(dbus_bus_request_name(connection, DBUS_SERVICE_DBUS, 0, error) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
90 dbus_bus_add_match(connection, "type='signal', member='NameAcquired'", error);
91 dbus_bus_add_match(connection, "type='signal', member='NameLost'", error);
92 if(dbus_error_is_set(error))
95 _dbus_connection_close_possibly_shared (connection);
96 dbus_connection_unref (connection);
100 _dbus_verbose ("Daemon connected as kdbus client.\n");
105 dbus_bool_t setup_connection(BusContext* context, DBusError* error)
107 //on the basis of bus_connections_setup_connection from connection.c
109 dbus_bool_t retval = FALSE; //todo opitimize
110 // DBusConnection* connection;
112 //todo what to do with error
114 /* connection = context->myConnection; //todo
115 dbus_connection_set_route_peer_messages (connection, TRUE);
117 if (!dbus_connection_set_watch_functions (connection,
118 add_connection_watch,
119 remove_connection_watch,
120 toggle_connection_watch,
125 if (!dbus_connection_set_timeout_functions (connection,
126 add_connection_timeout,
127 remove_connection_timeout,
132 dbus_connection_set_dispatch_status_function (connection,
133 dispatch_status_function,
134 bus_context_get_loop (context),
137 if (!bus_dispatch_add_connection (connection))
145 if (!dbus_connection_set_watch_functions (connection,
149 _dbus_assert_not_reached ("setting watch functions to NULL failed");
151 if (!dbus_connection_set_timeout_functions (connection,
155 _dbus_assert_not_reached ("setting timeout functions to NULL failed");
158 dbus_connection_set_dispatch_status_function (connection,