215378148d5eb391206c4982b7cc62896515e189
[platform/upstream/dbus.git] / bus / kdbus-d.c
1 /*
2  * kdbus-d.c
3  *
4  *  Created on: Sep 4, 2013
5  *      Author: r.pajak
6  *
7  *  kdbus add-on to dbus daemon
8  *
9  */
10
11 #include "kdbus-d.h"
12 #include <dbus/kdbus.h>
13 #include <dbus/dbus-connection-internal.h>
14 #include <dbus/dbus-bus.h>
15 #include "dispatch.h"
16
17 #include <utils.h>
18 #include <stdlib.h>
19 #include <stdio.h>
20 #include <fcntl.h>
21 #include <unistd.h>
22
23 char* make_kdbus_bus(DBusBusType type, DBusError *error)
24 {
25     struct {
26         struct kdbus_cmd_bus_make head;
27         uint64_t n_size;
28         uint64_t n_type;
29         char name[64];
30     } __attribute__ ((__aligned__(8))) bus_make;
31
32     int fdc, ret;
33     char *bus;
34
35     /*TODO Distinguish session and system bus make*/
36     /*TODO Add dbus_set_error(error, DBUS_ERROR_FAILED,  "...") (?)*/
37
38     _dbus_verbose("Opening /dev/kdbus/control\n");
39     fdc = open("/dev/kdbus/control", O_RDWR|O_CLOEXEC);
40     if (fdc < 0)
41     {
42         _dbus_verbose("--- error %d (%m)\n", fdc);
43         return NULL;
44     }
45
46     memset(&bus_make, 0, sizeof(bus_make));
47     bus_make.head.bloom_size = 64;
48     bus_make.head.flags = KDBUS_MAKE_ACCESS_WORLD;
49
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;
54
55     _dbus_verbose("Creating bus '%s'\n", bus_make.name);
56     ret = ioctl(fdc, KDBUS_CMD_BUS_MAKE, &bus_make);
57     if (ret)
58     {
59         _dbus_verbose("--- error %d (%m)\n", ret);
60         return NULL;
61     }
62
63     if (asprintf(&bus, "kdbus:path=/dev/kdbus/%s/bus", bus_make.name) < 0)
64     {
65         BUS_SET_OOM (error);
66         return NULL;
67     }
68
69     _dbus_verbose("Return value '%s'\n", bus);
70         return bus;
71 }
72
73 DBusServer* empty_server_init(char* address)
74 {
75         return dbus_server_init_mini(address);
76 }
77
78 DBusConnection* daemon_as_client(DBusBusType type, char* address, DBusError *error)
79 {
80         DBusConnection* connection;
81
82         dbus_bus_set_bus_connection_address(type, address);
83
84         connection = dbus_bus_get(type, error);
85         if(connection == NULL)
86                 return NULL;
87
88         if(dbus_bus_request_name(connection, DBUS_SERVICE_DBUS, 0, error) != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
89                 goto failed;
90
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))
94         {
95 failed:
96                 _dbus_connection_close_possibly_shared (connection);
97                 dbus_connection_unref (connection);
98                 connection = NULL;
99         }
100         else
101                 _dbus_verbose ("Daemon connected as kdbus client.\n");
102
103         return connection;
104 }