LCOV - code coverage report
Current view: top level - src/plugins/dbusrecv - receivemessage.c (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 0 47 0.0 %
Date: 2019-09-12 12:28:41 Functions: 0 3 0.0 %

          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             : }

Generated by: LCOV version 1.13