diff options
Diffstat (limited to 'bus/dispatch.c')
| -rw-r--r-- | bus/dispatch.c | 647 | 
1 files changed, 417 insertions, 230 deletions
| diff --git a/bus/dispatch.c b/bus/dispatch.c index d43e8121..606c68ef 100644 --- a/bus/dispatch.c +++ b/bus/dispatch.c @@ -28,38 +28,33 @@  #include "services.h"  #include "utils.h"  #include "bus.h" +#include "signals.h"  #include "test.h"  #include <dbus/dbus-internals.h>  #include <string.h> -static dbus_int32_t message_handler_slot = -1; - -typedef struct -{ -  BusContext     *context; -  DBusConnection *sender; -  DBusMessage    *message; -  BusTransaction *transaction; -  DBusError      *error; -} SendMessageData; -  static dbus_bool_t -send_one_message (DBusConnection *connection, void *data) +send_one_message (DBusConnection *connection, +                  BusContext     *context, +                  DBusConnection *sender, +                  DBusConnection *addressed_recipient, +                  DBusMessage    *message, +                  BusTransaction *transaction, +                  DBusError      *error)  { -  SendMessageData *d = data; - -  if (!bus_context_check_security_policy (d->context, -                                          d->sender, +  if (!bus_context_check_security_policy (context, +                                          sender, +                                          addressed_recipient,                                            connection, -                                          d->message, +                                          message,                                            NULL))      return TRUE; /* silently don't send it */ -  if (!bus_transaction_send (d->transaction, +  if (!bus_transaction_send (transaction,                               connection, -                             d->message)) +                             message))      { -      BUS_SET_OOM (d->error); +      BUS_SET_OOM (error);        return FALSE;      } @@ -67,30 +62,60 @@ send_one_message (DBusConnection *connection, void *data)  }  dbus_bool_t -bus_dispatch_broadcast_message (BusTransaction *transaction, -                                DBusConnection *sender, -                                DBusMessage    *message, -                                DBusError      *error) +bus_dispatch_matches (BusTransaction *transaction, +                      DBusConnection *sender, +                      DBusConnection *addressed_recipient, +                      DBusMessage    *message, +                      DBusError      *error)  {    DBusError tmp_error; -  SendMessageData d;    BusConnections *connections; +  DBusList *recipients; +  BusMatchmaker *matchmaker; +  DBusList *link; +  BusContext *context;    _DBUS_ASSERT_ERROR_IS_CLEAR (error); -   + +  /* sender and recipient can both be NULL for the bus driver, +   * or for signals with no particular recipient +   */ + +  _dbus_assert (sender == NULL || bus_connection_is_active (sender));    _dbus_assert (dbus_message_get_sender (message) != NULL);    connections = bus_transaction_get_connections (transaction);    dbus_error_init (&tmp_error); -  d.sender = sender; -  d.context = bus_transaction_get_context (transaction); -  d.message = message; -  d.transaction = transaction; -  d.error = &tmp_error; -   -  bus_connections_foreach_active (connections, send_one_message, &d); +  context = bus_transaction_get_context (transaction); +  matchmaker = bus_context_get_matchmaker (context); +  recipients = NULL; +  if (!bus_matchmaker_get_recipients (matchmaker, +                                      bus_context_get_connections (context), +                                      sender, addressed_recipient, message, +                                      &recipients)) +    { +      BUS_SET_OOM (error); +      return FALSE; +    } + +  link = _dbus_list_get_first_link (&recipients); +  while (link != NULL) +    { +      DBusConnection *dest; + +      dest = link->data; + +      if (!send_one_message (dest, context, sender, addressed_recipient, +                             message, transaction, &tmp_error)) +        break; + +      link = _dbus_list_get_next_link (&recipients, link); +    } + +  _dbus_list_clear (&recipients); +      if (dbus_error_is_set (&tmp_error))      {        dbus_move_error (&tmp_error, error); @@ -100,16 +125,21 @@ bus_dispatch_broadcast_message (BusTransaction *transaction,      return TRUE;  } -static void +static DBusHandlerResult  bus_dispatch (DBusConnection *connection,                DBusMessage    *message)  { -  const char *sender, *service_name, *message_name; +  const char *sender, *service_name;    DBusError error;    BusTransaction *transaction;    BusContext *context; +  DBusHandlerResult result; +  DBusConnection *addressed_recipient; +   +  result = DBUS_HANDLER_RESULT_HANDLED;    transaction = NULL; +  addressed_recipient = NULL;    dbus_error_init (&error);    context = bus_connection_get_context (connection); @@ -123,32 +153,50 @@ bus_dispatch (DBusConnection *connection,    /* Ref connection in case we disconnect it at some point in here */    dbus_connection_ref (connection); - +      service_name = dbus_message_get_destination (message); -  message_name = dbus_message_get_name (message); - -  _dbus_assert (message_name != NULL); /* DBusMessageLoader is supposed to check this */ -  _dbus_verbose ("DISPATCH: %s to %s\n", -                 message_name, service_name ? service_name : "peer"); -   -  /* If service_name is NULL, this is a message to the bus daemon, not -   * intended to actually go "on the bus"; e.g. a peer-to-peer +#ifdef DBUS_ENABLE_VERBOSE_MODE +  { +    const char *interface_name, *member_name, *error_name; + +    interface_name = dbus_message_get_interface (message); +    member_name = dbus_message_get_member (message); +    error_name = dbus_message_get_error_name (message); +     +    _dbus_verbose ("DISPATCH: %s %s %s to %s\n", +                   interface_name ? interface_name : "(no interface)", +                   member_name ? member_name : "(no member)", +                   error_name ? error_name : "(no error name)", +                   service_name ? service_name : "peer"); +  } +#endif /* DBUS_ENABLE_VERBOSE_MODE */ +   +  /* If service_name is NULL, if it's a signal we send it to all +   * connections with a match rule. If it's not a signal, it goes to +   * the bus daemon but doesn't go "on the bus"; e.g. a peer-to-peer     * ping. Handle these immediately, especially disconnection     * messages. There are no security policy checks on these.     */    if (service_name == NULL) -    {       -      if (strcmp (message_name, DBUS_MESSAGE_LOCAL_DISCONNECT) == 0) -        bus_connection_disconnected (connection); +    { +      if (dbus_message_is_signal (message, +                                  DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL, +                                  "Disconnected")) +        { +          bus_connection_disconnected (connection); +          goto out; +        } -      /* DBusConnection also handles some of these automatically, we leave -       * it to do so. -       */ -      goto out; +      if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL) +        { +          /* DBusConnection also handles some of these automatically, we leave +           * it to do so. +           */ +          result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +          goto out; +        }      } - -  _dbus_assert (service_name != NULL); /* this message is intended for bus routing */    /* Create our transaction */    transaction = bus_transaction_new (context); @@ -177,17 +225,18 @@ bus_dispatch (DBusConnection *connection,         */        service_name = dbus_message_get_destination (message);      } - -  if (strcmp (service_name, DBUS_SERVICE_DBUS) == 0) /* to bus driver */ +   +  if (service_name && +      strcmp (service_name, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS) == 0) /* to bus driver */      {        if (!bus_context_check_security_policy (context, -                                              connection, NULL, message, &error)) +                                              connection, NULL, NULL, message, &error))          {            _dbus_verbose ("Security policy rejected message\n");            goto out;          } -      _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_DBUS); +      _dbus_verbose ("Giving message to %s\n", DBUS_SERVICE_ORG_FREEDESKTOP_DBUS);        if (!bus_driver_handle_message (connection, transaction, message, &error))          goto out;      } @@ -195,22 +244,16 @@ bus_dispatch (DBusConnection *connection,      {        _dbus_verbose ("Received message from non-registered client. Disconnecting.\n");        dbus_connection_disconnect (connection); +      goto out;      } -  /* FIXME what if we un-special-case this service and just have a flag -   * on services that all service owners will get messages to it, not just -   * the primary owner. -   */ -  else if (strcmp (service_name, DBUS_SERVICE_BROADCAST) == 0) /* spam! */ -    { -      if (!bus_dispatch_broadcast_message (transaction, connection, message, &error)) -        goto out; -    } -  else  /* route to named service */ +  else if (service_name != NULL) /* route to named service */      {        DBusString service_string;        BusService *service;        BusRegistry *registry; +      _dbus_assert (service_name != NULL); +              registry = bus_connection_get_registry (connection);        _dbus_string_init_const (&service_string, service_name); @@ -225,24 +268,30 @@ bus_dispatch (DBusConnection *connection,            goto out;          }        else -        { -          DBusConnection *recipient; -           -          recipient = bus_service_get_primary_owner (service); -          _dbus_assert (recipient != NULL); +        {           +          addressed_recipient = bus_service_get_primary_owner (service); +          _dbus_assert (addressed_recipient != NULL);            if (!bus_context_check_security_policy (context, -                                                  connection, recipient, message, &error)) +                                                  connection, addressed_recipient, +                                                  addressed_recipient, +                                                  message, &error))              goto out;            /* Dispatch the message */ -          if (!bus_transaction_send (transaction, recipient, message)) +          if (!bus_transaction_send (transaction, addressed_recipient, message))              {                BUS_SET_OOM (&error);                goto out;              }          }      } + +  /* Now match the messages against any match rules, which will send +   * out signals and such. addressed_recipient may == NULL. +   */ +  if (!bus_dispatch_matches (transaction, connection, addressed_recipient, message, &error)) +    goto out;   out:    if (dbus_error_is_set (&error)) @@ -295,66 +344,26 @@ bus_dispatch (DBusConnection *connection,      }    dbus_connection_unref (connection); -} -static DBusHandlerResult -bus_dispatch_message_handler (DBusMessageHandler *handler, -			      DBusConnection     *connection, -			      DBusMessage        *message, -			      void               *user_data) -{ -  bus_dispatch (connection, message); -   -  return DBUS_HANDLER_RESULT_ALLOW_MORE_HANDLERS; +  return result;  } -static void -free_message_handler (void *data) +static DBusHandlerResult +bus_dispatch_message_filter (DBusConnection     *connection, +                             DBusMessage        *message, +                             void               *user_data)  { -  DBusMessageHandler *handler = data; -   -  _dbus_assert (message_handler_slot >= 0); -   -  dbus_message_handler_unref (handler); -  dbus_connection_free_data_slot (&message_handler_slot); +  return bus_dispatch (connection, message);  }  dbus_bool_t  bus_dispatch_add_connection (DBusConnection *connection) -{ -  DBusMessageHandler *handler; - -  if (!dbus_connection_allocate_data_slot (&message_handler_slot)) +{   +  if (!dbus_connection_add_filter (connection, +                                   bus_dispatch_message_filter, +                                   NULL, NULL))      return FALSE; -  handler = dbus_message_handler_new (bus_dispatch_message_handler, NULL, NULL);   -  if (handler == NULL) -    { -      dbus_connection_free_data_slot (&message_handler_slot); -      return FALSE; -    }     -   -  if (!dbus_connection_add_filter (connection, handler)) -    { -      dbus_message_handler_unref (handler); -      dbus_connection_free_data_slot (&message_handler_slot); -       -      return FALSE; -    } - -  _dbus_assert (message_handler_slot >= 0); -   -  if (!dbus_connection_set_data (connection, -				 message_handler_slot, -				 handler, -                                 free_message_handler)) -    { -      dbus_message_handler_unref (handler); -      dbus_connection_free_data_slot (&message_handler_slot); - -      return FALSE; -    } -    return TRUE;  } @@ -364,9 +373,9 @@ bus_dispatch_remove_connection (DBusConnection *connection)    /* Here we tell the bus driver that we want to get off. */    bus_driver_remove_connection (connection); -  dbus_connection_set_data (connection, -			    message_handler_slot, -			    NULL, NULL); +  dbus_connection_remove_filter (connection, +                                 bus_dispatch_message_filter, +                                 NULL);  }  #ifdef DBUS_BUILD_TESTS @@ -401,6 +410,42 @@ pop_message_waiting_for_memory (DBusConnection *connection)    return dbus_connection_pop_message (connection);  } +static void +warn_unexpected_real (DBusConnection *connection, +                      DBusMessage    *message, +                      const char     *expected, +                      const char     *function, +                      int             line) +{ +  _dbus_warn ("%s:%d received message interface \"%s\" member \"%s\" error name \"%s\" on %p, expecting %s\n", +              function, line, +              dbus_message_get_interface (message) ? +              dbus_message_get_interface (message) : "(unset)", +              dbus_message_get_member (message) ? +              dbus_message_get_member (message) : "(unset)", +              dbus_message_get_error_name (message) ? +              dbus_message_get_error_name (message) : "(unset)", +              connection, +              expected); +} + +#define warn_unexpected(connection, message, expected) \ +  warn_unexpected_real (connection, message, expected, _DBUS_FUNCTION_NAME, __LINE__) + +static void +verbose_message_received (DBusConnection *connection, +                          DBusMessage    *message) +{ +  _dbus_verbose ("Received message interface \"%s\" member \"%s\" error name \"%s\" on %p\n", +                 dbus_message_get_interface (message) ? +                 dbus_message_get_interface (message) : "(unset)", +                 dbus_message_get_member (message) ? +                 dbus_message_get_member (message) : "(unset)", +                 dbus_message_get_error_name (message) ? +                 dbus_message_get_error_name (message) : "(unset)", +                 connection); +} +  typedef struct  {    const char *expected_service_name; @@ -424,14 +469,15 @@ check_service_deleted_foreach (DBusConnection *connection,    if (message == NULL)      {        _dbus_warn ("Did not receive a message on %p, expecting %s\n", -                  connection, DBUS_MESSAGE_SERVICE_DELETED); +                  connection, "ServiceDeleted");        goto out;      } -  else if (!dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_DELETED)) +  else if (!dbus_message_is_signal (message, +                                    DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                                    "ServiceDeleted"))      { -      _dbus_warn ("Received message %s on %p, expecting %s\n", -                  dbus_message_get_name (message), -                  connection, DBUS_MESSAGE_SERVICE_DELETED); +      warn_unexpected (connection, message, "ServiceDeleted"); +        goto out;      }    else @@ -554,8 +600,8 @@ check_no_messages_foreach (DBusConnection *connection,    message = pop_message_waiting_for_memory (connection);    if (message != NULL)      { -      _dbus_warn ("Received message %s on %p, expecting no messages\n", -                  dbus_message_get_name (message), connection); +      warn_unexpected (connection, message, "no messages"); +        d->failed = TRUE;      } @@ -591,14 +637,14 @@ check_service_created_foreach (DBusConnection *connection,    if (message == NULL)      {        _dbus_warn ("Did not receive a message on %p, expecting %s\n", -                  connection, DBUS_MESSAGE_SERVICE_CREATED); +                  connection, "ServiceCreated");        goto out;      } -  else if (!dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_CREATED)) +  else if (!dbus_message_is_signal (message, +                                    DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                                    "ServiceCreated"))      { -      _dbus_warn ("Received message %s on %p, expecting %s\n", -                  dbus_message_get_name (message), -                  connection, DBUS_MESSAGE_SERVICE_CREATED); +      warn_unexpected (connection, message, "ServiceCreated");        goto out;      }    else @@ -662,7 +708,7 @@ check_hello_message (BusContext     *context,                       DBusConnection *connection)  {    DBusMessage *message; -  dbus_int32_t serial; +  dbus_uint32_t serial;    dbus_bool_t retval;    DBusError error;    char *name; @@ -673,9 +719,13 @@ check_hello_message (BusContext     *context,    name = NULL;    acquired = NULL;    message = NULL; + +  _dbus_verbose ("check_hello_message for %p\n", connection); -  message = dbus_message_new (DBUS_MESSAGE_HELLO, -                              DBUS_SERVICE_DBUS); +  message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, +                                          DBUS_PATH_ORG_FREEDESKTOP_DBUS, +                                          DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                                          "Hello");    if (message == NULL)      return TRUE; @@ -710,14 +760,13 @@ check_hello_message (BusContext     *context,    if (message == NULL)      {        _dbus_warn ("Did not receive a reply to %s %d on %p\n", -                  DBUS_MESSAGE_HELLO, serial, connection); +                  "Hello", serial, connection);        goto out;      } -  _dbus_verbose ("Received %s on %p\n", -                 dbus_message_get_name (message), connection); +  verbose_message_received (connection, message); -  if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) +  if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))      {        _dbus_warn ("Message has wrong sender %s\n",                    dbus_message_get_sender (message) ? @@ -725,17 +774,17 @@ check_hello_message (BusContext     *context,        goto out;      } -  if (dbus_message_get_is_error (message)) +  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)      { -      if (dbus_message_has_name (message, +      if (dbus_message_is_error (message,                                   DBUS_ERROR_NO_MEMORY))          {            ; /* good, this is a valid response */          }        else          { -          _dbus_warn ("Did not expect error %s\n", -                      dbus_message_get_name (message)); +          warn_unexpected (connection, message, "not this error"); +            goto out;          }      } @@ -743,15 +792,14 @@ check_hello_message (BusContext     *context,      {        CheckServiceCreatedData scd; -      if (dbus_message_has_name (message, -                                 DBUS_MESSAGE_HELLO)) +      if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN)          {            ; /* good, expected */          }        else          { -          _dbus_warn ("Did not expect reply %s\n", -                      dbus_message_get_name (message)); +          warn_unexpected (connection, message, "method return for Hello"); +            goto out;          } @@ -780,7 +828,7 @@ check_hello_message (BusContext     *context,        while (!dbus_bus_set_base_service (connection, name))          _dbus_wait_for_memory (); -      scd.skip_connection = NULL; +      scd.skip_connection = connection; /* we haven't done AddMatch so won't get it ourselves */        scd.failed = FALSE;        scd.expected_service_name = name;        bus_test_clients_foreach (check_service_created_foreach, @@ -795,7 +843,7 @@ check_hello_message (BusContext     *context,        if (message == NULL)          {            _dbus_warn ("Expecting %s, got nothing\n", -                      DBUS_MESSAGE_SERVICE_ACQUIRED); +                      "ServiceAcquired");            goto out;          } @@ -850,6 +898,126 @@ check_hello_message (BusContext     *context,   * but the correct thing may include OOM errors.   */  static dbus_bool_t +check_add_match_all (BusContext     *context, +                     DBusConnection *connection) +{ +  DBusMessage *message; +  dbus_bool_t retval; +  dbus_uint32_t serial; +  DBusError error; + +  retval = FALSE; +  dbus_error_init (&error); +  message = NULL; + +  _dbus_verbose ("check_add_match_all for %p\n", connection); +   +  message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, +                                          DBUS_PATH_ORG_FREEDESKTOP_DBUS, +                                          DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                                          "AddMatch"); + +  if (message == NULL) +    return TRUE; + +  if (!dbus_message_append_args (message, DBUS_TYPE_STRING, "", /* FIXME */ +                                 DBUS_TYPE_INVALID)) +    { +      dbus_message_unref (message); +      return TRUE; +    } +   +  if (!dbus_connection_send (connection, message, &serial)) +    { +      dbus_message_unref (message); +      return TRUE; +    } + +  dbus_message_unref (message); +  message = NULL; + +  /* send our message */ +  bus_test_run_clients_loop (TRUE); + +  dbus_connection_ref (connection); /* because we may get disconnected */ +  block_connection_until_message_from_bus (context, connection); + +  if (!dbus_connection_get_is_connected (connection)) +    { +      _dbus_verbose ("connection was disconnected\n"); +       +      dbus_connection_unref (connection); +       +      return TRUE; +    } + +  dbus_connection_unref (connection); +   +  message = pop_message_waiting_for_memory (connection); +  if (message == NULL) +    { +      _dbus_warn ("Did not receive a reply to %s %d on %p\n", +                  "AddMatch", serial, connection); +      goto out; +    } + +  verbose_message_received (connection, message); + +  if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS)) +    { +      _dbus_warn ("Message has wrong sender %s\n", +                  dbus_message_get_sender (message) ? +                  dbus_message_get_sender (message) : "(none)"); +      goto out; +    } +   +  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR) +    { +      if (dbus_message_is_error (message, +                                 DBUS_ERROR_NO_MEMORY)) +        { +          ; /* good, this is a valid response */ +        } +      else +        { +          warn_unexpected (connection, message, "not this error"); + +          goto out; +        } +    } +  else +    { +      if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_METHOD_RETURN) +        { +          ; /* good, expected */ +          _dbus_assert (dbus_message_get_reply_serial (message) == serial); +        } +      else +        { +          warn_unexpected (connection, message, "method return for AddMatch"); + +          goto out; +        } +    } + +  if (!check_no_leftovers (context)) +    goto out; +   +  retval = TRUE; +   + out: +  dbus_error_free (&error); +   +  if (message) +    dbus_message_unref (message); +   +  return retval; +} + +/* returns TRUE if the correct thing happens, + * but the correct thing may include OOM errors. + */ +static dbus_bool_t  check_hello_connection (BusContext *context)  {    DBusConnection *connection; @@ -874,7 +1042,7 @@ check_hello_connection (BusContext *context)    if (!check_hello_message (context, connection))      return FALSE; - +      if (dbus_bus_get_base_service (connection) == NULL)      {        /* We didn't successfully register, so we can't @@ -884,6 +1052,9 @@ check_hello_connection (BusContext *context)      }    else      { +      if (!check_add_match_all (context, connection)) +        return FALSE; +              kill_client_connection (context, connection);      } @@ -900,14 +1071,16 @@ check_nonexistent_service_activation (BusContext     *context,                                        DBusConnection *connection)  {    DBusMessage *message; -  dbus_int32_t serial; +  dbus_uint32_t serial;    dbus_bool_t retval;    DBusError error;    dbus_error_init (&error); -  message = dbus_message_new (DBUS_MESSAGE_ACTIVATE_SERVICE, -                              DBUS_SERVICE_DBUS); +  message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, +                                          DBUS_PATH_ORG_FREEDESKTOP_DBUS, +                                          DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                                          "ActivateService");    if (message == NULL)      return TRUE; @@ -946,16 +1119,15 @@ check_nonexistent_service_activation (BusContext     *context,    if (message == NULL)      {        _dbus_warn ("Did not receive a reply to %s %d on %p\n", -                  DBUS_MESSAGE_ACTIVATE_SERVICE, serial, connection); +                  "ActivateService", serial, connection);        goto out;      } -  _dbus_verbose ("Received %s on %p\n", -                 dbus_message_get_name (message), connection); +  verbose_message_received (connection, message); -  if (dbus_message_get_is_error (message)) +  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)      { -      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) +      if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))          {            _dbus_warn ("Message has wrong sender %s\n",                        dbus_message_get_sender (message) ? @@ -963,20 +1135,19 @@ check_nonexistent_service_activation (BusContext     *context,            goto out;          } -      if (dbus_message_has_name (message, +      if (dbus_message_is_error (message,                                   DBUS_ERROR_NO_MEMORY))          {            ; /* good, this is a valid response */          } -      else if (dbus_message_has_name (message, +      else if (dbus_message_is_error (message,                                        DBUS_ERROR_ACTIVATE_SERVICE_NOT_FOUND))          {            ; /* good, this is expected also */          }        else          { -          _dbus_warn ("Did not expect error %s\n", -                      dbus_message_get_name (message)); +          warn_unexpected (connection, message, "not this error");            goto out;          }      } @@ -1015,7 +1186,9 @@ check_base_service_activated (BusContext     *context,    message = initial_message;    dbus_message_ref (message);   -  if (dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_CREATED)) +  if (dbus_message_is_signal (message, +                              DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                              "ServiceCreated"))      {        char *service_name;        CheckServiceCreatedData scd; @@ -1034,7 +1207,7 @@ check_base_service_activated (BusContext     *context,            else              {                _dbus_warn ("Message %s doesn't have a service name: %s\n", -                          dbus_message_get_name (message), +                          "ServiceCreated",                            error.message);                dbus_error_free (&error);                goto out; @@ -1062,8 +1235,8 @@ check_base_service_activated (BusContext     *context,      }    else      { -      _dbus_warn ("Expected to get base service ServiceCreated, instead got %s\n", -                  dbus_message_get_name (message)); +      warn_unexpected (connection, message, "ServiceCreated for base service"); +        goto out;      } @@ -1104,7 +1277,9 @@ check_service_activated (BusContext     *context,    message = initial_message;    dbus_message_ref (message); -  if (dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_CREATED)) +  if (dbus_message_is_signal (message, +                              DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                              "ServiceCreated"))      {        char *service_name;        CheckServiceCreatedData scd; @@ -1123,7 +1298,7 @@ check_service_activated (BusContext     *context,            else              {                _dbus_warn ("Message %s doesn't have a service name: %s\n", -                          dbus_message_get_name (message), +                          "ServiceCreated",                            error.message);                dbus_error_free (&error);                goto out; @@ -1154,22 +1329,21 @@ check_service_activated (BusContext     *context,        if (message == NULL)          {            _dbus_warn ("Expected a reply to %s, got nothing\n", -                      DBUS_MESSAGE_ACTIVATE_SERVICE); +                      "ActivateService");            goto out;          }      }    else      { -      _dbus_warn ("Expected to get service %s ServiceCreated, instead got %s\n", -                  activated_name, dbus_message_get_name (message)); +      warn_unexpected (connection, message, "ServiceCreated for the activated name"); +              goto out;      } -  if (!dbus_message_has_name (message, DBUS_MESSAGE_ACTIVATE_SERVICE)) +  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_RETURN)      { -      _dbus_warn ("Expected reply to %s, got message %s instead\n", -                  DBUS_MESSAGE_ACTIVATE_SERVICE, -                  dbus_message_get_name (message)); +      warn_unexpected (connection, message, "reply to ActivateService"); +        goto out;      } @@ -1181,7 +1355,7 @@ check_service_activated (BusContext     *context,        if (!dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))          {            _dbus_warn ("Did not have activation result first argument to %s: %s\n", -                      DBUS_MESSAGE_ACTIVATE_SERVICE, error.message); +                      "ActivateService", error.message);            dbus_error_free (&error);            goto out;          } @@ -1279,7 +1453,7 @@ check_send_exit_to_service (BusContext     *context,  {    dbus_bool_t got_error;    DBusMessage *message; -  dbus_int32_t serial; +  dbus_uint32_t serial;    dbus_bool_t retval;    _dbus_verbose ("Sending exit message to the test service\n"); @@ -1287,8 +1461,10 @@ check_send_exit_to_service (BusContext     *context,    retval = FALSE;    /* Kill off the test service by sending it a quit message */ -  message = dbus_message_new ("org.freedesktop.DBus.TestSuiteExit", -                              service_name); +  message = dbus_message_new_method_call (service_name, +                                          "/org/freedesktop/TestSuite", +                                          "org.freedesktop.TestSuite", +                                          "Exit");    if (message == NULL)      { @@ -1324,7 +1500,7 @@ check_send_exit_to_service (BusContext     *context,    /* see if we got an error during message bus dispatching */    bus_test_run_clients_loop (FALSE);    message = dbus_connection_borrow_message (connection); -  got_error = message != NULL && dbus_message_get_is_error (message); +  got_error = message != NULL && dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR;    if (message)      {        dbus_connection_return_message (connection, message); @@ -1344,21 +1520,16 @@ check_send_exit_to_service (BusContext     *context,        message = pop_message_waiting_for_memory (connection);        _dbus_assert (message != NULL); -      if (!dbus_message_get_is_error (message)) +      if (!dbus_message_is_error (message, +                                  DBUS_ERROR_NO_MEMORY))          { -          _dbus_warn ("expecting an error reply to asking test service to exit, got %s\n", -                      dbus_message_get_name (message)); -          goto out; -        } -      else if (!dbus_message_has_name (message, DBUS_ERROR_NO_MEMORY)) -        { -          _dbus_warn ("not expecting error %s when asking test service to exit\n", -                      dbus_message_get_name (message)); +          warn_unexpected (connection, message, +                           "a no memory error from asking test service to exit");            goto out;          }        _dbus_verbose ("Got error %s when asking test service to exit\n", -                     dbus_message_get_name (message)); +                     dbus_message_get_error_name (message));        /* Do this again; we still need the service to exit... */        if (!check_send_exit_to_service (context, connection, @@ -1402,10 +1573,10 @@ check_got_error (BusContext     *context,        goto out;      } -  if (!dbus_message_get_is_error (message)) +  if (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_ERROR)      { -      _dbus_warn ("Expected an error, got %s\n", -                  dbus_message_get_name (message)); +      warn_unexpected (connection, message, "an error"); +        goto out;      } @@ -1415,7 +1586,7 @@ check_got_error (BusContext     *context,    error_name = first_error_name;    while (error_name != NULL)      { -      if (dbus_message_has_name (message, error_name)) +      if (dbus_message_is_error (message, error_name))          {            error_found = TRUE;            break; @@ -1428,7 +1599,7 @@ check_got_error (BusContext     *context,      {        _dbus_warn ("Expected error %s or other, got %s instead\n",                    first_error_name, -                  dbus_message_get_name (message)); +                  dbus_message_get_error_name (message));        goto out;      } @@ -1451,7 +1622,7 @@ check_existent_service_activation (BusContext     *context,                                     DBusConnection *connection)  {    DBusMessage *message; -  dbus_int32_t serial; +  dbus_uint32_t serial;    dbus_bool_t retval;    DBusError error;    char *base_service; @@ -1460,8 +1631,10 @@ check_existent_service_activation (BusContext     *context,    dbus_error_init (&error); -  message = dbus_message_new (DBUS_MESSAGE_ACTIVATE_SERVICE, -                              DBUS_SERVICE_DBUS); +  message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, +                                          DBUS_PATH_ORG_FREEDESKTOP_DBUS, +                                          DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                                          "ActivateService");    if (message == NULL)      return TRUE; @@ -1505,17 +1678,16 @@ check_existent_service_activation (BusContext     *context,    if (message == NULL)      {        _dbus_warn ("Did not receive any messages after %s %d on %p\n", -                  DBUS_MESSAGE_ACTIVATE_SERVICE, serial, connection); +                  "ActivateService", serial, connection);        goto out;      } -  _dbus_verbose ("Received %s on %p after sending %s\n", -                 dbus_message_get_name (message), connection, -                 DBUS_MESSAGE_ACTIVATE_SERVICE); +  verbose_message_received (connection, message); +  _dbus_verbose ("  (after sending %s)\n", "ActivateService"); -  if (dbus_message_get_is_error (message)) +  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)      { -      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) +      if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))          {            _dbus_warn ("Message has wrong sender %s\n",                        dbus_message_get_sender (message) ? @@ -1523,12 +1695,12 @@ check_existent_service_activation (BusContext     *context,            goto out;          } -      if (dbus_message_has_name (message, +      if (dbus_message_is_error (message,                                   DBUS_ERROR_NO_MEMORY))          {            ; /* good, this is a valid response */          } -      else if (dbus_message_has_name (message, +      else if (dbus_message_is_error (message,                                        DBUS_ERROR_SPAWN_CHILD_EXITED))          {            ; /* good, this is expected also */ @@ -1536,7 +1708,7 @@ check_existent_service_activation (BusContext     *context,        else          {            _dbus_warn ("Did not expect error %s\n", -                      dbus_message_get_name (message)); +                      dbus_message_get_error_name (message));            goto out;          }      } @@ -1562,8 +1734,10 @@ check_existent_service_activation (BusContext     *context,            goto out;          } -      got_service_deleted = dbus_message_has_name (message, DBUS_MESSAGE_SERVICE_DELETED); -      got_error = dbus_message_get_is_error (message); +      got_service_deleted = dbus_message_is_signal (message, +                                                    DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                                                    "ServiceDeleted"); +      got_error = dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR;        dbus_connection_return_message (connection, message);        message = NULL; @@ -1662,14 +1836,16 @@ check_segfault_service_activation (BusContext     *context,                                     DBusConnection *connection)  {    DBusMessage *message; -  dbus_int32_t serial; +  dbus_uint32_t serial;    dbus_bool_t retval;    DBusError error;    dbus_error_init (&error); -  message = dbus_message_new (DBUS_MESSAGE_ACTIVATE_SERVICE, -                              DBUS_SERVICE_DBUS); +  message = dbus_message_new_method_call (DBUS_SERVICE_ORG_FREEDESKTOP_DBUS, +                                          DBUS_PATH_ORG_FREEDESKTOP_DBUS, +                                          DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, +                                          "ActivateService");    if (message == NULL)      return TRUE; @@ -1709,16 +1885,15 @@ check_segfault_service_activation (BusContext     *context,    if (message == NULL)      {        _dbus_warn ("Did not receive a reply to %s %d on %p\n", -                  DBUS_MESSAGE_ACTIVATE_SERVICE, serial, connection); +                  "ActivateService", serial, connection);        goto out;      } -  _dbus_verbose ("Received %s on %p\n", -                 dbus_message_get_name (message), connection); +  verbose_message_received (connection, message); -  if (dbus_message_get_is_error (message)) +  if (dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR)      { -      if (!dbus_message_has_sender (message, DBUS_SERVICE_DBUS)) +      if (!dbus_message_has_sender (message, DBUS_SERVICE_ORG_FREEDESKTOP_DBUS))          {            _dbus_warn ("Message has wrong sender %s\n",                        dbus_message_get_sender (message) ? @@ -1726,20 +1901,20 @@ check_segfault_service_activation (BusContext     *context,            goto out;          } -      if (dbus_message_has_name (message, -                                DBUS_ERROR_NO_MEMORY)) +      if (dbus_message_is_error (message, +                                 DBUS_ERROR_NO_MEMORY))          {            ; /* good, this is a valid response */          } -      else if (dbus_message_has_name (message, -                                     DBUS_ERROR_SPAWN_CHILD_SIGNALED)) +      else if (dbus_message_is_error (message, +                                      DBUS_ERROR_SPAWN_CHILD_SIGNALED))          {            ; /* good, this is expected also */          }        else          { -          _dbus_warn ("Did not expect error %s\n", -                      dbus_message_get_name (message)); +          warn_unexpected (connection, message, "not this error"); +            goto out;          }      } @@ -1862,6 +2037,9 @@ bus_dispatch_test (const DBusString *test_data_dir)    if (!check_hello_message (context, foo))      _dbus_assert_not_reached ("hello message failed"); + +  if (!check_add_match_all (context, foo)) +    _dbus_assert_not_reached ("AddMatch message failed");    bar = dbus_connection_open ("debug-pipe:name=test-server", &error);    if (bar == NULL) @@ -1872,6 +2050,9 @@ bus_dispatch_test (const DBusString *test_data_dir)    if (!check_hello_message (context, bar))      _dbus_assert_not_reached ("hello message failed"); + +  if (!check_add_match_all (context, bar)) +    _dbus_assert_not_reached ("AddMatch message failed");    baz = dbus_connection_open ("debug-pipe:name=test-server", &error);    if (baz == NULL) @@ -1883,6 +2064,9 @@ bus_dispatch_test (const DBusString *test_data_dir)    if (!check_hello_message (context, baz))      _dbus_assert_not_reached ("hello message failed"); +  if (!check_add_match_all (context, baz)) +    _dbus_assert_not_reached ("AddMatch message failed"); +      if (!check_no_leftovers (context))      {        _dbus_warn ("Messages were left over after setting up initial connections"); @@ -1939,6 +2123,9 @@ bus_dispatch_sha1_test (const DBusString *test_data_dir)    if (!check_hello_message (context, foo))      _dbus_assert_not_reached ("hello message failed"); +  if (!check_add_match_all (context, foo)) +    _dbus_assert_not_reached ("addmatch message failed"); +      if (!check_no_leftovers (context))      {        _dbus_warn ("Messages were left over after setting up initial SHA-1 connection\n"); | 
