bus/connection: API for getting list of names from connections
[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 const DBusList *
1532 bus_connection_get_owned_services_list (DBusConnection *connection)
1533 {
1534   BusConnectionData *d;
1535
1536   d = BUS_CONNECTION_DATA (connection);
1537   return d->services_owned;
1538 }
1539
1540 void
1541 bus_connection_add_owned_service_link (DBusConnection *connection,
1542                                        DBusList       *link)
1543 {
1544   BusConnectionData *d;
1545
1546   d = BUS_CONNECTION_DATA (connection);
1547   _dbus_assert (d != NULL);
1548
1549   _dbus_list_append_link (&d->services_owned, link);
1550
1551   d->n_services_owned += 1;
1552
1553 #ifdef DBUS_ENABLE_STATS
1554   update_peak (&d->peak_bus_names, d->n_services_owned);
1555   update_peak (&d->connections->peak_bus_names_per_conn,
1556                d->n_services_owned);
1557
1558   d->connections->total_bus_names += 1;
1559   update_peak (&d->connections->peak_bus_names,
1560                d->connections->total_bus_names);
1561 #endif
1562 }
1563
1564 dbus_bool_t
1565 bus_connection_add_owned_service (DBusConnection *connection,
1566                                   BusService     *service)
1567 {
1568   DBusList *link;
1569
1570   link = _dbus_list_alloc_link (service);
1571
1572   if (link == NULL)
1573     return FALSE;
1574
1575   bus_connection_add_owned_service_link (connection, link);
1576
1577   return TRUE;
1578 }
1579
1580 void
1581 bus_connection_remove_owned_service (DBusConnection *connection,
1582                                      BusService     *service)
1583 {
1584   BusConnectionData *d;
1585
1586   d = BUS_CONNECTION_DATA (connection);
1587   _dbus_assert (d != NULL);
1588
1589   _dbus_list_remove_last (&d->services_owned, service);
1590
1591   d->n_services_owned -= 1;
1592   _dbus_assert (d->n_services_owned >= 0);
1593
1594 #ifdef DBUS_ENABLE_STATS
1595   d->connections->total_bus_names -= 1;
1596 #endif
1597 }
1598
1599 int
1600 bus_connection_get_n_services_owned (DBusConnection *connection)
1601 {
1602   BusConnectionData *d;
1603
1604   d = BUS_CONNECTION_DATA (connection);
1605   _dbus_assert (d != NULL);
1606   
1607   return d->n_services_owned;
1608 }
1609
1610 dbus_bool_t
1611 bus_connection_complete (DBusConnection   *connection,
1612                          const DBusString *name,
1613                          DBusError        *error)
1614 {
1615   BusConnectionData *d;
1616   unsigned long uid;
1617   
1618   d = BUS_CONNECTION_DATA (connection);
1619   _dbus_assert (d != NULL);
1620   _dbus_assert (d->name == NULL);
1621   _dbus_assert (d->policy == NULL);
1622
1623   _dbus_assert (!bus_connection_is_active (connection));
1624   
1625   if (!_dbus_string_copy_data (name, &d->name))
1626     {
1627       BUS_SET_OOM (error);
1628       return FALSE;
1629     }
1630
1631   _dbus_assert (d->name != NULL);
1632   
1633   _dbus_verbose ("Name %s assigned to %p\n", d->name, connection);
1634
1635   d->policy = bus_context_create_client_policy (d->connections->context,
1636                                                 connection,
1637                                                 error);
1638
1639   /* we may have a NULL policy on OOM or error getting list of
1640    * groups for a user. In the latter case we don't handle it so
1641    * well currently, as it will just keep failing over and over.
1642    */
1643
1644   if (d->policy == NULL)
1645     {
1646       _dbus_verbose ("Failed to create security policy for connection %p\n",
1647                      connection);
1648       _DBUS_ASSERT_ERROR_IS_SET (error);
1649       dbus_free (d->name);
1650       d->name = NULL;
1651       return FALSE;
1652     }
1653   
1654   if (dbus_connection_get_unix_user (connection, &uid))
1655     {
1656       if (!adjust_connections_for_uid (d->connections,
1657                                        uid, 1))
1658         goto fail;
1659     }
1660
1661   /* Create and cache a string which holds information about the 
1662    * peer process; used for logging purposes.
1663    */
1664   if (!cache_peer_loginfo_string (d, connection))
1665     goto fail;
1666
1667   /* Now the connection is active, move it between lists */
1668   _dbus_list_unlink (&d->connections->incomplete,
1669                      d->link_in_connection_list);
1670   d->connections->n_incomplete -= 1;
1671   _dbus_list_append_link (&d->connections->completed,
1672                           d->link_in_connection_list);
1673   d->connections->n_completed += 1;
1674
1675   _dbus_assert (d->connections->n_incomplete >= 0);
1676   _dbus_assert (d->connections->n_completed > 0);
1677
1678   /* If we have dropped below the max. number of incomplete
1679    * connections, start accept()ing again */
1680   bus_context_check_all_watches (d->connections->context);
1681
1682   /* See if we can remove the timeout */
1683   bus_connections_expire_incomplete (d->connections);
1684
1685   _dbus_assert (bus_connection_is_active (connection));
1686   
1687   return TRUE;
1688 fail:
1689   BUS_SET_OOM (error);
1690   dbus_free (d->name);
1691   d->name = NULL;
1692   if (d->policy)
1693     bus_client_policy_unref (d->policy);
1694   d->policy = NULL;
1695   return FALSE;
1696 }
1697
1698 dbus_bool_t
1699 bus_connections_reload_policy (BusConnections *connections,
1700                                DBusError      *error)
1701 {
1702   BusConnectionData *d;
1703   DBusConnection *connection;
1704   DBusList *link;
1705
1706   _dbus_assert (connections != NULL);
1707   _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1708
1709   for (link = _dbus_list_get_first_link (&(connections->completed));
1710        link;
1711        link = _dbus_list_get_next_link (&(connections->completed), link))
1712     {
1713       connection = link->data;
1714       d = BUS_CONNECTION_DATA (connection);
1715       _dbus_assert (d != NULL);
1716       _dbus_assert (d->policy != NULL);
1717
1718       bus_client_policy_unref (d->policy);
1719       d->policy = bus_context_create_client_policy (connections->context,
1720                                                     connection,
1721                                                     error);
1722       if (d->policy == NULL)
1723         {
1724           _dbus_verbose ("Failed to create security policy for connection %p\n",
1725                       connection);
1726           _DBUS_ASSERT_ERROR_IS_SET (error);
1727           return FALSE;
1728         }
1729     }
1730
1731   return TRUE;
1732 }
1733
1734 const char *
1735 bus_connection_get_name (DBusConnection *connection)
1736 {
1737   BusConnectionData *d;
1738   
1739   d = BUS_CONNECTION_DATA (connection);
1740   _dbus_assert (d != NULL);
1741   
1742   return d->name;
1743 }
1744
1745 /**
1746  * Check whether completing the passed-in connection would
1747  * exceed limits, and if so set error and return #FALSE
1748  */
1749 dbus_bool_t
1750 bus_connections_check_limits (BusConnections  *connections,
1751                               DBusConnection  *requesting_completion,
1752                               const char     **limit_name_out,
1753                               int             *limit_out,
1754                               DBusError       *error)
1755 {
1756   unsigned long uid;
1757   int limit;
1758
1759   limit = bus_context_get_max_completed_connections (connections->context);
1760
1761   if (connections->n_completed >= limit)
1762     {
1763       if (limit_name_out != NULL)
1764         *limit_name_out = "max_completed_connections";
1765
1766       if (limit_out != NULL)
1767         *limit_out = limit;
1768
1769       dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
1770                       "The maximum number of active connections has been reached");
1771       return FALSE;
1772     }
1773   
1774   if (dbus_connection_get_unix_user (requesting_completion, &uid))
1775     {
1776       limit = bus_context_get_max_connections_per_user (connections->context);
1777
1778       if (get_connections_for_uid (connections, uid) >= limit)
1779         {
1780           if (limit_name_out != NULL)
1781             *limit_name_out = "max_connections_per_user";
1782
1783           if (limit_out != NULL)
1784             *limit_out = limit;
1785
1786           dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
1787                           "The maximum number of active connections for UID %lu has been reached",
1788                           uid);
1789           return FALSE;
1790         }
1791     }
1792   
1793   return TRUE;
1794 }
1795
1796 static void
1797 bus_pending_reply_free (BusPendingReply *pending)
1798 {
1799   _dbus_verbose ("Freeing pending reply %p, replier %p receiver %p serial %u\n",
1800                  pending,
1801                  pending->will_send_reply,
1802                  pending->will_get_reply,
1803                  pending->reply_serial);
1804
1805   dbus_free (pending);
1806 }
1807
1808 static dbus_bool_t
1809 bus_pending_reply_send_no_reply (BusConnections  *connections,
1810                                  BusTransaction  *transaction,
1811                                  BusPendingReply *pending)
1812 {
1813   DBusMessage *message;
1814   DBusMessageIter iter;
1815   dbus_bool_t retval;
1816   const char *errmsg;
1817
1818   retval = FALSE;
1819   
1820   message = dbus_message_new (DBUS_MESSAGE_TYPE_ERROR);
1821   if (message == NULL)
1822     return FALSE;
1823   
1824   dbus_message_set_no_reply (message, TRUE);
1825   
1826   if (!dbus_message_set_reply_serial (message,
1827                                       pending->reply_serial))
1828     goto out;
1829
1830   if (!dbus_message_set_error_name (message,
1831                                     DBUS_ERROR_NO_REPLY))
1832     goto out;
1833
1834   /* If you change these messages, adjust test/dbus-daemon.c to match */
1835   if (pending->will_send_reply == NULL)
1836     errmsg = "Message recipient disconnected from message bus without replying";
1837   else
1838     errmsg = "Message did not receive a reply (timeout by message bus)";
1839
1840   dbus_message_iter_init_append (message, &iter);
1841   if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &errmsg))
1842     goto out;
1843     
1844   if (!bus_transaction_send_from_driver (transaction, pending->will_get_reply,
1845                                          message))
1846     goto out;
1847
1848   retval = TRUE;
1849
1850  out:
1851   dbus_message_unref (message);
1852   return retval;
1853 }
1854
1855 static dbus_bool_t
1856 bus_pending_reply_expired (BusExpireList *list,
1857                            DBusList      *link,
1858                            void          *data)
1859 {
1860   BusPendingReply *pending = link->data;
1861   BusConnections *connections = data;
1862   BusTransaction *transaction;
1863   
1864   /* No reply is forthcoming. So nuke it if we can. If not,
1865    * leave it in the list to try expiring again later when we
1866    * get more memory.
1867    */
1868
1869   _dbus_verbose ("Expiring pending reply %p, replier %p receiver %p serial %u\n",
1870                  pending,
1871                  pending->will_send_reply,
1872                  pending->will_get_reply,
1873                  pending->reply_serial);
1874   
1875   transaction = bus_transaction_new (connections->context);
1876   if (transaction == NULL)
1877     return FALSE;
1878   
1879   if (!bus_pending_reply_send_no_reply (connections,
1880                                         transaction,
1881                                         pending))
1882     {
1883       bus_transaction_cancel_and_free (transaction);
1884       return FALSE;
1885     }
1886
1887   bus_expire_list_remove_link (connections->pending_replies, link);
1888
1889   bus_pending_reply_free (pending);
1890   bus_transaction_execute_and_free (transaction);
1891
1892   return TRUE;
1893 }
1894
1895 static void
1896 bus_connection_drop_pending_replies (BusConnections  *connections,
1897                                      DBusConnection  *connection)
1898 {
1899   /* The DBusConnection is almost 100% finalized here, so you can't
1900    * do anything with it except check for pointer equality
1901    */
1902   DBusList *link;
1903
1904   _dbus_verbose ("Dropping pending replies that involve connection %p\n",
1905                  connection);
1906   
1907   link = bus_expire_list_get_first_link (connections->pending_replies);
1908   while (link != NULL)
1909     {
1910       DBusList *next;
1911       BusPendingReply *pending;
1912
1913       next = bus_expire_list_get_next_link (connections->pending_replies,
1914                                             link);
1915       pending = link->data;
1916
1917       if (pending->will_get_reply == connection)
1918         {
1919           /* We don't need to track this pending reply anymore */
1920
1921           _dbus_verbose ("Dropping pending reply %p, replier %p receiver %p serial %u\n",
1922                          pending,
1923                          pending->will_send_reply,
1924                          pending->will_get_reply,
1925                          pending->reply_serial);
1926           
1927           bus_expire_list_remove_link (connections->pending_replies,
1928                                        link);
1929           bus_pending_reply_free (pending);
1930         }
1931       else if (pending->will_send_reply == connection)
1932         {
1933           /* The reply isn't going to be sent, so set things
1934            * up so it will be expired right away
1935            */
1936           _dbus_verbose ("Will expire pending reply %p, replier %p receiver %p serial %u\n",
1937                          pending,
1938                          pending->will_send_reply,
1939                          pending->will_get_reply,
1940                          pending->reply_serial);
1941           
1942           pending->will_send_reply = NULL;
1943           pending->expire_item.added_tv_sec = 0;
1944           pending->expire_item.added_tv_usec = 0;
1945
1946           bus_expire_list_recheck_immediately (connections->pending_replies);
1947         }
1948       
1949       link = next;
1950     }
1951 }
1952
1953
1954 typedef struct
1955 {
1956   BusPendingReply *pending;
1957   BusConnections  *connections;
1958 } CancelPendingReplyData;
1959
1960 static void
1961 cancel_pending_reply (void *data)
1962 {
1963   CancelPendingReplyData *d = data;
1964
1965   _dbus_verbose ("d = %p\n", d);
1966   
1967   if (!bus_expire_list_remove (d->connections->pending_replies,
1968                                &d->pending->expire_item))
1969     _dbus_assert_not_reached ("pending reply did not exist to be cancelled");
1970
1971   bus_pending_reply_free (d->pending); /* since it's been cancelled */
1972 }
1973
1974 static void
1975 cancel_pending_reply_data_free (void *data)
1976 {
1977   CancelPendingReplyData *d = data;
1978
1979   _dbus_verbose ("d = %p\n", d);
1980   
1981   /* d->pending should be either freed or still
1982    * in the list of pending replies (owned by someone
1983    * else)
1984    */
1985   
1986   dbus_free (d);
1987 }
1988
1989 /*
1990  * Record that a reply is allowed; return TRUE on success.
1991  */
1992 dbus_bool_t
1993 bus_connections_expect_reply (BusConnections  *connections,
1994                               BusTransaction  *transaction,
1995                               DBusConnection  *will_get_reply,
1996                               DBusConnection  *will_send_reply,
1997                               DBusMessage     *reply_to_this,
1998                               DBusError       *error)
1999 {
2000   BusPendingReply *pending;
2001   dbus_uint32_t reply_serial;
2002   DBusList *link;
2003   CancelPendingReplyData *cprd;
2004   int count;
2005   int limit;
2006
2007   _dbus_assert (will_get_reply != NULL);
2008   _dbus_assert (will_send_reply != NULL);
2009   _dbus_assert (reply_to_this != NULL);
2010   
2011   if (dbus_message_get_no_reply (reply_to_this))
2012     return TRUE; /* we won't allow a reply, since client doesn't care for one. */
2013   
2014   reply_serial = dbus_message_get_serial (reply_to_this);
2015
2016   link = bus_expire_list_get_first_link (connections->pending_replies);
2017   count = 0;
2018   while (link != NULL)
2019     {
2020       pending = link->data;
2021
2022       if (pending->reply_serial == reply_serial &&
2023           pending->will_get_reply == will_get_reply &&
2024           pending->will_send_reply == will_send_reply)
2025         {
2026           dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
2027                           "Message has the same reply serial as a currently-outstanding existing method call");
2028           return FALSE;
2029         }
2030       
2031       link = bus_expire_list_get_next_link (connections->pending_replies,
2032                                             link);
2033       if (pending->will_get_reply == will_get_reply)
2034         ++count;
2035     }
2036
2037   limit = bus_context_get_max_replies_per_connection (connections->context);
2038
2039   if (count >= limit)
2040     {
2041       bus_context_log (connections->context, DBUS_SYSTEM_LOG_WARNING,
2042                        "The maximum number of pending replies for "
2043                        "\"%s\" (%s) has been reached "
2044                        "(max_replies_per_connection=%d)",
2045                        bus_connection_get_name (will_get_reply),
2046                        bus_connection_get_loginfo (will_get_reply),
2047                        limit);
2048
2049       dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
2050                       "The maximum number of pending replies per connection has been reached");
2051       return FALSE;
2052     }
2053
2054 #ifdef DBUS_ENABLE_STATS
2055   {
2056     BusConnectionData *d;
2057
2058     d = BUS_CONNECTION_DATA (will_get_reply);
2059     _dbus_assert (d != NULL);
2060
2061     update_peak(&d->peak_pending_replies, count);
2062   }
2063 #endif
2064
2065   pending = dbus_new0 (BusPendingReply, 1);
2066   if (pending == NULL)
2067     {
2068       BUS_SET_OOM (error);
2069       return FALSE;
2070     }
2071
2072 #ifdef DBUS_ENABLE_VERBOSE_MODE
2073   /* so we can see a not-yet-added pending reply */
2074   pending->expire_item.added_tv_sec = 1;
2075   pending->expire_item.added_tv_usec = 1;
2076 #endif
2077
2078   pending->will_get_reply = will_get_reply;
2079   pending->will_send_reply = will_send_reply;
2080   pending->reply_serial = reply_serial;
2081   
2082   cprd = dbus_new0 (CancelPendingReplyData, 1);
2083   if (cprd == NULL)
2084     {
2085       BUS_SET_OOM (error);
2086       bus_pending_reply_free (pending);
2087       return FALSE;
2088     }
2089   
2090   if (!bus_expire_list_add (connections->pending_replies,
2091                             &pending->expire_item))
2092     {
2093       BUS_SET_OOM (error);
2094       dbus_free (cprd);
2095       bus_pending_reply_free (pending);
2096       return FALSE;
2097     }
2098
2099   if (!bus_transaction_add_cancel_hook (transaction,
2100                                         cancel_pending_reply,
2101                                         cprd,
2102                                         cancel_pending_reply_data_free))
2103     {
2104       BUS_SET_OOM (error);
2105       bus_expire_list_remove (connections->pending_replies, &pending->expire_item);
2106       dbus_free (cprd);
2107       bus_pending_reply_free (pending);
2108       return FALSE;
2109     }
2110                                         
2111   cprd->pending = pending;
2112   cprd->connections = connections;
2113   
2114   _dbus_get_monotonic_time (&pending->expire_item.added_tv_sec,
2115                             &pending->expire_item.added_tv_usec);
2116
2117   _dbus_verbose ("Added pending reply %p, replier %p receiver %p serial %u\n",
2118                  pending,
2119                  pending->will_send_reply,
2120                  pending->will_get_reply,
2121                  pending->reply_serial);
2122   
2123   return TRUE;
2124 }
2125
2126 typedef struct
2127 {
2128   DBusList        *link;
2129   BusConnections  *connections;
2130 } CheckPendingReplyData;
2131
2132 static void
2133 cancel_check_pending_reply (void *data)
2134 {
2135   CheckPendingReplyData *d = data;
2136
2137   _dbus_verbose ("d = %p\n",d);
2138
2139   bus_expire_list_add_link (d->connections->pending_replies,
2140                             d->link);
2141   d->link = NULL;
2142 }
2143
2144 static void
2145 check_pending_reply_data_free (void *data)
2146 {
2147   CheckPendingReplyData *d = data;
2148
2149   _dbus_verbose ("d = %p\n",d);
2150   
2151   if (d->link != NULL)
2152     {
2153       BusPendingReply *pending = d->link->data;
2154       
2155       _dbus_assert (!bus_expire_list_contains_item (d->connections->pending_replies,
2156                                                     &pending->expire_item));
2157       
2158       bus_pending_reply_free (pending);
2159       _dbus_list_free_link (d->link);
2160     }
2161   
2162   dbus_free (d);
2163 }
2164
2165 /*
2166  * Check whether a reply is allowed, remove BusPendingReply
2167  * if so, return TRUE if so.
2168  */
2169 dbus_bool_t
2170 bus_connections_check_reply (BusConnections *connections,
2171                              BusTransaction *transaction,
2172                              DBusConnection *sending_reply,
2173                              DBusConnection *receiving_reply,
2174                              DBusMessage    *reply,
2175                              DBusError      *error)
2176 {
2177   CheckPendingReplyData *cprd;
2178   DBusList *link;
2179   dbus_uint32_t reply_serial;
2180   
2181   _dbus_assert (sending_reply != NULL);
2182   _dbus_assert (receiving_reply != NULL);
2183
2184   reply_serial = dbus_message_get_reply_serial (reply);
2185
2186   link = bus_expire_list_get_first_link (connections->pending_replies);
2187   while (link != NULL)
2188     {
2189       BusPendingReply *pending = link->data;
2190
2191       if (pending->reply_serial == reply_serial &&
2192           pending->will_get_reply == receiving_reply &&
2193           pending->will_send_reply == sending_reply)
2194         {
2195           _dbus_verbose ("Found pending reply with serial %u\n", reply_serial);
2196           break;
2197         }
2198       
2199       link = bus_expire_list_get_next_link (connections->pending_replies,
2200                                             link);
2201     }
2202
2203   if (link == NULL)
2204     {
2205       _dbus_verbose ("No pending reply expected\n");
2206
2207       return FALSE;
2208     }
2209
2210   cprd = dbus_new0 (CheckPendingReplyData, 1);
2211   if (cprd == NULL)
2212     {
2213       BUS_SET_OOM (error);
2214       return FALSE;
2215     }
2216   
2217   if (!bus_transaction_add_cancel_hook (transaction,
2218                                         cancel_check_pending_reply,
2219                                         cprd,
2220                                         check_pending_reply_data_free))
2221     {
2222       BUS_SET_OOM (error);
2223       dbus_free (cprd);
2224       return FALSE;
2225     }
2226
2227   cprd->link = link;
2228   cprd->connections = connections;
2229   
2230   bus_expire_list_unlink (connections->pending_replies,
2231                           link);
2232   
2233   _dbus_assert (!bus_expire_list_contains_item (connections->pending_replies, link->data));
2234
2235   return TRUE;
2236 }
2237
2238 /*
2239  * Transactions
2240  *
2241  * Note that this is fairly fragile; in particular, don't try to use
2242  * one transaction across any main loop iterations.
2243  */
2244
2245 typedef struct
2246 {
2247   BusTransaction *transaction;
2248   DBusMessage    *message;
2249   DBusPreallocatedSend *preallocated;
2250 } MessageToSend;
2251
2252 typedef struct
2253 {
2254   BusTransactionCancelFunction cancel_function;
2255   DBusFreeFunction free_data_function;
2256   void *data;
2257 } CancelHook;
2258
2259 struct BusTransaction
2260 {
2261   DBusList *connections;
2262   BusContext *context;
2263   DBusList *cancel_hooks;
2264 };
2265
2266 static void
2267 message_to_send_free (DBusConnection *connection,
2268                       MessageToSend  *to_send)
2269 {
2270   if (to_send->message)
2271     dbus_message_unref (to_send->message);
2272
2273   if (to_send->preallocated)
2274     dbus_connection_free_preallocated_send (connection, to_send->preallocated);
2275
2276   dbus_free (to_send);
2277 }
2278
2279 static void
2280 cancel_hook_cancel (void *element,
2281                     void *data)
2282 {
2283   CancelHook *ch = element;
2284
2285   _dbus_verbose ("Running transaction cancel hook\n");
2286   
2287   if (ch->cancel_function)
2288     (* ch->cancel_function) (ch->data);  
2289 }
2290
2291 static void
2292 cancel_hook_free (void *element,
2293                   void *data)
2294 {
2295   CancelHook *ch = element;
2296
2297   if (ch->free_data_function)
2298     (* ch->free_data_function) (ch->data);
2299
2300   dbus_free (ch);
2301 }
2302
2303 static void
2304 free_cancel_hooks (BusTransaction *transaction)
2305 {
2306   _dbus_list_foreach (&transaction->cancel_hooks,
2307                       cancel_hook_free, NULL);
2308   
2309   _dbus_list_clear (&transaction->cancel_hooks);
2310 }
2311
2312 BusTransaction*
2313 bus_transaction_new (BusContext *context)
2314 {
2315   BusTransaction *transaction;
2316
2317   transaction = dbus_new0 (BusTransaction, 1);
2318   if (transaction == NULL)
2319     return NULL;
2320
2321   transaction->context = context;
2322   
2323   return transaction;
2324 }
2325
2326 BusContext*
2327 bus_transaction_get_context (BusTransaction  *transaction)
2328 {
2329   return transaction->context;
2330 }
2331
2332 /**
2333  * Reserve enough memory to capture the given message if the
2334  * transaction goes through.
2335  */
2336 dbus_bool_t
2337 bus_transaction_capture (BusTransaction *transaction,
2338                          DBusConnection *sender,
2339                          DBusConnection *addressed_recipient,
2340                          DBusMessage    *message)
2341 {
2342   BusConnections *connections;
2343   BusMatchmaker *mm;
2344   DBusList *link;
2345   DBusList *recipients = NULL;
2346   dbus_bool_t ret = FALSE;
2347
2348   connections = bus_context_get_connections (transaction->context);
2349
2350   /* shortcut: don't compose the message unless someone wants it */
2351   if (connections->monitors == NULL)
2352     return TRUE;
2353
2354   mm = connections->monitor_matchmaker;
2355   /* This is non-null if there has ever been a monitor - we don't GC it.
2356    * There's little point, since there is up to 1 per process. */
2357   _dbus_assert (mm != NULL);
2358
2359   if (!bus_matchmaker_get_recipients (mm, connections, sender,
2360         addressed_recipient, message, &recipients))
2361     goto out;
2362
2363   for (link = _dbus_list_get_first_link (&recipients);
2364       link != NULL;
2365       link = _dbus_list_get_next_link (&recipients, link))
2366     {
2367       DBusConnection *recipient = link->data;
2368
2369       if (!bus_transaction_send (transaction, recipient, message, FALSE))
2370         goto out;
2371     }
2372
2373   ret = TRUE;
2374
2375 out:
2376   _dbus_list_clear (&recipients);
2377   return ret;
2378 }
2379
2380 dbus_bool_t
2381 bus_transaction_capture_error_reply (BusTransaction  *transaction,
2382                                      DBusConnection  *addressed_recipient,
2383                                      const DBusError *error,
2384                                      DBusMessage     *in_reply_to)
2385 {
2386   BusConnections *connections;
2387   DBusMessage *reply;
2388   dbus_bool_t ret = FALSE;
2389
2390   _dbus_assert (error != NULL);
2391   _DBUS_ASSERT_ERROR_IS_SET (error);
2392
2393   connections = bus_context_get_connections (transaction->context);
2394
2395   /* shortcut: don't compose the message unless someone wants it */
2396   if (connections->monitors == NULL)
2397     return TRUE;
2398
2399   reply = dbus_message_new_error (in_reply_to,
2400                                   error->name,
2401                                   error->message);
2402
2403   if (reply == NULL)
2404     return FALSE;
2405
2406   if (!dbus_message_set_sender (reply, DBUS_SERVICE_DBUS))
2407     goto out;
2408
2409   ret = bus_transaction_capture (transaction, NULL, addressed_recipient, reply);
2410
2411 out:
2412   dbus_message_unref (reply);
2413   return ret;
2414 }
2415
2416 dbus_bool_t
2417 bus_transaction_send_from_driver (BusTransaction *transaction,
2418                                   DBusConnection *connection,
2419                                   DBusMessage    *message)
2420 {
2421   DBusError error = DBUS_ERROR_INIT;
2422   BusDeferredMessage *deferred_message;
2423
2424   /* We have to set the sender to the driver, and have
2425    * to check security policy since it was not done in
2426    * dispatch.c
2427    */
2428   _dbus_verbose ("Sending %s %s %s from driver\n",
2429                  dbus_message_get_interface (message) ?
2430                  dbus_message_get_interface (message) : "(no interface)",
2431                  dbus_message_get_member (message) ?
2432                  dbus_message_get_member (message) : "(no member)",
2433                  dbus_message_get_error_name (message) ?
2434                  dbus_message_get_error_name (message) : "(no error name)");
2435                  
2436   if (!dbus_message_set_sender (message, DBUS_SERVICE_DBUS))
2437     return FALSE;
2438
2439   if (bus_connection_is_active (connection))
2440     {
2441       if (!dbus_message_set_destination (message,
2442                                          bus_connection_get_name (connection)))
2443         return FALSE;
2444     }
2445   
2446   /* bus driver never wants a reply */
2447   dbus_message_set_no_reply (message, TRUE);
2448
2449   /* Capture it for monitors, even if the real recipient's receive policy
2450    * does not allow it to receive this message from us (which would be odd).
2451    */
2452   if (!bus_transaction_capture (transaction, NULL, connection, message))
2453     return FALSE;
2454
2455   /* If security policy doesn't allow the message, we would silently
2456    * eat it; the driver doesn't care about getting a reply. However,
2457    * if we're actively capturing messages, it's nice to log that we
2458    * tried to send it and did not allow ourselves to do so.
2459    */
2460   switch (bus_context_check_security_policy (bus_transaction_get_context (transaction),
2461                                              transaction,
2462                                              NULL, connection, connection,
2463                                              message, NULL, &error,
2464                                              &deferred_message))
2465     {
2466     case BUS_RESULT_TRUE:
2467       break;
2468     case BUS_RESULT_FALSE:
2469       if (!bus_transaction_capture_error_reply (transaction, connection,
2470                                                 &error, message))
2471         {
2472           bus_context_log (transaction->context, DBUS_SYSTEM_LOG_WARNING,
2473                            "message from dbus-daemon rejected but not enough "
2474                            "memory to capture it");
2475         }
2476
2477       /* This is not fatal to the transaction so silently eat the disallowed
2478        * message (see reasoning above) */
2479       dbus_error_free (&error);
2480       return TRUE;
2481       break;
2482     case BUS_RESULT_LATER:
2483       if (!bus_deferred_message_queue_at_recipient(deferred_message, transaction, FALSE, FALSE))
2484           return FALSE;
2485       return TRUE; /* pretend to have sent it */
2486     }
2487
2488   return bus_transaction_send (transaction, connection, message, FALSE);
2489 }
2490
2491 dbus_bool_t
2492 bus_transaction_send (BusTransaction *transaction,
2493                       DBusConnection *connection,
2494                       DBusMessage    *message,
2495                       dbus_bool_t     deferred_dispatch)
2496 {
2497   MessageToSend *to_send;
2498   BusConnectionData *d;
2499   DBusList *link;
2500
2501   _dbus_verbose ("  trying to add %s interface=%s member=%s error=%s to transaction%s\n",
2502                  dbus_message_get_type (message) == DBUS_MESSAGE_TYPE_ERROR ? "error" :
2503                  dbus_message_get_reply_serial (message) != 0 ? "reply" :
2504                  "message",
2505                  dbus_message_get_interface (message) ?
2506                  dbus_message_get_interface (message) : "(unset)",
2507                  dbus_message_get_member (message) ?
2508                  dbus_message_get_member (message) : "(unset)",
2509                  dbus_message_get_error_name (message) ?
2510                  dbus_message_get_error_name (message) : "(unset)",
2511                  dbus_connection_get_is_connected (connection) ?
2512                  "" : " (disconnected)");
2513
2514   _dbus_assert (dbus_message_get_sender (message) != NULL);
2515   
2516   if (!dbus_connection_get_is_connected (connection))
2517     return TRUE; /* silently ignore disconnected connections */
2518   
2519   d = BUS_CONNECTION_DATA (connection);
2520   _dbus_assert (d != NULL);
2521
2522   if (!deferred_dispatch && d->deferred_messages != NULL)
2523     {
2524       BusDeferredMessage *deferred_message;
2525       dbus_bool_t success;
2526       /* sender and addressed recipient are not required at this point as we only need to send message
2527        * to a single recipient without performing policy check. */
2528       deferred_message = bus_deferred_message_new (message,
2529                                                    NULL,
2530                                                    NULL,
2531                                                    connection,
2532                                                    BUS_RESULT_TRUE);
2533       if (deferred_message == NULL)
2534         return FALSE;
2535
2536       success = bus_deferred_message_queue_at_recipient(deferred_message, transaction,
2537           FALSE, FALSE);
2538       bus_deferred_message_unref(deferred_message);
2539
2540       return success;
2541     }
2542
2543   to_send = dbus_new (MessageToSend, 1);
2544   if (to_send == NULL)
2545     {
2546       return FALSE;
2547     }
2548
2549   to_send->preallocated = dbus_connection_preallocate_send (connection);
2550   if (to_send->preallocated == NULL)
2551     {
2552       dbus_free (to_send);
2553       return FALSE;
2554     }  
2555   
2556   dbus_message_ref (message);
2557   to_send->message = message;
2558   to_send->transaction = transaction;
2559
2560   _dbus_verbose ("about to prepend message\n");
2561   
2562   if (!_dbus_list_prepend (&d->transaction_messages, to_send))
2563     {
2564       message_to_send_free (connection, to_send);
2565       return FALSE;
2566     }
2567
2568   _dbus_verbose ("prepended message\n");
2569   
2570   /* See if we already had this connection in the list
2571    * for this transaction. If we have a pending message,
2572    * then we should already be in transaction->connections
2573    */
2574   link = _dbus_list_get_first_link (&d->transaction_messages);
2575   _dbus_assert (link->data == to_send);
2576   link = _dbus_list_get_next_link (&d->transaction_messages, link);
2577   while (link != NULL)
2578     {
2579       MessageToSend *m = link->data;
2580       DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
2581       
2582       if (m->transaction == transaction)
2583         break;
2584         
2585       link = next;
2586     }
2587
2588   if (link == NULL)
2589     {
2590       if (!_dbus_list_prepend (&transaction->connections, connection))
2591         {
2592           _dbus_list_remove (&d->transaction_messages, to_send);
2593           message_to_send_free (connection, to_send);
2594           return FALSE;
2595         }
2596     }
2597
2598   return TRUE;
2599 }
2600
2601 static void
2602 transaction_free (BusTransaction *transaction)
2603 {
2604   _dbus_assert (transaction->connections == NULL);
2605
2606   free_cancel_hooks (transaction);
2607
2608   dbus_free (transaction);
2609 }
2610
2611 static void
2612 connection_cancel_transaction (DBusConnection *connection,
2613                                BusTransaction *transaction)
2614 {
2615   DBusList *link;
2616   BusConnectionData *d;
2617   
2618   d = BUS_CONNECTION_DATA (connection);
2619   _dbus_assert (d != NULL);
2620   
2621   link = _dbus_list_get_first_link (&d->transaction_messages);
2622   while (link != NULL)
2623     {
2624       MessageToSend *m = link->data;
2625       DBusList *next = _dbus_list_get_next_link (&d->transaction_messages, link);
2626       
2627       if (m->transaction == transaction)
2628         {
2629           _dbus_list_remove_link (&d->transaction_messages,
2630                                   link);
2631           
2632           message_to_send_free (connection, m);
2633         }
2634         
2635       link = next;
2636     }
2637 }
2638
2639 void
2640 bus_transaction_cancel_and_free (BusTransaction *transaction)
2641 {
2642   DBusConnection *connection;
2643
2644   _dbus_verbose ("TRANSACTION: cancelled\n");
2645   
2646   while ((connection = _dbus_list_pop_first (&transaction->connections)))
2647     connection_cancel_transaction (connection, transaction);
2648
2649   _dbus_list_foreach (&transaction->cancel_hooks,
2650                       cancel_hook_cancel, NULL);
2651
2652   transaction_free (transaction);
2653 }
2654
2655 static void
2656 connection_execute_transaction (DBusConnection *connection,
2657                                 BusTransaction *transaction)
2658 {
2659   DBusList *link;
2660   BusConnectionData *d;
2661   
2662   d = BUS_CONNECTION_DATA (connection);
2663   _dbus_assert (d != NULL);
2664
2665   /* Send the queue in order (FIFO) */
2666   link = _dbus_list_get_last_link (&d->transaction_messages);
2667   while (link != NULL)
2668     {
2669       MessageToSend *m = link->data;
2670       DBusList *prev = _dbus_list_get_prev_link (&d->transaction_messages, link);
2671       
2672       if (m->transaction == transaction)
2673         {
2674           _dbus_list_remove_link (&d->transaction_messages,
2675                                   link);
2676
2677           _dbus_assert (dbus_message_get_sender (m->message) != NULL);
2678           
2679           dbus_connection_send_preallocated (connection,
2680                                              m->preallocated,
2681                                              m->message,
2682                                              NULL);
2683
2684           m->preallocated = NULL; /* so we don't double-free it */
2685           
2686           message_to_send_free (connection, m);
2687         }
2688         
2689       link = prev;
2690     }
2691 }
2692
2693 void
2694 bus_transaction_execute_and_free (BusTransaction *transaction)
2695 {
2696   /* For each connection in transaction->connections
2697    * send the messages
2698    */
2699   DBusConnection *connection;
2700
2701   _dbus_verbose ("TRANSACTION: executing\n");
2702   
2703   while ((connection = _dbus_list_pop_first (&transaction->connections)))
2704     connection_execute_transaction (connection, transaction);
2705
2706   transaction_free (transaction);
2707 }
2708
2709 static void
2710 bus_connection_remove_transactions (DBusConnection *connection)
2711 {
2712   MessageToSend *to_send;
2713   BusConnectionData *d;
2714   
2715   d = BUS_CONNECTION_DATA (connection);
2716   _dbus_assert (d != NULL);
2717   
2718   while ((to_send = _dbus_list_get_first (&d->transaction_messages)))
2719     {
2720       /* only has an effect for the first MessageToSend listing this transaction */
2721       _dbus_list_remove (&to_send->transaction->connections,
2722                          connection);
2723
2724       _dbus_list_remove (&d->transaction_messages, to_send);
2725       message_to_send_free (connection, to_send);
2726     }
2727 }
2728
2729 /**
2730  * Converts the DBusError to a message reply
2731  */
2732 dbus_bool_t
2733 bus_transaction_send_error_reply (BusTransaction  *transaction,
2734                                   DBusConnection  *connection,
2735                                   const DBusError *error,
2736                                   DBusMessage     *in_reply_to)
2737 {
2738   DBusMessage *reply;
2739   
2740   _dbus_assert (error != NULL);
2741   _DBUS_ASSERT_ERROR_IS_SET (error);
2742   
2743   _dbus_verbose ("Sending error reply %s \"%s\"\n",
2744                  error->name, error->message);
2745
2746   reply = dbus_message_new_error (in_reply_to,
2747                                   error->name,
2748                                   error->message);
2749   if (reply == NULL)
2750     return FALSE;
2751
2752   if (!bus_transaction_send_from_driver (transaction, connection, reply))
2753     {
2754       dbus_message_unref (reply);
2755       return FALSE;
2756     }
2757
2758   dbus_message_unref (reply);
2759   
2760   return TRUE;
2761 }
2762
2763 dbus_bool_t
2764 bus_transaction_add_cancel_hook (BusTransaction               *transaction,
2765                                  BusTransactionCancelFunction  cancel_function,
2766                                  void                         *data,
2767                                  DBusFreeFunction              free_data_function)
2768 {
2769   CancelHook *ch;
2770
2771   ch = dbus_new (CancelHook, 1);
2772   if (ch == NULL)
2773     return FALSE;
2774
2775   _dbus_verbose ("     adding cancel hook function = %p data = %p\n",
2776                  cancel_function, data);
2777   
2778   ch->cancel_function = cancel_function;
2779   ch->data = data;
2780   ch->free_data_function = free_data_function;
2781
2782   /* It's important that the hooks get run in reverse order that they
2783    * were added
2784    */
2785   if (!_dbus_list_prepend (&transaction->cancel_hooks, ch))
2786     {
2787       dbus_free (ch);
2788       return FALSE;
2789     }
2790
2791   return TRUE;
2792 }
2793
2794 void
2795 bus_connection_dispatch_deferred (DBusConnection *connection)
2796 {
2797   BusDeferredMessage *message;
2798
2799   _dbus_return_if_fail (connection != NULL);
2800
2801   while ((message = bus_connection_pop_deferred_message(connection)) != NULL)
2802     {
2803       bus_deferred_message_dispatch(message);
2804       bus_deferred_message_unref(message);
2805     }
2806 }
2807
2808 dbus_bool_t
2809 bus_connection_has_deferred_messages (DBusConnection *connection)
2810 {
2811   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2812   return d->deferred_messages != NULL ? TRUE : FALSE;
2813 }
2814
2815 dbus_bool_t
2816 bus_connection_queue_deferred_message (DBusConnection *connection,
2817                                        BusDeferredMessage *message,
2818                                        dbus_bool_t prepend)
2819 {
2820   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2821   dbus_bool_t success;
2822   if (prepend)
2823     success = _dbus_list_prepend(&d->deferred_messages, message);
2824   else
2825     success = _dbus_list_append(&d->deferred_messages, message);
2826
2827   if (success)
2828     {
2829       bus_deferred_message_ref(message);
2830       return TRUE;
2831     }
2832
2833   return FALSE;
2834 }
2835
2836 dbus_bool_t
2837 bus_connection_replace_deferred_message (DBusConnection *connection,
2838                                          BusDeferredMessage *oldMessage,
2839                                          BusDeferredMessage *newMessage)
2840 {
2841   DBusList *link;
2842   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2843
2844   link = _dbus_list_find_first(&d->deferred_messages, oldMessage);
2845   if (link == NULL)
2846     return FALSE;
2847
2848   if (!_dbus_list_insert_after(&d->deferred_messages, link, newMessage))
2849     return FALSE;
2850
2851   bus_deferred_message_ref(newMessage);
2852   _dbus_list_remove_link(&d->deferred_messages, link);
2853   bus_deferred_message_unref(oldMessage);
2854   return TRUE;
2855 }
2856
2857 BusDeferredMessage *
2858 bus_connection_pop_deferred_message (DBusConnection *connection)
2859 {
2860   DBusList *link;
2861   BusDeferredMessage *message;
2862   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2863
2864   link =_dbus_list_get_first_link(&d->deferred_messages);
2865   if (link != NULL)
2866     {
2867       message = link->data;
2868       if (!bus_deferred_message_waits_for_check(message))
2869         {
2870           _dbus_list_remove_link(&d->deferred_messages, link);
2871           return message;
2872         }
2873     }
2874
2875   return NULL;
2876 }
2877
2878 dbus_bool_t
2879 bus_connection_putback_deferred_message (DBusConnection *connection, BusDeferredMessage *message)
2880 {
2881   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2882   if (_dbus_list_prepend(&d->deferred_messages, message))
2883     {
2884       return TRUE;
2885     }
2886   return FALSE;
2887 }
2888
2889 void
2890 bus_connection_clear_deferred_messages (DBusConnection *connection)
2891 {
2892   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2893   DBusList *link;
2894   DBusList *next;
2895   BusDeferredMessage *message;
2896
2897   link =_dbus_list_get_first_link(&d->deferred_messages);
2898   while (link != NULL)
2899     {
2900       next = _dbus_list_get_next_link (&d->deferred_messages, link);
2901       message = link->data;
2902
2903       bus_deferred_message_unref(message);
2904       _dbus_list_remove_link(&d->deferred_messages, link);
2905
2906       link = next;
2907     }
2908 }
2909
2910 void
2911 bus_connection_remove_deferred_message (DBusConnection *connection,
2912                                         BusDeferredMessage *message)
2913 {
2914   BusConnectionData *d = BUS_CONNECTION_DATA(connection);
2915   if (_dbus_list_remove(&d->deferred_messages, message))
2916     bus_deferred_message_unref(message);
2917 }
2918
2919 int
2920 bus_connections_get_n_active (BusConnections *connections)
2921 {
2922   return connections->n_completed;
2923 }
2924
2925 int
2926 bus_connections_get_n_incomplete (BusConnections *connections)
2927 {
2928   return connections->n_incomplete;
2929 }
2930
2931 #ifdef DBUS_ENABLE_STATS
2932 int
2933 bus_connections_get_total_match_rules (BusConnections *connections)
2934 {
2935   return connections->total_match_rules;
2936 }
2937
2938 int
2939 bus_connections_get_peak_match_rules (BusConnections *connections)
2940 {
2941   return connections->peak_match_rules;
2942 }
2943
2944 int
2945 bus_connections_get_peak_match_rules_per_conn (BusConnections *connections)
2946 {
2947   return connections->peak_match_rules_per_conn;
2948 }
2949
2950 int
2951 bus_connections_get_total_bus_names (BusConnections *connections)
2952 {
2953   return connections->total_bus_names;
2954 }
2955
2956 int
2957 bus_connections_get_peak_bus_names (BusConnections *connections)
2958 {
2959   return connections->peak_bus_names;
2960 }
2961
2962 int
2963 bus_connections_get_peak_bus_names_per_conn (BusConnections *connections)
2964 {
2965   return connections->peak_bus_names_per_conn;
2966 }
2967
2968 int
2969 bus_connection_get_peak_match_rules (DBusConnection *connection)
2970 {
2971   BusConnectionData *d;
2972
2973   d = BUS_CONNECTION_DATA (connection);
2974   _dbus_assert(d != NULL);
2975
2976   return d->peak_match_rules;
2977 }
2978
2979 int
2980 bus_connection_get_peak_bus_names (DBusConnection *connection)
2981 {
2982   BusConnectionData *d;
2983
2984   d = BUS_CONNECTION_DATA (connection);
2985   _dbus_assert(d != NULL);
2986
2987   return d->peak_bus_names;
2988 }
2989
2990 int bus_connection_get_n_pending_replies (DBusConnection *connection)
2991 {
2992   BusConnectionData *d;
2993   DBusList *link;
2994   BusPendingReply *pending;
2995   int count = 0;
2996
2997   d = BUS_CONNECTION_DATA (connection);
2998   _dbus_assert(d != NULL);
2999
3000   link = bus_expire_list_get_first_link(d->connections->pending_replies);
3001   while (link != NULL)
3002     {
3003       pending = link->data;
3004       link = bus_expire_list_get_next_link(d->connections->pending_replies,
3005         link);
3006       if (pending->will_get_reply == connection)
3007         ++count;
3008     }
3009
3010   return count;
3011 }
3012
3013 int
3014 bus_connection_get_peak_pending_replies (DBusConnection *connection)
3015 {
3016   BusConnectionData *d;
3017
3018   d = BUS_CONNECTION_DATA (connection);
3019   _dbus_assert (d != NULL);
3020
3021   return d->peak_pending_replies;
3022 }
3023 #endif /* DBUS_ENABLE_STATS */
3024
3025 dbus_bool_t
3026 bus_connection_is_monitor (DBusConnection *connection)
3027 {
3028   BusConnectionData *d;
3029
3030   d = BUS_CONNECTION_DATA (connection);
3031   _dbus_assert(d != NULL);
3032
3033   return d->link_in_monitors != NULL;
3034 }
3035
3036 static dbus_bool_t
3037 bcd_add_monitor_rules (BusConnectionData  *d,
3038                        DBusConnection     *connection,
3039                        DBusList          **rules)
3040 {
3041   BusMatchmaker *mm = d->connections->monitor_matchmaker;
3042   DBusList *iter;
3043
3044   if (mm == NULL)
3045     {
3046       mm = bus_matchmaker_new ();
3047
3048       if (mm == NULL)
3049         return FALSE;
3050
3051       d->connections->monitor_matchmaker = mm;
3052     }
3053
3054   for (iter = _dbus_list_get_first_link (rules);
3055       iter != NULL;
3056       iter = _dbus_list_get_next_link (rules, iter))
3057     {
3058       if (!bus_matchmaker_add_rule (mm, iter->data))
3059         {
3060           bus_matchmaker_disconnected (mm, connection);
3061           return FALSE;
3062         }
3063     }
3064
3065   return TRUE;
3066 }
3067
3068 static void
3069 bcd_drop_monitor_rules (BusConnectionData *d,
3070                         DBusConnection *connection)
3071 {
3072   BusMatchmaker *mm = d->connections->monitor_matchmaker;
3073
3074   if (mm != NULL)
3075     bus_matchmaker_disconnected (mm, connection);
3076 }
3077
3078 dbus_bool_t
3079 bus_connection_be_monitor (DBusConnection  *connection,
3080                            BusTransaction  *transaction,
3081                            DBusList       **rules,
3082                            DBusError       *error)
3083 {
3084   BusConnectionData *d;
3085   DBusList *link;
3086   DBusList *tmp;
3087   DBusList *iter;
3088
3089   d = BUS_CONNECTION_DATA (connection);
3090   _dbus_assert (d != NULL);
3091
3092   link = _dbus_list_alloc_link (connection);
3093
3094   if (link == NULL)
3095     {
3096       BUS_SET_OOM (error);
3097       return FALSE;
3098     }
3099
3100   if (!bcd_add_monitor_rules (d, connection, rules))
3101     {
3102       _dbus_list_free_link (link);
3103       BUS_SET_OOM (error);
3104       return FALSE;
3105     }
3106
3107   /* release all its names */
3108   if (!_dbus_list_copy (&d->services_owned, &tmp))
3109     {
3110       bcd_drop_monitor_rules (d, connection);
3111       _dbus_list_free_link (link);
3112       BUS_SET_OOM (error);
3113       return FALSE;
3114     }
3115
3116   for (iter = _dbus_list_get_first_link (&tmp);
3117       iter != NULL;
3118       iter = _dbus_list_get_next_link (&tmp, iter))
3119     {
3120       BusService *service = iter->data;
3121
3122       /* This call is transactional: if there isn't enough memory to
3123        * do everything, then the service gets all its names back when
3124        * the transaction is cancelled due to OOM. */
3125       if (!bus_service_remove_owner (service, connection, transaction, error))
3126         {
3127           bcd_drop_monitor_rules (d, connection);
3128           _dbus_list_free_link (link);
3129           _dbus_list_clear (&tmp);
3130           return FALSE;
3131         }
3132     }
3133
3134   /* We have now done everything that can fail, so there is no problem
3135    * with doing the irrevocable stuff. */
3136
3137   _dbus_list_clear (&tmp);
3138
3139   bus_context_log (transaction->context, DBUS_SYSTEM_LOG_INFO,
3140                    "Connection %s (%s) became a monitor.", d->name,
3141                    d->cached_loginfo_string);
3142
3143   if (d->n_match_rules > 0)
3144     {
3145       BusMatchmaker *mm;
3146
3147       mm = bus_context_get_matchmaker (d->connections->context);
3148       bus_matchmaker_disconnected (mm, connection);
3149     }
3150
3151   /* flag it as a monitor */
3152   d->link_in_monitors = link;
3153   _dbus_list_append_link (&d->connections->monitors, link);
3154
3155   /* it isn't allowed to reply, and it is no longer relevant whether it
3156    * receives replies */
3157   bus_connection_drop_pending_replies (d->connections, connection);
3158
3159   return TRUE;
3160 }