Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief Source for dbus plugin
5 : *
6 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
7 : *
8 : */
9 :
10 : #include "dbus.h"
11 :
12 : #ifndef HAVE_KDBCONFIG
13 : #include "kdbconfig.h"
14 : #endif
15 :
16 : #include <kdblogger.h>
17 :
18 : /**
19 : * @internal
20 : * Get and setup D-Bus connection.
21 : *
22 : * @param type D-Bus bus type
23 : * @param ioBinding I/O binding (optional)
24 : * @param handlePointer Pointer to D-Bus I/O adapter handle
25 : * @return D-Bus connection or NULL on error
26 : */
27 0 : static DBusConnection * dbusGetConnection (DBusBusType type)
28 : {
29 : DBusError error;
30 0 : dbus_error_init (&error);
31 :
32 0 : DBusConnection * connection = dbus_bus_get (type, &error);
33 0 : if (connection == NULL)
34 : {
35 : ELEKTRA_LOG_WARNING ("Failed to open connection to %s message bus: %s", (type == DBUS_BUS_SYSTEM) ? "system" : "session",
36 : error.message);
37 0 : dbus_error_free (&error);
38 0 : return NULL;
39 : }
40 0 : dbus_error_free (&error);
41 :
42 0 : dbus_connection_set_exit_on_disconnect (connection, FALSE);
43 :
44 0 : return connection;
45 : }
46 :
47 : /**
48 : * @internal
49 : * Send Elektra's signal message over D-Bus.
50 : *
51 : * @param pluginData Plugin data, stores D-Bus connection, I/O binding and more
52 : * @param type D-Bus bus type
53 : * @param keyName Key name to include in message
54 : * @param signalName Signal name
55 : * @retval 1 on success
56 : * @retval -1 on error
57 : */
58 0 : int elektraDbusSendMessage (ElektraDbusPluginData * pluginData, DBusBusType type, const char * keyName, const char * signalName)
59 : {
60 : DBusConnection * connection;
61 : DBusMessage * message;
62 0 : const char * dest = NULL; // to all receivers
63 0 : const char * interface = "org.libelektra";
64 0 : const char * path = "/org/libelektra/configuration";
65 :
66 0 : switch (type)
67 : {
68 : case DBUS_BUS_SYSTEM:
69 0 : if (!pluginData->systemBus)
70 : {
71 0 : pluginData->systemBus = dbusGetConnection (type);
72 : }
73 0 : connection = pluginData->systemBus;
74 0 : break;
75 : case DBUS_BUS_SESSION:
76 0 : if (!pluginData->sessionBus)
77 : {
78 0 : pluginData->sessionBus = dbusGetConnection (type);
79 : }
80 0 : connection = pluginData->sessionBus;
81 0 : break;
82 : default:
83 : connection = NULL;
84 : }
85 0 : if (connection == NULL)
86 : {
87 : return -1;
88 : }
89 :
90 0 : message = dbus_message_new_signal (path, interface, signalName);
91 :
92 0 : if (message == NULL)
93 : {
94 : ELEKTRA_LOG_WARNING ("Couldn't allocate D-Bus message");
95 : return -1;
96 : }
97 :
98 : if (dest && !dbus_message_set_destination (message, dest))
99 : {
100 : ELEKTRA_LOG_WARNING ("Not enough memory");
101 : dbus_message_unref (message);
102 : return -1;
103 : }
104 :
105 0 : if (!dbus_message_append_args (message, DBUS_TYPE_STRING, &keyName, DBUS_TYPE_INVALID))
106 : {
107 : ELEKTRA_LOG_WARNING ("Couldn't add message argument");
108 0 : dbus_message_unref (message);
109 0 : return -1;
110 : }
111 :
112 0 : dbus_connection_send (connection, message, NULL);
113 :
114 0 : dbus_message_unref (message);
115 :
116 0 : return 1;
117 : }
|