D-Bus  1.6.8
dbus-connection.c
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* dbus-connection.c DBusConnection object
3  *
4  * Copyright (C) 2002-2006 Red Hat Inc.
5  *
6  * Licensed under the Academic Free License version 2.1
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  *
22  */
23 
24 #include <config.h>
25 #include "dbus-shared.h"
26 #include "dbus-connection.h"
27 #include "dbus-list.h"
28 #include "dbus-timeout.h"
29 #include "dbus-transport.h"
30 #include "dbus-watch.h"
31 #include "dbus-connection-internal.h"
32 #include "dbus-pending-call-internal.h"
33 #include "dbus-list.h"
34 #include "dbus-hash.h"
35 #include "dbus-message-internal.h"
36 #include "dbus-message-private.h"
37 #include "dbus-threads.h"
38 #include "dbus-protocol.h"
39 #include "dbus-dataslot.h"
40 #include "dbus-string.h"
41 #include "dbus-signature.h"
42 #include "dbus-pending-call.h"
43 #include "dbus-object-tree.h"
44 #include "dbus-threads-internal.h"
45 #include "dbus-bus.h"
46 #include "dbus-marshal-basic.h"
47 
48 #ifdef DBUS_DISABLE_CHECKS
49 #define TOOK_LOCK_CHECK(connection)
50 #define RELEASING_LOCK_CHECK(connection)
51 #define HAVE_LOCK_CHECK(connection)
52 #else
53 #define TOOK_LOCK_CHECK(connection) do { \
54  _dbus_assert (!(connection)->have_connection_lock); \
55  (connection)->have_connection_lock = TRUE; \
56  } while (0)
57 #define RELEASING_LOCK_CHECK(connection) do { \
58  _dbus_assert ((connection)->have_connection_lock); \
59  (connection)->have_connection_lock = FALSE; \
60  } while (0)
61 #define HAVE_LOCK_CHECK(connection) _dbus_assert ((connection)->have_connection_lock)
62 /* A "DO_NOT_HAVE_LOCK_CHECK" is impossible since we need the lock to check the flag */
63 #endif
64 
65 #define TRACE_LOCKS 1
66 
67 #define CONNECTION_LOCK(connection) do { \
68  if (TRACE_LOCKS) { _dbus_verbose ("LOCK\n"); } \
69  _dbus_rmutex_lock ((connection)->mutex); \
70  TOOK_LOCK_CHECK (connection); \
71  } while (0)
72 
73 #define CONNECTION_UNLOCK(connection) _dbus_connection_unlock (connection)
74 
75 #define SLOTS_LOCK(connection) do { \
76  _dbus_rmutex_lock ((connection)->slot_mutex); \
77  } while (0)
78 
79 #define SLOTS_UNLOCK(connection) do { \
80  _dbus_rmutex_unlock ((connection)->slot_mutex); \
81  } while (0)
82 
83 #define DISPATCH_STATUS_NAME(s) \
84  ((s) == DBUS_DISPATCH_COMPLETE ? "complete" : \
85  (s) == DBUS_DISPATCH_DATA_REMAINS ? "data remains" : \
86  (s) == DBUS_DISPATCH_NEED_MEMORY ? "need memory" : \
87  "???")
88 
206 #ifdef DBUS_ENABLE_VERBOSE_MODE
207 static void
208 _dbus_connection_trace_ref (DBusConnection *connection,
209  int old_refcount,
210  int new_refcount,
211  const char *why)
212 {
213  static int enabled = -1;
214 
215  _dbus_trace_ref ("DBusConnection", connection, old_refcount, new_refcount,
216  why, "DBUS_CONNECTION_TRACE", &enabled);
217 }
218 #else
219 #define _dbus_connection_trace_ref(c,o,n,w) \
220  do \
221  {\
222  (void) (o); \
223  (void) (n); \
224  } while (0)
225 #endif
226 
231 
236 {
239  void *user_data;
241 };
242 
243 
248 {
252 };
253 
254 #if HAVE_DECL_MSG_NOSIGNAL
255 static dbus_bool_t _dbus_modify_sigpipe = FALSE;
256 #else
257 static dbus_bool_t _dbus_modify_sigpipe = TRUE;
258 #endif
259 
264 {
298  dbus_uint32_t client_serial;
313  char *server_guid;
315  /* These two MUST be bools and not bitfields, because they are protected by a separate lock
316  * from connection->mutex and all bitfields in a word have to be read/written together.
317  * So you can't have a different lock for different bitfields in the same word.
318  */
322  unsigned int shareable : 1;
324  unsigned int exit_on_disconnect : 1;
326  unsigned int route_peer_messages : 1;
328  unsigned int disconnected_message_arrived : 1;
336 #ifndef DBUS_DISABLE_CHECKS
337  unsigned int have_connection_lock : 1;
338 #endif
339 
340 #ifndef DBUS_DISABLE_CHECKS
342 #endif
343 };
344 
345 static DBusDispatchStatus _dbus_connection_get_dispatch_status_unlocked (DBusConnection *connection);
346 static void _dbus_connection_update_dispatch_status_and_unlock (DBusConnection *connection,
347  DBusDispatchStatus new_status);
348 static void _dbus_connection_last_unref (DBusConnection *connection);
349 static void _dbus_connection_acquire_dispatch (DBusConnection *connection);
350 static void _dbus_connection_release_dispatch (DBusConnection *connection);
351 static DBusDispatchStatus _dbus_connection_flush_unlocked (DBusConnection *connection);
352 static void _dbus_connection_close_possibly_shared_and_unlock (DBusConnection *connection);
353 static dbus_bool_t _dbus_connection_get_is_connected_unlocked (DBusConnection *connection);
354 static dbus_bool_t _dbus_connection_peek_for_reply_unlocked (DBusConnection *connection,
355  dbus_uint32_t client_serial);
356 
357 static DBusMessageFilter *
358 _dbus_message_filter_ref (DBusMessageFilter *filter)
359 {
360 #ifdef DBUS_DISABLE_ASSERT
361  _dbus_atomic_inc (&filter->refcount);
362 #else
363  dbus_int32_t old_value;
364 
365  old_value = _dbus_atomic_inc (&filter->refcount);
366  _dbus_assert (old_value > 0);
367 #endif
368 
369  return filter;
370 }
371 
372 static void
373 _dbus_message_filter_unref (DBusMessageFilter *filter)
374 {
375  dbus_int32_t old_value;
376 
377  old_value = _dbus_atomic_dec (&filter->refcount);
378  _dbus_assert (old_value > 0);
379 
380  if (old_value == 1)
381  {
382  if (filter->free_user_data_function)
383  (* filter->free_user_data_function) (filter->user_data);
384 
385  dbus_free (filter);
386  }
387 }
388 
394 void
396 {
397  CONNECTION_LOCK (connection);
398 }
399 
405 void
407 {
408  DBusList *expired_messages;
409  DBusList *iter;
410 
411  if (TRACE_LOCKS)
412  {
413  _dbus_verbose ("UNLOCK\n");
414  }
415 
416  /* If we had messages that expired (fell off the incoming or outgoing
417  * queues) while we were locked, actually release them now */
418  expired_messages = connection->expired_messages;
419  connection->expired_messages = NULL;
420 
421  RELEASING_LOCK_CHECK (connection);
422  _dbus_rmutex_unlock (connection->mutex);
423 
424  for (iter = _dbus_list_pop_first_link (&expired_messages);
425  iter != NULL;
426  iter = _dbus_list_pop_first_link (&expired_messages))
427  {
428  DBusMessage *message = iter->data;
429 
430  dbus_message_unref (message);
431  _dbus_list_free_link (iter);
432  }
433 }
434 
442 static void
443 _dbus_connection_wakeup_mainloop (DBusConnection *connection)
444 {
445  if (connection->wakeup_main_function)
446  (*connection->wakeup_main_function) (connection->wakeup_main_data);
447 }
448 
449 #ifdef DBUS_BUILD_TESTS
450 
462 void
463 _dbus_connection_test_get_locks (DBusConnection *connection,
464  DBusMutex **mutex_loc,
465  DBusMutex **dispatch_mutex_loc,
466  DBusMutex **io_path_mutex_loc,
467  DBusCondVar **dispatch_cond_loc,
468  DBusCondVar **io_path_cond_loc)
469 {
470  *mutex_loc = (DBusMutex *) connection->mutex;
471  *dispatch_mutex_loc = (DBusMutex *) connection->dispatch_mutex;
472  *io_path_mutex_loc = (DBusMutex *) connection->io_path_mutex;
473  *dispatch_cond_loc = connection->dispatch_cond;
474  *io_path_cond_loc = connection->io_path_cond;
475 }
476 #endif
477 
486 void
488  DBusList *link)
489 {
490  DBusPendingCall *pending;
491  dbus_uint32_t reply_serial;
492  DBusMessage *message;
493 
495 
497  link);
498  message = link->data;
499 
500  /* If this is a reply we're waiting on, remove timeout for it */
501  reply_serial = dbus_message_get_reply_serial (message);
502  if (reply_serial != 0)
503  {
504  pending = _dbus_hash_table_lookup_int (connection->pending_replies,
505  reply_serial);
506  if (pending != NULL)
507  {
511 
513  }
514  }
515 
516 
517 
518  connection->n_incoming += 1;
519 
520  _dbus_connection_wakeup_mainloop (connection);
521 
522  _dbus_verbose ("Message %p (%s %s %s %s '%s' reply to %u) added to incoming queue %p, %d incoming\n",
523  message,
525  dbus_message_get_path (message) ?
526  dbus_message_get_path (message) :
527  "no path",
528  dbus_message_get_interface (message) ?
529  dbus_message_get_interface (message) :
530  "no interface",
531  dbus_message_get_member (message) ?
532  dbus_message_get_member (message) :
533  "no member",
534  dbus_message_get_signature (message),
536  connection,
537  connection->n_incoming);
538 
539  _dbus_message_trace_ref (message, -1, -1,
540  "_dbus_conection_queue_received_message_link");
541 }
542 
551 void
553  DBusList *link)
554 {
555  HAVE_LOCK_CHECK (connection);
556 
557  _dbus_list_append_link (&connection->incoming_messages, link);
558 
559  connection->n_incoming += 1;
560 
561  _dbus_connection_wakeup_mainloop (connection);
562 
563  _dbus_message_trace_ref (link->data, -1, -1,
564  "_dbus_connection_queue_synthesized_message_link");
565 
566  _dbus_verbose ("Synthesized message %p added to incoming queue %p, %d incoming\n",
567  link->data, connection, connection->n_incoming);
568 }
569 
570 
580 {
581  HAVE_LOCK_CHECK (connection);
582  return connection->outgoing_messages != NULL;
583 }
584 
596 {
597  dbus_bool_t v;
598 
599  _dbus_return_val_if_fail (connection != NULL, FALSE);
600 
601  CONNECTION_LOCK (connection);
603  CONNECTION_UNLOCK (connection);
604 
605  return v;
606 }
607 
617 {
618  HAVE_LOCK_CHECK (connection);
619 
620  return _dbus_list_get_last (&connection->outgoing_messages);
621 }
622 
631 void
633  DBusMessage *message)
634 {
635  DBusList *link;
636 
637  HAVE_LOCK_CHECK (connection);
638 
639  /* This can be called before we even complete authentication, since
640  * it's called on disconnect to clean up the outgoing queue.
641  * It's also called as we successfully send each message.
642  */
643 
644  link = _dbus_list_get_last_link (&connection->outgoing_messages);
645  _dbus_assert (link != NULL);
646  _dbus_assert (link->data == message);
647 
648  _dbus_list_unlink (&connection->outgoing_messages,
649  link);
650  _dbus_list_prepend_link (&connection->expired_messages, link);
651 
652  connection->n_outgoing -= 1;
653 
654  _dbus_verbose ("Message %p (%s %s %s %s '%s') removed from outgoing queue %p, %d left to send\n",
655  message,
657  dbus_message_get_path (message) ?
658  dbus_message_get_path (message) :
659  "no path",
660  dbus_message_get_interface (message) ?
661  dbus_message_get_interface (message) :
662  "no interface",
663  dbus_message_get_member (message) ?
664  dbus_message_get_member (message) :
665  "no member",
666  dbus_message_get_signature (message),
667  connection, connection->n_outgoing);
668 
669  /* It's OK that in principle we call the notify function, because for the
670  * outgoing limit, there isn't one */
671  _dbus_message_remove_counter (message, connection->outgoing_counter);
672 
673  /* The message will actually be unreffed when we unlock */
674 }
675 
678  DBusWatch *watch);
680 typedef void (* DBusWatchRemoveFunction) (DBusWatchList *list,
681  DBusWatch *watch);
683 typedef void (* DBusWatchToggleFunction) (DBusWatchList *list,
684  DBusWatch *watch,
685  dbus_bool_t enabled);
686 
687 static dbus_bool_t
688 protected_change_watch (DBusConnection *connection,
689  DBusWatch *watch,
690  DBusWatchAddFunction add_function,
691  DBusWatchRemoveFunction remove_function,
692  DBusWatchToggleFunction toggle_function,
693  dbus_bool_t enabled)
694 {
695  dbus_bool_t retval;
696 
697  HAVE_LOCK_CHECK (connection);
698 
699  /* The original purpose of protected_change_watch() was to hold a
700  * ref on the connection while dropping the connection lock, then
701  * calling out to the app. This was a broken hack that did not
702  * work, since the connection was in a hosed state (no WatchList
703  * field) while calling out.
704  *
705  * So for now we'll just keep the lock while calling out. This means
706  * apps are not allowed to call DBusConnection methods inside a
707  * watch function or they will deadlock.
708  *
709  * The "real fix" is to use the _and_unlock() pattern found
710  * elsewhere in the code, to defer calling out to the app until
711  * we're about to drop locks and return flow of control to the app
712  * anyway.
713  *
714  * See http://lists.freedesktop.org/archives/dbus/2007-July/thread.html#8144
715  */
716 
717  if (connection->watches)
718  {
719  if (add_function)
720  retval = (* add_function) (connection->watches, watch);
721  else if (remove_function)
722  {
723  retval = TRUE;
724  (* remove_function) (connection->watches, watch);
725  }
726  else
727  {
728  retval = TRUE;
729  (* toggle_function) (connection->watches, watch, enabled);
730  }
731  return retval;
732  }
733  else
734  return FALSE;
735 }
736 
737 
751  DBusWatch *watch)
752 {
753  return protected_change_watch (connection, watch,
755  NULL, NULL, FALSE);
756 }
757 
767 void
769  DBusWatch *watch)
770 {
771  protected_change_watch (connection, watch,
772  NULL,
774  NULL, FALSE);
775 }
776 
787 void
789  DBusWatch *watch,
790  dbus_bool_t enabled)
791 {
792  _dbus_assert (watch != NULL);
793 
794  protected_change_watch (connection, watch,
795  NULL, NULL,
797  enabled);
798 }
799 
802  DBusTimeout *timeout);
805  DBusTimeout *timeout);
808  DBusTimeout *timeout,
809  dbus_bool_t enabled);
810 
811 static dbus_bool_t
812 protected_change_timeout (DBusConnection *connection,
813  DBusTimeout *timeout,
814  DBusTimeoutAddFunction add_function,
815  DBusTimeoutRemoveFunction remove_function,
816  DBusTimeoutToggleFunction toggle_function,
817  dbus_bool_t enabled)
818 {
819  dbus_bool_t retval;
820 
821  HAVE_LOCK_CHECK (connection);
822 
823  /* The original purpose of protected_change_timeout() was to hold a
824  * ref on the connection while dropping the connection lock, then
825  * calling out to the app. This was a broken hack that did not
826  * work, since the connection was in a hosed state (no TimeoutList
827  * field) while calling out.
828  *
829  * So for now we'll just keep the lock while calling out. This means
830  * apps are not allowed to call DBusConnection methods inside a
831  * timeout function or they will deadlock.
832  *
833  * The "real fix" is to use the _and_unlock() pattern found
834  * elsewhere in the code, to defer calling out to the app until
835  * we're about to drop locks and return flow of control to the app
836  * anyway.
837  *
838  * See http://lists.freedesktop.org/archives/dbus/2007-July/thread.html#8144
839  */
840 
841  if (connection->timeouts)
842  {
843  if (add_function)
844  retval = (* add_function) (connection->timeouts, timeout);
845  else if (remove_function)
846  {
847  retval = TRUE;
848  (* remove_function) (connection->timeouts, timeout);
849  }
850  else
851  {
852  retval = TRUE;
853  (* toggle_function) (connection->timeouts, timeout, enabled);
854  }
855  return retval;
856  }
857  else
858  return FALSE;
859 }
860 
875  DBusTimeout *timeout)
876 {
877  return protected_change_timeout (connection, timeout,
879  NULL, NULL, FALSE);
880 }
881 
891 void
893  DBusTimeout *timeout)
894 {
895  protected_change_timeout (connection, timeout,
896  NULL,
898  NULL, FALSE);
899 }
900 
911 void
913  DBusTimeout *timeout,
914  dbus_bool_t enabled)
915 {
916  protected_change_timeout (connection, timeout,
917  NULL, NULL,
919  enabled);
920 }
921 
922 static dbus_bool_t
923 _dbus_connection_attach_pending_call_unlocked (DBusConnection *connection,
924  DBusPendingCall *pending)
925 {
926  dbus_uint32_t reply_serial;
927  DBusTimeout *timeout;
928 
929  HAVE_LOCK_CHECK (connection);
930 
931  reply_serial = _dbus_pending_call_get_reply_serial_unlocked (pending);
932 
933  _dbus_assert (reply_serial != 0);
934 
935  timeout = _dbus_pending_call_get_timeout_unlocked (pending);
936 
937  if (timeout)
938  {
939  if (!_dbus_connection_add_timeout_unlocked (connection, timeout))
940  return FALSE;
941 
943  reply_serial,
944  pending))
945  {
946  _dbus_connection_remove_timeout_unlocked (connection, timeout);
947 
949  HAVE_LOCK_CHECK (connection);
950  return FALSE;
951  }
952 
954  }
955  else
956  {
958  reply_serial,
959  pending))
960  {
961  HAVE_LOCK_CHECK (connection);
962  return FALSE;
963  }
964  }
965 
967 
968  HAVE_LOCK_CHECK (connection);
969 
970  return TRUE;
971 }
972 
973 static void
974 free_pending_call_on_hash_removal (void *data)
975 {
976  DBusPendingCall *pending;
977  DBusConnection *connection;
978 
979  if (data == NULL)
980  return;
981 
982  pending = data;
983 
984  connection = _dbus_pending_call_get_connection_unlocked (pending);
985 
986  HAVE_LOCK_CHECK (connection);
987 
989  {
992 
994  }
995 
996  /* FIXME 1.0? this is sort of dangerous and undesirable to drop the lock
997  * here, but the pending call finalizer could in principle call out to
998  * application code so we pretty much have to... some larger code reorg
999  * might be needed.
1000  */
1001  _dbus_connection_ref_unlocked (connection);
1003  CONNECTION_LOCK (connection);
1004  _dbus_connection_unref_unlocked (connection);
1005 }
1006 
1007 static void
1008 _dbus_connection_detach_pending_call_unlocked (DBusConnection *connection,
1009  DBusPendingCall *pending)
1010 {
1011  /* This ends up unlocking to call the pending call finalizer, which is unexpected to
1012  * say the least.
1013  */
1016 }
1017 
1018 static void
1019 _dbus_connection_detach_pending_call_and_unlock (DBusConnection *connection,
1020  DBusPendingCall *pending)
1021 {
1022  /* The idea here is to avoid finalizing the pending call
1023  * with the lock held, since there's a destroy notifier
1024  * in pending call that goes out to application code.
1025  *
1026  * There's an extra unlock inside the hash table
1027  * "free pending call" function FIXME...
1028  */
1032 
1036 
1038 
1040 }
1041 
1050 void
1052  DBusPendingCall *pending)
1053 {
1054  CONNECTION_LOCK (connection);
1055  _dbus_connection_detach_pending_call_and_unlock (connection, pending);
1056 }
1057 
1067 static dbus_bool_t
1068 _dbus_connection_acquire_io_path (DBusConnection *connection,
1069  int timeout_milliseconds)
1070 {
1071  dbus_bool_t we_acquired;
1072 
1073  HAVE_LOCK_CHECK (connection);
1074 
1075  /* We don't want the connection to vanish */
1076  _dbus_connection_ref_unlocked (connection);
1077 
1078  /* We will only touch io_path_acquired which is protected by our mutex */
1079  CONNECTION_UNLOCK (connection);
1080 
1081  _dbus_verbose ("locking io_path_mutex\n");
1082  _dbus_cmutex_lock (connection->io_path_mutex);
1083 
1084  _dbus_verbose ("start connection->io_path_acquired = %d timeout = %d\n",
1085  connection->io_path_acquired, timeout_milliseconds);
1086 
1087  we_acquired = FALSE;
1088 
1089  if (connection->io_path_acquired)
1090  {
1091  if (timeout_milliseconds != -1)
1092  {
1093  _dbus_verbose ("waiting %d for IO path to be acquirable\n",
1094  timeout_milliseconds);
1095 
1096  if (!_dbus_condvar_wait_timeout (connection->io_path_cond,
1097  connection->io_path_mutex,
1098  timeout_milliseconds))
1099  {
1100  /* We timed out before anyone signaled. */
1101  /* (writing the loop to handle the !timedout case by
1102  * waiting longer if needed is a pain since dbus
1103  * wraps pthread_cond_timedwait to take a relative
1104  * time instead of absolute, something kind of stupid
1105  * on our part. for now it doesn't matter, we will just
1106  * end up back here eventually.)
1107  */
1108  }
1109  }
1110  else
1111  {
1112  while (connection->io_path_acquired)
1113  {
1114  _dbus_verbose ("waiting for IO path to be acquirable\n");
1115  _dbus_condvar_wait (connection->io_path_cond,
1116  connection->io_path_mutex);
1117  }
1118  }
1119  }
1120 
1121  if (!connection->io_path_acquired)
1122  {
1123  we_acquired = TRUE;
1124  connection->io_path_acquired = TRUE;
1125  }
1126 
1127  _dbus_verbose ("end connection->io_path_acquired = %d we_acquired = %d\n",
1128  connection->io_path_acquired, we_acquired);
1129 
1130  _dbus_verbose ("unlocking io_path_mutex\n");
1131  _dbus_cmutex_unlock (connection->io_path_mutex);
1132 
1133  CONNECTION_LOCK (connection);
1134 
1135  HAVE_LOCK_CHECK (connection);
1136 
1137  _dbus_connection_unref_unlocked (connection);
1138 
1139  return we_acquired;
1140 }
1141 
1149 static void
1150 _dbus_connection_release_io_path (DBusConnection *connection)
1151 {
1152  HAVE_LOCK_CHECK (connection);
1153 
1154  _dbus_verbose ("locking io_path_mutex\n");
1155  _dbus_cmutex_lock (connection->io_path_mutex);
1156 
1157  _dbus_assert (connection->io_path_acquired);
1158 
1159  _dbus_verbose ("start connection->io_path_acquired = %d\n",
1160  connection->io_path_acquired);
1161 
1162  connection->io_path_acquired = FALSE;
1163  _dbus_condvar_wake_one (connection->io_path_cond);
1164 
1165  _dbus_verbose ("unlocking io_path_mutex\n");
1166  _dbus_cmutex_unlock (connection->io_path_mutex);
1167 }
1168 
1204 void
1206  DBusPendingCall *pending,
1207  unsigned int flags,
1208  int timeout_milliseconds)
1209 {
1210  _dbus_verbose ("start\n");
1211 
1212  HAVE_LOCK_CHECK (connection);
1213 
1214  if (connection->n_outgoing == 0)
1215  flags &= ~DBUS_ITERATION_DO_WRITING;
1216 
1217  if (_dbus_connection_acquire_io_path (connection,
1218  (flags & DBUS_ITERATION_BLOCK) ? timeout_milliseconds : 0))
1219  {
1220  HAVE_LOCK_CHECK (connection);
1221 
1222  if ( (pending != NULL) && _dbus_pending_call_get_completed_unlocked(pending))
1223  {
1224  _dbus_verbose ("pending call completed while acquiring I/O path");
1225  }
1226  else if ( (pending != NULL) &&
1227  _dbus_connection_peek_for_reply_unlocked (connection,
1229  {
1230  _dbus_verbose ("pending call completed while acquiring I/O path (reply found in queue)");
1231  }
1232  else
1233  {
1235  flags, timeout_milliseconds);
1236  }
1237 
1238  _dbus_connection_release_io_path (connection);
1239  }
1240 
1241  HAVE_LOCK_CHECK (connection);
1242 
1243  _dbus_verbose ("end\n");
1244 }
1245 
1257 {
1258  DBusConnection *connection;
1259  DBusWatchList *watch_list;
1260  DBusTimeoutList *timeout_list;
1261  DBusHashTable *pending_replies;
1262  DBusList *disconnect_link;
1263  DBusMessage *disconnect_message;
1264  DBusCounter *outgoing_counter;
1265  DBusObjectTree *objects;
1266 
1267  watch_list = NULL;
1268  connection = NULL;
1269  pending_replies = NULL;
1270  timeout_list = NULL;
1271  disconnect_link = NULL;
1272  disconnect_message = NULL;
1273  outgoing_counter = NULL;
1274  objects = NULL;
1275 
1276  watch_list = _dbus_watch_list_new ();
1277  if (watch_list == NULL)
1278  goto error;
1279 
1280  timeout_list = _dbus_timeout_list_new ();
1281  if (timeout_list == NULL)
1282  goto error;
1283 
1284  pending_replies =
1286  NULL,
1287  (DBusFreeFunction)free_pending_call_on_hash_removal);
1288  if (pending_replies == NULL)
1289  goto error;
1290 
1291  connection = dbus_new0 (DBusConnection, 1);
1292  if (connection == NULL)
1293  goto error;
1294 
1295  _dbus_rmutex_new_at_location (&connection->mutex);
1296  if (connection->mutex == NULL)
1297  goto error;
1298 
1300  if (connection->io_path_mutex == NULL)
1301  goto error;
1302 
1304  if (connection->dispatch_mutex == NULL)
1305  goto error;
1306 
1308  if (connection->dispatch_cond == NULL)
1309  goto error;
1310 
1312  if (connection->io_path_cond == NULL)
1313  goto error;
1314 
1316  if (connection->slot_mutex == NULL)
1317  goto error;
1318 
1319  disconnect_message = dbus_message_new_signal (DBUS_PATH_LOCAL,
1321  "Disconnected");
1322 
1323  if (disconnect_message == NULL)
1324  goto error;
1325 
1326  disconnect_link = _dbus_list_alloc_link (disconnect_message);
1327  if (disconnect_link == NULL)
1328  goto error;
1329 
1330  outgoing_counter = _dbus_counter_new ();
1331  if (outgoing_counter == NULL)
1332  goto error;
1333 
1334  objects = _dbus_object_tree_new (connection);
1335  if (objects == NULL)
1336  goto error;
1337 
1338  if (_dbus_modify_sigpipe)
1340 
1341  /* initialized to 0: use atomic op to avoid mixing atomic and non-atomic */
1342  _dbus_atomic_inc (&connection->refcount);
1343  connection->transport = transport;
1344  connection->watches = watch_list;
1345  connection->timeouts = timeout_list;
1346  connection->pending_replies = pending_replies;
1347  connection->outgoing_counter = outgoing_counter;
1348  connection->filter_list = NULL;
1349  connection->last_dispatch_status = DBUS_DISPATCH_COMPLETE; /* so we're notified first time there's data */
1350  connection->objects = objects;
1351  connection->exit_on_disconnect = FALSE;
1352  connection->shareable = FALSE;
1353  connection->route_peer_messages = FALSE;
1354  connection->disconnected_message_arrived = FALSE;
1355  connection->disconnected_message_processed = FALSE;
1356 
1357 #ifndef DBUS_DISABLE_CHECKS
1358  connection->generation = _dbus_current_generation;
1359 #endif
1360 
1361  _dbus_data_slot_list_init (&connection->slot_list);
1362 
1363  connection->client_serial = 1;
1364 
1365  connection->disconnect_message_link = disconnect_link;
1366 
1367  CONNECTION_LOCK (connection);
1368 
1369  if (!_dbus_transport_set_connection (transport, connection))
1370  {
1371  CONNECTION_UNLOCK (connection);
1372 
1373  goto error;
1374  }
1375 
1376  _dbus_transport_ref (transport);
1377 
1378  CONNECTION_UNLOCK (connection);
1379 
1380  _dbus_connection_trace_ref (connection, 0, 1, "new_for_transport");
1381  return connection;
1382 
1383  error:
1384  if (disconnect_message != NULL)
1385  dbus_message_unref (disconnect_message);
1386 
1387  if (disconnect_link != NULL)
1388  _dbus_list_free_link (disconnect_link);
1389 
1390  if (connection != NULL)
1391  {
1394  _dbus_rmutex_free_at_location (&connection->mutex);
1398  dbus_free (connection);
1399  }
1400  if (pending_replies)
1401  _dbus_hash_table_unref (pending_replies);
1402 
1403  if (watch_list)
1404  _dbus_watch_list_free (watch_list);
1405 
1406  if (timeout_list)
1407  _dbus_timeout_list_free (timeout_list);
1408 
1409  if (outgoing_counter)
1410  _dbus_counter_unref (outgoing_counter);
1411 
1412  if (objects)
1413  _dbus_object_tree_unref (objects);
1414 
1415  return NULL;
1416 }
1417 
1427 {
1428  dbus_int32_t old_refcount;
1429 
1430  _dbus_assert (connection != NULL);
1432 
1433  HAVE_LOCK_CHECK (connection);
1434 
1435  old_refcount = _dbus_atomic_inc (&connection->refcount);
1436  _dbus_connection_trace_ref (connection, old_refcount, old_refcount + 1,
1437  "ref_unlocked");
1438 
1439  return connection;
1440 }
1441 
1448 void
1450 {
1451  dbus_int32_t old_refcount;
1452 
1453  HAVE_LOCK_CHECK (connection);
1454 
1455  _dbus_assert (connection != NULL);
1456 
1457  old_refcount = _dbus_atomic_dec (&connection->refcount);
1458 
1459  _dbus_connection_trace_ref (connection, old_refcount, old_refcount - 1,
1460  "unref_unlocked");
1461 
1462  if (old_refcount == 1)
1463  _dbus_connection_last_unref (connection);
1464 }
1465 
1466 static dbus_uint32_t
1467 _dbus_connection_get_next_client_serial (DBusConnection *connection)
1468 {
1469  dbus_uint32_t serial;
1470 
1471  serial = connection->client_serial++;
1472 
1473  if (connection->client_serial == 0)
1474  connection->client_serial = 1;
1475 
1476  return serial;
1477 }
1478 
1494  unsigned int condition,
1495  void *data)
1496 {
1497  DBusConnection *connection;
1498  dbus_bool_t retval;
1499  DBusDispatchStatus status;
1500 
1501  connection = data;
1502 
1503  _dbus_verbose ("start\n");
1504 
1505  CONNECTION_LOCK (connection);
1506 
1507  if (!_dbus_connection_acquire_io_path (connection, 1))
1508  {
1509  /* another thread is handling the message */
1510  CONNECTION_UNLOCK (connection);
1511  return TRUE;
1512  }
1513 
1514  HAVE_LOCK_CHECK (connection);
1515  retval = _dbus_transport_handle_watch (connection->transport,
1516  watch, condition);
1517 
1518  _dbus_connection_release_io_path (connection);
1519 
1520  HAVE_LOCK_CHECK (connection);
1521 
1522  _dbus_verbose ("middle\n");
1523 
1524  status = _dbus_connection_get_dispatch_status_unlocked (connection);
1525 
1526  /* this calls out to user code */
1527  _dbus_connection_update_dispatch_status_and_unlock (connection, status);
1528 
1529  _dbus_verbose ("end\n");
1530 
1531  return retval;
1532 }
1533 
1534 _DBUS_DEFINE_GLOBAL_LOCK (shared_connections);
1535 static DBusHashTable *shared_connections = NULL;
1536 static DBusList *shared_connections_no_guid = NULL;
1537 
1538 static void
1539 close_connection_on_shutdown (DBusConnection *connection)
1540 {
1541  DBusMessage *message;
1542 
1543  dbus_connection_ref (connection);
1545 
1546  /* Churn through to the Disconnected message */
1547  while ((message = dbus_connection_pop_message (connection)))
1548  {
1549  dbus_message_unref (message);
1550  }
1551  dbus_connection_unref (connection);
1552 }
1553 
1554 static void
1555 shared_connections_shutdown (void *data)
1556 {
1557  int n_entries;
1558 
1559  _DBUS_LOCK (shared_connections);
1560 
1561  /* This is a little bit unpleasant... better ideas? */
1562  while ((n_entries = _dbus_hash_table_get_n_entries (shared_connections)) > 0)
1563  {
1564  DBusConnection *connection;
1565  DBusHashIter iter;
1566 
1567  _dbus_hash_iter_init (shared_connections, &iter);
1568  _dbus_hash_iter_next (&iter);
1569 
1570  connection = _dbus_hash_iter_get_value (&iter);
1571 
1572  _DBUS_UNLOCK (shared_connections);
1573  close_connection_on_shutdown (connection);
1574  _DBUS_LOCK (shared_connections);
1575 
1576  /* The connection should now be dead and not in our hash ... */
1577  _dbus_assert (_dbus_hash_table_get_n_entries (shared_connections) < n_entries);
1578  }
1579 
1580  _dbus_assert (_dbus_hash_table_get_n_entries (shared_connections) == 0);
1581 
1582  _dbus_hash_table_unref (shared_connections);
1583  shared_connections = NULL;
1584 
1585  if (shared_connections_no_guid != NULL)
1586  {
1587  DBusConnection *connection;
1588  connection = _dbus_list_pop_first (&shared_connections_no_guid);
1589  while (connection != NULL)
1590  {
1591  _DBUS_UNLOCK (shared_connections);
1592  close_connection_on_shutdown (connection);
1593  _DBUS_LOCK (shared_connections);
1594  connection = _dbus_list_pop_first (&shared_connections_no_guid);
1595  }
1596  }
1597 
1598  shared_connections_no_guid = NULL;
1599 
1600  _DBUS_UNLOCK (shared_connections);
1601 }
1602 
1603 static dbus_bool_t
1604 connection_lookup_shared (DBusAddressEntry *entry,
1605  DBusConnection **result)
1606 {
1607  _dbus_verbose ("checking for existing connection\n");
1608 
1609  *result = NULL;
1610 
1611  _DBUS_LOCK (shared_connections);
1612 
1613  if (shared_connections == NULL)
1614  {
1615  _dbus_verbose ("creating shared_connections hash table\n");
1616 
1617  shared_connections = _dbus_hash_table_new (DBUS_HASH_STRING,
1618  dbus_free,
1619  NULL);
1620  if (shared_connections == NULL)
1621  {
1622  _DBUS_UNLOCK (shared_connections);
1623  return FALSE;
1624  }
1625 
1626  if (!_dbus_register_shutdown_func (shared_connections_shutdown, NULL))
1627  {
1628  _dbus_hash_table_unref (shared_connections);
1629  shared_connections = NULL;
1630  _DBUS_UNLOCK (shared_connections);
1631  return FALSE;
1632  }
1633 
1634  _dbus_verbose (" successfully created shared_connections\n");
1635 
1636  _DBUS_UNLOCK (shared_connections);
1637  return TRUE; /* no point looking up in the hash we just made */
1638  }
1639  else
1640  {
1641  const char *guid;
1642 
1643  guid = dbus_address_entry_get_value (entry, "guid");
1644 
1645  if (guid != NULL)
1646  {
1647  DBusConnection *connection;
1648 
1649  connection = _dbus_hash_table_lookup_string (shared_connections,
1650  guid);
1651 
1652  if (connection)
1653  {
1654  /* The DBusConnection can't be finalized without taking
1655  * the shared_connections lock to remove it from the
1656  * hash. So it's safe to ref the connection here.
1657  * However, it may be disconnected if the Disconnected
1658  * message hasn't been processed yet, in which case we
1659  * want to pretend it isn't in the hash and avoid
1660  * returning it.
1661  *
1662  * The idea is to avoid ever returning a disconnected connection
1663  * from dbus_connection_open(). We could just synchronously
1664  * drop our shared ref to the connection on connection disconnect,
1665  * and then assert here that the connection is connected, but
1666  * that causes reentrancy headaches.
1667  */
1668  CONNECTION_LOCK (connection);
1669  if (_dbus_connection_get_is_connected_unlocked (connection))
1670  {
1671  _dbus_connection_ref_unlocked (connection);
1672  *result = connection;
1673  _dbus_verbose ("looked up existing connection to server guid %s\n",
1674  guid);
1675  }
1676  else
1677  {
1678  _dbus_verbose ("looked up existing connection to server guid %s but it was disconnected so ignoring it\n",
1679  guid);
1680  }
1681  CONNECTION_UNLOCK (connection);
1682  }
1683  }
1684 
1685  _DBUS_UNLOCK (shared_connections);
1686  return TRUE;
1687  }
1688 }
1689 
1690 static dbus_bool_t
1691 connection_record_shared_unlocked (DBusConnection *connection,
1692  const char *guid)
1693 {
1694  char *guid_key;
1695  char *guid_in_connection;
1696 
1697  HAVE_LOCK_CHECK (connection);
1698  _dbus_assert (connection->server_guid == NULL);
1699  _dbus_assert (connection->shareable);
1700 
1701  /* get a hard ref on this connection, even if
1702  * we won't in fact store it in the hash, we still
1703  * need to hold a ref on it until it's disconnected.
1704  */
1705  _dbus_connection_ref_unlocked (connection);
1706 
1707  if (guid == NULL)
1708  {
1709  _DBUS_LOCK (shared_connections);
1710 
1711  if (!_dbus_list_prepend (&shared_connections_no_guid, connection))
1712  {
1713  _DBUS_UNLOCK (shared_connections);
1714  return FALSE;
1715  }
1716 
1717  _DBUS_UNLOCK (shared_connections);
1718  return TRUE; /* don't store in the hash */
1719  }
1720 
1721  /* A separate copy of the key is required in the hash table, because
1722  * we don't have a lock on the connection when we are doing a hash
1723  * lookup.
1724  */
1725 
1726  guid_key = _dbus_strdup (guid);
1727  if (guid_key == NULL)
1728  return FALSE;
1729 
1730  guid_in_connection = _dbus_strdup (guid);
1731  if (guid_in_connection == NULL)
1732  {
1733  dbus_free (guid_key);
1734  return FALSE;
1735  }
1736 
1737  _DBUS_LOCK (shared_connections);
1738  _dbus_assert (shared_connections != NULL);
1739 
1740  if (!_dbus_hash_table_insert_string (shared_connections,
1741  guid_key, connection))
1742  {
1743  dbus_free (guid_key);
1744  dbus_free (guid_in_connection);
1745  _DBUS_UNLOCK (shared_connections);
1746  return FALSE;
1747  }
1748 
1749  connection->server_guid = guid_in_connection;
1750 
1751  _dbus_verbose ("stored connection to %s to be shared\n",
1752  connection->server_guid);
1753 
1754  _DBUS_UNLOCK (shared_connections);
1755 
1756  _dbus_assert (connection->server_guid != NULL);
1757 
1758  return TRUE;
1759 }
1760 
1761 static void
1762 connection_forget_shared_unlocked (DBusConnection *connection)
1763 {
1764  HAVE_LOCK_CHECK (connection);
1765 
1766  if (!connection->shareable)
1767  return;
1768 
1769  _DBUS_LOCK (shared_connections);
1770 
1771  if (connection->server_guid != NULL)
1772  {
1773  _dbus_verbose ("dropping connection to %s out of the shared table\n",
1774  connection->server_guid);
1775 
1776  if (!_dbus_hash_table_remove_string (shared_connections,
1777  connection->server_guid))
1778  _dbus_assert_not_reached ("connection was not in the shared table");
1779 
1780  dbus_free (connection->server_guid);
1781  connection->server_guid = NULL;
1782  }
1783  else
1784  {
1785  _dbus_list_remove (&shared_connections_no_guid, connection);
1786  }
1787 
1788  _DBUS_UNLOCK (shared_connections);
1789 
1790  /* remove our reference held on all shareable connections */
1791  _dbus_connection_unref_unlocked (connection);
1792 }
1793 
1794 static DBusConnection*
1795 connection_try_from_address_entry (DBusAddressEntry *entry,
1796  DBusError *error)
1797 {
1798  DBusTransport *transport;
1799  DBusConnection *connection;
1800 
1801  transport = _dbus_transport_open (entry, error);
1802 
1803  if (transport == NULL)
1804  {
1805  _DBUS_ASSERT_ERROR_IS_SET (error);
1806  return NULL;
1807  }
1808 
1809  connection = _dbus_connection_new_for_transport (transport);
1810 
1811  _dbus_transport_unref (transport);
1812 
1813  if (connection == NULL)
1814  {
1815  _DBUS_SET_OOM (error);
1816  return NULL;
1817  }
1818 
1819 #ifndef DBUS_DISABLE_CHECKS
1820  _dbus_assert (!connection->have_connection_lock);
1821 #endif
1822  return connection;
1823 }
1824 
1825 /*
1826  * If the shared parameter is true, then any existing connection will
1827  * be used (and if a new connection is created, it will be available
1828  * for use by others). If the shared parameter is false, a new
1829  * connection will always be created, and the new connection will
1830  * never be returned to other callers.
1831  *
1832  * @param address the address
1833  * @param shared whether the connection is shared or private
1834  * @param error error return
1835  * @returns the connection or #NULL on error
1836  */
1837 static DBusConnection*
1838 _dbus_connection_open_internal (const char *address,
1839  dbus_bool_t shared,
1840  DBusError *error)
1841 {
1842  DBusConnection *connection;
1843  DBusAddressEntry **entries;
1844  DBusError tmp_error = DBUS_ERROR_INIT;
1845  DBusError first_error = DBUS_ERROR_INIT;
1846  int len, i;
1847 
1848  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1849 
1850  _dbus_verbose ("opening %s connection to: %s\n",
1851  shared ? "shared" : "private", address);
1852 
1853  if (!dbus_parse_address (address, &entries, &len, error))
1854  return NULL;
1855 
1856  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1857 
1858  connection = NULL;
1859 
1860  for (i = 0; i < len; i++)
1861  {
1862  if (shared)
1863  {
1864  if (!connection_lookup_shared (entries[i], &connection))
1865  _DBUS_SET_OOM (&tmp_error);
1866  }
1867 
1868  if (connection == NULL)
1869  {
1870  connection = connection_try_from_address_entry (entries[i],
1871  &tmp_error);
1872 
1873  if (connection != NULL && shared)
1874  {
1875  const char *guid;
1876 
1877  connection->shareable = TRUE;
1878 
1879  /* guid may be NULL */
1880  guid = dbus_address_entry_get_value (entries[i], "guid");
1881 
1882  CONNECTION_LOCK (connection);
1883 
1884  if (!connection_record_shared_unlocked (connection, guid))
1885  {
1886  _DBUS_SET_OOM (&tmp_error);
1887  _dbus_connection_close_possibly_shared_and_unlock (connection);
1888  dbus_connection_unref (connection);
1889  connection = NULL;
1890  }
1891  else
1892  CONNECTION_UNLOCK (connection);
1893  }
1894  }
1895 
1896  if (connection)
1897  break;
1898 
1899  _DBUS_ASSERT_ERROR_IS_SET (&tmp_error);
1900 
1901  if (i == 0)
1902  dbus_move_error (&tmp_error, &first_error);
1903  else
1904  dbus_error_free (&tmp_error);
1905  }
1906 
1907  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1908  _DBUS_ASSERT_ERROR_IS_CLEAR (&tmp_error);
1909 
1910  if (connection == NULL)
1911  {
1912  _DBUS_ASSERT_ERROR_IS_SET (&first_error);
1913  dbus_move_error (&first_error, error);
1914  }
1915  else
1916  dbus_error_free (&first_error);
1917 
1918  dbus_address_entries_free (entries);
1919  return connection;
1920 }
1921 
1930 void
1932 {
1933  _dbus_assert (connection != NULL);
1935 
1936  CONNECTION_LOCK (connection);
1937  _dbus_connection_close_possibly_shared_and_unlock (connection);
1938 }
1939 
1940 static DBusPreallocatedSend*
1941 _dbus_connection_preallocate_send_unlocked (DBusConnection *connection)
1942 {
1943  DBusPreallocatedSend *preallocated;
1944 
1945  HAVE_LOCK_CHECK (connection);
1946 
1947  _dbus_assert (connection != NULL);
1948 
1949  preallocated = dbus_new (DBusPreallocatedSend, 1);
1950  if (preallocated == NULL)
1951  return NULL;
1952 
1953  preallocated->queue_link = _dbus_list_alloc_link (NULL);
1954  if (preallocated->queue_link == NULL)
1955  goto failed_0;
1956 
1957  preallocated->counter_link = _dbus_list_alloc_link (connection->outgoing_counter);
1958  if (preallocated->counter_link == NULL)
1959  goto failed_1;
1960 
1961  _dbus_counter_ref (preallocated->counter_link->data);
1962 
1963  preallocated->connection = connection;
1964 
1965  return preallocated;
1966 
1967  failed_1:
1968  _dbus_list_free_link (preallocated->queue_link);
1969  failed_0:
1970  dbus_free (preallocated);
1971 
1972  return NULL;
1973 }
1974 
1975 /* Called with lock held, does not update dispatch status */
1976 static void
1977 _dbus_connection_send_preallocated_unlocked_no_update (DBusConnection *connection,
1978  DBusPreallocatedSend *preallocated,
1979  DBusMessage *message,
1980  dbus_uint32_t *client_serial)
1981 {
1982  dbus_uint32_t serial;
1983 
1984  preallocated->queue_link->data = message;
1986  preallocated->queue_link);
1987 
1988  /* It's OK that we'll never call the notify function, because for the
1989  * outgoing limit, there isn't one */
1991  preallocated->counter_link);
1992 
1993  dbus_free (preallocated);
1994  preallocated = NULL;
1995 
1996  dbus_message_ref (message);
1997 
1998  connection->n_outgoing += 1;
1999 
2000  _dbus_verbose ("Message %p (%s %s %s %s '%s') for %s added to outgoing queue %p, %d pending to send\n",
2001  message,
2003  dbus_message_get_path (message) ?
2004  dbus_message_get_path (message) :
2005  "no path",
2006  dbus_message_get_interface (message) ?
2007  dbus_message_get_interface (message) :
2008  "no interface",
2009  dbus_message_get_member (message) ?
2010  dbus_message_get_member (message) :
2011  "no member",
2012  dbus_message_get_signature (message),
2013  dbus_message_get_destination (message) ?
2014  dbus_message_get_destination (message) :
2015  "null",
2016  connection,
2017  connection->n_outgoing);
2018 
2019  if (dbus_message_get_serial (message) == 0)
2020  {
2021  serial = _dbus_connection_get_next_client_serial (connection);
2022  dbus_message_set_serial (message, serial);
2023  if (client_serial)
2024  *client_serial = serial;
2025  }
2026  else
2027  {
2028  if (client_serial)
2029  *client_serial = dbus_message_get_serial (message);
2030  }
2031 
2032  _dbus_verbose ("Message %p serial is %u\n",
2033  message, dbus_message_get_serial (message));
2034 
2035  dbus_message_lock (message);
2036 
2037  /* Now we need to run an iteration to hopefully just write the messages
2038  * out immediately, and otherwise get them queued up
2039  */
2041  NULL,
2042  DBUS_ITERATION_DO_WRITING,
2043  -1);
2044 
2045  /* If stuff is still queued up, be sure we wake up the main loop */
2046  if (connection->n_outgoing > 0)
2047  _dbus_connection_wakeup_mainloop (connection);
2048 }
2049 
2050 static void
2051 _dbus_connection_send_preallocated_and_unlock (DBusConnection *connection,
2052  DBusPreallocatedSend *preallocated,
2053  DBusMessage *message,
2054  dbus_uint32_t *client_serial)
2055 {
2056  DBusDispatchStatus status;
2057 
2058  HAVE_LOCK_CHECK (connection);
2059 
2060  _dbus_connection_send_preallocated_unlocked_no_update (connection,
2061  preallocated,
2062  message, client_serial);
2063 
2064  _dbus_verbose ("middle\n");
2065  status = _dbus_connection_get_dispatch_status_unlocked (connection);
2066 
2067  /* this calls out to user code */
2068  _dbus_connection_update_dispatch_status_and_unlock (connection, status);
2069 }
2070 
2082  DBusMessage *message,
2083  dbus_uint32_t *client_serial)
2084 {
2085  DBusPreallocatedSend *preallocated;
2086 
2087  _dbus_assert (connection != NULL);
2088  _dbus_assert (message != NULL);
2089 
2090  preallocated = _dbus_connection_preallocate_send_unlocked (connection);
2091  if (preallocated == NULL)
2092  {
2093  CONNECTION_UNLOCK (connection);
2094  return FALSE;
2095  }
2096 
2097  _dbus_connection_send_preallocated_and_unlock (connection,
2098  preallocated,
2099  message,
2100  client_serial);
2101  return TRUE;
2102 }
2103 
2128 void
2130 {
2131  dbus_int32_t refcount;
2132 
2133  CONNECTION_LOCK (connection);
2134 
2135  refcount = _dbus_atomic_get (&connection->refcount);
2136  /* The caller should have at least one ref */
2137  _dbus_assert (refcount >= 1);
2138 
2139  if (refcount == 1)
2140  _dbus_connection_close_possibly_shared_and_unlock (connection);
2141  else
2142  CONNECTION_UNLOCK (connection);
2143 }
2144 
2145 
2155 static void
2156 _dbus_memory_pause_based_on_timeout (int timeout_milliseconds)
2157 {
2158  if (timeout_milliseconds == -1)
2159  _dbus_sleep_milliseconds (1000);
2160  else if (timeout_milliseconds < 100)
2161  ; /* just busy loop */
2162  else if (timeout_milliseconds <= 1000)
2163  _dbus_sleep_milliseconds (timeout_milliseconds / 3);
2164  else
2165  _dbus_sleep_milliseconds (1000);
2166 }
2167 
2168 static DBusMessage *
2169 generate_local_error_message (dbus_uint32_t serial,
2170  char *error_name,
2171  char *error_msg)
2172 {
2173  DBusMessage *message;
2175  if (!message)
2176  goto out;
2177 
2178  if (!dbus_message_set_error_name (message, error_name))
2179  {
2180  dbus_message_unref (message);
2181  message = NULL;
2182  goto out;
2183  }
2184 
2185  dbus_message_set_no_reply (message, TRUE);
2186 
2187  if (!dbus_message_set_reply_serial (message,
2188  serial))
2189  {
2190  dbus_message_unref (message);
2191  message = NULL;
2192  goto out;
2193  }
2194 
2195  if (error_msg != NULL)
2196  {
2197  DBusMessageIter iter;
2198 
2199  dbus_message_iter_init_append (message, &iter);
2200  if (!dbus_message_iter_append_basic (&iter,
2202  &error_msg))
2203  {
2204  dbus_message_unref (message);
2205  message = NULL;
2206  goto out;
2207  }
2208  }
2209 
2210  out:
2211  return message;
2212 }
2213 
2214 /*
2215  * Peek the incoming queue to see if we got reply for a specific serial
2216  */
2217 static dbus_bool_t
2218 _dbus_connection_peek_for_reply_unlocked (DBusConnection *connection,
2219  dbus_uint32_t client_serial)
2220 {
2221  DBusList *link;
2222  HAVE_LOCK_CHECK (connection);
2223 
2224  link = _dbus_list_get_first_link (&connection->incoming_messages);
2225 
2226  while (link != NULL)
2227  {
2228  DBusMessage *reply = link->data;
2229 
2230  if (dbus_message_get_reply_serial (reply) == client_serial)
2231  {
2232  _dbus_verbose ("%s reply to %d found in queue\n", _DBUS_FUNCTION_NAME, client_serial);
2233  return TRUE;
2234  }
2235  link = _dbus_list_get_next_link (&connection->incoming_messages, link);
2236  }
2237 
2238  return FALSE;
2239 }
2240 
2241 /* This is slightly strange since we can pop a message here without
2242  * the dispatch lock.
2243  */
2244 static DBusMessage*
2245 check_for_reply_unlocked (DBusConnection *connection,
2246  dbus_uint32_t client_serial)
2247 {
2248  DBusList *link;
2249 
2250  HAVE_LOCK_CHECK (connection);
2251 
2252  link = _dbus_list_get_first_link (&connection->incoming_messages);
2253 
2254  while (link != NULL)
2255  {
2256  DBusMessage *reply = link->data;
2257 
2258  if (dbus_message_get_reply_serial (reply) == client_serial)
2259  {
2260  _dbus_list_remove_link (&connection->incoming_messages, link);
2261  connection->n_incoming -= 1;
2262  return reply;
2263  }
2264  link = _dbus_list_get_next_link (&connection->incoming_messages, link);
2265  }
2266 
2267  return NULL;
2268 }
2269 
2270 static void
2271 connection_timeout_and_complete_all_pending_calls_unlocked (DBusConnection *connection)
2272 {
2273  /* We can't iterate over the hash in the normal way since we'll be
2274  * dropping the lock for each item. So we restart the
2275  * iter each time as we drain the hash table.
2276  */
2277 
2278  while (_dbus_hash_table_get_n_entries (connection->pending_replies) > 0)
2279  {
2280  DBusPendingCall *pending;
2281  DBusHashIter iter;
2282 
2283  _dbus_hash_iter_init (connection->pending_replies, &iter);
2284  _dbus_hash_iter_next (&iter);
2285 
2286  pending = _dbus_hash_iter_get_value (&iter);
2288 
2290  connection);
2291 
2297 
2299  CONNECTION_LOCK (connection);
2300  }
2301  HAVE_LOCK_CHECK (connection);
2302 }
2303 
2304 static void
2305 complete_pending_call_and_unlock (DBusConnection *connection,
2306  DBusPendingCall *pending,
2307  DBusMessage *message)
2308 {
2309  _dbus_pending_call_set_reply_unlocked (pending, message);
2310  _dbus_pending_call_ref_unlocked (pending); /* in case there's no app with a ref held */
2311  _dbus_connection_detach_pending_call_and_unlock (connection, pending);
2312 
2313  /* Must be called unlocked since it invokes app callback */
2314  _dbus_pending_call_complete (pending);
2315  dbus_pending_call_unref (pending);
2316 }
2317 
2318 static dbus_bool_t
2319 check_for_reply_and_update_dispatch_unlocked (DBusConnection *connection,
2320  DBusPendingCall *pending)
2321 {
2322  DBusMessage *reply;
2323  DBusDispatchStatus status;
2324 
2325  reply = check_for_reply_unlocked (connection,
2327  if (reply != NULL)
2328  {
2329  _dbus_verbose ("checked for reply\n");
2330 
2331  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): got reply\n");
2332 
2333  complete_pending_call_and_unlock (connection, pending, reply);
2334  dbus_message_unref (reply);
2335 
2336  CONNECTION_LOCK (connection);
2337  status = _dbus_connection_get_dispatch_status_unlocked (connection);
2338  _dbus_connection_update_dispatch_status_and_unlock (connection, status);
2339  dbus_pending_call_unref (pending);
2340 
2341  return TRUE;
2342  }
2343 
2344  return FALSE;
2345 }
2346 
2361 void
2363 {
2364  long start_tv_sec, start_tv_usec;
2365  long tv_sec, tv_usec;
2366  DBusDispatchStatus status;
2367  DBusConnection *connection;
2368  dbus_uint32_t client_serial;
2369  DBusTimeout *timeout;
2370  int timeout_milliseconds, elapsed_milliseconds;
2371 
2372  _dbus_assert (pending != NULL);
2373 
2374  if (dbus_pending_call_get_completed (pending))
2375  return;
2376 
2377  dbus_pending_call_ref (pending); /* necessary because the call could be canceled */
2378 
2379  connection = _dbus_pending_call_get_connection_and_lock (pending);
2380 
2381  /* Flush message queue - note, can affect dispatch status */
2382  _dbus_connection_flush_unlocked (connection);
2383 
2384  client_serial = _dbus_pending_call_get_reply_serial_unlocked (pending);
2385 
2386  /* note that timeout_milliseconds is limited to a smallish value
2387  * in _dbus_pending_call_new() so overflows aren't possible
2388  * below
2389  */
2390  timeout = _dbus_pending_call_get_timeout_unlocked (pending);
2391  _dbus_get_monotonic_time (&start_tv_sec, &start_tv_usec);
2392  if (timeout)
2393  {
2394  timeout_milliseconds = dbus_timeout_get_interval (timeout);
2395 
2396  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): will block %d milliseconds for reply serial %u from %ld sec %ld usec\n",
2397  timeout_milliseconds,
2398  client_serial,
2399  start_tv_sec, start_tv_usec);
2400  }
2401  else
2402  {
2403  timeout_milliseconds = -1;
2404 
2405  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): will block for reply serial %u\n", client_serial);
2406  }
2407 
2408  /* check to see if we already got the data off the socket */
2409  /* from another blocked pending call */
2410  if (check_for_reply_and_update_dispatch_unlocked (connection, pending))
2411  return;
2412 
2413  /* Now we wait... */
2414  /* always block at least once as we know we don't have the reply yet */
2416  pending,
2417  DBUS_ITERATION_DO_READING |
2418  DBUS_ITERATION_BLOCK,
2419  timeout_milliseconds);
2420 
2421  recheck_status:
2422 
2423  _dbus_verbose ("top of recheck\n");
2424 
2425  HAVE_LOCK_CHECK (connection);
2426 
2427  /* queue messages and get status */
2428 
2429  status = _dbus_connection_get_dispatch_status_unlocked (connection);
2430 
2431  /* the get_completed() is in case a dispatch() while we were blocking
2432  * got the reply instead of us.
2433  */
2435  {
2436  _dbus_verbose ("Pending call completed by dispatch\n");
2437  _dbus_connection_update_dispatch_status_and_unlock (connection, status);
2438  dbus_pending_call_unref (pending);
2439  return;
2440  }
2441 
2442  if (status == DBUS_DISPATCH_DATA_REMAINS)
2443  {
2444  if (check_for_reply_and_update_dispatch_unlocked (connection, pending))
2445  return;
2446  }
2447 
2448  _dbus_get_monotonic_time (&tv_sec, &tv_usec);
2449  elapsed_milliseconds = (tv_sec - start_tv_sec) * 1000 +
2450  (tv_usec - start_tv_usec) / 1000;
2451 
2452  if (!_dbus_connection_get_is_connected_unlocked (connection))
2453  {
2454  DBusMessage *error_msg;
2455 
2456  error_msg = generate_local_error_message (client_serial,
2458  "Connection was disconnected before a reply was received");
2459 
2460  /* on OOM error_msg is set to NULL */
2461  complete_pending_call_and_unlock (connection, pending, error_msg);
2462  dbus_pending_call_unref (pending);
2463  return;
2464  }
2465  else if (connection->disconnect_message_link == NULL)
2466  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): disconnected\n");
2467  else if (timeout == NULL)
2468  {
2469  if (status == DBUS_DISPATCH_NEED_MEMORY)
2470  {
2471  /* Try sleeping a bit, as we aren't sure we need to block for reading,
2472  * we may already have a reply in the buffer and just can't process
2473  * it.
2474  */
2475  _dbus_verbose ("dbus_connection_send_with_reply_and_block() waiting for more memory\n");
2476 
2477  _dbus_memory_pause_based_on_timeout (timeout_milliseconds - elapsed_milliseconds);
2478  }
2479  else
2480  {
2481  /* block again, we don't have the reply buffered yet. */
2483  pending,
2484  DBUS_ITERATION_DO_READING |
2485  DBUS_ITERATION_BLOCK,
2486  timeout_milliseconds - elapsed_milliseconds);
2487  }
2488 
2489  goto recheck_status;
2490  }
2491  else if (tv_sec < start_tv_sec)
2492  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): clock set backward\n");
2493  else if (elapsed_milliseconds < timeout_milliseconds)
2494  {
2495  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): %d milliseconds remain\n", timeout_milliseconds - elapsed_milliseconds);
2496 
2497  if (status == DBUS_DISPATCH_NEED_MEMORY)
2498  {
2499  /* Try sleeping a bit, as we aren't sure we need to block for reading,
2500  * we may already have a reply in the buffer and just can't process
2501  * it.
2502  */
2503  _dbus_verbose ("dbus_connection_send_with_reply_and_block() waiting for more memory\n");
2504 
2505  _dbus_memory_pause_based_on_timeout (timeout_milliseconds - elapsed_milliseconds);
2506  }
2507  else
2508  {
2509  /* block again, we don't have the reply buffered yet. */
2511  NULL,
2512  DBUS_ITERATION_DO_READING |
2513  DBUS_ITERATION_BLOCK,
2514  timeout_milliseconds - elapsed_milliseconds);
2515  }
2516 
2517  goto recheck_status;
2518  }
2519 
2520  _dbus_verbose ("dbus_connection_send_with_reply_and_block(): Waited %d milliseconds and got no reply\n",
2521  elapsed_milliseconds);
2522 
2524 
2525  /* unlock and call user code */
2526  complete_pending_call_and_unlock (connection, pending, NULL);
2527 
2528  /* update user code on dispatch status */
2529  CONNECTION_LOCK (connection);
2530  status = _dbus_connection_get_dispatch_status_unlocked (connection);
2531  _dbus_connection_update_dispatch_status_and_unlock (connection, status);
2532  dbus_pending_call_unref (pending);
2533 }
2534 
2540 int
2542 {
2543  return _dbus_transport_get_pending_fds_count (connection->transport);
2544 }
2545 
2553 void
2555  DBusPendingFdsChangeFunction callback,
2556  void *data)
2557 {
2559  callback, data);
2560 }
2561 
2599 dbus_connection_open (const char *address,
2600  DBusError *error)
2601 {
2602  DBusConnection *connection;
2603 
2604  _dbus_return_val_if_fail (address != NULL, NULL);
2605  _dbus_return_val_if_error_is_set (error, NULL);
2606 
2607  connection = _dbus_connection_open_internal (address,
2608  TRUE,
2609  error);
2610 
2611  return connection;
2612 }
2613 
2642 dbus_connection_open_private (const char *address,
2643  DBusError *error)
2644 {
2645  DBusConnection *connection;
2646 
2647  _dbus_return_val_if_fail (address != NULL, NULL);
2648  _dbus_return_val_if_error_is_set (error, NULL);
2649 
2650  connection = _dbus_connection_open_internal (address,
2651  FALSE,
2652  error);
2653 
2654  return connection;
2655 }
2656 
2665 {
2666  dbus_int32_t old_refcount;
2667 
2668  _dbus_return_val_if_fail (connection != NULL, NULL);
2669  _dbus_return_val_if_fail (connection->generation == _dbus_current_generation, NULL);
2670  old_refcount = _dbus_atomic_inc (&connection->refcount);
2671  _dbus_connection_trace_ref (connection, old_refcount, old_refcount + 1,
2672  "ref");
2673 
2674  return connection;
2675 }
2676 
2677 static void
2678 free_outgoing_message (void *element,
2679  void *data)
2680 {
2681  DBusMessage *message = element;
2682  DBusConnection *connection = data;
2683 
2684  _dbus_message_remove_counter (message, connection->outgoing_counter);
2685  dbus_message_unref (message);
2686 }
2687 
2688 /* This is run without the mutex held, but after the last reference
2689  * to the connection has been dropped we should have no thread-related
2690  * problems
2691  */
2692 static void
2693 _dbus_connection_last_unref (DBusConnection *connection)
2694 {
2695  DBusList *link;
2696 
2697  _dbus_verbose ("Finalizing connection %p\n", connection);
2698 
2699  _dbus_assert (_dbus_atomic_get (&connection->refcount) == 0);
2700 
2701  /* You have to disconnect the connection before unref:ing it. Otherwise
2702  * you won't get the disconnected message.
2703  */
2705  _dbus_assert (connection->server_guid == NULL);
2706 
2707  /* ---- We're going to call various application callbacks here, hope it doesn't break anything... */
2709 
2713 
2714  _dbus_watch_list_free (connection->watches);
2715  connection->watches = NULL;
2716 
2717  _dbus_timeout_list_free (connection->timeouts);
2718  connection->timeouts = NULL;
2719 
2720  _dbus_data_slot_list_free (&connection->slot_list);
2721 
2722  link = _dbus_list_get_first_link (&connection->filter_list);
2723  while (link != NULL)
2724  {
2725  DBusMessageFilter *filter = link->data;
2726  DBusList *next = _dbus_list_get_next_link (&connection->filter_list, link);
2727 
2728  filter->function = NULL;
2729  _dbus_message_filter_unref (filter); /* calls app callback */
2730  link->data = NULL;
2731 
2732  link = next;
2733  }
2734  _dbus_list_clear (&connection->filter_list);
2735 
2736  /* ---- Done with stuff that invokes application callbacks */
2737 
2738  _dbus_object_tree_unref (connection->objects);
2739 
2741  connection->pending_replies = NULL;
2742 
2743  _dbus_list_clear (&connection->filter_list);
2744 
2745  _dbus_list_foreach (&connection->outgoing_messages,
2746  free_outgoing_message,
2747  connection);
2748  _dbus_list_clear (&connection->outgoing_messages);
2749 
2750  _dbus_list_foreach (&connection->incoming_messages,
2752  NULL);
2753  _dbus_list_clear (&connection->incoming_messages);
2754 
2755  _dbus_counter_unref (connection->outgoing_counter);
2756 
2757  _dbus_transport_unref (connection->transport);
2758 
2759  if (connection->disconnect_message_link)
2760  {
2761  DBusMessage *message = connection->disconnect_message_link->data;
2762  dbus_message_unref (message);
2764  }
2765 
2768 
2771 
2773 
2774  _dbus_rmutex_free_at_location (&connection->mutex);
2775 
2776  dbus_free (connection);
2777 }
2778 
2798 void
2800 {
2801  dbus_int32_t old_refcount;
2802 
2803  _dbus_return_if_fail (connection != NULL);
2804  _dbus_return_if_fail (connection->generation == _dbus_current_generation);
2805 
2806  old_refcount = _dbus_atomic_dec (&connection->refcount);
2807 
2808  _dbus_connection_trace_ref (connection, old_refcount, old_refcount - 1,
2809  "unref");
2810 
2811  if (old_refcount == 1)
2812  {
2813 #ifndef DBUS_DISABLE_CHECKS
2814  if (_dbus_transport_get_is_connected (connection->transport))
2815  {
2816  _dbus_warn_check_failed ("The last reference on a connection was dropped without closing the connection. This is a bug in an application. See dbus_connection_unref() documentation for details.\n%s",
2817  connection->shareable ?
2818  "Most likely, the application called unref() too many times and removed a reference belonging to libdbus, since this is a shared connection.\n" :
2819  "Most likely, the application was supposed to call dbus_connection_close(), since this is a private connection.\n");
2820  return;
2821  }
2822 #endif
2823  _dbus_connection_last_unref (connection);
2824  }
2825 }
2826 
2827 /*
2828  * Note that the transport can disconnect itself (other end drops us)
2829  * and in that case this function never runs. So this function must
2830  * not do anything more than disconnect the transport and update the
2831  * dispatch status.
2832  *
2833  * If the transport self-disconnects, then we assume someone will
2834  * dispatch the connection to cause the dispatch status update.
2835  */
2836 static void
2837 _dbus_connection_close_possibly_shared_and_unlock (DBusConnection *connection)
2838 {
2839  DBusDispatchStatus status;
2840 
2841  HAVE_LOCK_CHECK (connection);
2842 
2843  _dbus_verbose ("Disconnecting %p\n", connection);
2844 
2845  /* We need to ref because update_dispatch_status_and_unlock will unref
2846  * the connection if it was shared and libdbus was the only remaining
2847  * refcount holder.
2848  */
2849  _dbus_connection_ref_unlocked (connection);
2850 
2851  _dbus_transport_disconnect (connection->transport);
2852 
2853  /* This has the side effect of queuing the disconnect message link
2854  * (unless we don't have enough memory, possibly, so don't assert it).
2855  * After the disconnect message link is queued, dbus_bus_get/dbus_connection_open
2856  * should never again return the newly-disconnected connection.
2857  *
2858  * However, we only unref the shared connection and exit_on_disconnect when
2859  * the disconnect message reaches the head of the message queue,
2860  * NOT when it's first queued.
2861  */
2862  status = _dbus_connection_get_dispatch_status_unlocked (connection);
2863 
2864  /* This calls out to user code */
2865  _dbus_connection_update_dispatch_status_and_unlock (connection, status);
2866 
2867  /* Could also call out to user code */
2868  dbus_connection_unref (connection);
2869 }
2870 
2913 void
2915 {
2916  _dbus_return_if_fail (connection != NULL);
2917  _dbus_return_if_fail (connection->generation == _dbus_current_generation);
2918 
2919  CONNECTION_LOCK (connection);
2920 
2921 #ifndef DBUS_DISABLE_CHECKS
2922  if (connection->shareable)
2923  {
2924  CONNECTION_UNLOCK (connection);
2925 
2926  _dbus_warn_check_failed ("Applications must not close shared connections - see dbus_connection_close() docs. This is a bug in the application.\n");
2927  return;
2928  }
2929 #endif
2930 
2931  _dbus_connection_close_possibly_shared_and_unlock (connection);
2932 }
2933 
2934 static dbus_bool_t
2935 _dbus_connection_get_is_connected_unlocked (DBusConnection *connection)
2936 {
2937  HAVE_LOCK_CHECK (connection);
2938  return _dbus_transport_get_is_connected (connection->transport);
2939 }
2940 
2956 {
2957  dbus_bool_t res;
2958 
2959  _dbus_return_val_if_fail (connection != NULL, FALSE);
2960 
2961  CONNECTION_LOCK (connection);
2962  res = _dbus_connection_get_is_connected_unlocked (connection);
2963  CONNECTION_UNLOCK (connection);
2964 
2965  return res;
2966 }
2967 
2978 {
2979  dbus_bool_t res;
2980 
2981  _dbus_return_val_if_fail (connection != NULL, FALSE);
2982 
2983  CONNECTION_LOCK (connection);
2984  res = _dbus_transport_get_is_authenticated (connection->transport);
2985  CONNECTION_UNLOCK (connection);
2986 
2987  return res;
2988 }
2989 
3012 {
3013  dbus_bool_t res;
3014 
3015  _dbus_return_val_if_fail (connection != NULL, FALSE);
3016 
3017  CONNECTION_LOCK (connection);
3018  res = _dbus_transport_get_is_anonymous (connection->transport);
3019  CONNECTION_UNLOCK (connection);
3020 
3021  return res;
3022 }
3023 
3055 char*
3057 {
3058  char *id;
3059 
3060  _dbus_return_val_if_fail (connection != NULL, NULL);
3061 
3062  CONNECTION_LOCK (connection);
3064  CONNECTION_UNLOCK (connection);
3065 
3066  return id;
3067 }
3068 
3088  int type)
3089 {
3090  _dbus_return_val_if_fail (connection != NULL, FALSE);
3091 
3092  if (!dbus_type_is_valid (type))
3093  return FALSE;
3094 
3095  if (type != DBUS_TYPE_UNIX_FD)
3096  return TRUE;
3097 
3098 #ifdef HAVE_UNIX_FD_PASSING
3099  {
3100  dbus_bool_t b;
3101 
3102  CONNECTION_LOCK(connection);
3104  CONNECTION_UNLOCK(connection);
3105 
3106  return b;
3107  }
3108 #endif
3109 
3110  return FALSE;
3111 }
3112 
3126 void
3128  dbus_bool_t exit_on_disconnect)
3129 {
3130  _dbus_return_if_fail (connection != NULL);
3131 
3132  CONNECTION_LOCK (connection);
3133  connection->exit_on_disconnect = exit_on_disconnect != FALSE;
3134  CONNECTION_UNLOCK (connection);
3135 }
3136 
3148 {
3149  DBusPreallocatedSend *preallocated;
3150 
3151  _dbus_return_val_if_fail (connection != NULL, NULL);
3152 
3153  CONNECTION_LOCK (connection);
3154 
3155  preallocated =
3156  _dbus_connection_preallocate_send_unlocked (connection);
3157 
3158  CONNECTION_UNLOCK (connection);
3159 
3160  return preallocated;
3161 }
3162 
3172 void
3174  DBusPreallocatedSend *preallocated)
3175 {
3176  _dbus_return_if_fail (connection != NULL);
3177  _dbus_return_if_fail (preallocated != NULL);
3178  _dbus_return_if_fail (connection == preallocated->connection);
3179 
3180  _dbus_list_free_link (preallocated->queue_link);
3181  _dbus_counter_unref (preallocated->counter_link->data);
3182  _dbus_list_free_link (preallocated->counter_link);
3183  dbus_free (preallocated);
3184 }
3185 
3198 void
3200  DBusPreallocatedSend *preallocated,
3201  DBusMessage *message,
3202  dbus_uint32_t *client_serial)
3203 {
3204  _dbus_return_if_fail (connection != NULL);
3205  _dbus_return_if_fail (preallocated != NULL);
3206  _dbus_return_if_fail (message != NULL);
3207  _dbus_return_if_fail (preallocated->connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212  dbus_message_get_member (message) != NULL));
3213 
3214  CONNECTION_LOCK (connection);
3215 
3216 #ifdef HAVE_UNIX_FD_PASSING
3217 
3218  if (!_dbus_transport_can_pass_unix_fd(connection->transport) &&
3219  message->n_unix_fds > 0)
3220  {
3221  /* Refuse to send fds on a connection that cannot handle
3222  them. Unfortunately we cannot return a proper error here, so
3223  the best we can is just return. */
3224  CONNECTION_UNLOCK (connection);
3225  return;
3226  }
3227 
3228 #endif
3229 
3230  _dbus_connection_send_preallocated_and_unlock (connection,
3231  preallocated,
3232  message, client_serial);
3233 }
3234 
3235 static dbus_bool_t
3236 _dbus_connection_send_unlocked_no_update (DBusConnection *connection,
3237  DBusMessage *message,
3238  dbus_uint32_t *client_serial)
3239 {
3240  DBusPreallocatedSend *preallocated;
3241 
3242  _dbus_assert (connection != NULL);
3243  _dbus_assert (message != NULL);
3244 
connection == connection);
3208  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_METHOD_CALL ||
3209  dbus_message_get_member (message) != NULL);
3210  _dbus_return_if_fail (dbus_message_get_type (message) != DBUS_MESSAGE_TYPE_SIGNAL ||
3211  (dbus_message_get_interface (message) != NULL &&
3212