Stats: Add field PendingReplies
[platform/upstream/dbus.git] / bus / connection.c
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* connection.c  Client connections
3  *
4  * Copyright (C) 2003  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 "connection.h"
26 #include "dispatch.h"
27 #include "policy.h"
28 #include "services.h"
29 #include "utils.h"
30 #include "signals.h"
31 #include "expirelist.h"
32 #include "selinux.h"
33 #include "apparmor.h"
34 #include "check.h"
35 #include <dbus/dbus-list.h>
36 #include <dbus/dbus-hash.h>
37 #include <dbus/dbus-timeout.h>
38 #include <dbus/dbus-connection-internal.h>
39 #include <dbus/dbus-internals.h>
40 #include <dbus/dbus-message-internal.h>
41 #ifdef DBUS_ENABLE_CYNARA
42 #include <stdlib.h>
43 #include <cynara-session.h>
44 #include <stdio.h>
45 #endif
46
47 /* Trim executed commands to this length; we want to keep logs readable */
48 #define MAX_LOG_COMMAND_LEN 50
49
50 static void bus_connection_remove_transactions (DBusConnection *connection);
51
52 typedef struct
53 {
54   BusExpireItem expire_item;
55
56   DBusConnection *will_get_reply;
57   DBusConnection *will_send_reply;
58
59   dbus_uint32_t reply_serial;
60   
61 } BusPendingReply;
62
63 struct BusConnections
64 {
65   int refcount;
66   DBusList *completed;  /**< List of all completed connections */
67   int n_completed;      /**< Length of completed list */
68   DBusList *incomplete; /**< List of all not-yet-active connections */
69   int n_incomplete;     /**< Length of incomplete list */
70   BusContext *context;
71   DBusHashTable *completed_by_user; /**< Number of completed connections for each UID */
72   DBusTimeout *expire_timeout; /**< Timeout for expiring incomplete connections. */
73   int stamp;                   /**< Incrementing number */
74   BusExpireList *pending_replies; /**< List of pending replies */
75
76   /** List of all monitoring connections, a subset of completed.
77    * Each member is a #DBusConnection. */
78   DBusList *monitors;
79   BusMatchmaker *monitor_matchmaker;
80
81 #ifdef DBUS_ENABLE_STATS
82   int total_match_rules;
83   int peak_match_rules;
84   int peak_match_rules_per_conn;
85
86   int total_bus_names;
87   int peak_bus_names;
88   int peak_bus_names_per_conn;
89 #endif
90 };
91
92 static dbus_int32_t connection_data_slot = -1;
93
94 typedef struct
95 {
96   BusConnections *connections;
97   DBusList *link_in_connection_list;
98   DBusConnection *connection;
99   DBusList *services_owned;
100   int n_services_owned;
101   DBusList *match_rules;
102   int n_match_rules;
103   char *name;
104   DBusList *transaction_messages; /**< Stuff we need to send as part of a transaction */
105   DBusMessage *oom_message;
106   DBusPreallocatedSend *oom_preallocated;
107   BusClientPolicy *policy;
108   DBusList *deferred_messages;  /**< Queue of messages deferred due to pending policy check */
109
110   char *cached_loginfo_string;
111   BusSELinuxID *selinux_id;
112   BusAppArmorConfinement *apparmor_confinement;
113
114   long connection_tv_sec;  /**< Time when we connected (seconds component) */
115   long connection_tv_usec; /**< Time when we connected (microsec component) */
116   int stamp;               /**< connections->stamp last time we were traversed */
117
118 #ifdef DBUS_ENABLE_STATS
119   int peak_match_rules;
120   int peak_bus_names;
121   int peak_pending_replies;
122 #endif
123   int n_pending_unix_fds;
124   DBusTimeout *pending_unix_fds_timeout;
125
126   /** non-NULL if and only if this is a monitor */
127   DBusList *link_in_monitors;
128 #ifdef DBUS_ENABLE_CYNARA
129   char *cynara_session_id;
130 #endif
131 } BusConnectionData;
132
133 static dbus_bool_t bus_pending_reply_expired (BusExpireList *list,
134                                               DBusList      *link,
135                                               void          *data);
136
137 static void bus_connection_drop_pending_replies (BusConnections  *connections,
138                                                  DBusConnection  *connection);
139
140 static dbus_bool_t expire_incomplete_timeout (void *data);
141
142 #define BUS_CONNECTION_DATA(connection) (dbus_connection_get_data ((connection), connection_data_slot))
143
144 DBusLoop*
145 bus_connection_get_loop (DBusConnection *connection)
146 {
147   BusConnectionData *d;
148
149   d = BUS_CONNECTION_DATA (connection);
150   _dbus_assert(d != NULL);
151
152   return bus_context_get_loop (d->connections->context);
153 }
154
155
156 static int
157 get_connections_for_uid (BusConnections *connections,
158                          dbus_uid_t      uid)
159 {
160   void *val;
161   int current_count;
162
163   /* val is NULL is 0 when it isn't in the hash yet */
164   
165   val = _dbus_hash_table_lookup_uintptr (connections->completed_by_user,
166                                        uid);
167
168   current_count = _DBUS_POINTER_TO_INT (val);
169
170   return current_count;
171 }
172
173 static dbus_bool_t
174 adjust_connections_for_uid (BusConnections *connections,
175                             dbus_uid_t      uid,
176                             int             adjustment)
177 {
178   int current_count;
179
180   current_count = get_connections_for_uid (connections, uid);
181
182   _dbus_verbose ("Adjusting connection count for UID " DBUS_UID_FORMAT
183                  ": was %d adjustment %d making %d\n",
184                  uid, current_count, adjustment, current_count + adjustment);
185   
186   _dbus_assert (current_count >= 0);
187   
188   current_count += adjustment;
189
190   _dbus_assert (current_count >= 0);
191
192   if (current_count == 0)
193     {
194       _dbus_hash_table_remove_uintptr (connections->completed_by_user, uid);
195       return TRUE;
196     }
197   else
198     {
199       dbus_bool_t retval;
200       
201       retval = _dbus_hash_table_insert_uintptr (connections->completed_by_user,
202                                               uid, _DBUS_INT_TO_POINTER (current_count));
203
204       /* only positive adjustment can fail as otherwise
205        * a hash entry should already exist
206        */
207       _dbus_assert (adjustment > 0 ||
208                     (adjustment <= 0 && retval));
209
210       return retval;
211     }
212 }
213
214 void
215 bus_connection_disconnected (DBusConnection *connection)
216 {
217   BusConnectionData *d;
218   BusService *service;
219   BusMatchmaker *matchmaker;
220   
221   d = BUS_CONNECTION_DATA (connection);
222   _dbus_assert (d != NULL);
223
224   _dbus_verbose ("%s disconnected, dropping all service ownership and releasing\n",
225                  d->name ? d->name : "(inactive)");
226
227   /* Delete our match rules */
228   if (d->n_match_rules > 0)
229     {
230       matchmaker = bus_context_get_matchmaker (d->connections->context);
231       bus_matchmaker_disconnected (matchmaker, connection);
232     }
233   
234   /* Drop any service ownership. Unfortunately, this requires
235    * memory allocation and there doesn't seem to be a good way to
236    * handle it other than sleeping; we can't "fail" the operation of
237    * disconnecting a client, and preallocating a broadcast "service is
238    * now gone" message for every client-service pair seems kind of
239    * involved.
240    */
241   while ((service = _dbus_list_get_last (&d->services_owned)))
242     {
243       BusTransaction *transaction;
244       DBusError error;
245
246     retry:
247       
248       dbus_error_init (&error);
249         
250       while ((transaction = bus_transaction_new (d->connections->context)) == NULL)
251         _dbus_wait_for_memory ();
252         
253       if (!bus_service_remove_owner (service, connection,
254                                      transaction, &error))
255         {
256           _DBUS_ASSERT_ERROR_IS_SET (&error);
257           
258           if (dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY))
259             {
260               dbus_error_free (&error);
261               bus_transaction_cancel_and_free (transaction);
262               _dbus_wait_for_memory ();
263               goto retry;
264             }
265           else
266             {
267               _dbus_verbose ("Failed to remove service owner: %s %s\n",
268                              error.name, error.message);
269               _dbus_assert_not_reached ("Removing service owner failed for non-memory-related reason");
270             }
271         }
272         
273       bus_transaction_execute_and_free (transaction);
274     }
275
276   bus_connection_clear_deferred_messages(connection);
277
278   bus_dispatch_remove_connection (connection);
279   
280   /* no more watching */
281   if (!dbus_connection_set_watch_functions (connection,
282                                             NULL, NULL, NULL,
283                                             connection,
284                                             NULL))
285     _dbus_assert_not_reached ("setting watch functions to NULL failed");
286
287   if (!dbus_connection_set_timeout_functions (connection,
288                                               NULL, NULL, NULL,
289                                               connection,
290                                               NULL))
291     _dbus_assert_not_reached ("setting timeout functions to NULL failed");
292   
293   dbus_connection_set_unix_user_function (connection,
294                                           NULL, NULL, NULL);
295   dbus_connection_set_windows_user_function (connection,
296                                              NULL, NULL, NULL);
297   
298   dbus_connection_set_dispatch_status_function (connection,
299                                                 NULL, NULL, NULL);
300
301   if (d->pending_unix_fds_timeout)
302     {
303       _dbus_loop_remove_timeout (bus_context_get_loop (d->connections->context),
304                                  d->pending_unix_fds_timeout);
305       _dbus_timeout_unref (d->pending_unix_fds_timeout);
306     }
307   d->pending_unix_fds_timeout = NULL;
308   _dbus_connection_set_pending_fds_function (connection, NULL, NULL);
309   
310   bus_connection_remove_transactions (connection);
311
312   if (d->link_in_monitors != NULL)
313     {
314       BusMatchmaker *mm = d->connections->monitor_matchmaker;
315
316       if (mm != NULL)
317         bus_matchmaker_disconnected (mm, connection);
318
319       _dbus_list_remove_link (&d->connections->monitors, d->link_in_monitors);
320       d->link_in_monitors = NULL;
321     }
322
323   if (d->link_in_connection_list != NULL)
324     {
325       if (d->name != NULL)
326         {
327           unsigned long uid;
328           
329           _dbus_list_remove_link (&d->connections->completed, d->link_in_connection_list);
330           d->link_in_connection_list = NULL;
331           d->connections->n_completed -= 1;
332
333           if (dbus_connection_get_unix_user (connection, &uid))
334             {
335               if (!adjust_connections_for_uid (d->connections,
336                                                uid, -1))
337                 _dbus_assert_not_reached ("adjusting downward should never fail");
338             }
339         }
340       else
341         {
342           _dbus_list_remove_link (&d->connections->incomplete, d->link_in_connection_list);
343           d->link_in_connection_list = NULL;
344           d->connections->n_incomplete -= 1;
345
346           /* If we have dropped below the max. number of incomplete
347            * connections, start accept()ing again */
348           bus_context_check_all_watches (d->connections->context);
349         }
350       
351       _dbus_assert (d->connections->n_incomplete >= 0);
352       _dbus_assert (d->connections->n_completed >= 0);
353     }
354
355   bus_connection_drop_pending_replies (d->connections, connection);
356   
357   /* frees "d" as side effect */
358   dbus_connection_set_data (connection,
359                             connection_data_slot,
360                             NULL, NULL);
361   
362   dbus_connection_unref (connection);
363 }
364
365 static dbus_bool_t
366 add_connection_watch (DBusWatch      *watch,
367                       void           *data)
368 {
369   DBusConnection *connection = data;
370
371   return _dbus_loop_add_watch (bus_connection_get_loop (connection), watch);
372 }
373
374 static void
375 remove_connection_watch (DBusWatch      *watch,
376                          void           *data)
377 {
378   DBusConnection *connection = data;
379   
380   _dbus_loop_remove_watch (bus_connection_get_loop (connection), watch);
381 }
382
383 static void
384 toggle_connection_watch (DBusWatch      *watch,
385                          void           *data)
386 {
387   DBusConnection *connection = data;
388
389   _dbus_loop_toggle_watch (bus_connection_get_loop (connection), watch);
390 }
391
392 static dbus_bool_t
393 add_connection_timeout (DBusTimeout    *timeout,
394                         void           *data)
395 {
396   DBusConnection *connection = data;
397   
398   return _dbus_loop_add_timeout (bus_connection_get_loop (connection), timeout);
399 }
400
401 static void
402 remove_connection_timeout (DBusTimeout    *timeout,
403                            void           *data)
404 {
405   DBusConnection *connection = data;
406   
407   _dbus_loop_remove_timeout (bus_connection_get_loop (connection), timeout);
408 }
409
410 static void
411 dispatch_status_function (DBusConnection    *connection,
412                           DBusDispatchStatus new_status,
413                           void              *data)
414 {
415   DBusLoop *loop = data;
416   
417   if (new_status != DBUS_DISPATCH_COMPLETE)
418     {
419       while (!_dbus_loop_queue_dispatch (loop, connection))
420         _dbus_wait_for_memory ();
421     }
422 }
423
424 static dbus_bool_t
425 allow_unix_user_function (DBusConnection *connection,
426                           unsigned long   uid,
427                           void           *data)
428 {
429   BusConnectionData *d;
430     
431   d = BUS_CONNECTION_DATA (connection);
432
433   _dbus_assert (d != NULL);
434   
435   return bus_context_allow_unix_user (d->connections->context, uid);
436 }
437
438 static void
439 free_connection_data (void *data)
440 {
441   BusConnectionData *d = data;
442
443   /* services_owned should be NULL since we should be disconnected */
444   _dbus_assert (d->services_owned == NULL);
445   _dbus_assert (d->n_services_owned == 0);
446   /* similarly */
447   _dbus_assert (d->transaction_messages == NULL);
448
449   if (d->oom_preallocated)
450     dbus_connection_free_preallocated_send (d->connection, d->oom_preallocated);
451
452   if (d->oom_message)
453     dbus_message_unref (d->oom_message);
454
455   if (d->policy)
456     bus_client_policy_unref (d->policy);
457
458   if (d->apparmor_confinement)
459     bus_apparmor_confinement_unref (d->apparmor_confinement);
460   
461   dbus_free (d->cached_loginfo_string);
462   
463   dbus_free (d->name);
464   
465 #ifdef DBUS_ENABLE_CYNARA
466   free (d->cynara_session_id);
467 #endif
468
469   dbus_free (d);
470 }
471
472 BusConnections*
473 bus_connections_new (BusContext *context)
474 {
475   BusConnections *connections;
476
477   if (!dbus_connection_allocate_data_slot (&connection_data_slot))
478     goto failed_0;
479
480   connections = dbus_new0 (BusConnections, 1);
481   if (connections == NULL)
482     goto failed_1;
483
484   connections->completed_by_user = _dbus_hash_table_new (DBUS_HASH_UINTPTR,
485                                                          NULL, NULL);
486   if (connections->completed_by_user == NULL)
487     goto failed_2;
488
489   connections->expire_timeout = _dbus_timeout_new (100, /* irrelevant */
490                                                    expire_incomplete_timeout,
491                                                    connections, NULL);
492   if (connections->expire_timeout == NULL)
493     goto failed_3;
494
495   _dbus_timeout_disable (connections->expire_timeout);
496
497   connections->pending_replies = bus_expire_list_new (bus_context_get_loop (context),
498                                                       bus_context_get_reply_timeout (context),
499                                                       bus_pending_reply_expired,
500                                                       connections);
501   if (connections->pending_replies == NULL)
502     goto failed_4;
503   
504   if (!_dbus_loop_add_timeout (bus_context_get_loop (context),
505                                connections->expire_timeout))
506     goto failed_5;
507   
508   connections->refcount = 1;
509   connections->context = context;
510   
511   return connections;
512
513  failed_5:
514   bus_expire_list_free (connections->pending_replies);
515  failed_4:
516   _dbus_timeout_unref (connections->expire_timeout);
517  failed_3:
518   _dbus_hash_table_unref (connections->completed_by_user);
519  failed_2:
520   dbus_free (connections);
521  failed_1:
522   dbus_connection_free_data_slot (&connection_data_slot);
523  failed_0:
524   return NULL;
525 }
526
527 BusConnections *
528 bus_connections_ref (BusConnections *connections)
529 {
530   _dbus_assert (connections->refcount > 0);
531   connections->refcount += 1;
532
533   return connections;
534 }
535
536 void
537 bus_connections_unref (BusConnections *connections)
538 {
539   _dbus_assert (connections->refcount > 0);
540   connections->refcount -= 1;
541   if (connections->refcount == 0)
542     {
543       /* drop all incomplete */
544       while (connections->incomplete != NULL)
545         {
546           DBusConnection *connection;
547
548           connection = connections->incomplete->data;
549
550           dbus_connection_ref (connection);
551           dbus_connection_close (connection);
552           bus_connection_disconnected (connection);
553           dbus_connection_unref (connection);
554         }
555
556       _dbus_assert (connections->n_incomplete == 0);
557
558       /* drop all monitors */
559       _dbus_list_clear (&connections->monitors);
560
561       /* drop all real connections */
562       while (connections->completed != NULL)
563         {
564           DBusConnection *connection;
565
566           connection = connections->completed->data;
567
568           dbus_connection_ref (connection);
569           dbus_connection_close (connection);
570           bus_connection_disconnected (connection);
571           dbus_connection_unref (connection);
572         }
573
574       _dbus_assert (connections->n_completed == 0);
575
576       bus_expire_list_free (connections->pending_replies);
577       
578       _dbus_loop_remove_timeout (bus_context_get_loop (connections->context),
579                                  connections->expire_timeout);
580       
581       _dbus_timeout_unref (connections->expire_timeout);
582       
583       _dbus_hash_table_unref (connections->completed_by_user);
584
585       if (connections->monitor_matchmaker != NULL)
586         bus_matchmaker_unref (connections->monitor_matchmaker);
587
588       dbus_free (connections);
589
590       dbus_connection_free_data_slot (&connection_data_slot);
591     }
592 }
593
594 /* Used for logging */
595 static dbus_bool_t
596 cache_peer_loginfo_string (BusConnectionData *d, 
597                            DBusConnection    *connection)
598 {
599   DBusString loginfo_buf;
600   unsigned long uid;
601   unsigned long pid;
602   char *windows_sid = NULL, *security_label = NULL;
603   dbus_bool_t prev_added;
604
605   if (!_dbus_string_init (&loginfo_buf))
606     return FALSE;
607   
608   prev_added = FALSE;
609   if (dbus_connection_get_unix_user (connection, &uid))
610     {
611       if (!_dbus_string_append_printf (&loginfo_buf, "uid=%ld", uid))
612         goto oom;
613       else
614         prev_added = TRUE;
615     }
616
617   if (dbus_connection_get_unix_process_id (connection, &pid))
618     {
619       if (prev_added)
620         {
621           if (!_dbus_string_append_byte (&loginfo_buf, ' '))
622             goto oom;
623         }
624       if (!_dbus_string_append_printf (&loginfo_buf, "pid=%ld comm=\"", pid))
625         goto oom;
626       /* Ignore errors here; we may not have permissions to read the
627        * proc file. */
628       _dbus_command_for_pid (pid, &loginfo_buf, MAX_LOG_COMMAND_LEN, NULL);
629       if (!_dbus_string_append_byte (&loginfo_buf, '"'))
630         goto oom;
631       else
632         prev_added = TRUE;
633     }
634
635   if (dbus_connection_get_windows_user (connection, &windows_sid))
636     {
637       dbus_bool_t did_append;
638
639       if (prev_added)
640         {
641           if (!_dbus_string_append_byte (&loginfo_buf, ' '))
642             goto oom;
643         }
644
645       did_append = _dbus_string_append_printf (&loginfo_buf,
646                                                "sid=\"%s\"", windows_sid);
647       dbus_free (windows_sid);
648       windows_sid = NULL;
649       if (!did_append)
650         goto oom;
651       else
652         prev_added = TRUE;
653     }
654
655   if (_dbus_connection_get_linux_security_label (connection, &security_label))
656     {
657       dbus_bool_t did_append;
658
659       if (prev_added)
660         {
661           if (!_dbus_string_append_byte (&loginfo_buf, ' '))
662             goto oom;
663         }
664
665       did_append = _dbus_string_append_printf (&loginfo_buf,
666                                                "label=\"%s\"", security_label);
667       dbus_free (security_label);
668       security_label = NULL;
669       if (!did_append)
670         goto oom;
671       else
672         prev_added = TRUE;
673     }
674
675   if (!_dbus_string_steal_data (&loginfo_buf, &(d->cached_loginfo_string)))
676     goto oom;
677
678   _dbus_string_free (&loginfo_buf); 
679
680   return TRUE;
681 oom:
682    _dbus_string_free (&loginfo_buf);
683    if (security_label != NULL)
684      dbus_free (security_label);
685    if (windows_sid != NULL)
686      dbus_free (windows_sid);
687
688    return FALSE;
689 }
690
691 static void
692 check_pending_fds_cb (DBusConnection *connection)
693 {
694   BusConnectionData *d = BUS_CONNECTION_DATA (connection);
695   int n_pending_unix_fds_old;
696   int n_pending_unix_fds_new;
697
698   _dbus_assert(d != NULL);
699
700   n_pending_unix_fds_old = d->n_pending_unix_fds;
701   n_pending_unix_fds_new = _dbus_connection_get_pending_fds_count (connection);
702
703   _dbus_verbose ("Pending fds count changed on connection %p: %d -> %d\n",
704                  connection, n_pending_unix_fds_old, n_pending_unix_fds_new);
705
706   if (n_pending_unix_fds_old == 0 && n_pending_unix_fds_new > 0)
707     {
708       _dbus_timeout_restart (d->pending_unix_fds_timeout,
709               bus_context_get_pending_fd_timeout (d->connections->context));
710     }
711
712   if (n_pending_unix_fds_old > 0 && n_pending_unix_fds_new == 0)
713     {
714       _dbus_timeout_disable (d->pending_unix_fds_timeout);
715     }
716
717
718   d->n_pending_unix_fds = n_pending_unix_fds_new;
719 }
720
721 static dbus_bool_t
722 pending_unix_fds_timeout_cb (void *data)
723 {
724   DBusConnection *connection = data;
725   BusConnectionData *d = BUS_CONNECTION_DATA (connection);
726   int limit;
727
728   _dbus_assert (d != NULL);
729   limit = bus_context_get_pending_fd_timeout (d->connections->context);
730   bus_context_log (d->connections->context, DBUS_SYSTEM_LOG_WARNING,
731       "Connection \"%s\" (%s) has had Unix fds pending for too long, "
732       "closing it (pending_fd_timeout=%d ms)",
733       d->name != NULL ? d->name : "(null)",
734       bus_connection_get_loginfo (connection),
735       limit);
736
737   dbus_connection_close (connection);
738   return TRUE;
739 }
740
741 dbus_bool_t
742 bus_connections_setup_connection (BusConnections *connections,
743                                   DBusConnection *connection)
744 {
745
746   BusConnectionData *d = NULL;
747   DBusError error;
748
749   d = dbus_new0 (BusConnectionData, 1);
750   
751   if (d == NULL)
752     goto oom;
753
754   d->connections = connections;
755   d->connection = connection;
756   
757   _dbus_get_monotonic_time (&d->connection_tv_sec,
758                             &d->connection_tv_usec);
759   
760   _dbus_assert (connection_data_slot >= 0);
761   
762   if (!dbus_connection_set_data (connection,
763                                  connection_data_slot,
764                                  d, free_connection_data))
765     {
766       /* We have to free d explicitly, because this is the only code
767        * path where it's non-NULL but dbus_connection_set_data() hasn't
768        * taken responsibility for freeing it. */
769       dbus_free (d);
770       d = NULL;
771       goto oom;
772     }
773
774   dbus_connection_set_route_peer_messages (connection, TRUE);
775
776   dbus_error_init (&error);
777   d->selinux_id = bus_selinux_init_connection_id (connection,
778                                                   &error);
779   if (dbus_error_is_set (&error))
780     {
781       bus_context_log (connections->context, DBUS_SYSTEM_LOG_WARNING,
782                        "Unable to set up new connection: %s", error.message);
783       dbus_error_free (&error);
784       goto error;
785     }
786
787   d->apparmor_confinement = bus_apparmor_init_connection_confinement (connection,
788                                                                       &error);
789   if (dbus_error_is_set (&error))
790     {
791       bus_context_log (connections->context, DBUS_SYSTEM_LOG_WARNING,
792                        "Unable to set up new connection: %s", error.message);
793       dbus_error_free (&error);
794       goto error;
795     }
796
797   if (!dbus_connection_set_watch_functions (connection,
798                                             add_connection_watch,
799                                             remove_connection_watch,
800                                             toggle_connection_watch,
801                                             connection,
802                                             NULL))
803     goto oom;
804   
805   if (!dbus_connection_set_timeout_functions (connection,
806                                               add_connection_timeout,
807                                               remove_connection_timeout,
808                                               NULL,
809                                               connection, NULL))
810     goto oom;
811
812   /* For now we don't need to set a Windows user function because
813    * there are no policies in the config file controlling what
814    * Windows users can connect. The default 'same user that owns the
815    * bus can connect' behavior of DBusConnection is fine on Windows.
816    */
817   dbus_connection_set_unix_user_function (connection,
818                                           allow_unix_user_function,
819                                           NULL, NULL);
820
821   dbus_connection_set_dispatch_status_function (connection,
822                                                 dispatch_status_function,
823                                                 bus_context_get_loop (connections->context),
824                                                 NULL);
825
826   d->link_in_connection_list = _dbus_list_alloc_link (connection);
827   if (d->link_in_connection_list == NULL)
828     goto oom;
829   
830   /* Setup the connection with the dispatcher */
831   if (!bus_dispatch_add_connection (connection))
832     goto oom;
833
834   if (dbus_connection_get_dispatch_status (connection) != DBUS_DISPATCH_COMPLETE)
835     {
836       if (!_dbus_loop_queue_dispatch (bus_context_get_loop (connections->context), connection))
837         {
838           bus_dispatch_remove_connection (connection);
839           goto oom;
840         }
841     }
842
843   /* Setup pending fds timeout (see #80559) */
844   d->pending_unix_fds_timeout = _dbus_timeout_new (100, /* irrelevant */
845                                                    pending_unix_fds_timeout_cb,
846                                                    connection, NULL);
847   if (d->pending_unix_fds_timeout == NULL)
848     goto oom;
849
850   _dbus_timeout_disable (d->pending_unix_fds_timeout);
851   if (!_dbus_loop_add_timeout (bus_context_get_loop (connections->context),
852                                d->pending_unix_fds_timeout))
853     goto oom;
854
855   _dbus_connection_set_pending_fds_function (connection,
856           (DBusPendingFdsChangeFunction) check_pending_fds_cb,
857           connection);
858
859   _dbus_list_append_link (&connections->incomplete, d->link_in_connection_list);
860   connections->n_incomplete += 1;
861   
862   dbus_connection_ref (connection);
863
864   bus_connections_expire_incomplete (connections);
865   
866   /* The listening socket is removed from the main loop,
867    * i.e. does not accept(), while n_incomplete is at its
868    * maximum value; so we shouldn't get here in that case */
869   _dbus_assert (connections->n_incomplete <=
870       bus_context_get_max_incomplete_connections (connections->context));
871
872   /* If we have the maximum number of incomplete connections,
873    * stop accept()ing any more, to avert a DoS. See fd.o #80919 */
874   bus_context_check_all_watches (d->connections->context);
875   
876   return TRUE;
877
878 oom:
879   bus_context_log (connections->context, DBUS_SYSTEM_LOG_WARNING,
880                    "No memory to set up new connection");
881   /* fall through */
882 error:
883   if (d != NULL)
884     {
885       d->selinux_id = NULL;
886
887       if (d->apparmor_confinement)
888         bus_apparmor_confinement_unref (d->apparmor_confinement);
889       d->apparmor_confinement = NULL;
890       
891       if (!dbus_connection_set_watch_functions (connection,
892                                                 NULL, NULL, NULL,
893                                                 connection,
894                                                 NULL))
895         _dbus_assert_not_reached ("setting watch functions to NULL failed");
896       
897       if (!dbus_connection_set_timeout_functions (connection,
898                                                   NULL, NULL, NULL,
899                                                   connection,
900                                                   NULL))
901         _dbus_assert_not_reached ("setting timeout functions to NULL failed");
902
903       dbus_connection_set_unix_user_function (connection,
904                                               NULL, NULL, NULL);
905
906       dbus_connection_set_windows_user_function (connection,
907                                                  NULL, NULL, NULL);
908       
909       dbus_connection_set_dispatch_status_function (connection,
910                                                     NULL, NULL, NULL);
911
912       if (d->pending_unix_fds_timeout)
913         _dbus_timeout_unref (d->pending_unix_fds_timeout);
914
915       d->pending_unix_fds_timeout = NULL;
916
917       _dbus_connection_set_pending_fds_function (connection, NULL, NULL);
918
919       if (d->link_in_connection_list != NULL)
920         {
921           _dbus_assert (d->link_in_connection_list->next == NULL);
922           _dbus_assert (d->link_in_connection_list->prev == NULL);
923           _dbus_list_free_link (d->link_in_connection_list);
924           d->link_in_connection_list = NULL;
925         }
926       
927       if (!dbus_connection_set_data (connection,
928                                      connection_data_slot,
929                                      NULL, NULL))
930         _dbus_assert_not_reached ("failed to set connection data to null");
931
932       /* "d" has now been freed */
933     }
934   
935   return FALSE;
936 }
937
938 void
939 bus_connections_expire_incomplete (BusConnections *connections)
940 {    
941   int next_interval;
942
943   next_interval = -1;
944   
945   if (connections->incomplete != NULL)
946     {
947       long tv_sec, tv_usec;
948       DBusList *link;
949       int auth_timeout;
950       
951       _dbus_get_monotonic_time (&tv_sec, &tv_usec);
952       auth_timeout = bus_context_get_auth_timeout (connections->context);
953   
954       link = _dbus_list_get_first_link (&connections->incomplete);
955       while (link != NULL)
956         {
957           DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link);
958           DBusConnection *connection;
959           BusConnectionData *d;
960           double elapsed;
961       
962           connection = link->data;
963       
964           d = BUS_CONNECTION_DATA (connection);
965       
966           _dbus_assert (d != NULL);
967       
968           elapsed = ELAPSED_MILLISECONDS_SINCE (d->connection_tv_sec,
969                                                 d->connection_tv_usec,
970                                                 tv_sec, tv_usec);
971
972           if (elapsed >= (double) auth_timeout)
973             {
974               /* Unfortunately, we can't identify the connection: it doesn't
975                * have a unique name yet, we don't know its uid/pid yet,
976                * and so on. */
977               bus_context_log (connections->context, DBUS_SYSTEM_LOG_WARNING,
978                   "Connection has not authenticated soon enough, closing it "
979                   "(auth_timeout=%dms, elapsed: %.0fms)",
980                   auth_timeout, elapsed);
981
982               _dbus_verbose ("Timing out authentication for connection %p\n", connection);
983               dbus_connection_close (connection);
984             }
985           else
986             {
987               /* We can end the loop, since the connections are in oldest-first order */
988               next_interval = ((double)auth_timeout) - elapsed;
989               _dbus_verbose ("Connection %p authentication expires in %d milliseconds\n",
990                              connection, next_interval);
991           
992               break;
993             }
994       
995           link = next;
996         }
997     }
998
999   bus_expire_timeout_set_interval (connections->expire_timeout,
1000                                    next_interval);
1001 }
1002
1003 static dbus_bool_t
1004 expire_incomplete_timeout (void *data)
1005 {
1006   BusConnections *connections = data;
1007
1008   _dbus_verbose ("Running\n");
1009   
1010   /* note that this may remove the timeout */
1011   bus_connections_expire_incomplete (connections);
1012
1013   return TRUE;
1014 }
1015
1016 dbus_bool_t
1017 bus_connection_get_unix_groups  (DBusConnection   *connection,
1018                                  unsigned long   **groups,
1019                                  int              *n_groups,
1020                                  DBusError        *error)
1021 {
1022   unsigned long uid;
1023
1024   *groups = NULL;
1025   *n_groups = 0;
1026
1027   if (dbus_connection_get_unix_user (connection, &uid))
1028     {
1029       if (!_dbus_unix_groups_from_uid (uid, groups, n_groups))
1030         {
1031           _dbus_verbose ("Did not get any groups for UID %lu\n",
1032                          uid);
1033           return FALSE;
1034         }
1035       else
1036         {
1037           _dbus_verbose ("Got %d groups for UID %lu\n",
1038                          *n_groups, uid);
1039           return TRUE;
1040         }
1041     }
1042   else
1043     return TRUE; /* successfully got 0 groups */
1044 }
1045
1046 dbus_bool_t
1047 bus_connection_is_in_unix_group (DBusConnection *connection,
1048                                  unsigned long   gid)
1049 {
1050   int i;
1051   unsigned long *group_ids;
1052   int n_group_ids;
1053
1054   if (!bus_connection_get_unix_groups (connection, &group_ids, &n_group_ids,
1055                                        NULL))
1056     return FALSE;
1057
1058   i = 0;
1059   while (i < n_group_ids)
1060     {
1061       if (group_ids[i] == gid)
1062         {
1063           dbus_free (group_ids);
1064           return TRUE;
1065         }
1066       ++i;
1067     }
1068
1069   dbus_free (group_ids);
1070   return FALSE;
1071 }
1072
1073 const char *
1074 bus_connection_get_loginfo (DBusConnection        *connection)
1075 {
1076   BusConnectionData *d;
1077     
1078   d = BUS_CONNECTION_DATA (connection);
1079   _dbus_assert(d != NULL);
1080
1081   if (!bus_connection_is_active (connection))
1082     return "inactive";
1083   return d->cached_loginfo_string;  
1084 }
1085
1086 BusClientPolicy*
1087 bus_connection_get_policy (DBusConnection *connection)
1088 {
1089   BusConnectionData *d;
1090     
1091   d = BUS_CONNECTION_DATA (connection);
1092
1093   _dbus_assert (d != NULL);
1094   _dbus_assert (d->policy != NULL);
1095   
1096   return d->policy;
1097 }
1098
1099 #ifdef DBUS_ENABLE_CYNARA
1100 const char *bus_connection_get_cynara_session_id (DBusConnection *connection)
1101 {
1102   BusConnectionData *d = BUS_CONNECTION_DATA (connection);
1103   _dbus_assert (d != NULL);
1104
1105   if (d->cynara_session_id == NULL)
1106     {
1107       unsigned long pid;
1108       if (dbus_connection_get_unix_process_id(connection, &pid))
1109         d->cynara_session_id = cynara_session_from_pid(pid);
1110
1111       /* If client exits as soon as async call, cynara_session_from_pid() returns null.
1112          cynara_session_from_pid checks /proc/pid to verify process */
1113       if (d->cynara_session_id == NULL)
1114         asprintf (&d->cynara_session_id, "/proc/%ld", pid);
1115     }
1116   return d->cynara_session_id;
1117 }
1118 #endif
1119
1120 static dbus_bool_t
1121 foreach_active (BusConnections               *connections,
1122                 BusConnectionForeachFunction  function,
1123                 void                         *data)
1124 {
1125   DBusList *link;
1126   
1127   link = _dbus_list_get_first_link (&connections->completed);
1128   while (link != NULL)
1129     {
1130       DBusConnection *connection = link->data;
1131       DBusList *next = _dbus_list_get_next_link (&connections->completed, link);
1132
1133       if (!(* function) (connection, data))
1134         return FALSE;
1135       
1136       link = next;
1137     }
1138
1139   return TRUE;
1140 }
1141
1142 static dbus_bool_t
1143 foreach_inactive (BusConnections               *connections,
1144                   BusConnectionForeachFunction  function,
1145                   void                         *data)
1146 {
1147   DBusList *link;
1148   
1149   link = _dbus_list_get_first_link (&connections->incomplete);
1150   while (link != NULL)
1151     {
1152       DBusConnection *connection = link->data;
1153       DBusList *next = _dbus_list_get_next_link (&connections->incomplete, link);
1154
1155       if (!(* function) (connection, data))
1156         return FALSE;
1157       
1158       link = next;
1159     }
1160
1161   return TRUE;
1162 }
1163
1164 /**
1165  * Calls function on each active connection; if the function returns
1166  * #FALSE, stops iterating. Active connections are authenticated
1167  * and have sent a Hello message.
1168  *
1169  * @param connections the connections object
1170  * @param function the function
1171  * @param data data to pass to it as a second arg
1172  */
1173 void
1174 bus_connections_foreach_active (BusConnections               *connections,
1175                                 BusConnectionForeachFunction  function,
1176                                 void                         *data)
1177 {
1178   foreach_active (connections, function, data);
1179 }
1180
1181 /**
1182  * Calls function on each connection; if the function returns
1183  * #FALSE, stops iterating.
1184  *
1185  * @param connections the connections object
1186  * @param function the function
1187  * @param data data to pass to it as a second arg
1188  */
1189 void
1190 bus_connections_foreach (BusConnections               *connections,
1191                          BusConnectionForeachFunction  function,
1192                          void                         *data)
1193 {
1194   if (!foreach_active (connections, function, data))
1195     return;
1196
1197   foreach_inactive (connections, function, data);
1198 }
1199
1200 BusContext*
1201 bus_connections_get_context (BusConnections *connections)
1202 {
1203   return connections->context;
1204 }
1205
1206 /*
1207  * This is used to avoid covering the same connection twice when
1208  * traversing connections. Note that it assumes we will
1209  * bus_connection_mark_stamp() each connection at least once per
1210  * INT_MAX increments of the global stamp, or wraparound would break
1211  * things.
1212  */
1213 void
1214 bus_connections_increment_stamp (BusConnections *connections)
1215 {
1216   connections->stamp += 1;
1217 }
1218
1219 /* Mark connection with current stamp, return TRUE if it
1220  * didn't already have that stamp
1221  */
1222 dbus_bool_t
1223 bus_connection_mark_stamp (DBusConnection *connection)
1224 {
1225   BusConnectionData *d;
1226   
1227   d = BUS_CONNECTION_DATA (connection);
1228   
1229   _dbus_assert (d != NULL);
1230
1231   if (d->stamp == d->connections->stamp)
1232     return FALSE;
1233   else
1234     {
1235       d->stamp = d->connections->stamp;
1236       return TRUE;
1237     }
1238 }
1239
1240 BusContext*
1241 bus_connection_get_context (DBusConnection *connection)
1242 {
1243   BusConnectionData *d;
1244
1245   d = BUS_CONNECTION_DATA (connection);
1246
1247   _dbus_assert (d != NULL);
1248
1249   return d->connections->context;
1250 }
1251
1252 BusConnections*
1253 bus_connection_get_connections (DBusConnection *connection)
1254 {
1255   BusConnectionData *d;
1256     
1257   d = BUS_CONNECTION_DATA (connection);
1258
1259   _dbus_assert (d != NULL);
1260
1261   return d->connections;
1262 }
1263
1264 BusRegistry*
1265 bus_connection_get_registry (DBusConnection *connection)
1266 {
1267   BusConnectionData *d;
1268
1269   d = BUS_CONNECTION_DATA (connection);
1270
1271   _dbus_assert (d != NULL);
1272
1273   return bus_context_get_registry (d->connections->context);
1274 }
1275
1276 BusActivation*
1277 bus_connection_get_activation (DBusConnection *connection)
1278 {
1279   BusConnectionData *d;
1280
1281   d = BUS_CONNECTION_DATA (connection);
1282
1283   _dbus_assert (d != NULL);
1284
1285   return bus_context_get_activation (d->connections->context);
1286 }
1287
1288 BusMatchmaker*
1289 bus_connection_get_matchmaker (DBusConnection *connection)
1290 {
1291   BusConnectionData *d;
1292
1293   d = BUS_CONNECTION_DATA (connection);
1294
1295   _dbus_assert (d != NULL);
1296
1297   return bus_context_get_matchmaker (d->connections->context);
1298 }
1299
1300 BusSELinuxID*
1301 bus_connection_get_selinux_id (DBusConnection *connection)
1302 {
1303   BusConnectionData *d;
1304
1305   d = BUS_CONNECTION_DATA (connection);
1306
1307   _dbus_assert (d != NULL);
1308
1309   return d->selinux_id;
1310 }
1311
1312 BusAppArmorConfinement*
1313 bus_connection_dup_apparmor_confinement (DBusConnection *connection)
1314 {
1315   BusConnectionData *d;
1316
1317   d = BUS_CONNECTION_DATA (connection);
1318
1319   _dbus_assert (d != NULL);
1320
1321   bus_apparmor_confinement_ref (d->apparmor_confinement);
1322   return d->apparmor_confinement;
1323 }
1324
1325 /**
1326  * Checks whether the connection is registered with the message bus.
1327  *
1328  * @param connection the connection
1329  * @returns #TRUE if we're an active message bus participant
1330  */
1331 dbus_bool_t
1332 bus_connection_is_active (DBusConnection *connection)
1333 {
1334   BusConnectionData *d;
1335
1336   d = BUS_CONNECTION_DATA (connection);
1337   _dbus_assert(d != NULL);
1338   
1339   return d->name != NULL;
1340 }
1341
1342 dbus_bool_t
1343 bus_connection_preallocate_oom_error (DBusConnection *connection)
1344 {
1345   DBusMessage *message;
1346   DBusPreallocatedSend *preallocated;
1347   BusConnectionData *d;
1348
1349   d = BUS_CONNECTION_DATA (connection);  
1350
1351   _dbus_assert (d != NULL);
1352
1353   if (d->oom_preallocated != NULL)
1354     return TRUE;
1355   
1356   preallocated = dbus_connection_preallocate_send (connection);
1357   if (preallocated == NULL)
1358     return FALSE;
1359
1360   message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR);
1361
1362   if (message == NULL)
1363     {
1364       dbus_connection_free_preallocated_send (connection, preallocated);
1365       return FALSE;
1366     }
1367
1368   /* d->name may be NULL, but that is OK */
1369   if (!dbus_message_set_error_name (message, DBUS_ERROR_NO_MEMORY) ||
1370       !dbus_message_set_destination (message, d->name) ||
1371       !dbus_message_set_sender (message,
1372                                 DBUS_SERVICE_DBUS))
1373     {
1374       dbus_connection_free_preallocated_send (connection, preallocated);
1375       dbus_message_unref (message);
1376       return FALSE;
1377     }
1378   
1379   /* set reply serial to placeholder value just so space is already allocated
1380    * for it.
1381    */
1382   if (!dbus_message_set_reply_serial (message, 14))
1383     {
1384       dbus_connection_free_preallocated_send (connection, preallocated);
1385       dbus_message_unref (message);
1386       return FALSE;
1387     }
1388
1389   d->oom_message = message;
1390   d->oom_preallocated = preallocated;
1391   
1392   return TRUE;
1393 }
1394
1395 void
1396 bus_connection_send_oom_error (DBusConnection *connection,
1397                                DBusMessage    *in_reply_to)
1398 {
1399   BusConnectionData *d;
1400
1401   d = BUS_CONNECTION_DATA (connection);  
1402
1403   _dbus_assert (d != NULL);  
1404   _dbus_assert (d->oom_message != NULL);
1405
1406   bus_context_log (d->connections->context, DBUS_SYSTEM_LOG_WARNING,
1407                    "dbus-daemon transaction failed (OOM), sending error to "
1408                    "sender %s", bus_connection_get_loginfo (connection));
1409
1410   /* should always succeed since we set it to a placeholder earlier */
1411   if (!dbus_message_set_reply_serial (d->oom_message,
1412                                       dbus_message_get_serial (in_reply_to)))
1413     _dbus_assert_not_reached ("Failed to set reply serial for preallocated oom message");
1414
1415   _dbus_assert (dbus_message_get_sender (d->oom_message) != NULL);
1416   
1417   dbus_connection_send_preallocated (connection, d->oom_preallocated,
1418                                      d->oom_message, NULL);
1419
1420   dbus_message_unref (d->oom_message);
1421   d->oom_message = NULL;
1422   d->oom_preallocated = NULL;
1423 }
1424
1425 #ifdef DBUS_ENABLE_STATS
1426 static void
1427 update_peak (int *peak,
1428              int n)
1429 {
1430   if (*peak < n)
1431     *peak = n;
1432 }
1433 #endif
1434
1435 void
1436 bus_connection_add_match_rule_link (DBusConnection *connection,
1437                                     DBusList       *link)
1438 {
1439   BusConnectionData *d;
1440
1441   d = BUS_CONNECTION_DATA (connection);
1442   _dbus_assert (d != NULL);
1443
1444   _dbus_list_append_link (&d->match_rules, link);
1445
1446   d->n_match_rules += 1;
1447
1448 #ifdef DBUS_ENABLE_STATS
1449   update_peak (&d->peak_match_rules, d->n_match_rules);
1450   update_peak (&d->connections->peak_match_rules_per_conn, d->n_match_rules);
1451
1452   d->connections->total_match_rules += 1;
1453   update_peak (&d->connections->peak_match_rules,
1454                d->connections->total_match_rules);
1455 #endif
1456 }
1457
1458 dbus_bool_t
1459 bus_connection_add_match_rule (DBusConnection *connection,
1460                                BusMatchRule   *rule)
1461 {
1462     DBusList *link;
1463
1464   link = _dbus_list_alloc_link (rule);
1465
1466   if (link == NULL)
1467     return FALSE;
1468
1469   bus_connection_add_match_rule_link (connection, link);
1470
1471   return TRUE;
1472 }
1473
1474 void
1475 bus_connection_remove_match_rule (DBusConnection *connection,
1476                                   BusMatchRule   *rule)
1477 {
1478   BusConnectionData *d;
1479
1480   d = BUS_CONNECTION_DATA (connection);
1481   _dbus_assert (d != NULL);
1482
1483   _dbus_list_remove_last (&d->match_rules, rule);
1484
1485   d->n_match_rules -= 1;
1486   _dbus_assert (d->n_match_rules >= 0);
1487
1488 #ifdef DBUS_ENABLE_STATS
1489   d->connections->total_match_rules -= 1;
1490 #endif
1491 }
1492
1493 int
1494 bus_connection_get_n_match_rules (DBusConnection *connection)
1495 {
1496   BusConnectionData *d;
1497
1498   d = BUS_CONNECTION_DATA (connection);
1499   _dbus_assert (d != NULL);
1500   
1501   return d->n_match_rules;
1502 }
1503
1504 dbus_bool_t
1505 bus_connection_is_service_owner_by_prefix (DBusConnection *connection,
1506                                            const char *name_prefix)
1507 {
1508   BusConnectionData *d;
1509   DBusList *link;
1510
1511   d = BUS_CONNECTION_DATA (connection);
1512   _dbus_assert (d != NULL);
1513
1514   link = _dbus_list_get_first_link (&d->services_owned);
1515   while (link != NULL)
1516     {
1517       BusService *service = link->data;
1518       DBusString str;
1519
1520       _dbus_string_init_const (&str, bus_service_get_name (service));
1521
1522       if (_dbus_string_starts_with_words_c_str (&str, name_prefix, '.'))
1523         return TRUE;
1524
1525       link = _dbus_list_get_next_link (&d->services_owned, link);
1526     }
1527
1528   return FALSE;
1529 }
1530
1531 void
1532 bus_connection_add_owned_service_link (DBusConnection *connection,
1533                                        DBusList       *link)
1534 {
1535   BusConnectionData *d;
1536
1537   d = BUS_CONNECTION_DATA (connection);
1538   _dbus_assert (d != NULL);
1539
1540   _dbus_list_append_link (&d->services_owned, link);
1541
1542   d->n_services_owned += 1;
1543
1544 #ifdef DBUS_ENABLE_STATS
1545   update_peak (&d->peak_bus_names, d->n_services_owned);
1546   update_peak (&d->connections->peak_bus_names_per_conn,
1547                d->n_services_owned);
1548
1549   d->connections->total_bus_names += 1;
1550   update_peak (&d->connections->peak_bus_names,
1551                d->connections->total_bus_names);
1552 #endif
1553 }
1554
1555 dbus_bool_t
1556 bus_connection_add_owned_service (DBusConnection *connection,
1557                                   BusService     *service)
1558 {
1559   DBusList *link;
1560
1561   link = _dbus_list_alloc_link (service);
1562
1563   if (link == NULL)
1564     return FALSE;
1565
1566   bus_connection_add_owned_service_link (connection, link);
1567
1568   return TRUE;
1569 }
1570
1571 void
1572 bus_connection_remove_owned_service (DBusConnection *connection,
1573                                      BusService     *service)
1574 {
1575   BusConnectionData *d;
1576
1577   d = BUS_CONNECTION_DATA (connection);
1578   _dbus_assert (d != NULL);
1579
1580   _dbus_list_remove_last (&d->services_owned, service);
1581
1582   d->n_services_owned -= 1;
1583   _dbus_assert (d->n_services_owned >= 0);
1584
1585 #ifdef DBUS_ENABLE_STATS
1586   d->connections->total_bus_names -= 1;
1587 #endif
1588 }
1589
1590 int
1591 bus_connection_get_n_services_owned (DBusConnection *connection)
1592 {
1593   BusConnectionData *d;
1594
1595   d = BUS_CONNECTION_DATA (connection);
1596   _dbus_assert (d != NULL);
1597   
1598   return d->n_services_owned;
1599 }
1600
1601 dbus_bool_t
1602 bus_connection_complete (DBusConnection   *connection,
1603                          const DBusString *name,
1604                          DBusError        *error)
1605 {
1606   BusConnectionData *d;
1607   unsigned long uid;
1608   
1609   d = BUS_CONNECTION_DATA (connection);
1610   _dbus_assert (d != NULL);
1611   _dbus_assert (d->name == NULL);
1612   _dbus_assert (d->policy == NULL);
1613
1614   _dbus_assert (!bus_connection_is_active (connection));
1615   
1616   if (!_dbus_string_copy_data (name, &d->name))
1617     {
1618       BUS_SET_OOM (error);
1619       return FALSE;
1620     }
1621
1622   _dbus_assert (d->name != NULL);
1623   
1624   _dbus_verbose ("Name %s assigned to %p\n", d->name, connection);
1625
1626   d->policy = bus_context_create_client_policy (d->connections->context,
1627                                                 connection,
1628                                                 error);
1629
1630   /* we may have a NULL policy on OOM or error getting list of
1631    * groups for a user. In the latter case we don't handle it so
1632    * well currently, as it will just keep failing over and over.
1633    */
1634
1635   if (d->policy == NULL)
1636     {
1637       _dbus_verbose ("Failed to create security policy for connection %p\n",
1638                      connection);
1639       _DBUS_ASSERT_ERROR_IS_SET (error);
1640       dbus_free (d->name);
1641       d->name = NULL;
1642       return FALSE;
1643     }
1644   
1645   if (dbus_connection_get_unix_user (connection, &uid))
1646     {
1647       if (!adjust_connections_for_uid (d->connections,
1648                                        uid, 1))
1649         goto fail;
1650     }
1651
1652   /* Create and cache a string which holds information about the 
1653    * peer process; used for logging purposes.
1654    */
1655   if (!cache_peer_loginfo_string (d, connection))
1656     goto fail;
1657
1658   /* Now the connection is active, move it between lists */
1659   _dbus_list_unlink (&d->connections->incomplete,
1660                      d->link_in_connection_list);
1661   d->connections->n_incomplete -= 1;
1662   _dbus_list_append_link (&d->connections->completed,
1663                           d->link_in_connection_list);
1664   d->connections->n_completed += 1;
1665
1666   _dbus_assert (d->connections->n_incomplete >= 0);
1667   _dbus_assert (d->connections->n_completed > 0);
1668
1669   /* If we have dropped below the max. number of incomplete
1670    * connections, start accept()ing again */
1671   bus_context_check_all_watches (d->connections->context);
1672
1673   /* See if we can remove the timeout */
1674   bus_connections_expire_incomplete (d->connections);
1675
1676   _dbus_assert (bus_connection_is_active (connection));
1677   
1678   return TRUE;
1679 fail:
1680   BUS_SET_OOM (error);
1681   dbus_free (d->name);
1682   d->name = NULL;
1683   if (d->policy)
1684     bus_client_policy_unref (d->policy);
1685   d->policy = NULL;
1686   return FALSE;
1687 }
1688
1689 dbus_bool_t
1690 bus_connections_reload_policy (BusConnections *connections,
1691                                DBusError      *error)
1692 {
1693   BusConnectionData *d;
1694   DBusConnection *connection;
1695   DBusList *link;
1696
1697   _dbus_assert (connections != NULL);
1698   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1699
1700   for (link = _dbus_list_get_first_link (&(connections->completed));
1701        link;
1702        link = _dbus_list_get_next_link (&(connections->completed), link))
1703     {
1704       connection = link->data;
1705       d = BUS_CONNECTION_DATA (connection);
1706       _dbus_assert (d != NULL);
1707       _dbus_assert (d->policy != NULL);
1708
1709       bus_client_policy_unref (d->policy);
1710       d->policy = bus_context_create_client_policy (connections->context,
1711                                                     connection,
1712                                                     error);
1713       if (d->policy == NULL)
1714         {
1715           _dbus_verbose ("Failed to create security policy for connection %p\n",
1716                       connection);
1717           _DBUS_ASSERT_ERROR_IS_SET (error);
1718           return FALSE;
1719         }
1720     }
1721
1722   return TRUE;
1723 }
1724
1725 const char *
1726 bus_connection_get_name (DBusConnection *connection)
1727 {
1728   BusConnectionData *d;
1729   
1730   d = BUS_CONNECTION_DATA (connection);
1731   _dbus_assert (d != NULL);
1732   
1733   return d->name;
1734 }
1735
1736 /**
1737  * Check whether completing the passed-in connection would
1738  * exceed limits, and if so set error and return #FALSE
1739  */
1740 dbus_bool_t
1741 bus_connections_check_limits (BusConnections  *connections,
1742                               DBusConnection  *requesting_completion,
1743                               const char     **limit_name_out,
1744                               int             *limit_out,
1745                               DBusError       *error)
1746 {
1747   unsigned long uid;
1748   int limit;
1749
1750   limit = bus_context_get_max_completed_connections (connections->context);
1751
1752   if (connections->n_completed >= limit)
1753     {
1754       if (limit_name_out != NULL)
1755         *limit_name_out = "max_completed_connections";
1756
1757       if (limit_out != NULL)
1758         *limit_out = limit;
1759
1760       dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
1761                       "The maximum number of active connections has been reached");
1762       return FALSE;
1763     }
1764   
1765   if (dbus_connection_get_unix_user (requesting_completion, &uid))
1766     {
1767       limit = bus_context_get_max_connections_per_user (connections->context);
1768
1769       if (get_connections_for_uid (connections, uid) >= limit)
1770         {
1771           if (limit_name_out != NULL)
1772             *limit_name_out = "max_connections_per_user";
1773
1774           if (limit_out != NULL)
1775             *limit_out = limit;
1776
1777           dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
1778                           "The maximum number of active connections for UID %lu has been reached",
1779                           uid);
1780           return FALSE;
1781         }
1782     }
1783   
1784   return TRUE;
1785 }
1786
1787 static void
1788 bus_pending_reply_free (BusPendingReply *pending)
1789 {
1790   _dbus_verbose ("Freeing pending reply %p, replier %p receiver %p serial %u\n",
1791                  pending,
1792                  pending->will_send_reply,
1793                  pending->will_get_reply,
1794                  pending->reply_serial);
1795
1796   dbus_free (pending);
1797 }
1798
1799 static dbus_bool_t
1800 bus_pending_reply_send_no_reply (BusConnections  *connections,
1801                                  BusTransaction  *transaction,
1802                                  BusPendingReply *pending)
1803 {
1804   DBusMessage *message;
1805   DBusMessageIter iter;
1806   dbus_bool_t retval;
1807   const char *errmsg;
1808
1809   retval = FALSE;
1810   
1811   message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR);
1812   if (message == NULL)
1813     return FALSE;
1814   
1815   dbus_message_set_no_reply (message, TRUE);
1816   
1817   if (!dbus_message_set_reply_serial (message,
1818                                       pending->reply_serial))
1819     goto out;
1820
1821   if (!dbus_message_set_error_name (message,
1822                                     DBUS_ERROR_NO_REPLY))
1823     goto out;
1824
1825   /* If you change these messages, adjust test/dbus-daemon.c to match */
1826   if (pending->will_send_reply == NULL)
1827     errmsg = "Message recipient disconnected from message bus without replying";
1828   else
1829     errmsg = "Message did not receive a reply (timeout by message bus)";
1830
1831   dbus_message_iter_init_append (message, &iter);
1832   if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &errmsg))
1833     goto out;
1834     
1835   if (!bus_transaction_send_from_driver (transaction, pending->will_get_reply,
1836                                          message))
1837     goto out;
1838
1839   retval = TRUE;
1840
1841  out:
1842   dbus_message_unref (message);
1843   return retval;
1844 }
1845
1846 static dbus_bool_t
1847 bus_pending_reply_expired (BusExpireList *list,
1848                            DBusList      *link,
1849                            void          *data)
1850 {
1851   BusPendingReply *pending = link->data;
1852   BusConnections *connections = data;
1853   BusTransaction *transaction;
1854   
1855   /* No reply is forthcoming. So nuke it if we can. If not,
1856    * leave it in the list to try expiring again later when we
1857    * get more memory.
1858    */
1859
1860   _dbus_verbose ("Expiring pending reply %p, replier %p receiver %p serial %u\n",
1861                  pending,
1862                  pending->will_send_reply,
1863                  pending->will_get_reply,
1864                  pending->reply_serial);
1865   
1866   transaction = bus_transaction_new (connections->context);
1867   if (transaction == NULL)
1868     return FALSE;
1869   
1870   if (!bus_pending_reply_send_no_reply (connections,
1871                                         transaction,
1872                                         pending))
1873     {
1874       bus_transaction_cancel_and_free (transaction);
1875       return FALSE;
1876     }
1877
1878   bus_expire_list_remove_link (connections->pending_replies, link);
1879
1880   bus_pending_reply_free (pending);
1881   bus_transaction_execute_and_free (transaction);
1882
1883   return TRUE;
1884 }
1885
1886 static void
1887 bus_connection_drop_pending_replies (BusConnections  *connections,
1888                                      DBusConnection  *connection)
1889 {
1890   /* The DBusConnection is almost 100% finalized here, so you can't
1891    * do anything with it except check for pointer equality
1892    */
1893   DBusList *link;
1894
1895   _dbus_verbose ("Dropping pending replies that involve connection %p\n",
1896                  connection);
1897   
1898   link = bus_expire_list_get_first_link (connections->pending_replies);
1899   while (link != NULL)
1900     {
1901       DBusList *next;
1902       BusPendingReply *pending;
1903
1904       next = bus_expire_list_get_next_link (connections->pending_replies,
1905                                             link);
1906       pending = link->data;
1907
1908       if (pending->will_get_reply == connection)
1909         {
1910           /* We don't need to track this pending reply anymore */
1911
1912           _dbus_verbose ("Dropping pending reply %p, replier %p receiver %p serial %u\n",
1913                          pending,
1914                          pending->will_send_reply,
1915                          pending->will_get_reply,
1916                          pending->reply_serial);
1917           
1918           bus_expire_list_remove_link (connections->pending_replies,
1919                                        link);
1920           bus_pending_reply_free (pending);
1921         }
1922       else if (pending->will_send_reply == connection)
1923         {
1924           /* The reply isn't going to be sent, so set things
1925            * up so it will be expired right away
1926            */
1927           _dbus_verbose ("Will expire pending reply %p, replier %p receiver %p serial %u\n",
1928                          pending,
1929                          pending->will_send_reply,
1930                          pending->will_get_reply,
1931                          pending->reply_serial);
1932           
1933           pending->will_send_reply = NULL;
1934           pending->expire_item.added_tv_sec = 0;
1935           pending->expire_item.added_tv_usec = 0;
1936
1937           bus_expire_list_recheck_immediately (connections->pending_replies);
1938         }
1939       
1940       link = next;
1941     }
1942 }
1943
1944
1945 typedef struct
1946 {
1947   BusPendingReply *pending;
1948   BusConnections  *connections;
1949 } CancelPendingReplyData;
1950
1951 static void
1952 cancel_pending_reply (void *data)
1953 {
1954   CancelPendingReplyData *d = data;
1955
1956   _dbus_verbose ("d = %p\n", d);
1957   
1958   if (!bus_expire_list_remove (d->connections->pending_replies,
1959                                &d->pending->expire_item))
1960     _dbus_assert_not_reached ("pending reply did not exist to be cancelled");
1961
1962   bus_pending_reply_free (d->pending); /* since it's been cancelled */
1963 }
1964
1965 static void
1966 cancel_pending_reply_data_free (void *data)
1967 {
1968   CancelPendingReplyData *d = data;
1969
1970   _dbus_verbose ("d = %p\n", d);
1971   
1972   /* d->pending should be either freed or still
1973    * in the list of pending replies (owned by someone
1974    * else)
1975    */
1976   
1977   dbus_free (d);
1978 }
1979
1980 /*
1981  * Record that a reply is allowed; return TRUE on success.
1982  */
1983 dbus_bool_t
1984 bus_connections_expect_reply (BusConnections  *connections,
1985                               BusTransaction  *transaction,
1986                               DBusConnection  *will_get_reply,
1987                               DBusConnection  *will_send_reply,
1988                               DBusMessage     *reply_to_this,
1989                               DBusError       *error)
1990 {
1991   BusPendingReply *pending;
1992   dbus_uint32_t reply_serial;
1993   DBusList *link;
1994   CancelPendingReplyData *cprd;
1995   int count;
1996   int limit;
1997
1998   _dbus_assert (will_get_reply != NULL);
1999   _dbus_assert (will_send_reply != NULL);
2000   _dbus_assert (reply_to_this != NULL);
2001   
2002   if (dbus_message_get_no_reply (reply_to_this))
2003     return TRUE; /* we won't allow a reply, since client doesn't care for one. */
2004   
2005   reply_serial = dbus_message_get_serial (reply_to_this);
2006
2007   link = bus_expire_list_get_first_link (connections->pending_replies);
2008   count = 0;
2009   while (link != NULL)
2010     {
2011       pending = link->data;
2012
2013       if (pending->reply_serial == reply_serial &&
2014           pending->will_get_reply == will_get_reply &&
2015           pending->will_send_reply == will_send_reply)
2016         {
2017           dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
2018                           "Message has the same reply serial as a currently-outstanding existing method call");
2019           return FALSE;
2020         }
2021       
2022       link = bus_expire_list_get_next_link (connections->pending_replies,
2023                                             link);
2024       if (pending->will_get_reply == will_get_reply)
2025         ++count;
2026     }
2027
2028   limit = bus_context_get_max_replies_per_connection (connections->context);
2029
2030   if (count >= limit)
2031     {
2032       bus_context_log (connections->context, DBUS_SYSTEM_LOG_WARNING,
2033                        "The maximum number of pending replies for "
2034                        "\"%s\" (%s) has been reached "
2035                        "(max_replies_per_connection=%d)",
2036                        bus_connection_get_name (will_get_reply),
2037                        bus_connection_get_loginfo (will_get_reply),
2038                        limit);
2039
2040       dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
2041                       "The maximum number of pending replies per connection has been reached");
2042       return FALSE;
2043     }
2044
2045 #ifdef DBUS_ENABLE_STATS
2046   {
2047     BusConnectionData *d;
2048
2049     d = BUS_CONNECTION_DATA (will_get_reply);
2050     _dbus_assert (d != NULL);
2051
2052     update_peak(&d->peak_pending_replies, count);
2053   }
2054 #endif
2055
2056   pending = dbus_new0 (BusPendingReply, 1);
2057   if (pending == NULL)
2058     {
2059       BUS_SET_OOM (error);
2060       return FALSE;
2061     }
2062
2063 #ifdef DBUS_ENABLE_VERBOSE_MODE
2064   /* so we can see a not-yet-added pending reply */
2065   pending->expire_item.added_tv_sec = 1;
2066   pending->expire_item.added_tv_usec = 1;
2067 #endif
2068
2069   pending->will_get_reply = will_get_reply;
2070   pending->will_send_reply = will_send_reply;
2071   pending->reply_serial = reply_serial;
2072   
2073   cprd = dbus_new0 (CancelPendingReplyData, 1);
2074   if (cprd == NULL)
2075     {
2076       BUS_SET_OOM (error);
2077       bus_pending_reply_free (pending);
2078       return FALSE;
2079     }
2080   
2081   if (!bus_expire_list_add (connections->pending_replies,
2082                             &pending->expire_item))
2083     {
2084       BUS_SET_OOM (error);
2085       dbus_free (cprd);
2086       bus_pending_reply_free (pending);
2087       return FALSE;
2088     }
2089
2090   if (!bus_transaction_add_cancel_hook (transaction,
2091                                         cancel_pending_reply,
2092                                         cprd,
2093                                         cancel_pending_reply_data_free))
2094     {
2095       BUS_SET_OOM (error);
2096       bus_expire_list_remove (connections->pending_replies, &pending->expire_item);
2097       dbus_free (cprd);
2098       bus_pending_reply_free (pending);
2099       return FALSE;
2100     }
2101                                         
2102   cprd->pending = pending;
2103   cprd->connections = connections;
2104   
2105   _dbus_get_monotonic_time (&pending->expire_item.added_tv_sec,
2106                             &pending->expire_item.added_tv_usec);
2107
2108   _dbus_verbose ("Added pending reply %p, replier %p receiver %p serial %u\n",
2109                  pending,
2110                  pending->will_send_reply,
2111                  pending->will_get_reply,
2112                  pending->reply_serial);
2113   
2114   return TRUE;
2115 }
2116
2117 typedef struct
2118 {
2119   DBusList        *link;
2120   BusConnections  *connections;
2121 } CheckPendingReplyData;
2122
2123 static void
2124 cancel_check_pending_reply (void *data)
2125 {
2126   CheckPendingReplyData *d = data;
2127
2128   _dbus_verbose ("d = %p\n",d);
2129
2130   bus_expire_list_add_link (d->connections->pending_replies,
2131                             d->link);
2132   d->link = NULL;
2133 }
2134
2135 static void
2136 check_pending_reply_data_free (void *data)
2137 {
2138   CheckPendingReplyData *d = data;
2139
2140   _dbus_verbose ("d = %p\n",d);
2141   
2142   if (d->link != NULL)
2143     {
2144       BusPendingReply *pending = d->link->data;
2145       
2146       _dbus_assert (!bus_expire_list_contains_item (d->connections->pending_replies,
2147                                                     &pending->expire_item));
2148       
2149       bus_pending_reply_free (pending);
2150       _dbus_list_free_link (d->link);
2151     }
2152   
2153   dbus_free (d);
2154 }
2155
2156 /*
2157  * Check whether a reply is allowed, remove BusPendingReply
2158  * if so, return TRUE if so.
2159  */
2160 dbus_bool_t
2161 bus_connections_check_reply (BusConnections *connections,
2162                              BusTransaction *transaction,
2163                              DBusConnection *sending_reply,
2164                              DBusConnection *receiving_reply,
2165                              DBusMessage    *reply,
2166                              DBusError      *error)
2167 {
2168   CheckPendingReplyData *cprd;
2169   DBusList *link;
2170   dbus_uint32_t reply_serial;
2171   
2172   _dbus_assert (sending_reply != NULL);
2173   _dbus_assert (receiving_reply != NULL);
2174
2175   reply_serial = dbus_message_get_reply_serial (reply);
2176
2177   link = bus_expire_list_get_first_link (connections->pending_replies);
2178   while (link != NULL)
2179     {
2180       BusPendingReply *pending = link->data;
2181
2182       if (pending->reply_serial == reply_serial &&
2183           pending->will_get_reply == receiving_reply &&
2184           pending->will_send_reply == sending_reply)
2185         {
2186           _dbus_verbose ("Found pending reply with serial %u\n", reply_serial);
2187           break;
2188         }
2189       
2190       link = bus_expire_list_get_next_link (connections->pending_replies,
2191                                             link);
2192     }
2193
2194   if (link == NULL)
2195     {
2196       _dbus_verbose ("No pending reply expected\n");
2197
2198       return FALSE;
2199     }
2200
2201   cprd = dbus_new0 (CheckPendingReplyData, 1);
2202   if (cprd == NULL)
2203     {
2204       BUS_SET_OOM (error);
2205       return FALSE;
2206     }
2207   
2208   if (!bus_transaction_add_cancel_hook (transaction,
2209                                         cancel_check_pending_reply,
2210                                         cprd,
2211                                         check_pending_reply_data_free))
2212     {
2213       BUS_SET_OOM (error);
2214       dbus_free (cprd);
2215       return FALSE;
2216     }
2217
2218   cprd->link = link;
2219   cprd->connections = connections;
2220   
2221   bus_expire_list_unlink (connections->pending_replies,
2222                           link);
2223   
2224   _dbus_assert (!bus_expire_list_contains_item (connections->pending_replies, link->data));
2225
2226   return TRUE;
2227 }
2228
2229 /*
2230  * Transactions
2231  *
2232  * Note that this is fairly fragile; in particular, don't try to use
2233  * one transaction across any main loop iterations.
2234  */
2235
2236 typedef struct
2237 {
2238   BusTransaction *transaction;
2239   DBusMessage    *message;
2240   DBusPreallocatedSend *preallocated;
2241 } MessageToSend;
2242
2243 typedef struct
2244 {
2245   BusTransactionCancelFunction cancel_function;
2246   DBusFreeFunction free_data_function;
2247   void *data;
2248 } CancelHook;
2249
2250 struct BusTransaction
2251 {
2252   DBusList *connections;
2253   BusContext *context;
2254   DBusList *cancel_hooks;
2255 };
2256
2257 static void
2258 message_to_send_free (DBusConnection *connection,
2259                       MessageToSend  *to_send)
2260 {
2261   if (to_send->message)
2262     dbus_message_unref (to_send->message);
2263
2264   if (to_send->preallocated)
2265     dbus_connection_free_preallocated_send (connection, to_send->preallocated);
2266
2267   dbus_free (to_send);
2268 }
2269
2270 static void
2271 cancel_hook_cancel (void *element,
2272                     void *data)
2273 {
2274   CancelHook *ch = element;
2275
2276   _dbus_verbose ("Running transaction cancel hook\n");
2277   
2278   if (ch->cancel_function)
2279     (* ch->cancel_function) (ch->data);  
2280 }
2281
2282 static void
2283 cancel_hook_free (void *element,
2284                   void *data)
2285 {
2286   CancelHook *ch = element;
2287
2288   if (ch->free_data_function)
2289     (* ch->free_data_function) (ch->data);
2290
2291   dbus_free (ch);
2292 }
2293
2294 static void
2295 free_cancel_hooks (BusTransaction *transaction)
2296 {
2297   _dbus_list_foreach (&transaction->cancel_hooks,
2298                       cancel_hook_free, NULL);
2299   
2300   _dbus_list_clear (&transaction->cancel_hooks);
2301 }
2302
2303 BusTransaction*
2304 bus_transaction_new (BusContext *context)
2305 {
2306   BusTransaction *transaction;
2307
2308   transaction = dbus_new0 (BusTransaction, 1);
2309   if (transaction == NULL)
2310     return NULL;
2311
2312   transaction->context = context;
2313   
2314   return transaction;
2315 }
2316
2317 BusContext*
2318 bus_transaction_get_context (BusTransaction  *transaction)
2319 {
2320   return transaction->context;
2321 }
2322
2323 /**
2324  * Reserve enough memory to capture the given message if the
2325  * transaction goes through.
2326  */
2327 dbus_bool_t
2328 bus_transaction_capture (BusTransaction *transaction,
2329                          DBusConnection *sender,
2330                          DBusConnection *addressed_recipient,
2331                          DBusMessage    *message)
2332 {
2333   BusConnections *connections;
2334   BusMatchmaker *mm;
2335   DBusList *link;
2336   DBusList *recipients = NULL;
2337   dbus_bool_t ret = FALSE;
2338
2339   connections = bus_context_get_connections (transaction->context);
2340
2341   /* shortcut: don't compose the message unless someone wants it */
2342   if (connections->monitors == NULL)
2343     return TRUE;
2344
2345   mm = connections->monitor_matchmaker;
2346   /* This is non-null if there has ever been a monitor - we don't GC it.
2347    * There's little point, since there is up to 1 per process. */
2348   _dbus_assert (mm != NULL);
2349
2350   if (!bus_matchmaker_get_recipients (mm, connections, sender,
2351         addressed_recipient, message, &recipients))
2352     goto out;
2353
2354   for (link = _dbus_list_get_first_link (&recipients);
2355       link != NULL;
2356       link = _dbus_list_get_next_link (&recipients, link))
2357     {
2358       DBusConnection *recipient = link->data;
2359
2360       if (!bus_transaction_send (transaction, recipient, message, FALSE))
2361         goto out;
2362     }
2363
2364   ret = TRUE;
2365
2366 out:
2367   _dbus_list_clear (&recipients);
2368   return ret;
2369 }
2370
2371 dbus_bool_t
2372 bus_transaction_capture_error_reply (BusTransaction  *transaction,
2373                                      DBusConnection  *addressed_recipient,
2374                                      const DBusError *error,
2375                                      DBusMessage     *in_reply_to)
2376 {
2377   BusConnections *connections;
2378   DBusMessage *reply;
2379   dbus_bool_t ret = FALSE;
2380
2381   _dbus_assert (error != NULL);
2382   _DBUS_ASSERT_ERROR_IS_SET (error);
2383
2384   connections = bus_context_get_connections (transaction->context);
2385
2386   /* shortcut: don't compose the message unless someone wants it */
2387   if (connections->monitors == NULL)
2388     return TRUE;
2389
2390   reply = dbus_message_new_error (in_reply_to,
2391                                   error->name,
2392                                   error->message);
2393
2394   if (reply == NULL)
2395     return FALSE;
2396
2397   if (!dbus_message_set_sender (reply, DBUS_SERVICE_DBUS))
2398     goto out;
2399
2400   ret = bus_transaction_capture (transaction, NULL, addressed_recipient, reply);
2401
2402 out:
2403   dbus_message_unref (reply);
2404   return ret;
2405 }
2406
2407 dbus_bool_t
2408 bus_transaction_send_from_driver (BusTransaction *transaction,
2409                                   DBusConnection *connection,
2410                                   DBusMessage    *message)
2411 {
2412   DBusError error = DBUS_ERROR_INIT;
2413   BusDeferredMessage *deferred_message;
2414
2415   /* We have to set the sender to the driver, and have
2416    * to check security policy since it was not done in
2417    * dispatch.c
2418    */
2419   _dbus_verbose ("Sending %s %s %s from driver\n",
2420                  dbus_message_get_interface (message) ?
2421                  dbus_message_get_interface (message) : "(no interface)",
2422                  dbus_message_get_member (message) ?
2423                  dbus_message_get_member (message) : "(no member)",
2424                  dbus_message_get_error_name (message) ?
2425                  dbus_message_get_error_name (message) : "(no error name)");
2426                  
2427   if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
2428     return FALSE;
2429
2430   if (bus_connection_is_active (connection))
2431     {
2432       if (!dbus_message_set_destination (message,
2433                                          bus_connection_get_name (connection)))
2434         return FALSE;
2435     }
2436   
2437   /* bus driver never wants a reply */
2438   dbus_message_set_no_reply (message, TRUE);
2439
2440   /* Capture it for monitors, even if the real recipient's receive policy
2441    * does not allow it to receive this message from us (which would be odd).
2442    */
2443   if (!bus_transaction_capture (transaction, NULL, connection, message))
2444     return FALSE;
2445
2446   /* If security policy doesn't allow the message, we would silently
2447    * eat it; the driver doesn't care about getting a reply. However,
2448    * if we're actively capturing messages, it's nice to log that we
2449    * tried to send it and did not allow ourselves to do so.
2450    */
2451   switch (bus_context_check_security_policy (bus_transaction_get_context (transaction),
2452                                              transaction,
2453                                              NULL, connection, connection,
2454                                              message, NULL, &error,
2455                                              &deferred_message))
2456     {
2457     case BUS_RESULT_TRUE:
2458       break;
2459     case BUS_RESULT_FALSE:
2460       if (!bus_transaction_capture_error_reply (transaction, connection,
2461                                                 &error, message))
2462         {
2463           bus_context_log (transaction->context, DBUS_SYSTEM_LOG_WARNING,
2464                            "message from dbus-daemon rejected but not enough "
2465                            "memory to capture it");
2466         }
2467
2468       /* This is not fatal to the transaction so silently eat the disallowed
2469        * message (see reasoning above) */
2470       dbus_error_free (&error);
2471       return TRUE;
2472       break;
2473     case BUS_RESULT_LATER:
2474       if (!bus_deferred_message_queue_at_recipient(deferred_message, transaction, FALSE, FALSE))
2475           return FALSE;
2476       return TRUE; /* pretend to have sent it */
2477     }
2478
2479   return bus_transaction_send (transaction, connection, message, FALSE);
2480 }
2481
2482 dbus_bool_t
2483 bus_transaction_send (BusTransaction *transaction,
2484                       DBusConnection *connection,
2485                       DBusMessage    *message,
2486                       dbus_bool_t     deferred_dispatch)
2487 {
2488   MessageToSend *to_send;
2489   BusConnectionData *d;
2490   DBusList *link;
2491
2492   _dbus_verbose ("  trying to add %s interface=%s member=%s error=%s to transaction%s\n",
2493                  dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ? "error" :
2494                  dbus_message_get_reply_serial (message) != 0 ? "reply" :
2495                  "message",
2496                  dbus_message_get_interface (message) ?
2497                  dbus_message_get_interface (message) : "(unset)",
2498                  dbus_message_get_member (message) ?
2499                  dbus_message_get_member (message) : "(unset)",
2500                  dbus_message_get_error_name (message) ?
2501                  dbus_message_get_error_name (message) : "(unset)",
2502                  dbus_connection_get_is_connected (connection) ?
2503                  "" : " (disconnected)");
2504
2505   _dbus_assert (dbus_message_get_sender (message) != NULL);
2506   
2507   if (!dbus_connection_get_is_connected (connection))
2508     return TRUE; /* silently ignore disconnected connections */
2509   
2510   d = BUS_CONNECTION_DATA (connection);
2511   _dbus_assert (d != NULL);
2512
2513   if (!deferred_dispatch && d->deferred_messages != NULL)
2514     {
2515       BusDeferredMessage *deferred_message;
2516       dbus_bool_t success;
2517       /* sender and addressed recipient are not required at this point as we only need to send message
2518        * to a single recipient without performing policy check. */
2519       deferred_message = bus_deferred_message_new (message,
2520                                                    NULL,
2521                                                    NULL,
2522                                                    connection,
2523                                                    BUS_RESULT_TRUE);
2524       if (deferred_message == NULL)
2525         return FALSE;
2526
2527       success = bus_deferred_message_queue_at_recipient(deferred_message, transaction,
2528           FALSE, FALSE);
2529       bus_deferred_message_unref(deferred_message);
2530
2531       return success;
2532     }
2533
2534   to_send = dbus_new (MessageToSend, 1);
2535   if (to_send == NULL)
2536     {
2537       return FALSE;
2538     }
2539
2540   to_send->preallocated = dbus_connection_preallocate_send (connection);
2541   if (to_send->preallocated == NULL)
2542     {
2543       dbus_free (to_send);
2544       return FALSE;
2545     }  
2546   
2547   dbus_message_ref (message);
2548   to_send->message = message;
2549   to_send->transaction = transaction;
2550
2551   _dbus_verbose ("about to prepend message\n");
2552   
2553   if (!_dbus_list_prepend (&d->transaction_messages, to_send))
2554     {
2555       message_to_send_free (connection, to_send);
2556       return FALSE;
2557     }
2558
2559   _dbus_verbose ("prepended message\n");
2560   
2561   /* See if we already had this connection in the list
2562    * for this transaction. If we have a pending message,
2563    * then we should already be in transaction->connections
2564    */
2565   link = _dbus_list_get_first_link (&d->transaction_messages);
2566   _dbus_assert (link->data == to_send);
2567   link = _dbus_list_get_next_link (&d->transaction_messages, link);
2568   while (link != NULL)
2569     {
2570       MessageToSend *m = link->data;
2571       DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
2572       
2573       if (m->transaction == transaction)
2574         break;
2575         
2576       link = next;
2577     }
2578
2579   if (link == NULL)
2580     {
2581       if (!_dbus_list_prepend (&transaction->connections, connection))
2582         {
2583           _dbus_list_remove (&d->transaction_messages, to_send);
2584           message_to_send_free (connection, to_send);
2585           return FALSE;
2586         }
2587     }
2588
2589   return TRUE;
2590 }
2591
2592 static void
2593 transaction_free (BusTransaction *transaction)
2594 {
2595   _dbus_assert (transaction->connections == NULL);
2596
2597   free_cancel_hooks (transaction);
2598
2599   dbus_free (transaction);
2600 }
2601
2602 static void
2603 connection_cancel_transaction (DBusConnection *connection,
2604                                BusTransaction *transaction)
2605 {
2606   DBusList *link;
2607   BusConnectionData *d;
2608   
2609   d = BUS_CONNECTION_DATA (connection);
2610   _dbus_assert (d != NULL);
2611   
2612   link = _dbus_list_get_first_link (&d->transaction_messages);
2613   while (link != NULL)
2614     {
2615       MessageToSend *m = link->data;
2616       DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
2617       
2618       if (m->transaction == transaction)
2619         {
2620           _dbus_list_remove_link (&d->transaction_messages,
2621                                   link);
2622           
2623           message_to_send_free (connection, m);
2624         }
2625         
2626       link = next;
2627     }
2628 }
2629
2630 void
2631 bus_transaction_cancel_and_free (BusTransaction *transaction)
2632 {
2633   DBusConnection *connection;
2634
2635   _dbus_verbose ("TRANSACTION: cancelled\n");
2636   
2637   while ((connection = _dbus_list_pop_first (&transaction->connections)))
2638     connection_cancel_transaction (connection, transaction);
2639
2640   _dbus_list_foreach (&transaction->cancel_hooks,
2641                       cancel_hook_cancel, NULL);
2642
2643   transaction_free (transaction);
2644 }
2645
2646 static void
2647 connection_execute_transaction (DBusConnection *connection,
2648                                 BusTransaction *transaction)
2649 {
2650   DBusList *link;
2651   BusConnectionData *d;
2652   
2653   d = BUS_CONNECTION_DATA (connection);
2654   _dbus_assert (d != NULL);
2655
2656   /* Send the queue in order (FIFO) */
2657   link = _dbus_list_get_last_link (&d->transaction_messages);
2658   while (link != NULL)
2659     {
2660       MessageToSend *m = link->data;
2661       DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link);
2662       
2663       if (m->transaction == transaction)
2664         {
2665           _dbus_list_remove_link (&d->transaction_messages,
2666                                   link);
2667
2668           _dbus_assert (dbus_message_get_sender (m->message) != NULL);
2669           
2670           dbus_connection_send_preallocated (connection,
2671                                              m->preallocated,
2672                                              m->message,
2673                                              NULL);
2674
2675           m->preallocated = NULL; /* so we don't double-free it */
2676           
2677           message_to_send_free (connection, m);
2678         }
2679         
2680       link = prev;
2681     }
2682 }
2683
2684 void
2685 bus_transaction_execute_and_free (BusTransaction *transaction)
2686 {
2687   /* For each connection in transaction->connections
2688    * send the messages
2689    */
2690   DBusConnection *connection;
2691
2692   _dbus_verbose ("TRANSACTION: executing\n");
2693   
2694   while ((connection = _dbus_list_pop_first (&transaction->connections)))
2695     connection_execute_transaction (connection, transaction);
2696
2697   transaction_free (transaction);
2698 }
2699
2700 static void
2701 bus_connection_remove_transactions (DBusConnection *connection)
2702 {
2703   MessageToSend *to_send;
2704   BusConnectionData *d;
2705   
2706   d = BUS_CONNECTION_DATA (connection);
2707   _dbus_assert (d != NULL);
2708   
2709   while ((to_send = _dbus_list_get_first (&d->transaction_messages)))
2710     {
2711       /* only has an effect for the first MessageToSend listing this transaction */
2712       _dbus_list_remove (&to_send->transaction->connections,
2713                          connection);
2714
2715       _dbus_list_remove (&d->transaction_messages, to_send);
2716       message_to_send_free (connection, to_send);
2717     }
2718 }
2719
2720 /**
2721  * Converts the DBusError to a message reply
2722  */
2723 dbus_bool_t
2724 bus_transaction_send_error_reply (BusTransaction  *transaction,
2725                                   DBusConnection  *connection,
2726                                   const DBusError *error,
2727                                   DBusMessage     *in_reply_to)
2728 {
2729   DBusMessage *reply;
2730   
2731   _dbus_assert (error != NULL);
2732   _DBUS_ASSERT_ERROR_IS_SET (error);
2733   
2734   _dbus_verbose ("Sending error reply %s \"%s\"\n",
2735                  error->name, error->message);
2736
2737   reply = dbus_message_new_error (in_reply_to,
2738                                   error->name,
2739                                   error->message);
2740   if (reply == NULL)
2741     return FALSE;
2742
2743   if (!bus_transaction_send_from_driver (transaction, connection, reply))
2744     {
2745       dbus_message_unref (reply);
2746       return FALSE;
2747     }
2748
2749   dbus_message_unref (reply);
2750   
2751   return TRUE;
2752 }
2753
2754 dbus_bool_t
2755 bus_transaction_add_cancel_hook (BusTransaction               *transaction,
2756                                  BusTransactionCancelFunction  cancel_function,
2757                                  void                         *data,
2758                                  DBusFreeFunction              free_data_function)
2759 {
2760   CancelHook *ch;
2761
2762   ch = dbus_new (CancelHook, 1);
2763   if (ch == NULL)
2764     return FALSE;
2765
2766   _dbus_verbose ("     adding cancel hook function = %p data = %p\n",
2767                  cancel_function, data);
2768   
2769   ch->cancel_function = cancel_function;
2770   ch->data = data;
2771   ch->free_data_function = free_data_function;
2772
2773   /* It's important that the hooks get run in reverse order that they
2774    * were added
2775    */
2776   if (!_dbus_list_prepend (&transaction->cancel_hooks, ch))
2777     {
2778       dbus_free (ch);
2779       return FALSE;
2780     }
2781
2782   return TRUE;
2783 }
2784
2785 void
2786 bus_connection_dispatch_deferred (DBusConnection *connection)
2787 {
2788   BusDeferredMessage *message;
2789
2790   _dbus_return_if_fail (connection != NULL);
2791
2792   while ((message = bus_connection_pop_deferred_message(connection)) != NULL)
2793     {
2794       bus_deferred_message_dispatch(message);
2795       bus_deferred_message_unref(message);
2796     }
2797 }
2798
2799 dbus_bool_t
2800 bus_connection_has_deferred_messages (DBusConnection *connection)
2801 {
2802   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2803   return d->deferred_messages != NULL ? TRUE : FALSE;
2804 }
2805
2806 dbus_bool_t
2807 bus_connection_queue_deferred_message (DBusConnection *connection,
2808                                        BusDeferredMessage *message,
2809                                        dbus_bool_t prepend)
2810 {
2811   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2812   dbus_bool_t success;
2813   if (prepend)
2814     success = _dbus_list_prepend(&d->deferred_messages, message);
2815   else
2816     success = _dbus_list_append(&d->deferred_messages, message);
2817
2818   if (success)
2819     {
2820       bus_deferred_message_ref(message);
2821       return TRUE;
2822     }
2823
2824   return FALSE;
2825 }
2826
2827 dbus_bool_t
2828 bus_connection_replace_deferred_message (DBusConnection *connection,
2829                                          BusDeferredMessage *oldMessage,
2830                                          BusDeferredMessage *newMessage)
2831 {
2832   DBusList *link;
2833   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2834
2835   link = _dbus_list_find_first(&d->deferred_messages, oldMessage);
2836   if (link == NULL)
2837     return FALSE;
2838
2839   if (!_dbus_list_insert_after(&d->deferred_messages, link, newMessage))
2840     return FALSE;
2841
2842   bus_deferred_message_ref(newMessage);
2843   _dbus_list_remove_link(&d->deferred_messages, link);
2844   bus_deferred_message_unref(oldMessage);
2845   return TRUE;
2846 }
2847
2848 BusDeferredMessage *
2849 bus_connection_pop_deferred_message (DBusConnection *connection)
2850 {
2851   DBusList *link;
2852   BusDeferredMessage *message;
2853   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2854
2855   link =_dbus_list_get_first_link(&d->deferred_messages);
2856   if (link != NULL)
2857     {
2858       message = link->data;
2859       if (!bus_deferred_message_waits_for_check(message))
2860         {
2861           _dbus_list_remove_link(&d->deferred_messages, link);
2862           return message;
2863         }
2864     }
2865
2866   return NULL;
2867 }
2868
2869 dbus_bool_t
2870 bus_connection_putback_deferred_message (DBusConnection *connection, BusDeferredMessage *message)
2871 {
2872   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2873   if (_dbus_list_prepend(&d->deferred_messages, message))
2874     {
2875       return TRUE;
2876     }
2877   return FALSE;
2878 }
2879
2880 void
2881 bus_connection_clear_deferred_messages (DBusConnection *connection)
2882 {
2883   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2884   DBusList *link;
2885   DBusList *next;
2886   BusDeferredMessage *message;
2887
2888   link =_dbus_list_get_first_link(&d->deferred_messages);
2889   while (link != NULL)
2890     {
2891       next = _dbus_list_get_next_link (&d->deferred_messages, link);
2892       message = link->data;
2893
2894       bus_deferred_message_unref(message);
2895       _dbus_list_remove_link(&d->deferred_messages, link);
2896
2897       link = next;
2898     }
2899 }
2900
2901 void
2902 bus_connection_remove_deferred_message (DBusConnection *connection,
2903                                         BusDeferredMessage *message)
2904 {
2905   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2906   if (_dbus_list_remove(&d->deferred_messages, message))
2907     bus_deferred_message_unref(message);
2908 }
2909
2910 int
2911 bus_connections_get_n_active (BusConnections *connections)
2912 {
2913   return connections->n_completed;
2914 }
2915
2916 int
2917 bus_connections_get_n_incomplete (BusConnections *connections)
2918 {
2919   return connections->n_incomplete;
2920 }
2921
2922 #ifdef DBUS_ENABLE_STATS
2923 int
2924 bus_connections_get_total_match_rules (BusConnections *connections)
2925 {
2926   return connections->total_match_rules;
2927 }
2928
2929 int
2930 bus_connections_get_peak_match_rules (BusConnections *connections)
2931 {
2932   return connections->peak_match_rules;
2933 }
2934
2935 int
2936 bus_connections_get_peak_match_rules_per_conn (BusConnections *connections)
2937 {
2938   return connections->peak_match_rules_per_conn;
2939 }
2940
2941 int
2942 bus_connections_get_total_bus_names (BusConnections *connections)
2943 {
2944   return connections->total_bus_names;
2945 }
2946
2947 int
2948 bus_connections_get_peak_bus_names (BusConnections *connections)
2949 {
2950   return connections->peak_bus_names;
2951 }
2952
2953 int
2954 bus_connections_get_peak_bus_names_per_conn (BusConnections *connections)
2955 {
2956   return connections->peak_bus_names_per_conn;
2957 }
2958
2959 int
2960 bus_connection_get_peak_match_rules (DBusConnection *connection)
2961 {
2962   BusConnectionData *d;
2963
2964   d = BUS_CONNECTION_DATA (connection);
2965   _dbus_assert(d != NULL);
2966
2967   return d->peak_match_rules;
2968 }
2969
2970 int
2971 bus_connection_get_peak_bus_names (DBusConnection *connection)
2972 {
2973   BusConnectionData *d;
2974
2975   d = BUS_CONNECTION_DATA (connection);
2976   _dbus_assert(d != NULL);
2977
2978   return d->peak_bus_names;
2979 }
2980
2981 int bus_connection_get_n_pending_replies (DBusConnection *connection)
2982 {
2983   BusConnectionData *d;
2984   DBusList *link;
2985   BusPendingReply *pending;
2986   int count = 0;
2987
2988   d = BUS_CONNECTION_DATA (connection);
2989   _dbus_assert(d != NULL);
2990
2991   link = bus_expire_list_get_first_link(d->connections->pending_replies);
2992   while (link != NULL)
2993     {
2994       pending = link->data;
2995       link = bus_expire_list_get_next_link(d->connections->pending_replies,
2996         link);
2997       if (pending->will_get_reply == connection)
2998         ++count;
2999     }
3000
3001   return count;
3002 }
3003
3004 int
3005 bus_connection_get_peak_pending_replies (DBusConnection *connection)
3006 {
3007   BusConnectionData *d;
3008
3009   d = BUS_CONNECTION_DATA (connection);
3010   _dbus_assert (d != NULL);
3011
3012   return d->peak_pending_replies;
3013 }
3014 #endif /* DBUS_ENABLE_STATS */
3015
3016 dbus_bool_t
3017 bus_connection_is_monitor (DBusConnection *connection)
3018 {
3019   BusConnectionData *d;
3020
3021   d = BUS_CONNECTION_DATA (connection);
3022   _dbus_assert(d != NULL);
3023
3024   return d->link_in_monitors != NULL;
3025 }
3026
3027 static dbus_bool_t
3028 bcd_add_monitor_rules (BusConnectionData  *d,
3029                        DBusConnection     *connection,
3030                        DBusList          **rules)
3031 {
3032   BusMatchmaker *mm = d->connections->monitor_matchmaker;
3033   DBusList *iter;
3034
3035   if (mm == NULL)
3036     {
3037       mm = bus_matchmaker_new ();
3038
3039       if (mm == NULL)
3040         return FALSE;
3041
3042       d->connections->monitor_matchmaker = mm;
3043     }
3044
3045   for (iter = _dbus_list_get_first_link (rules);
3046       iter != NULL;
3047       iter = _dbus_list_get_next_link (rules, iter))
3048     {
3049       if (!bus_matchmaker_add_rule (mm, iter->data))
3050         {
3051           bus_matchmaker_disconnected (mm, connection);
3052           return FALSE;
3053         }
3054     }
3055
3056   return TRUE;
3057 }
3058
3059 static void
3060 bcd_drop_monitor_rules (BusConnectionData *d,
3061                         DBusConnection *connection)
3062 {
3063   BusMatchmaker *mm = d->connections->monitor_matchmaker;
3064
3065   if (mm != NULL)
3066     bus_matchmaker_disconnected (mm, connection);
3067 }
3068
3069 dbus_bool_t
3070 bus_connection_be_monitor (DBusConnection  *connection,
3071                            BusTransaction  *transaction,
3072                            DBusList       **rules,
3073                            DBusError       *error)
3074 {
3075   BusConnectionData *d;
3076   DBusList *link;
3077   DBusList *tmp;
3078   DBusList *iter;
3079
3080   d = BUS_CONNECTION_DATA (connection);
3081   _dbus_assert (d != NULL);
3082
3083   link = _dbus_list_alloc_link (connection);
3084
3085   if (link == NULL)
3086     {
3087       BUS_SET_OOM (error);
3088       return FALSE;
3089     }
3090
3091   if (!bcd_add_monitor_rules (d, connection, rules))
3092     {
3093       _dbus_list_free_link (link);
3094       BUS_SET_OOM (error);
3095       return FALSE;
3096     }
3097
3098   /* release all its names */
3099   if (!_dbus_list_copy (&d->services_owned, &tmp))
3100     {
3101       bcd_drop_monitor_rules (d, connection);
3102       _dbus_list_free_link (link);
3103       BUS_SET_OOM (error);
3104       return FALSE;
3105     }
3106
3107   for (iter = _dbus_list_get_first_link (&tmp);
3108       iter != NULL;
3109       iter = _dbus_list_get_next_link (&tmp, iter))
3110     {
3111       BusService *service = iter->data;
3112
3113       /* This call is transactional: if there isn't enough memory to
3114        * do everything, then the service gets all its names back when
3115        * the transaction is cancelled due to OOM. */
3116       if (!bus_service_remove_owner (service, connection, transaction, error))
3117         {
3118           bcd_drop_monitor_rules (d, connection);
3119           _dbus_list_free_link (link);
3120           _dbus_list_clear (&tmp);
3121           return FALSE;
3122         }
3123     }
3124
3125   /* We have now done everything that can fail, so there is no problem
3126    * with doing the irrevocable stuff. */
3127
3128   _dbus_list_clear (&tmp);
3129
3130   bus_context_log (transaction->context, DBUS_SYSTEM_LOG_INFO,
3131                    "Connection %s (%s) became a monitor.", d->name,
3132                    d->cached_loginfo_string);
3133
3134   if (d->n_match_rules > 0)
3135     {
3136       BusMatchmaker *mm;
3137
3138       mm = bus_context_get_matchmaker (d->connections->context);
3139       bus_matchmaker_disconnected (mm, connection);
3140     }
3141
3142   /* flag it as a monitor */
3143   d->link_in_monitors = link;
3144   _dbus_list_append_link (&d->connections->monitors, link);
3145
3146   /* it isn't allowed to reply, and it is no longer relevant whether it
3147    * receives replies */
3148   bus_connection_drop_pending_replies (d->connections, connection);
3149
3150   return TRUE;
3151 }