Home | History | Annotate | Download | only in dbus
      1 /* -*- mode: C; c-file-style: "gnu" -*- */
      2 /* dbus-bus.c  Convenience functions for communicating with the bus.
      3  *
      4  * Copyright (C) 2003  CodeFactory AB
      5  * Copyright (C) 2003  Red Hat, Inc.
      6  *
      7  * Licensed under the Academic Free License version 2.1
      8  *
      9  * This program is free software; you can redistribute it and/or modify
     10  * it under the terms of the GNU General Public License as published by
     11  * the Free Software Foundation; either version 2 of the License, or
     12  * (at your option) any later version.
     13  *
     14  * This program is distributed in the hope that it will be useful,
     15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     17  * GNU General Public License for more details.
     18  *
     19  * You should have received a copy of the GNU General Public License
     20  * along with this program; if not, write to the Free Software
     21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
     22  *
     23  */
     24 
     25 #include "dbus-bus.h"
     26 #include "dbus-protocol.h"
     27 #include "dbus-internals.h"
     28 #include "dbus-message.h"
     29 #include "dbus-marshal-validate.h"
     30 #include "dbus-threads-internal.h"
     31 #include "dbus-connection-internal.h"
     32 #include <string.h>
     33 
     34 /**
     35  * @defgroup DBusBus Message bus APIs
     36  * @ingroup DBus
     37  * @brief Functions for communicating with the message bus
     38  *
     39  * dbus_bus_get() allows all modules and libraries in a given
     40  * process to share the same connection to the bus daemon by storing
     41  * the connection globally.
     42  *
     43  * All other functions in this module are just convenience functions;
     44  * most of them invoke methods on the bus daemon, by sending method
     45  * call messages to #DBUS_SERVICE_DBUS. These convenience functions
     46  * often make blocking method calls. If you don't want to block,
     47  * you can send the method call messages manually in the same way
     48  * you would any other method call message.
     49  *
     50  * This module is the only one in libdbus that's specific to
     51  * communicating with the message bus daemon. The rest of the API can
     52  * also be used for connecting to another application directly.
     53  *
     54  * @todo right now the default address of the system bus is hardcoded,
     55  * so if you change it in the global config file suddenly you have to
     56  * set DBUS_SYSTEM_BUS_ADDRESS env variable.  Might be nice if the
     57  * client lib somehow read the config file, or if the bus on startup
     58  * somehow wrote out its address to a well-known spot, but might also
     59  * not be worth it.
     60  */
     61 
     62 /**
     63  * @defgroup DBusBusInternals Message bus APIs internals
     64  * @ingroup DBusInternals
     65  * @brief Internals of functions for communicating with the message bus
     66  *
     67  * @{
     68  */
     69 
     70 /**
     71  * Block of message-bus-related data we attach to each
     72  * #DBusConnection used with these convenience functions.
     73  *
     74  */
     75 typedef struct
     76 {
     77   DBusConnection *connection; /**< Connection we're associated with */
     78   char *unique_name; /**< Unique name of this connection */
     79 
     80   unsigned int is_well_known : 1; /**< Is one of the well-known connections in our global array */
     81 } BusData;
     82 
     83 /** The slot we have reserved to store BusData.
     84  */
     85 static dbus_int32_t bus_data_slot = -1;
     86 
     87 /** Number of bus types */
     88 #define N_BUS_TYPES 3
     89 
     90 static DBusConnection *bus_connections[N_BUS_TYPES];
     91 static char *bus_connection_addresses[N_BUS_TYPES] = { NULL, NULL, NULL };
     92 
     93 static DBusBusType activation_bus_type = DBUS_BUS_STARTER;
     94 
     95 static dbus_bool_t initialized = FALSE;
     96 
     97 /**
     98  * Lock for globals in this file
     99  */
    100 _DBUS_DEFINE_GLOBAL_LOCK (bus);
    101 
    102 /**
    103  * Global lock covering all BusData on any connection. The bet is
    104  * that some lock contention is better than more memory
    105  * for a per-connection lock, but it's tough to imagine it mattering
    106  * either way.
    107  */
    108 _DBUS_DEFINE_GLOBAL_LOCK (bus_datas);
    109 
    110 static void
    111 addresses_shutdown_func (void *data)
    112 {
    113   int i;
    114 
    115   i = 0;
    116   while (i < N_BUS_TYPES)
    117     {
    118       if (bus_connections[i] != NULL)
    119         _dbus_warn_check_failed ("dbus_shutdown() called but connections were still live. This probably means the application did not drop all its references to bus connections.\n");
    120 
    121       dbus_free (bus_connection_addresses[i]);
    122       bus_connection_addresses[i] = NULL;
    123       ++i;
    124     }
    125 
    126   activation_bus_type = DBUS_BUS_STARTER;
    127 }
    128 
    129 static dbus_bool_t
    130 get_from_env (char           **connection_p,
    131               const char      *env_var)
    132 {
    133   const char *s;
    134 
    135   _dbus_assert (*connection_p == NULL);
    136 
    137   s = _dbus_getenv (env_var);
    138   if (s == NULL || *s == '\0')
    139     return TRUE; /* successfully didn't use the env var */
    140   else
    141     {
    142       *connection_p = _dbus_strdup (s);
    143       return *connection_p != NULL;
    144     }
    145 }
    146 
    147 static dbus_bool_t
    148 init_connections_unlocked (void)
    149 {
    150   if (!initialized)
    151     {
    152       const char *s;
    153       int i;
    154 
    155       i = 0;
    156       while (i < N_BUS_TYPES)
    157         {
    158           bus_connections[i] = NULL;
    159           ++i;
    160         }
    161 
    162       /* Don't init these twice, we may run this code twice if
    163        * init_connections_unlocked() fails midway through.
    164        * In practice, each block below should contain only one
    165        * "return FALSE" or running through twice may not
    166        * work right.
    167        */
    168 
    169        if (bus_connection_addresses[DBUS_BUS_SYSTEM] == NULL)
    170          {
    171            _dbus_verbose ("Filling in system bus address...\n");
    172 
    173            if (!get_from_env (&bus_connection_addresses[DBUS_BUS_SYSTEM],
    174                               "DBUS_SYSTEM_BUS_ADDRESS"))
    175              return FALSE;
    176          }
    177 
    178 
    179        if (bus_connection_addresses[DBUS_BUS_SYSTEM] == NULL)
    180          {
    181            /* Use default system bus address if none set in environment */
    182            bus_connection_addresses[DBUS_BUS_SYSTEM] =
    183              _dbus_strdup (DBUS_SYSTEM_BUS_DEFAULT_ADDRESS);
    184 
    185            if (bus_connection_addresses[DBUS_BUS_SYSTEM] == NULL)
    186              return FALSE;
    187 
    188            _dbus_verbose ("  used default system bus \"%s\"\n",
    189                           bus_connection_addresses[DBUS_BUS_SYSTEM]);
    190          }
    191        else
    192          _dbus_verbose ("  used env var system bus \"%s\"\n",
    193                         bus_connection_addresses[DBUS_BUS_SYSTEM]);
    194 
    195       if (bus_connection_addresses[DBUS_BUS_SESSION] == NULL)
    196         {
    197           _dbus_verbose ("Filling in session bus address...\n");
    198 
    199           if (!get_from_env (&bus_connection_addresses[DBUS_BUS_SESSION],
    200                              "DBUS_SESSION_BUS_ADDRESS"))
    201             return FALSE;
    202 
    203 	  if (bus_connection_addresses[DBUS_BUS_SESSION] == NULL)
    204 	    bus_connection_addresses[DBUS_BUS_SESSION] =
    205 	      _dbus_strdup (DBUS_SESSION_BUS_DEFAULT_ADDRESS);
    206 
    207           if (bus_connection_addresses[DBUS_BUS_SESSION] == NULL)
    208              return FALSE;
    209 
    210           _dbus_verbose ("  \"%s\"\n", bus_connection_addresses[DBUS_BUS_SESSION] ?
    211                          bus_connection_addresses[DBUS_BUS_SESSION] : "none set");
    212         }
    213 
    214       if (bus_connection_addresses[DBUS_BUS_STARTER] == NULL)
    215         {
    216           _dbus_verbose ("Filling in activation bus address...\n");
    217 
    218           if (!get_from_env (&bus_connection_addresses[DBUS_BUS_STARTER],
    219                              "DBUS_STARTER_ADDRESS"))
    220             return FALSE;
    221 
    222           _dbus_verbose ("  \"%s\"\n", bus_connection_addresses[DBUS_BUS_STARTER] ?
    223                          bus_connection_addresses[DBUS_BUS_STARTER] : "none set");
    224         }
    225 
    226 
    227       if (bus_connection_addresses[DBUS_BUS_STARTER] != NULL)
    228         {
    229           s = _dbus_getenv ("DBUS_STARTER_BUS_TYPE");
    230 
    231           if (s != NULL)
    232             {
    233               _dbus_verbose ("Bus activation type was set to \"%s\"\n", s);
    234 
    235               if (strcmp (s, "system") == 0)
    236                 activation_bus_type = DBUS_BUS_SYSTEM;
    237               else if (strcmp (s, "session") == 0)
    238                 activation_bus_type = DBUS_BUS_SESSION;
    239             }
    240         }
    241       else
    242         {
    243           /* Default to the session bus instead if available */
    244           if (bus_connection_addresses[DBUS_BUS_SESSION] != NULL)
    245             {
    246               bus_connection_addresses[DBUS_BUS_STARTER] =
    247                 _dbus_strdup (bus_connection_addresses[DBUS_BUS_SESSION]);
    248               if (bus_connection_addresses[DBUS_BUS_STARTER] == NULL)
    249                 return FALSE;
    250             }
    251         }
    252 
    253       /* If we return FALSE we have to be sure that restarting
    254        * the above code will work right
    255        */
    256 
    257       if (!_dbus_setenv ("DBUS_ACTIVATION_ADDRESS", NULL))
    258         return FALSE;
    259 
    260       if (!_dbus_setenv ("DBUS_ACTIVATION_BUS_TYPE", NULL))
    261         return FALSE;
    262 
    263       if (!_dbus_register_shutdown_func (addresses_shutdown_func,
    264                                          NULL))
    265         return FALSE;
    266 
    267       initialized = TRUE;
    268     }
    269 
    270   return initialized;
    271 }
    272 
    273 static void
    274 bus_data_free (void *data)
    275 {
    276   BusData *bd = data;
    277 
    278   if (bd->is_well_known)
    279     {
    280       int i;
    281       _DBUS_LOCK (bus);
    282       /* We may be stored in more than one slot */
    283       /* This should now be impossible - these slots are supposed to
    284        * be cleared on disconnect, so should not need to be cleared on
    285        * finalize
    286        */
    287       i = 0;
    288       while (i < N_BUS_TYPES)
    289         {
    290           if (bus_connections[i] == bd->connection)
    291             bus_connections[i] = NULL;
    292 
    293           ++i;
    294         }
    295       _DBUS_UNLOCK (bus);
    296     }
    297 
    298   dbus_free (bd->unique_name);
    299   dbus_free (bd);
    300 
    301   dbus_connection_free_data_slot (&bus_data_slot);
    302 }
    303 
    304 static BusData*
    305 ensure_bus_data (DBusConnection *connection)
    306 {
    307   BusData *bd;
    308 
    309   if (!dbus_connection_allocate_data_slot (&bus_data_slot))
    310     return NULL;
    311 
    312   bd = dbus_connection_get_data (connection, bus_data_slot);
    313   if (bd == NULL)
    314     {
    315       bd = dbus_new0 (BusData, 1);
    316       if (bd == NULL)
    317         {
    318           dbus_connection_free_data_slot (&bus_data_slot);
    319           return NULL;
    320         }
    321 
    322       bd->connection = connection;
    323 
    324       if (!dbus_connection_set_data (connection, bus_data_slot, bd,
    325                                      bus_data_free))
    326         {
    327           dbus_free (bd);
    328           dbus_connection_free_data_slot (&bus_data_slot);
    329           return NULL;
    330         }
    331 
    332       /* Data slot refcount now held by the BusData */
    333     }
    334   else
    335     {
    336       dbus_connection_free_data_slot (&bus_data_slot);
    337     }
    338 
    339   return bd;
    340 }
    341 
    342 /**
    343  * Internal function that checks to see if this
    344  * is a shared connection owned by the bus and if it is unref it.
    345  *
    346  * @param connection a connection that has been disconnected.
    347  */
    348 void
    349 _dbus_bus_notify_shared_connection_disconnected_unlocked (DBusConnection *connection)
    350 {
    351   int i;
    352 
    353   _DBUS_LOCK (bus);
    354 
    355   /* We are expecting to have the connection saved in only one of these
    356    * slots, but someone could in a pathological case set system and session
    357    * bus to the same bus or something. Or set one of them to the starter
    358    * bus without setting the starter bus type in the env variable.
    359    * So we don't break the loop as soon as we find a match.
    360    */
    361   for (i = 0; i < N_BUS_TYPES; ++i)
    362     {
    363       if (bus_connections[i] == connection)
    364         {
    365           bus_connections[i] = NULL;
    366         }
    367     }
    368 
    369   _DBUS_UNLOCK (bus);
    370 }
    371 
    372 static DBusConnection *
    373 internal_bus_get (DBusBusType  type,
    374                   dbus_bool_t  private,
    375                   DBusError   *error)
    376 {
    377   const char *address;
    378   DBusConnection *connection;
    379   BusData *bd;
    380   DBusBusType address_type;
    381 
    382   _dbus_return_val_if_fail (type >= 0 && type < N_BUS_TYPES, NULL);
    383   _dbus_return_val_if_error_is_set (error, NULL);
    384 
    385   _DBUS_LOCK (bus);
    386 
    387   if (!init_connections_unlocked ())
    388     {
    389       _DBUS_UNLOCK (bus);
    390       _DBUS_SET_OOM (error);
    391       return NULL;
    392     }
    393 
    394   /* We want to use the activation address even if the
    395    * activating bus is the session or system bus,
    396    * per the spec.
    397    */
    398   address_type = type;
    399 
    400   /* Use the real type of the activation bus for getting its
    401    * connection, but only if the real type's address is available. (If
    402    * the activating bus isn't a well-known bus then
    403    * activation_bus_type == DBUS_BUS_STARTER)
    404    */
    405   if (type == DBUS_BUS_STARTER &&
    406       bus_connection_addresses[activation_bus_type] != NULL)
    407     type = activation_bus_type;
    408 
    409   if (!private && bus_connections[type] != NULL)
    410     {
    411       connection = bus_connections[type];
    412       dbus_connection_ref (connection);
    413 
    414       _DBUS_UNLOCK (bus);
    415       return connection;
    416     }
    417 
    418   address = bus_connection_addresses[address_type];
    419   if (address == NULL)
    420     {
    421       dbus_set_error (error, DBUS_ERROR_FAILED,
    422                       "Unable to determine the address of the message bus (try 'man dbus-launch' and 'man dbus-daemon' for help)");
    423       _DBUS_UNLOCK (bus);
    424       return NULL;
    425     }
    426 
    427   if (private)
    428     connection = dbus_connection_open_private (address, error);
    429   else
    430     connection = dbus_connection_open (address, error);
    431 
    432   if (!connection)
    433     {
    434       _DBUS_ASSERT_ERROR_IS_SET (error);
    435       _DBUS_UNLOCK (bus);
    436       return NULL;
    437     }
    438 
    439   /* By default we're bound to the lifecycle of
    440    * the message bus.
    441    */
    442   dbus_connection_set_exit_on_disconnect (connection,
    443                                           TRUE);
    444 
    445   if (!dbus_bus_register (connection, error))
    446     {
    447       _DBUS_ASSERT_ERROR_IS_SET (error);
    448       _dbus_connection_close_possibly_shared (connection);
    449       dbus_connection_unref (connection);
    450 
    451       _DBUS_UNLOCK (bus);
    452       return NULL;
    453     }
    454 
    455   if (!private)
    456     {
    457       /* store a weak ref to the connection (dbus-connection.c is
    458        * supposed to have a strong ref that it drops on disconnect,
    459        * since this is a shared connection)
    460        */
    461       bus_connections[type] = connection;
    462     }
    463 
    464   _DBUS_LOCK (bus_datas);
    465   bd = ensure_bus_data (connection);
    466   _dbus_assert (bd != NULL); /* it should have been created on
    467                                 register, so OOM not possible */
    468   bd->is_well_known = TRUE;
    469   _DBUS_UNLOCK (bus_datas);
    470 
    471 
    472   _DBUS_UNLOCK (bus);
    473 
    474   /* Return a reference to the caller */
    475   return connection;
    476 }
    477 
    478 
    479 /** @} */ /* end of implementation details docs */
    480 
    481 /**
    482  * @addtogroup DBusBus
    483  * @{
    484  */
    485 
    486 /**
    487  * Connects to a bus daemon and registers the client with it.  If a
    488  * connection to the bus already exists, then that connection is
    489  * returned.  The caller of this function owns a reference to the bus.
    490  *
    491  * The caller may NOT call dbus_connection_close() on this connection;
    492  * see dbus_connection_open() and dbus_connection_close() for details
    493  * on that.
    494  *
    495  * If this function obtains a new connection object never before
    496  * returned from dbus_bus_get(), it will call
    497  * dbus_connection_set_exit_on_disconnect(), so the application
    498  * will exit if the connection closes. You can undo this
    499  * by calling dbus_connection_set_exit_on_disconnect() yourself
    500  * after you get the connection.
    501  *
    502  * dbus_bus_get() calls dbus_bus_register() for you.
    503  *
    504  * If returning a newly-created connection, this function will block
    505  * until authentication and bus registration are complete.
    506  *
    507  * @param type bus type
    508  * @param error address where an error can be returned.
    509  * @returns a #DBusConnection with new ref
    510  */
    511 DBusConnection *
    512 dbus_bus_get (DBusBusType  type,
    513 	      DBusError   *error)
    514 {
    515   return internal_bus_get (type, FALSE, error);
    516 }
    517 
    518 /**
    519  * Connects to a bus daemon and registers the client with it as with
    520  * dbus_bus_register().  Unlike dbus_bus_get(), always creates a new
    521  * connection. This connection will not be saved or recycled by
    522  * libdbus. Caller owns a reference to the bus and must either close
    523  * it or know it to be closed prior to releasing this reference.
    524  *
    525  * See dbus_connection_open_private() for more details on when to
    526  * close and unref this connection.
    527  *
    528  * This function calls
    529  * dbus_connection_set_exit_on_disconnect() on the new connection, so the application
    530  * will exit if the connection closes. You can undo this
    531  * by calling dbus_connection_set_exit_on_disconnect() yourself
    532  * after you get the connection.
    533  *
    534  * dbus_bus_get_private() calls dbus_bus_register() for you.
    535  *
    536  * This function will block until authentication and bus registration
    537  * are complete.
    538  *
    539  * @param type bus type
    540  * @param error address where an error can be returned.
    541  * @returns a DBusConnection with new ref
    542  */
    543 DBusConnection *
    544 dbus_bus_get_private (DBusBusType  type,
    545                       DBusError   *error)
    546 {
    547   return internal_bus_get (type, TRUE, error);
    548 }
    549 
    550 /**
    551  * Registers a connection with the bus. This must be the first
    552  * thing an application does when connecting to the message bus.
    553  * If registration succeeds, the unique name will be set,
    554  * and can be obtained using dbus_bus_get_unique_name().
    555  *
    556  * This function will block until registration is complete.
    557  *
    558  * If the connection has already registered with the bus
    559  * (determined by checking whether dbus_bus_get_unique_name()
    560  * returns a non-#NULL value), then this function does nothing.
    561  *
    562  * If you use dbus_bus_get() or dbus_bus_get_private() this
    563  * function will be called for you.
    564  *
    565  * @note Just use dbus_bus_get() or dbus_bus_get_private() instead of
    566  * dbus_bus_register() and save yourself some pain. Using
    567  * dbus_bus_register() manually is only useful if you have your
    568  * own custom message bus not found in #DBusBusType.
    569  *
    570  * If you open a bus connection with dbus_connection_open() or
    571  * dbus_connection_open_private() you will have to dbus_bus_register()
    572  * yourself, or make the appropriate registration method calls
    573  * yourself. If you send the method calls yourself, call
    574  * dbus_bus_set_unique_name() with the unique bus name you get from
    575  * the bus.
    576  *
    577  * For shared connections (created with dbus_connection_open()) in a
    578  * multithreaded application, you can't really make the registration
    579  * calls yourself, because you don't know whether some other thread is
    580  * also registering, and the bus will kick you off if you send two
    581  * registration messages.
    582  *
    583  * If you use dbus_bus_register() however, there is a lock that
    584  * keeps both apps from registering at the same time.
    585  *
    586  * The rule in a multithreaded app, then, is that dbus_bus_register()
    587  * must be used to register, or you need to have your own locks that
    588  * all threads in the app will respect.
    589  *
    590  * In a single-threaded application you can register by hand instead
    591  * of using dbus_bus_register(), as long as you check
    592  * dbus_bus_get_unique_name() to see if a unique name has already been
    593  * stored by another thread before you send the registration messages.
    594  *
    595  * @param connection the connection
    596  * @param error place to store errors
    597  * @returns #TRUE on success
    598  */
    599 dbus_bool_t
    600 dbus_bus_register (DBusConnection *connection,
    601                    DBusError      *error)
    602 {
    603   DBusMessage *message, *reply;
    604   char *name;
    605   BusData *bd;
    606   dbus_bool_t retval;
    607 
    608   _dbus_return_val_if_fail (connection != NULL, FALSE);
    609   _dbus_return_val_if_error_is_set (error, FALSE);
    610 
    611   retval = FALSE;
    612 
    613   _DBUS_LOCK (bus_datas);
    614 
    615   bd = ensure_bus_data (connection);
    616   if (bd == NULL)
    617     {
    618       _DBUS_SET_OOM (error);
    619       _DBUS_UNLOCK (bus_datas);
    620       return FALSE;
    621     }
    622 
    623   if (bd->unique_name != NULL)
    624     {
    625       _dbus_verbose ("Ignoring attempt to register the same DBusConnection %s with the message bus a second time.\n",
    626                      bd->unique_name);
    627       _DBUS_UNLOCK (bus_datas);
    628 
    629       /* Success! */
    630       return TRUE;
    631     }
    632 
    633   message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
    634                                           DBUS_PATH_DBUS,
    635                                           DBUS_INTERFACE_DBUS,
    636                                           "Hello");
    637 
    638   if (!message)
    639     {
    640       _DBUS_SET_OOM (error);
    641 
    642       _DBUS_UNLOCK (bus_datas);
    643       return FALSE;
    644     }
    645 
    646   reply = dbus_connection_send_with_reply_and_block (connection, message, -1, error);
    647 
    648   dbus_message_unref (message);
    649 
    650   if (reply == NULL)
    651     goto out;
    652   else if (dbus_set_error_from_message (error, reply))
    653     goto out;
    654   else if (!dbus_message_get_args (reply, error,
    655                                    DBUS_TYPE_STRING, &name,
    656                                    DBUS_TYPE_INVALID))
    657     goto out;
    658 
    659   bd->unique_name = _dbus_strdup (name);
    660   if (bd->unique_name == NULL)
    661     {
    662       _DBUS_SET_OOM (error);
    663       goto out;
    664     }
    665 
    666   retval = TRUE;
    667 
    668  out:
    669   if (reply)
    670     dbus_message_unref (reply);
    671 
    672   if (!retval)
    673     _DBUS_ASSERT_ERROR_IS_SET (error);
    674 
    675   _DBUS_UNLOCK (bus_datas);
    676 
    677   return retval;
    678 }
    679 
    680 
    681 /**
    682  * Sets the unique name of the connection, as assigned by the message
    683  * bus.  Can only be used if you registered with the bus manually
    684  * (i.e. if you did not call dbus_bus_register()). Can only be called
    685  * once per connection.  After the unique name is set, you can get it
    686  * with dbus_bus_get_unique_name().
    687  *
    688  * The only reason to use this function is to re-implement the
    689  * equivalent of dbus_bus_register() yourself. One (probably unusual)
    690  * reason to do that might be to do the bus registration call
    691  * asynchronously instead of synchronously.
    692  *
    693  * @note Just use dbus_bus_get() or dbus_bus_get_private(), or worst
    694  * case dbus_bus_register(), instead of messing with this
    695  * function. There's really no point creating pain for yourself by
    696  * doing things manually.
    697  *
    698  * It's hard to use this function safely on shared connections
    699  * (created by dbus_connection_open()) in a multithreaded application,
    700  * because only one registration attempt can be sent to the bus. If
    701  * two threads are both sending the registration message, there is no
    702  * mechanism in libdbus itself to avoid sending it twice.
    703  *
    704  * Thus, you need a way to coordinate which thread sends the
    705  * registration attempt; which also means you know which thread
    706  * will call dbus_bus_set_unique_name(). If you don't know
    707  * about all threads in the app (for example, if some libraries
    708  * you're using might start libdbus-using threads), then you
    709  * need to avoid using this function on shared connections.
    710  *
    711  * @param connection the connection
    712  * @param unique_name the unique name
    713  * @returns #FALSE if not enough memory
    714  */
    715 dbus_bool_t
    716 dbus_bus_set_unique_name (DBusConnection *connection,
    717                           const char     *unique_name)
    718 {
    719   BusData *bd;
    720   dbus_bool_t success;
    721 
    722   _dbus_return_val_if_fail (connection != NULL, FALSE);
    723   _dbus_return_val_if_fail (unique_name != NULL, FALSE);
    724 
    725   _DBUS_LOCK (bus_datas);
    726 
    727   bd = ensure_bus_data (connection);
    728   if (bd == NULL)
    729     return FALSE;
    730 
    731   _dbus_assert (bd->unique_name == NULL);
    732 
    733   bd->unique_name = _dbus_strdup (unique_name);
    734   success = bd->unique_name != NULL;
    735 
    736   _DBUS_UNLOCK (bus_datas);
    737 
    738   return success;
    739 }
    740 
    741 /**
    742  * Gets the unique name of the connection as assigned by the message
    743  * bus. Only possible after the connection has been registered with
    744  * the message bus. All connections returned by dbus_bus_get() or
    745  * dbus_bus_get_private() have been successfully registered.
    746  *
    747  * The name remains valid until the connection is freed, and
    748  * should not be freed by the caller.
    749  *
    750  * Other than dbus_bus_get(), there are two ways to set the unique
    751  * name; one is dbus_bus_register(), the other is
    752  * dbus_bus_set_unique_name().  You are responsible for calling
    753  * dbus_bus_set_unique_name() if you register by hand instead of using
    754  * dbus_bus_register().
    755  *
    756  * @param connection the connection
    757  * @returns the unique name or #NULL on error
    758  */
    759 const char*
    760 dbus_bus_get_unique_name (DBusConnection *connection)
    761 {
    762   BusData *bd;
    763   const char *unique_name;
    764 
    765   _dbus_return_val_if_fail (connection != NULL, NULL);
    766 
    767   _DBUS_LOCK (bus_datas);
    768 
    769   bd = ensure_bus_data (connection);
    770   if (bd == NULL)
    771     return NULL;
    772 
    773   unique_name = bd->unique_name;
    774 
    775   _DBUS_UNLOCK (bus_datas);
    776 
    777   return unique_name;
    778 }
    779 
    780 /**
    781  * Asks the bus to return the UID the named connection authenticated
    782  * as, if any.  Only works on UNIX; only works for connections on the
    783  * same machine as the bus. If you are not on the same machine as the
    784  * bus, then calling this is probably a bad idea, since the UID will
    785  * mean little to your application.
    786  *
    787  * For the system message bus you're guaranteed to be on the same
    788  * machine since it only listens on a UNIX domain socket (at least,
    789  * as shipped by default).
    790  *
    791  * This function only works for connections that authenticated as
    792  * a UNIX user, right now that includes all bus connections, but
    793  * it's very possible to have connections with no associated UID.
    794  * So check for errors and do something sensible if they happen.
    795  *
    796  * This function will always return an error on Windows.
    797  *
    798  * @param connection the connection
    799  * @param name a name owned by the connection
    800  * @param error location to store the error
    801  * @returns the unix user id, or ((unsigned)-1) if error is set
    802  */
    803 unsigned long
    804 dbus_bus_get_unix_user (DBusConnection *connection,
    805                         const char     *name,
    806                         DBusError      *error)
    807 {
    808   DBusMessage *message, *reply;
    809   dbus_uint32_t uid;
    810 
    811   _dbus_return_val_if_fail (connection != NULL, DBUS_UID_UNSET);
    812   _dbus_return_val_if_fail (name != NULL, DBUS_UID_UNSET);
    813   _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name), DBUS_UID_UNSET);
    814   _dbus_return_val_if_error_is_set (error, DBUS_UID_UNSET);
    815 
    816   message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
    817                                           DBUS_PATH_DBUS,
    818                                           DBUS_INTERFACE_DBUS,
    819                                           "GetConnectionUnixUser");
    820 
    821   if (message == NULL)
    822     {
    823       _DBUS_SET_OOM (error);
    824       return DBUS_UID_UNSET;
    825     }
    826 
    827   if (!dbus_message_append_args (message,
    828 				 DBUS_TYPE_STRING, &name,
    829 				 DBUS_TYPE_INVALID))
    830     {
    831       dbus_message_unref (message);
    832       _DBUS_SET_OOM (error);
    833       return DBUS_UID_UNSET;
    834     }
    835 
    836   reply = dbus_connection_send_with_reply_and_block (connection, message, -1,
    837                                                      error);
    838 
    839   dbus_message_unref (message);
    840 
    841   if (reply == NULL)
    842     {
    843       _DBUS_ASSERT_ERROR_IS_SET (error);
    844       return DBUS_UID_UNSET;
    845     }
    846 
    847   if (dbus_set_error_from_message (error, reply))
    848     {
    849       _DBUS_ASSERT_ERROR_IS_SET (error);
    850       dbus_message_unref (reply);
    851       return DBUS_UID_UNSET;
    852     }
    853 
    854   if (!dbus_message_get_args (reply, error,
    855                               DBUS_TYPE_UINT32, &uid,
    856                               DBUS_TYPE_INVALID))
    857     {
    858       _DBUS_ASSERT_ERROR_IS_SET (error);
    859       dbus_message_unref (reply);
    860       return DBUS_UID_UNSET;
    861     }
    862 
    863   dbus_message_unref (reply);
    864 
    865   return (unsigned long) uid;
    866 }
    867 
    868 
    869 /**
    870  * Asks the bus to assign the given name to this connection by invoking
    871  * the RequestName method on the bus. This method is fully documented
    872  * in the D-Bus specification. For quick reference, the flags and
    873  * result codes are discussed here, but the specification is the
    874  * canonical version of this information.
    875  *
    876  * First you should know that for each bus name, the bus stores
    877  * a queue of connections that would like to own it. Only
    878  * one owns it at a time - called the primary owner. If the primary
    879  * owner releases the name or disconnects, then the next owner in the
    880  * queue atomically takes over.
    881  *
    882  * So for example if you have an application org.freedesktop.TextEditor
    883  * and multiple instances of it can be run, you can have all of them
    884  * sitting in the queue. The first one to start up will receive messages
    885  * sent to org.freedesktop.TextEditor, but if that one exits another
    886  * will become the primary owner and receive messages.
    887  *
    888  * The queue means you don't need to manually watch for the current owner to
    889  * disappear and then request the name again.
    890  *
    891  * When requesting a name, you can specify several flags.
    892  *
    893  * #DBUS_NAME_FLAG_ALLOW_REPLACEMENT and #DBUS_NAME_FLAG_DO_NOT_QUEUE
    894  * are properties stored by the bus for this connection with respect to
    895  * each requested bus name. These properties are stored even if the
    896  * connection is queued and does not become the primary owner.
    897  * You can update these flags by calling RequestName again (even if
    898  * you already own the name).
    899  *
    900  * #DBUS_NAME_FLAG_ALLOW_REPLACEMENT means that another requestor of the
    901  * name can take it away from you by specifying #DBUS_NAME_FLAG_REPLACE_EXISTING.
    902  *
    903  * #DBUS_NAME_FLAG_DO_NOT_QUEUE means that if you aren't the primary owner,
    904  * you don't want to be queued up - you only care about being the
    905  * primary owner.
    906  *
    907  * Unlike the other two flags, #DBUS_NAME_FLAG_REPLACE_EXISTING is a property
    908  * of the individual RequestName call, i.e. the bus does not persistently
    909  * associate it with the connection-name pair. If a RequestName call includes
    910  * the #DBUS_NAME_FLAG_REPLACE_EXISTING flag, and the current primary
    911  * owner has #DBUS_NAME_FLAG_ALLOW_REPLACEMENT set, then the current primary
    912  * owner will be kicked off.
    913  *
    914  * If no flags are given, an application will receive the requested
    915  * name only if the name is currently unowned; and it will NOT give
    916  * up the name if another application asks to take it over using
    917  * #DBUS_NAME_FLAG_REPLACE_EXISTING.
    918  *
    919  * This function returns a result code. The possible result codes
    920  * are as follows.
    921  *
    922  * #DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER means that the name had no
    923  * existing owner, and the caller is now the primary owner; or that
    924  * the name had an owner, and the caller specified
    925  * #DBUS_NAME_FLAG_REPLACE_EXISTING, and the current owner
    926  * specified #DBUS_NAME_FLAG_ALLOW_REPLACEMENT.
    927  *
    928  * #DBUS_REQUEST_NAME_REPLY_IN_QUEUE happens only if the caller does NOT
    929  * specify #DBUS_NAME_FLAG_DO_NOT_QUEUE and either the current owner
    930  * did NOT specify #DBUS_NAME_FLAG_ALLOW_REPLACEMENT or the caller did NOT
    931  * specify #DBUS_NAME_FLAG_REPLACE_EXISTING. In this case the caller ends up
    932  * in a queue to own the name after the current owner gives it up.
    933  *
    934  * #DBUS_REQUEST_NAME_REPLY_EXISTS happens if the name has an owner
    935  * already and the caller specifies #DBUS_NAME_FLAG_DO_NOT_QUEUE
    936  * and either the current owner has NOT specified
    937  * #DBUS_NAME_FLAG_ALLOW_REPLACEMENT or the caller did NOT specify
    938  * #DBUS_NAME_FLAG_REPLACE_EXISTING.
    939  *
    940  * #DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER happens if an application
    941  * requests a name it already owns. (Re-requesting a name is useful if
    942  * you want to change the #DBUS_NAME_FLAG_ALLOW_REPLACEMENT or
    943  * #DBUS_NAME_FLAG_DO_NOT_QUEUE settings.)
    944  *
    945  * When a service represents an application, say "text editor," then
    946  * it should specify #DBUS_NAME_FLAG_ALLOW_REPLACEMENT if it wants
    947  * the last editor started to be the user's editor vs. the first one
    948  * started.  Then any editor that can be the user's editor should
    949  * specify #DBUS_NAME_FLAG_REPLACE_EXISTING to either take over
    950  * (last-started-wins) or be queued up (first-started-wins) according
    951  * to whether #DBUS_NAME_FLAG_ALLOW_REPLACEMENT was given.
    952  *
    953  * Conventionally, single-instance applications often offer a command
    954  * line option called --replace which means to replace the current
    955  * instance.  To implement this, always set
    956  * #DBUS_NAME_FLAG_ALLOW_REPLACEMENT when you request your
    957  * application's bus name.  When you lose ownership of your bus name,
    958  * you need to exit.  Look for the signal "NameLost" from
    959  * #DBUS_SERVICE_DBUS and #DBUS_INTERFACE_DBUS (the signal's first
    960  * argument is the bus name that was lost).  If starting up without
    961  * --replace, do not specify #DBUS_NAME_FLAG_REPLACE_EXISTING, and
    962  * exit if you fail to become the bus name owner. If --replace is
    963  * given, ask to replace the old owner.
    964  *
    965  * @param connection the connection
    966  * @param name the name to request
    967  * @param flags flags
    968  * @param error location to store the error
    969  * @returns a result code, -1 if error is set
    970  */
    971 int
    972 dbus_bus_request_name (DBusConnection *connection,
    973                        const char     *name,
    974                        unsigned int    flags,
    975                        DBusError      *error)
    976 {
    977   DBusMessage *message, *reply;
    978   dbus_uint32_t result;
    979 
    980   _dbus_return_val_if_fail (connection != NULL, 0);
    981   _dbus_return_val_if_fail (name != NULL, 0);
    982   _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name), 0);
    983   _dbus_return_val_if_error_is_set (error, 0);
    984 
    985   message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
    986                                           DBUS_PATH_DBUS,
    987                                           DBUS_INTERFACE_DBUS,
    988                                           "RequestName");
    989 
    990   if (message == NULL)
    991     {
    992       _DBUS_SET_OOM (error);
    993       return -1;
    994     }
    995 
    996   if (!dbus_message_append_args (message,
    997 				 DBUS_TYPE_STRING, &name,
    998 				 DBUS_TYPE_UINT32, &flags,
    999 				 DBUS_TYPE_INVALID))
   1000     {
   1001       dbus_message_unref (message);
   1002       _DBUS_SET_OOM (error);
   1003       return -1;
   1004     }
   1005 
   1006   reply = dbus_connection_send_with_reply_and_block (connection, message, -1,
   1007                                                      error);
   1008 
   1009   dbus_message_unref (message);
   1010 
   1011   if (reply == NULL)
   1012     {
   1013       _DBUS_ASSERT_ERROR_IS_SET (error);
   1014       return -1;
   1015     }
   1016 
   1017   if (dbus_set_error_from_message (error, reply))
   1018     {
   1019       _DBUS_ASSERT_ERROR_IS_SET (error);
   1020       dbus_message_unref (reply);
   1021       return -1;
   1022     }
   1023 
   1024   if (!dbus_message_get_args (reply, error,
   1025                               DBUS_TYPE_UINT32, &result,
   1026                               DBUS_TYPE_INVALID))
   1027     {
   1028       _DBUS_ASSERT_ERROR_IS_SET (error);
   1029       dbus_message_unref (reply);
   1030       return -1;
   1031     }
   1032 
   1033   dbus_message_unref (reply);
   1034 
   1035   return result;
   1036 }
   1037 
   1038 
   1039 /**
   1040  * Asks the bus to unassign the given name from this connection by
   1041  * invoking the ReleaseName method on the bus. The "ReleaseName"
   1042  * method is canonically documented in the D-Bus specification.
   1043  *
   1044  * Possible results are: #DBUS_RELEASE_NAME_REPLY_RELEASED
   1045  * which means you owned the name or were in the queue to own it,
   1046  * and and now you don't own it and aren't in the queue.
   1047  * #DBUS_RELEASE_NAME_REPLY_NOT_OWNER which means someone else
   1048  * owns the name so you can't release it.
   1049  * #DBUS_RELEASE_NAME_REPLY_NON_EXISTENT
   1050  * which means nobody owned the name.
   1051  *
   1052  * @param connection the connection
   1053  * @param name the name to remove
   1054  * @param error location to store the error
   1055  * @returns a result code, -1 if error is set
   1056  */
   1057 int
   1058 dbus_bus_release_name (DBusConnection *connection,
   1059                        const char     *name,
   1060                        DBusError      *error)
   1061 {
   1062   DBusMessage *message, *reply;
   1063   dbus_uint32_t result;
   1064 
   1065   _dbus_return_val_if_fail (connection != NULL, 0);
   1066   _dbus_return_val_if_fail (name != NULL, 0);
   1067   _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name), 0);
   1068   _dbus_return_val_if_error_is_set (error, 0);
   1069 
   1070   message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
   1071                                           DBUS_PATH_DBUS,
   1072                                           DBUS_INTERFACE_DBUS,
   1073                                           "ReleaseName");
   1074 
   1075   if (message == NULL)
   1076     {
   1077       _DBUS_SET_OOM (error);
   1078       return -1;
   1079     }
   1080 
   1081   if (!dbus_message_append_args (message,
   1082                                  DBUS_TYPE_STRING, &name,
   1083                                  DBUS_TYPE_INVALID))
   1084     {
   1085       dbus_message_unref (message);
   1086       _DBUS_SET_OOM (error);
   1087       return -1;
   1088     }
   1089 
   1090   reply = dbus_connection_send_with_reply_and_block (connection, message, -1,
   1091                                                      error);
   1092 
   1093   dbus_message_unref (message);
   1094 
   1095   if (reply == NULL)
   1096     {
   1097       _DBUS_ASSERT_ERROR_IS_SET (error);
   1098       return -1;
   1099     }
   1100 
   1101   if (dbus_set_error_from_message (error, reply))
   1102     {
   1103       _DBUS_ASSERT_ERROR_IS_SET (error);
   1104       dbus_message_unref (reply);
   1105       return -1;
   1106     }
   1107 
   1108   if (!dbus_message_get_args (reply, error,
   1109                               DBUS_TYPE_UINT32, &result,
   1110                               DBUS_TYPE_INVALID))
   1111     {
   1112       _DBUS_ASSERT_ERROR_IS_SET (error);
   1113       dbus_message_unref (reply);
   1114       return -1;
   1115     }
   1116 
   1117   dbus_message_unref (reply);
   1118 
   1119   return result;
   1120 }
   1121 
   1122 /**
   1123  * Asks the bus whether a certain name has an owner.
   1124  *
   1125  * Using this can easily result in a race condition,
   1126  * since an owner can appear or disappear after you
   1127  * call this.
   1128  *
   1129  * If you want to request a name, just request it;
   1130  * if you want to avoid replacing a current owner,
   1131  * don't specify #DBUS_NAME_FLAG_REPLACE_EXISTING and
   1132  * you will get an error if there's already an owner.
   1133  *
   1134  * @param connection the connection
   1135  * @param name the name
   1136  * @param error location to store any errors
   1137  * @returns #TRUE if the name exists, #FALSE if not or on error
   1138  */
   1139 dbus_bool_t
   1140 dbus_bus_name_has_owner (DBusConnection *connection,
   1141 			 const char     *name,
   1142                          DBusError      *error)
   1143 {
   1144   DBusMessage *message, *reply;
   1145   dbus_bool_t exists;
   1146 
   1147   _dbus_return_val_if_fail (connection != NULL, FALSE);
   1148   _dbus_return_val_if_fail (name != NULL, FALSE);
   1149   _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name), FALSE);
   1150   _dbus_return_val_if_error_is_set (error, FALSE);
   1151 
   1152   message = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
   1153                                           DBUS_PATH_DBUS,
   1154                                           DBUS_INTERFACE_DBUS,
   1155                                           "NameHasOwner");
   1156   if (message == NULL)
   1157     {
   1158       _DBUS_SET_OOM (error);
   1159       return FALSE;
   1160     }
   1161 
   1162   if (!dbus_message_append_args (message,
   1163 				 DBUS_TYPE_STRING, &name,
   1164 				 DBUS_TYPE_INVALID))
   1165     {
   1166       dbus_message_unref (message);
   1167       _DBUS_SET_OOM (error);
   1168       return FALSE;
   1169     }
   1170 
   1171   reply = dbus_connection_send_with_reply_and_block (connection, message, -1, error);
   1172   dbus_message_unref (message);
   1173 
   1174   if (reply == NULL)
   1175     {
   1176       _DBUS_ASSERT_ERROR_IS_SET (error);
   1177       return FALSE;
   1178     }
   1179 
   1180   if (!dbus_message_get_args (reply, error,
   1181                               DBUS_TYPE_BOOLEAN, &exists,
   1182                               DBUS_TYPE_INVALID))
   1183     {
   1184       _DBUS_ASSERT_ERROR_IS_SET (error);
   1185       dbus_message_unref (reply);
   1186       return FALSE;
   1187     }
   1188 
   1189   dbus_message_unref (reply);
   1190   return exists;
   1191 }
   1192 
   1193 /**
   1194  * Starts a service that will request ownership of the given name.
   1195  * The returned result will be one of be one of
   1196  * #DBUS_START_REPLY_SUCCESS or #DBUS_START_REPLY_ALREADY_RUNNING if
   1197  * successful.  Pass #NULL if you don't care about the result.
   1198  *
   1199  * The flags parameter is for future expansion, currently you should
   1200  * specify 0.
   1201  *
   1202  * It's often easier to avoid explicitly starting services, and
   1203  * just send a method call to the service's bus name instead.
   1204  * Method calls start a service to handle them by default
   1205  * unless you call dbus_message_set_auto_start() to disable this
   1206  * behavior.
   1207  *
   1208  * @param connection the connection
   1209  * @param name the name we want the new service to request
   1210  * @param flags the flags (should always be 0 for now)
   1211  * @param result a place to store the result or #NULL
   1212  * @param error location to store any errors
   1213  * @returns #TRUE if the activation succeeded, #FALSE if not
   1214  */
   1215 dbus_bool_t
   1216 dbus_bus_start_service_by_name (DBusConnection *connection,
   1217                                 const char     *name,
   1218                                 dbus_uint32_t   flags,
   1219                                 dbus_uint32_t  *result,
   1220                                 DBusError      *error)
   1221 {
   1222   DBusMessage *msg;
   1223   DBusMessage *reply;
   1224 
   1225   _dbus_return_val_if_fail (connection != NULL, FALSE);
   1226   _dbus_return_val_if_fail (_dbus_check_is_valid_bus_name (name), FALSE);
   1227 
   1228   msg = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
   1229                                       DBUS_PATH_DBUS,
   1230                                       DBUS_INTERFACE_DBUS,
   1231                                       "StartServiceByName");
   1232 
   1233   if (!dbus_message_append_args (msg, DBUS_TYPE_STRING, &name,
   1234 			  	 DBUS_TYPE_UINT32, &flags, DBUS_TYPE_INVALID))
   1235     {
   1236       dbus_message_unref (msg);
   1237       _DBUS_SET_OOM (error);
   1238       return FALSE;
   1239     }
   1240 
   1241   reply = dbus_connection_send_with_reply_and_block (connection, msg,
   1242                                                      -1, error);
   1243   dbus_message_unref (msg);
   1244 
   1245   if (reply == NULL)
   1246     {
   1247       _DBUS_ASSERT_ERROR_IS_SET (error);
   1248       return FALSE;
   1249     }
   1250 
   1251   if (dbus_set_error_from_message (error, reply))
   1252     {
   1253       _DBUS_ASSERT_ERROR_IS_SET (error);
   1254       dbus_message_unref (reply);
   1255       return FALSE;
   1256     }
   1257 
   1258   if (result != NULL &&
   1259       !dbus_message_get_args (reply, error, DBUS_TYPE_UINT32,
   1260 	      		      result, DBUS_TYPE_INVALID))
   1261     {
   1262       _DBUS_ASSERT_ERROR_IS_SET (error);
   1263       dbus_message_unref (reply);
   1264       return FALSE;
   1265     }
   1266 
   1267   dbus_message_unref (reply);
   1268   return TRUE;
   1269 }
   1270 
   1271 static void
   1272 send_no_return_values (DBusConnection *connection,
   1273                        DBusMessage    *msg,
   1274                        DBusError      *error)
   1275 {
   1276   if (error)
   1277     {
   1278       /* Block to check success codepath */
   1279       DBusMessage *reply;
   1280 
   1281       reply = dbus_connection_send_with_reply_and_block (connection, msg,
   1282                                                          -1, error);
   1283 
   1284       if (reply == NULL)
   1285         _DBUS_ASSERT_ERROR_IS_SET (error);
   1286       else
   1287         dbus_message_unref (reply);
   1288     }
   1289   else
   1290     {
   1291       /* Silently-fail nonblocking codepath */
   1292       dbus_message_set_no_reply (msg, TRUE);
   1293       dbus_connection_send (connection, msg, NULL);
   1294     }
   1295 }
   1296 
   1297 /**
   1298  * Adds a match rule to match messages going through the message bus.
   1299  * The "rule" argument is the string form of a match rule.
   1300  *
   1301  * If you pass #NULL for the error, this function will not
   1302  * block; the match thus won't be added until you flush the
   1303  * connection, and if there's an error adding the match
   1304  * (only possible error is lack of resources in the bus),
   1305  * you won't find out about it.
   1306  *
   1307  * If you pass non-#NULL for the error this function will
   1308  * block until it gets a reply.
   1309  *
   1310  * Normal API conventions would have the function return
   1311  * a boolean value indicating whether the error was set,
   1312  * but that would require blocking always to determine
   1313  * the return value.
   1314  *
   1315  * The AddMatch method is fully documented in the D-Bus
   1316  * specification. For quick reference, the format of the
   1317  * match rules is discussed here, but the specification
   1318  * is the canonical version of this information.
   1319  *
   1320  * Rules are specified as a string of comma separated
   1321  * key/value pairs. An example is
   1322  * "type='signal',sender='org.freedesktop.DBus',
   1323  * interface='org.freedesktop.DBus',member='Foo',
   1324  * path='/bar/foo',destination=':452345.34'"
   1325  *
   1326  * Possible keys you can match on are type, sender,
   1327  * interface, member, path, destination and numbered
   1328  * keys to match message args (keys are 'arg0', 'arg1', etc.).
   1329  * Omitting a key from the rule indicates
   1330  * a wildcard match.  For instance omitting
   1331  * the member from a match rule but adding a sender would
   1332  * let all messages from that sender through regardless of
   1333  * the member.
   1334  *
   1335  * Matches are inclusive not exclusive so as long as one
   1336  * rule matches the message will get through.  It is important
   1337  * to note this because every time a message is received the
   1338  * application will be paged into memory to process it.  This
   1339  * can cause performance problems such as draining batteries
   1340  * on embedded platforms.
   1341  *
   1342  * If you match message args ('arg0', 'arg1', and so forth)
   1343  * only string arguments will match. That is, arg0='5' means
   1344  * match the string "5" not the integer 5.
   1345  *
   1346  * Currently there is no way to match against non-string arguments.
   1347  *
   1348  * Matching on interface is tricky because method call
   1349  * messages only optionally specify the interface.
   1350  * If a message omits the interface, then it will NOT match
   1351  * if the rule specifies an interface name. This means match
   1352  * rules on method calls should not usually give an interface.
   1353  *
   1354  * However, signal messages are required to include the interface
   1355  * so when matching signals usually you should specify the interface
   1356  * in the match rule.
   1357  *
   1358  * For security reasons, you can match arguments only up to
   1359  * #DBUS_MAXIMUM_MATCH_RULE_ARG_NUMBER.
   1360  *
   1361  * Match rules have a maximum length of #DBUS_MAXIMUM_MATCH_RULE_LENGTH
   1362  * bytes.
   1363  *
   1364  * Both of these maximums are much higher than you're likely to need,
   1365  * they only exist because the D-Bus bus daemon has fixed limits on
   1366  * all resource usage.
   1367  *
   1368  * @param connection connection to the message bus
   1369  * @param rule textual form of match rule
   1370  * @param error location to store any errors
   1371  */
   1372 void
   1373 dbus_bus_add_match (DBusConnection *connection,
   1374                     const char     *rule,
   1375                     DBusError      *error)
   1376 {
   1377   DBusMessage *msg;
   1378 
   1379   _dbus_return_if_fail (rule != NULL);
   1380 
   1381   msg = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
   1382                                       DBUS_PATH_DBUS,
   1383                                       DBUS_INTERFACE_DBUS,
   1384                                       "AddMatch");
   1385 
   1386   if (msg == NULL)
   1387     {
   1388       _DBUS_SET_OOM (error);
   1389       return;
   1390     }
   1391 
   1392   if (!dbus_message_append_args (msg, DBUS_TYPE_STRING, &rule,
   1393                                  DBUS_TYPE_INVALID))
   1394     {
   1395       dbus_message_unref (msg);
   1396       _DBUS_SET_OOM (error);
   1397       return;
   1398     }
   1399 
   1400   send_no_return_values (connection, msg, error);
   1401 
   1402   dbus_message_unref (msg);
   1403 }
   1404 
   1405 /**
   1406  * Removes a previously-added match rule "by value" (the most
   1407  * recently-added identical rule gets removed).  The "rule" argument
   1408  * is the string form of a match rule.
   1409  *
   1410  * The bus compares match rules semantically, not textually, so
   1411  * whitespace and ordering don't have to be identical to
   1412  * the rule you passed to dbus_bus_add_match().
   1413  *
   1414  * If you pass #NULL for the error, this function will not
   1415  * block; otherwise it will. See detailed explanation in
   1416  * docs for dbus_bus_add_match().
   1417  *
   1418  * @param connection connection to the message bus
   1419  * @param rule textual form of match rule
   1420  * @param error location to store any errors
   1421  */
   1422 void
   1423 dbus_bus_remove_match (DBusConnection *connection,
   1424                        const char     *rule,
   1425                        DBusError      *error)
   1426 {
   1427   DBusMessage *msg;
   1428 
   1429   _dbus_return_if_fail (rule != NULL);
   1430 
   1431   msg = dbus_message_new_method_call (DBUS_SERVICE_DBUS,
   1432                                       DBUS_PATH_DBUS,
   1433                                       DBUS_INTERFACE_DBUS,
   1434                                       "RemoveMatch");
   1435 
   1436   if (!dbus_message_append_args (msg, DBUS_TYPE_STRING, &rule,
   1437                                  DBUS_TYPE_INVALID))
   1438     {
   1439       dbus_message_unref (msg);
   1440       _DBUS_SET_OOM (error);
   1441       return;
   1442     }
   1443 
   1444   send_no_return_values (connection, msg, error);
   1445 
   1446   dbus_message_unref (msg);
   1447 }
   1448 
   1449 /** @} */
   1450