Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief
5 : *
6 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
7 : */
8 :
9 : #include "dbusrecv.h"
10 :
11 : #include <kdblogger.h>
12 :
13 : #define RECEIVE_MATCH_RULE "type='signal',interface='org.libelektra',path='/org/libelektra/configuration'"
14 :
15 : /**
16 : * @internal
17 : * Get and setup D-Bus connection.
18 : *
19 : * handlePointer is updated to point to D-Bus I/O adapter handle.
20 : *
21 : * @param type D-Bus bus type
22 : * @param ioBinding I/O binding (optional)
23 : * @param handlePointer Pointer to D-Bus I/O adapter handle
24 : * @return D-Bus connection or NULL on error
25 : */
26 0 : static DBusConnection * dbusGetConnection (DBusBusType type, ElektraIoInterface * ioBinding, ElektraIoAdapterDbusHandle ** handlePointer)
27 : {
28 : DBusError error;
29 0 : dbus_error_init (&error);
30 :
31 0 : DBusConnection * connection = dbus_bus_get_private (type, &error);
32 0 : if (connection == NULL)
33 : {
34 : ELEKTRA_LOG_WARNING ("Failed to open connection to %s message bus: %s", (type == DBUS_BUS_SYSTEM) ? "system" : "session",
35 : error.message);
36 0 : dbus_error_free (&error);
37 0 : return NULL;
38 : }
39 0 : dbus_error_free (&error);
40 :
41 0 : dbus_connection_set_exit_on_disconnect (connection, FALSE);
42 :
43 0 : ElektraIoAdapterDbusHandle * handle = elektraIoAdapterDbusAttach (connection, ioBinding);
44 0 : if (!handle)
45 : {
46 : ELEKTRA_LOG_WARNING ("Failed to attach to the I/O binding");
47 : return NULL;
48 : }
49 0 : *handlePointer = handle;
50 :
51 0 : return connection;
52 : }
53 :
54 : /**
55 : * @internal
56 : * Revert changes made to D-Bus connection by elektraDbusRecvSetupReceive().
57 : *
58 : * @param pluginData Plugin data
59 : * @param connection D-bus bus type
60 : * @param filter_func message handler
61 : * @retval 1 on success
62 : * @retval 0 on error
63 : */
64 0 : int elektraDbusRecvTeardownReceive (ElektraDbusRecvPluginData * pluginData, DBusBusType type, DBusHandleMessageFunction filter_func)
65 : {
66 : DBusConnection * connection;
67 : DBusError error;
68 :
69 0 : switch (type)
70 : {
71 : case DBUS_BUS_SYSTEM:
72 0 : if (!pluginData->systemBus)
73 : {
74 0 : pluginData->systemBus = dbusGetConnection (type, pluginData->ioBinding, &pluginData->systemBusAdapter);
75 : }
76 0 : connection = pluginData->systemBus;
77 0 : break;
78 : case DBUS_BUS_SESSION:
79 0 : if (!pluginData->sessionBus)
80 : {
81 0 : pluginData->sessionBus = dbusGetConnection (type, pluginData->ioBinding, &pluginData->sessionBusAdapter);
82 : }
83 0 : connection = pluginData->sessionBus;
84 0 : break;
85 : default:
86 : connection = NULL;
87 : }
88 0 : if (connection == NULL)
89 : {
90 : return 0;
91 : }
92 :
93 0 : dbus_error_init (&error);
94 :
95 0 : dbus_bus_remove_match (connection, RECEIVE_MATCH_RULE, &error);
96 0 : if (dbus_error_is_set (&error)) goto error;
97 :
98 0 : dbus_connection_remove_filter (connection, filter_func, pluginData);
99 :
100 0 : return 1;
101 : error:
102 : ELEKTRA_LOG_WARNING ("Error occurred\n");
103 0 : dbus_error_free (&error);
104 0 : return 0;
105 : }
106 :
107 : /**
108 : * @internal
109 : * Setup D-Bus connection for receiving Elektra's signal messages.
110 : *
111 : * @param pluginData Plugin data
112 : * @param connection D-Bus connection
113 : * @param filter_func message handler
114 : * @retval 1 on success
115 : * @retval 0 on error
116 : */
117 0 : int elektraDbusRecvSetupReceive (ElektraDbusRecvPluginData * pluginData, DBusBusType type, DBusHandleMessageFunction filter_func)
118 : {
119 : DBusConnection * connection;
120 : DBusError error;
121 :
122 0 : switch (type)
123 : {
124 : case DBUS_BUS_SYSTEM:
125 0 : if (!pluginData->systemBus)
126 : {
127 0 : pluginData->systemBus = dbusGetConnection (type, pluginData->ioBinding, &pluginData->systemBusAdapter);
128 : }
129 0 : connection = pluginData->systemBus;
130 0 : break;
131 : case DBUS_BUS_SESSION:
132 0 : if (!pluginData->sessionBus)
133 : {
134 0 : pluginData->sessionBus = dbusGetConnection (type, pluginData->ioBinding, &pluginData->sessionBusAdapter);
135 : }
136 0 : connection = pluginData->sessionBus;
137 0 : break;
138 : default:
139 : connection = NULL;
140 : }
141 0 : if (connection == NULL)
142 : {
143 : return 0;
144 : }
145 :
146 0 : dbus_error_init (&error);
147 :
148 0 : dbus_bus_add_match (connection, RECEIVE_MATCH_RULE, &error);
149 0 : if (dbus_error_is_set (&error)) goto error;
150 :
151 0 : if (!dbus_connection_add_filter (connection, filter_func, pluginData, NULL))
152 : {
153 : goto error;
154 : }
155 :
156 : return 1;
157 : error:
158 : ELEKTRA_LOG_WARNING ("Error occurred\n");
159 0 : dbus_error_free (&error);
160 0 : return 0;
161 : }
|