bus.c revision 79b1e9966434bc3ca4b6009c19c77b91e7588180
16ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */
26ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington/* bus.c  message bus context object
36ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
47c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington * Copyright (C) 2003, 2004 Red Hat, Inc.
56ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
76ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
86ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * This program is free software; you can redistribute it and/or modify
96ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * it under the terms of the GNU General Public License as published by
106ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * the Free Software Foundation; either version 2 of the License, or
116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * (at your option) any later version.
126ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * This program is distributed in the hope that it will be useful,
146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * GNU General Public License for more details.
176ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
186ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * You should have received a copy of the GNU General Public License
196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * along with this program; if not, write to the Free Software
206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */
236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "bus.h"
256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "activation.h"
266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "connection.h"
276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "services.h"
286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "utils.h"
29b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington#include "policy.h"
3029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington#include "config-parser.h"
31a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h"
321e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington#include "selinux.h"
331d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen#include "dir-watch.h"
34b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington#include <dbus/dbus-list.h>
35b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington#include <dbus/dbus-hash.h>
366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include <dbus/dbus-internals.h>
376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
386ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusContext
396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
406ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  int refcount;
41600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  char *config_file;
42eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  char *type;
43b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  char *address;
440e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington  char *pidfile;
45600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  char *user;
46df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  DBusLoop *loop;
4729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusList *servers;
486ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnections *connections;
496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusActivation *activation;
506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
51bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington  BusPolicy *policy;
52a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
537c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  DBusUserDatabase *user_database;
543185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  BusLimits limits;
55600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  unsigned int fork : 1;
566ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington};
576ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
586843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Penningtonstatic dbus_int32_t server_data_slot = -1;
591b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
601b08036103a70159e7a67b2349306710edcd6654Havoc Penningtontypedef struct
611b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
621b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
631b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} BusServerData;
641b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
651b08036103a70159e7a67b2349306710edcd6654Havoc Pennington#define BUS_SERVER_DATA(server) (dbus_server_get_data ((server), server_data_slot))
661b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
671b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonstatic BusContext*
681b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonserver_get_context (DBusServer *server)
691b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
701b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
711b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusServerData *bd;
721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
736843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington  if (!dbus_server_allocate_data_slot (&server_data_slot))
741b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    return NULL;
751b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
761b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  bd = BUS_SERVER_DATA (server);
771b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  if (bd == NULL)
78e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington    {
796843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington      dbus_server_free_data_slot (&server_data_slot);
80e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington      return NULL;
81e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington    }
821b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
831b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = bd->context;
841b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
856843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington  dbus_server_free_data_slot (&server_data_slot);
861b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
871b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  return context;
881b08036103a70159e7a67b2349306710edcd6654Havoc Pennington}
891b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
90b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t
916ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonserver_watch_callback (DBusWatch     *watch,
926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                       unsigned int   condition,
936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                       void          *data)
946ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
953df260c07102745c5606c313af862558f105f83eHavoc Pennington  /* FIXME this can be done in dbus-mainloop.c
963df260c07102745c5606c313af862558f105f83eHavoc Pennington   * if the code in activation.c for the babysitter
973df260c07102745c5606c313af862558f105f83eHavoc Pennington   * watch handler is fixed.
983df260c07102745c5606c313af862558f105f83eHavoc Pennington   */
993df260c07102745c5606c313af862558f105f83eHavoc Pennington
1003df260c07102745c5606c313af862558f105f83eHavoc Pennington  return dbus_watch_handle (watch, condition);
1016ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
1026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1033bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
1046ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonadd_server_watch (DBusWatch  *watch,
10529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                  void       *data)
1066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
1071b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusServer *server = data;
1081b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
1091b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
1101b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = server_get_context (server);
1111b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
112df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  return _dbus_loop_add_watch (context->loop,
113df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                               watch, server_watch_callback, server,
114df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                               NULL);
1156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
1166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1176ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstatic void
1186ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonremove_server_watch (DBusWatch  *watch,
11929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                     void       *data)
1206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
1211b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusServer *server = data;
1221b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
1231b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
1241b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = server_get_context (server);
1251b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
126df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  _dbus_loop_remove_watch (context->loop,
127df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                           watch, server_watch_callback, server);
1286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
1296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1304c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
1316ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstatic void
1323bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonserver_timeout_callback (DBusTimeout   *timeout,
1333bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                         void          *data)
1343bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
135b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  /* can return FALSE on OOM but we just let it fire again later */
1363bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  dbus_timeout_handle (timeout);
1373bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
1383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
1403bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_server_timeout (DBusTimeout *timeout,
14129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                    void        *data)
1423bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
1431b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusServer *server = data;
1441b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
1451b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
1461b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = server_get_context (server);
1471b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
148df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  return _dbus_loop_add_timeout (context->loop,
149df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                                 timeout, server_timeout_callback, server, NULL);
1503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
1513bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1523bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
1533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_server_timeout (DBusTimeout *timeout,
15429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                       void        *data)
1553bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
1561b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusServer *server = data;
1571b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
1581b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
1591b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = server_get_context (server);
1601b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
161df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  _dbus_loop_remove_timeout (context->loop,
162df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                             timeout, server_timeout_callback, server);
1633bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
1643bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1653bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
1666ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonnew_connection_callback (DBusServer     *server,
1676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                         DBusConnection *new_connection,
1686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                         void           *data)
1696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
1706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusContext *context = data;
1716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!bus_connections_setup_connection (context->connections, new_connection))
173ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
174ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_verbose ("No memory to setup new connection\n");
1756ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
176ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      /* if we don't do this, it will get unref'd without
177ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * being disconnected... kind of strange really
178ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * that we have to do this, people won't get it right
179ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * in general.
180ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       */
18111fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J      dbus_connection_close (new_connection);
182ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
183983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
184983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  dbus_connection_set_max_received_size (new_connection,
1853185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington                                         context->limits.max_incoming_bytes);
186983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
187983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  dbus_connection_set_max_message_size (new_connection,
1883185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington                                        context->limits.max_message_size);
189ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
1904c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  /* on OOM, we won't have ref'd the connection so it will die. */
1916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
1926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
193b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Penningtonstatic void
1941b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonfree_server_data (void *data)
1951b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
1961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusServerData *bd = data;
1971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
1981b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  dbus_free (bd);
1991b08036103a70159e7a67b2349306710edcd6654Havoc Pennington}
2001b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
20129c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonstatic dbus_bool_t
20229c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonsetup_server (BusContext *context,
20329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington              DBusServer *server,
20444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington              char      **auth_mechanisms,
20529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington              DBusError  *error)
20644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{
2071b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusServerData *bd;
20807e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington
20907e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington  bd = dbus_new0 (BusServerData, 1);
21007e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington  if (!dbus_server_set_data (server,
21107e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington                             server_data_slot,
21207e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington                             bd, free_server_data))
21307e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington    {
21407e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington      dbus_free (bd);
21507e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington      BUS_SET_OOM (error);
21607e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington      return FALSE;
21707e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington    }
21807e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington
21907e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington  bd->context = context;
2201b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
22144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  if (!dbus_server_set_auth_mechanisms (server, (const char**) auth_mechanisms))
22244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
22344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      BUS_SET_OOM (error);
22444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      return FALSE;
22544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
22644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
22729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  dbus_server_set_new_connection_function (server,
22829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                           new_connection_callback,
22929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                           context, NULL);
23029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
23129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!dbus_server_set_watch_functions (server,
23229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        add_server_watch,
23329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        remove_server_watch,
23429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        NULL,
23529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        server,
23629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        NULL))
23729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
23829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      BUS_SET_OOM (error);
23929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      return FALSE;
24029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
24129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
24229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!dbus_server_set_timeout_functions (server,
24329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                          add_server_timeout,
24429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                          remove_server_timeout,
24529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                          NULL,
24629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                          server, NULL))
24729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
24829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      BUS_SET_OOM (error);
24929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      return FALSE;
25029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
2511b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
25229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  return TRUE;
25329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington}
25429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
255600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge/* This code only gets executed the first time the
256600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge   config files are parsed.  It is not executed
257600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge   when config files are reloaded.*/
258600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgestatic dbus_bool_t
259600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgeprocess_config_first_time_only (BusContext      *context,
260600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge				BusConfigParser *parser,
261600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge				DBusError       *error)
2626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
26329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusList *link;
26429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusList **addresses;
265856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington  const char *user, *pidfile;
26644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  char **auth_mechanisms;
26744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  DBusList **auth_mechanisms_list;
26844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  int len;
269600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  dbus_bool_t retval;
27029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
271600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
272e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington
273600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  retval = FALSE;
27444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  auth_mechanisms = NULL;
275856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington
276856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington  /* Check for an existing pid file. Of course this is a race;
277856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington   * we'd have to use fcntl() locks on the pid file to
278856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington   * avoid that. But we want to check for the pid file
279856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington   * before overwriting any existing sockets, etc.
280856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington   */
281856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington  pidfile = bus_config_parser_get_pidfile (parser);
282856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington  if (pidfile != NULL)
283856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington    {
284856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington      DBusString u;
285856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington      DBusStat stbuf;
286856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington
287856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington      _dbus_string_init_const (&u, pidfile);
288856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington
289eb37885909180e7e4c25e5337bec385082174dbdOlivier Andrieu      if (_dbus_stat (&u, &stbuf, NULL))
290856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington	{
291856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington	  dbus_set_error (error, DBUS_ERROR_FAILED,
292856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington			  "The pid file \"%s\" exists, if the message bus is not running, remove this file",
293856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington			  pidfile);
294856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington	  goto failed;
295856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington	}
296856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington    }
2976ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
298600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  /* keep around the pid filename so we can delete it later */
299600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->pidfile = _dbus_strdup (pidfile);
30044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
30144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  /* Build an array of auth mechanisms */
30244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
30344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  auth_mechanisms_list = bus_config_parser_get_mechanisms (parser);
30444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  len = _dbus_list_get_length (auth_mechanisms_list);
30544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
30644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  if (len > 0)
30744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
30844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      int i;
30944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
31044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      auth_mechanisms = dbus_new0 (char*, len + 1);
31144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      if (auth_mechanisms == NULL)
312600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	{
313600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  BUS_SET_OOM (error);
314600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  goto failed;
315600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	}
31644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
31744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      i = 0;
31844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      link = _dbus_list_get_first_link (auth_mechanisms_list);
31944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      while (link != NULL)
32044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        {
32144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          auth_mechanisms[i] = _dbus_strdup (link->data);
32244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          if (auth_mechanisms[i] == NULL)
323600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	    {
324600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	      BUS_SET_OOM (error);
325600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	      goto failed;
326600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	    }
32744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          link = _dbus_list_get_next_link (auth_mechanisms_list, link);
32844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        }
32944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
33044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  else
33144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
33244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      auth_mechanisms = NULL;
33344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
33444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
33544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  /* Listen on our addresses */
33629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
33729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  addresses = bus_config_parser_get_addresses (parser);
33829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
33929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  link = _dbus_list_get_first_link (addresses);
34029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  while (link != NULL)
34129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
34229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      DBusServer *server;
34329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
34429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      server = dbus_server_listen (link->data, error);
34529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (server == NULL)
346600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	{
347600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  _DBUS_ASSERT_ERROR_IS_SET (error);
348600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  goto failed;
349600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	}
35044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      else if (!setup_server (context, server, auth_mechanisms, error))
351600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	{
352600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  _DBUS_ASSERT_ERROR_IS_SET (error);
353600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  goto failed;
354600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	}
35529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
35629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (!_dbus_list_append (&context->servers, server))
35729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        {
35829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          BUS_SET_OOM (error);
35929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          goto failed;
36029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        }
36129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
36229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      link = _dbus_list_get_next_link (addresses, link);
36329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
36429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
365eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  /* note that type may be NULL */
366eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  context->type = _dbus_strdup (bus_config_parser_get_type (parser));
367d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington  if (bus_config_parser_get_type (parser) != NULL && context->type == NULL)
368d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington    {
369d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington      BUS_SET_OOM (error);
370d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington      goto failed;
371d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington    }
372600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
373600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  user = bus_config_parser_get_user (parser);
374600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (user != NULL)
375600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
376600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      context->user = _dbus_strdup (user);
377600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      if (context->user == NULL)
378600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	{
379600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  BUS_SET_OOM (error);
380600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  goto failed;
381600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	}
382600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
383600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
384600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->fork = bus_config_parser_get_fork (parser);
38544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
386600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
387600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  retval = TRUE;
388600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
389600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge failed:
390600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  dbus_free_string_array (auth_mechanisms);
391600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  return retval;
392600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge}
393600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
394600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge/* This code gets executed every time the config files
395600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge   are parsed: both during BusContext construction
396600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge   and on reloads. */
397600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgestatic dbus_bool_t
398600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgeprocess_config_every_time (BusContext      *context,
399600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge			   BusConfigParser *parser,
400600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge			   dbus_bool_t      is_reload,
401600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge			   DBusError       *error)
402600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge{
403600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  DBusString full_address;
404600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  DBusList *link;
4059a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J  char *addr;
4069a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J
407600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  dbus_bool_t retval;
408600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
409600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
410600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
4119a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J  addr = NULL;
412600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  retval = FALSE;
413600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
414600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (!_dbus_string_init (&full_address))
415600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
416600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
417600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      return FALSE;
418600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
419600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
420600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  /* get our limits and timeout lengths */
421600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  bus_config_parser_get_limits (parser, &context->limits);
422600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
423600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->policy = bus_config_parser_steal_policy (parser);
424600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _dbus_assert (context->policy != NULL);
425600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
42629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  /* We have to build the address backward, so that
42729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington   * <listen> later in the config file have priority
42829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington   */
42929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  link = _dbus_list_get_last_link (&context->servers);
43029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  while (link != NULL)
43129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
43229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      addr = dbus_server_get_address (link->data);
43329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (addr == NULL)
43429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        {
43529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          BUS_SET_OOM (error);
43629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          goto failed;
43729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        }
43829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
43929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (_dbus_string_get_length (&full_address) > 0)
44029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        {
44129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          if (!_dbus_string_append (&full_address, ";"))
44229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington            {
44329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington              BUS_SET_OOM (error);
44429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington              goto failed;
44529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington            }
44629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        }
4476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
44829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (!_dbus_string_append (&full_address, addr))
44929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        {
45029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          BUS_SET_OOM (error);
45129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          goto failed;
45229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        }
45329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
45429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      dbus_free (addr);
4559a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J      addr = NULL;
45629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
45729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      link = _dbus_list_get_prev_link (&context->servers, link);
45829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
45929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
460600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (is_reload)
461600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    dbus_free (context->address);
462600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
46329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!_dbus_string_copy_data (&full_address, &context->address))
4646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
4656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      BUS_SET_OOM (error);
4666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      goto failed;
4676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
46844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
469600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  /* Create activation subsystem */
470600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
471600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (is_reload)
472600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    bus_activation_unref (context->activation);
473600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
474600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->activation = bus_activation_new (context, &full_address,
475600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge                                            bus_config_parser_get_service_dirs (parser),
476600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge                                            error);
477600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (context->activation == NULL)
478600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
479600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      _DBUS_ASSERT_ERROR_IS_SET (error);
480600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
481600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
482600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
4835e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen  /* Drop existing conf-dir watches (if applicable) */
4841d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen
4851d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen  if (is_reload)
4861d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen    bus_drop_all_directory_watches ();
4871d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen
488600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
489600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  retval = TRUE;
490600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
491600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge failed:
492600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _dbus_string_free (&full_address);
4939a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J
4949a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J  if (addr)
49510b79991cc13b8b9347c19db840e50d6f5ede4fbJohn (J    dbus_free (addr);
4969a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J
497600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  return retval;
498600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge}
499600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
500600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgestatic dbus_bool_t
5015e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthenprocess_config_postinit (BusContext      *context,
502cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters			 BusConfigParser *parser,
5035e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen			 DBusError       *error)
504600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge{
505cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  DBusHashTable *service_context_table;
506600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
507cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  service_context_table = bus_config_parser_steal_service_context_table (parser);
508cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!bus_registry_set_service_context_table (context->registry,
509cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters					       service_context_table))
510600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
511cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      BUS_SET_OOM (error);
512cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      return FALSE;
513600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
514600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
515cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  _dbus_hash_table_unref (service_context_table);
5165e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen
5175e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen  /* Watch all conf directories */
5185e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen  _dbus_list_foreach (bus_config_parser_get_conf_dirs (parser),
5195e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen		      (DBusForeachFunction) bus_watch_directory,
5205e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen		      NULL);
5215e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen
522cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  return TRUE;
523600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge}
524600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
525600e411f25082bcf82d610a4c71b0dc3435b5a42Jon TrowbridgeBusContext*
526600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgebus_context_new (const DBusString *config_file,
527a24270a451c4ac7f8018bdd909a8f762e6abe80cDavid Zeuthen                 ForceForkSetting  force_fork,
528600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge                 int               print_addr_fd,
529600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge                 int               print_pid_fd,
530600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge                 DBusError        *error)
531600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge{
532600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  BusContext *context;
533cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  BusConfigParser *parser;
53479b1e9966434bc3ca4b6009c19c77b91e7588180John (J  DBusCredentials creds;
53579b1e9966434bc3ca4b6009c19c77b91e7588180John (J
536600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
537600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
538cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  context = NULL;
539cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  parser = NULL;
540cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
541600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (!dbus_server_allocate_data_slot (&server_data_slot))
542600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
543600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
544600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      return NULL;
545600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
546600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
547600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context = dbus_new0 (BusContext, 1);
548600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (context == NULL)
549600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
550600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
551600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
552600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
553600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->refcount = 1;
554600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
555600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (!_dbus_string_copy_data (config_file, &context->config_file))
556600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
557600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
558600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
559600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
560600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
561600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->loop = _dbus_loop_new ();
562600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (context->loop == NULL)
563600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
564600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
565600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
566600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
567600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
5681e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  context->registry = bus_registry_new (context);
5691e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  if (context->registry == NULL)
5701e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington    {
5711e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington      BUS_SET_OOM (error);
5721e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington      goto failed;
5731e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington    }
574cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
575cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  parser = bus_config_load (config_file, TRUE, NULL, error);
576cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser == NULL)
577cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
578cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
579cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
580cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
5811e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
582cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_first_time_only (context, parser, error))
583cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
584cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
585cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
586cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
587cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_every_time (context, parser, FALSE, error))
588600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
589600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      _DBUS_ASSERT_ERROR_IS_SET (error);
590600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
591600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
592600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
593600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  /* we need another ref of the server data slot for the context
594600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge   * to own
595600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge   */
596600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (!dbus_server_allocate_data_slot (&server_data_slot))
597600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    _dbus_assert_not_reached ("second ref of server data slot failed");
598600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
599600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->user_database = _dbus_user_database_new ();
600600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (context->user_database == NULL)
601600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
602600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
603600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
604600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
605600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
606c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington  /* Note that we don't know whether the print_addr_fd is
607c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington   * one of the sockets we're using to listen on, or some
608c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington   * other random thing. But I think the answer is "don't do
609c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington   * that then"
610c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington   */
611c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington  if (print_addr_fd >= 0)
612c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington    {
613c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      DBusString addr;
614c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      const char *a = bus_context_get_address (context);
615c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      int bytes;
616c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington
617c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      _dbus_assert (a != NULL);
618c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      if (!_dbus_string_init (&addr))
619c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        {
620c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          BUS_SET_OOM (error);
621c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          goto failed;
622c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        }
623c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington
624c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      if (!_dbus_string_append (&addr, a) ||
625c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          !_dbus_string_append (&addr, "\n"))
626c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        {
627c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          _dbus_string_free (&addr);
628c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          BUS_SET_OOM (error);
629c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          goto failed;
630c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        }
631c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington
632c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      bytes = _dbus_string_get_length (&addr);
633c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      if (_dbus_write (print_addr_fd, &addr, 0, bytes) != bytes)
634c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        {
635c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          dbus_set_error (error, DBUS_ERROR_FAILED,
636c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington                          "Printing message bus address: %s\n",
637c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington                          _dbus_strerror (errno));
638c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          _dbus_string_free (&addr);
639c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          goto failed;
640c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        }
641c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington
642c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      if (print_addr_fd > 2)
643c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        _dbus_close (print_addr_fd, NULL);
644c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington
645c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      _dbus_string_free (&addr);
646c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington    }
647c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington
6486ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  context->connections = bus_connections_new (context);
6496ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (context->connections == NULL)
6506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
6516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      BUS_SET_OOM (error);
6526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      goto failed;
6536ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
6546ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
655a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  context->matchmaker = bus_matchmaker_new ();
656a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (context->matchmaker == NULL)
657a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
658a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
659a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
660a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
66179b1e9966434bc3ca4b6009c19c77b91e7588180John (J
66279b1e9966434bc3ca4b6009c19c77b91e7588180John (J  /* check user before we fork */
66379b1e9966434bc3ca4b6009c19c77b91e7588180John (J  if (context->user != NULL)
66479b1e9966434bc3ca4b6009c19c77b91e7588180John (J    {
66579b1e9966434bc3ca4b6009c19c77b91e7588180John (J      DBusString u;
66679b1e9966434bc3ca4b6009c19c77b91e7588180John (J
66779b1e9966434bc3ca4b6009c19c77b91e7588180John (J      _dbus_string_init_const (&u, context->user);
66879b1e9966434bc3ca4b6009c19c77b91e7588180John (J
66979b1e9966434bc3ca4b6009c19c77b91e7588180John (J      if (!_dbus_credentials_from_username (&u, &creds) ||
67079b1e9966434bc3ca4b6009c19c77b91e7588180John (J          creds.uid < 0 ||
67179b1e9966434bc3ca4b6009c19c77b91e7588180John (J          creds.gid < 0)
67279b1e9966434bc3ca4b6009c19c77b91e7588180John (J        {
67379b1e9966434bc3ca4b6009c19c77b91e7588180John (J          dbus_set_error (error, DBUS_ERROR_FAILED,
67479b1e9966434bc3ca4b6009c19c77b91e7588180John (J                          "Could not get UID and GID for username \"%s\"",
67579b1e9966434bc3ca4b6009c19c77b91e7588180John (J                          context->user);
67679b1e9966434bc3ca4b6009c19c77b91e7588180John (J          goto failed;
67779b1e9966434bc3ca4b6009c19c77b91e7588180John (J        }
67879b1e9966434bc3ca4b6009c19c77b91e7588180John (J    }
67979b1e9966434bc3ca4b6009c19c77b91e7588180John (J
68044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  /* Now become a daemon if appropriate */
681a24270a451c4ac7f8018bdd909a8f762e6abe80cDavid Zeuthen  if ((force_fork != FORK_NEVER && context->fork) || force_fork == FORK_ALWAYS)
68244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
683856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington      DBusString u;
684856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington
685600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      if (context->pidfile)
686600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge        _dbus_string_init_const (&u, context->pidfile);
687856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington
688e430788a6bfb50c628825cdf6e09476e41dc1a78Colin Walters      if (!_dbus_become_daemon (context->pidfile ? &u : NULL,
689e430788a6bfb50c628825cdf6e09476e41dc1a78Colin Walters				print_pid_fd,
690e430788a6bfb50c628825cdf6e09476e41dc1a78Colin Walters				error))
691600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	{
692600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  _DBUS_ASSERT_ERROR_IS_SET (error);
693600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  goto failed;
694600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	}
69544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
696856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington  else
697856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington    {
698856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington      /* Need to write PID file for ourselves, not for the child process */
699600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      if (context->pidfile != NULL)
700856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington        {
701856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington          DBusString u;
702856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington
703600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge          _dbus_string_init_const (&u, context->pidfile);
704856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington
705856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington          if (!_dbus_write_pid_file (&u, _dbus_getpid (), error))
706600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	    {
707600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	      _DBUS_ASSERT_ERROR_IS_SET (error);
708600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	      goto failed;
709600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	    }
710856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington        }
711856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington    }
7120e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington
713df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington  /* Write PID if requested */
714df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington  if (print_pid_fd >= 0)
715df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington    {
716df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington      DBusString pid;
717df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington      int bytes;
718df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington
719df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington      if (!_dbus_string_init (&pid))
720df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington        {
721df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          BUS_SET_OOM (error);
722df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          goto failed;
723df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington        }
724df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington
725df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington      if (!_dbus_string_append_int (&pid, _dbus_getpid ()) ||
726df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          !_dbus_string_append (&pid, "\n"))
727df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington        {
728df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          _dbus_string_free (&pid);
729df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          BUS_SET_OOM (error);
730df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          goto failed;
731df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington        }
732df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington
733df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington      bytes = _dbus_string_get_length (&pid);
734df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington      if (_dbus_write (print_pid_fd, &pid, 0, bytes) != bytes)
735df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington        {
736df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          dbus_set_error (error, DBUS_ERROR_FAILED,
737df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington                          "Printing message bus PID: %s\n",
738df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington                          _dbus_strerror (errno));
739df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          _dbus_string_free (&pid);
740df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington          goto failed;
741df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington        }
742df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington
743df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington      if (print_pid_fd > 2)
744df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington        _dbus_close (print_pid_fd, NULL);
745df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington
746df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington      _dbus_string_free (&pid);
747df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington    }
748cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
749cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!bus_selinux_full_init ())
750cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
751cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _dbus_warn ("SELinux initialization failed\n");
752cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
753cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
754cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_postinit (context, parser, error))
755cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
756cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
757cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
758cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
7591d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen
760cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser != NULL)
7616b2af67ae1c675eda69bd0995f5e694591160ec5Colin Walters    {
7626b2af67ae1c675eda69bd0995f5e694591160ec5Colin Walters      bus_config_parser_unref (parser);
7636b2af67ae1c675eda69bd0995f5e694591160ec5Colin Walters      parser = NULL;
7646b2af67ae1c675eda69bd0995f5e694591160ec5Colin Walters    }
765df01c98cc7e83f3336e501fcf2eeee52c95464fbHavoc Pennington
766fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington  /* Here we change our credentials if required,
767fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington   * as soon as we've set up our sockets and pidfile
768fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington   */
769600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (context->user != NULL)
770fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington    {
771fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington      if (!_dbus_change_identity (creds.uid, creds.gid, error))
772600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	{
773600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  _DBUS_ASSERT_ERROR_IS_SET (error);
774600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  goto failed;
775600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	}
776fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington    }
77744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
7786843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington  dbus_server_free_data_slot (&server_data_slot);
7796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
7806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return context;
7816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
78244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington failed:
783cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser != NULL)
784cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    bus_config_parser_unref (parser);
78529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (context != NULL)
78629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    bus_context_unref (context);
78729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
788dd8b1b1d654c983ccc040b59143a11f239de0726Olivier Andrieu  if (server_data_slot >= 0)
789dd8b1b1d654c983ccc040b59143a11f239de0726Olivier Andrieu    dbus_server_free_data_slot (&server_data_slot);
7901b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
7916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return NULL;
7926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
7936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
794600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgedbus_bool_t
795600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgebus_context_reload_config (BusContext *context,
796600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge			   DBusError  *error)
797600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge{
798cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  BusConfigParser *parser;
799cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  DBusString config_file;
800cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  dbus_bool_t ret;
801cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
802caf220015ba1afd9dfca2a93cfa5208058041610Sjoerd Simons  /* Flush the user database cache */
803caf220015ba1afd9dfca2a93cfa5208058041610Sjoerd Simons  _dbus_user_database_flush(context->user_database);
804caf220015ba1afd9dfca2a93cfa5208058041610Sjoerd Simons
805cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  ret = FALSE;
806cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  _dbus_string_init_const (&config_file, context->config_file);
807cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  parser = bus_config_load (&config_file, TRUE, NULL, error);
808cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser == NULL)
809cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
810cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
811cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
812cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
813cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
814cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_every_time (context, parser, TRUE, error))
815cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
816cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
817cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
818cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
819cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_postinit (context, parser, error))
820cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
821cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
822cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
823cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
824cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  ret = TRUE;
825cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
826cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters failed:
827cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser != NULL)
828cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    bus_config_parser_unref (parser);
829cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  return ret;
830600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge}
831600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
83229c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonstatic void
83329c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonshutdown_server (BusContext *context,
83429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                 DBusServer *server)
8356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
83629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (server == NULL ||
83729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      !dbus_server_get_is_connected (server))
8383bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    return;
8393bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
84029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!dbus_server_set_watch_functions (server,
841f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                        NULL, NULL, NULL,
8423bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                        context,
8433bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                        NULL))
8443bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("setting watch functions to NULL failed");
8453bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
84629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!dbus_server_set_timeout_functions (server,
847f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                          NULL, NULL, NULL,
8483bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                          context,
8493bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                          NULL))
8503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("setting timeout functions to NULL failed");
8513bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
85229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  dbus_server_disconnect (server);
85329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington}
85429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
85529c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonvoid
85629c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonbus_context_shutdown (BusContext  *context)
85729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington{
85829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusList *link;
85929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
86029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  link = _dbus_list_get_first_link (&context->servers);
86129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  while (link != NULL)
86229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
86329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      shutdown_server (context, link->data);
86429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
86529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      link = _dbus_list_get_next_link (&context->servers, link);
86629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
8676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
8686ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
8699f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalBusContext *
8706ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_ref (BusContext *context)
8716ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
8726ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (context->refcount > 0);
8736ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  context->refcount += 1;
8749f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal
8759f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal  return context;
8766ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
8776ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
8786ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid
8796ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_unref (BusContext *context)
8806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
8816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (context->refcount > 0);
8826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  context->refcount -= 1;
8836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
8846ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (context->refcount == 0)
8856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
88629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      DBusList *link;
88729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
888ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_verbose ("Finalizing bus context %p\n", context);
889ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
8903bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington      bus_context_shutdown (context);
891ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
892ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (context->connections)
893ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
894ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_connections_unref (context->connections);
895ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          context->connections = NULL;
896ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
8973bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
8986ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (context->registry)
899ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
900ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_registry_unref (context->registry);
901ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          context->registry = NULL;
902ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
903ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
9046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (context->activation)
905ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
906ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_activation_unref (context->activation);
907ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          context->activation = NULL;
908ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
90929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
91029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      link = _dbus_list_get_first_link (&context->servers);
91129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      while (link != NULL)
912ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
91329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          dbus_server_unref (link->data);
91429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
91529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          link = _dbus_list_get_next_link (&context->servers, link);
916ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
91729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      _dbus_list_clear (&context->servers);
918b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
919bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington      if (context->policy)
920b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington        {
921bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington          bus_policy_unref (context->policy);
922bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington          context->policy = NULL;
923b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington        }
924bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington
9251b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      if (context->loop)
9261b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        {
927df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington          _dbus_loop_unref (context->loop);
9281b08036103a70159e7a67b2349306710edcd6654Havoc Pennington          context->loop = NULL;
9291b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        }
930a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
931a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (context->matchmaker)
932a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        {
933a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          bus_matchmaker_unref (context->matchmaker);
934a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          context->matchmaker = NULL;
935a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        }
9361b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
937600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      dbus_free (context->config_file);
938eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington      dbus_free (context->type);
9396ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      dbus_free (context->address);
940600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      dbus_free (context->user);
9410e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington
9420e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington      if (context->pidfile)
9430e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	{
9440e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington          DBusString u;
9450e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington          _dbus_string_init_const (&u, context->pidfile);
9460e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington
9470e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington          /* Deliberately ignore errors here, since there's not much
9480e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	   * we can do about it, and we're exiting anyways.
9490e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	   */
9500e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	  _dbus_delete_file (&u, NULL);
9510e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington
9520e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington          dbus_free (context->pidfile);
9530e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	}
9540e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington
955dd8b1b1d654c983ccc040b59143a11f239de0726Olivier Andrieu      if (context->user_database != NULL)
956dd8b1b1d654c983ccc040b59143a11f239de0726Olivier Andrieu	_dbus_user_database_unref (context->user_database);
9577c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington
9586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      dbus_free (context);
9591b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
9606843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington      dbus_server_free_data_slot (&server_data_slot);
9616ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
9626ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
9636ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
964eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington/* type may be NULL */
965eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonconst char*
966eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonbus_context_get_type (BusContext *context)
967eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington{
968eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  return context->type;
969eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington}
970eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington
971e45e4382274149ca60c11f068ccca719f3598074Havoc Penningtonconst char*
972e45e4382274149ca60c11f068ccca719f3598074Havoc Penningtonbus_context_get_address (BusContext *context)
973e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington{
974e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington  return context->address;
975e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington}
976e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington
9776ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry*
9786ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_get_registry (BusContext  *context)
9796ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
9806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return context->registry;
9816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
9826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
9836ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections*
9846ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_get_connections (BusContext  *context)
9856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
9866ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return context->connections;
9876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
9886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
9896ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation*
9906ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_get_activation (BusContext  *context)
9916ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
9926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return context->activation;
9936ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
994a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
995a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc PenningtonBusMatchmaker*
996a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_context_get_matchmaker (BusContext  *context)
997a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
998a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return context->matchmaker;
999a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
1000a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1001df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc PenningtonDBusLoop*
10021b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonbus_context_get_loop (BusContext *context)
10031b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
10041b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  return context->loop;
10051b08036103a70159e7a67b2349306710edcd6654Havoc Pennington}
10061b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
10077c022a80c9b8c5b085514ea49f983c0489e945abHavoc PenningtonDBusUserDatabase*
10087c022a80c9b8c5b085514ea49f983c0489e945abHavoc Penningtonbus_context_get_user_database (BusContext *context)
10097c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington{
10107c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  return context->user_database;
10117c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington}
10127c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington
1013a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t
1014a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtonbus_context_allow_user (BusContext   *context,
1015a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington                        unsigned long uid)
1016a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
10177c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington  return bus_policy_allow_user (context->policy,
10187c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington                                context->user_database,
10197c022a80c9b8c5b085514ea49f983c0489e945abHavoc Pennington                                uid);
1020a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
1021a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
10221e9b185b0c274ef0d684b1e43418388225321e72Havoc PenningtonBusPolicy *
10231e9b185b0c274ef0d684b1e43418388225321e72Havoc Penningtonbus_context_get_policy (BusContext *context)
10241e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington{
10251e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  return context->policy;
10261e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington}
10271e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
1028bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc PenningtonBusClientPolicy*
1029bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Penningtonbus_context_create_client_policy (BusContext      *context,
1030e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                                  DBusConnection  *connection,
1031e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                                  DBusError       *error)
1032a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
1033e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1034e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  return bus_policy_create_client_policy (context->policy, connection,
1035e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                                          error);
1036a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
10372250539aeee0569f8861841d1f5ff16f1539715eHavoc Pennington
10382250539aeee0569f8861841d1f5ff16f1539715eHavoc Penningtonint
10392250539aeee0569f8861841d1f5ff16f1539715eHavoc Penningtonbus_context_get_activation_timeout (BusContext *context)
10402250539aeee0569f8861841d1f5ff16f1539715eHavoc Pennington{
10412250539aeee0569f8861841d1f5ff16f1539715eHavoc Pennington
10423185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.activation_timeout;
10432250539aeee0569f8861841d1f5ff16f1539715eHavoc Pennington}
1044777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1045983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonint
1046983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_context_get_auth_timeout (BusContext *context)
1047983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{
10483185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.auth_timeout;
1049983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington}
1050983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
1051983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonint
1052983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_context_get_max_completed_connections (BusContext *context)
1053983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{
10543185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.max_completed_connections;
1055983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington}
1056983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
1057983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonint
1058983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_context_get_max_incomplete_connections (BusContext *context)
1059983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{
10603185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.max_incomplete_connections;
1061983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington}
1062983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
1063983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonint
1064983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_context_get_max_connections_per_user (BusContext *context)
1065983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{
10663185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.max_connections_per_user;
1067983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington}
1068983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
1069b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonint
1070b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonbus_context_get_max_pending_activations (BusContext *context)
1071b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington{
1072b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  return context->limits.max_pending_activations;
1073b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington}
1074b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington
1075b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonint
1076b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonbus_context_get_max_services_per_connection (BusContext *context)
1077b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington{
1078b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  return context->limits.max_services_per_connection;
1079b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington}
1080b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington
1081a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonint
1082a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_context_get_max_match_rules_per_connection (BusContext *context)
1083a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
1084a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return context->limits.max_match_rules_per_connection;
1085a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
1086a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
108764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonint
108864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_context_get_max_replies_per_connection (BusContext *context)
108964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{
109064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  return context->limits.max_replies_per_connection;
109164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington}
109264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington
109364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonint
109464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_context_get_reply_timeout (BusContext *context)
109564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{
109664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  return context->limits.reply_timeout;
109764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington}
109864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington
10996a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington/*
11006a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * addressed_recipient is the recipient specified in the message.
11016a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington *
11026a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * proposed_recipient is the recipient we're considering sending
11036a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * to right this second, and may be an eavesdropper.
11046a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington *
11056a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * sender is the sender of the message.
11066a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington *
11076a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * NULL for proposed_recipient or sender definitely means the bus driver.
11086a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington *
11096a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * NULL for addressed_recipient may mean the bus driver, or may mean
11106a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * no destination was specified in the message (e.g. a signal).
11116a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington */
1112777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtondbus_bool_t
1113777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_context_check_security_policy (BusContext     *context,
111464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington                                   BusTransaction *transaction,
1115777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                   DBusConnection *sender,
1116a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                   DBusConnection *addressed_recipient,
1117a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                   DBusConnection *proposed_recipient,
1118777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                   DBusMessage    *message,
1119777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                   DBusError      *error)
1120777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington{
1121777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  BusClientPolicy *sender_policy;
1122777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  BusClientPolicy *recipient_policy;
112364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  int type;
11243251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington  dbus_bool_t requested_reply;
112564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington
112664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  type = dbus_message_get_type (message);
112764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington
112864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  /* dispatch.c was supposed to ensure these invariants */
112964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  _dbus_assert (dbus_message_get_destination (message) != NULL ||
1130eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington                type == DBUS_MESSAGE_TYPE_SIGNAL ||
1131eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington                (sender == NULL && !bus_connection_is_active (proposed_recipient)));
113264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  _dbus_assert (type == DBUS_MESSAGE_TYPE_SIGNAL ||
113364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington                addressed_recipient != NULL ||
1134248895207dc15914ac7970a6d1431308075dca1dColin Walters                strcmp (dbus_message_get_destination (message), DBUS_SERVICE_DBUS) == 0);
1135a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
11363251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington  switch (type)
11373251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    {
11383251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    case DBUS_MESSAGE_TYPE_METHOD_CALL:
11393251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    case DBUS_MESSAGE_TYPE_SIGNAL:
11403251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    case DBUS_MESSAGE_TYPE_METHOD_RETURN:
11413251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    case DBUS_MESSAGE_TYPE_ERROR:
11423251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      break;
11433251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
11443251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    default:
11453251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      _dbus_verbose ("security check disallowing message of unknown type %d\n",
11463251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                     type);
11473251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
11483251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
11493251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      "Message bus will not accept messages of unknown type\n");
11503251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
11513251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      return FALSE;
11523251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    }
11533251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
11543251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington  requested_reply = FALSE;
11553251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
1156777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (sender != NULL)
1157777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
1158935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      const char *dest;
1159935a41a04c3f638134fa905503fc41ddbd18902fColin Walters
1160935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      dest = dbus_message_get_destination (message);
1161935a41a04c3f638134fa905503fc41ddbd18902fColin Walters
11621e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington      /* First verify the SELinux access controls.  If allowed then
11631e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington       * go on with the standard checks.
11641e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington       */
1165935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      if (!bus_selinux_allows_send (sender, proposed_recipient,
1166935a41a04c3f638134fa905503fc41ddbd18902fColin Walters				    dbus_message_type_to_string (dbus_message_get_type (message)),
1167935a41a04c3f638134fa905503fc41ddbd18902fColin Walters				    dbus_message_get_interface (message),
1168935a41a04c3f638134fa905503fc41ddbd18902fColin Walters				    dbus_message_get_member (message),
1169935a41a04c3f638134fa905503fc41ddbd18902fColin Walters				    dbus_message_get_error_name (message),
117044656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen				    dest ? dest : DBUS_SERVICE_DBUS, error))
11711e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington        {
117244656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen
117344656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen	  if (dbus_error_is_set (error) &&
117444656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen	      dbus_error_has_name (error, DBUS_ERROR_NO_MEMORY))
117544656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen	    {
117644656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen	      return FALSE;
117744656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen	    }
117844656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen
117944656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen
11801e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington          dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
11811e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          "An SELinux policy prevents this sender "
11821e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          "from sending this message to this recipient "
11831e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          "(rejected message had interface \"%s\" "
11841e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          "member \"%s\" error name \"%s\" destination \"%s\")",
11851e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          dbus_message_get_interface (message) ?
11861e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          dbus_message_get_interface (message) : "(unset)",
11871e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          dbus_message_get_member (message) ?
11881e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          dbus_message_get_member (message) : "(unset)",
11891e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          dbus_message_get_error_name (message) ?
11901e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington                          dbus_message_get_error_name (message) : "(unset)",
1191248895207dc15914ac7970a6d1431308075dca1dColin Walters                          dest ? dest : DBUS_SERVICE_DBUS);
11921e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington          _dbus_verbose ("SELinux security check denying send to service\n");
11931e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington          return FALSE;
11941e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington        }
11951e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
1196e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      if (bus_connection_is_active (sender))
1197b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington        {
1198e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          sender_policy = bus_connection_get_policy (sender);
1199e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_assert (sender_policy != NULL);
12003251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
12013251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington          /* Fill in requested_reply variable with TRUE if this is a
12023251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington           * reply and the reply was pending.
12033251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington           */
12043251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington          if (dbus_message_get_reply_serial (message) != 0)
120564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington            {
120664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington              if (proposed_recipient != NULL /* not to the bus driver */ &&
12073251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  addressed_recipient == proposed_recipient /* not eavesdropping */)
12083251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                {
12093251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  DBusError error2;
12103251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
12113251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  dbus_error_init (&error2);
12123251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  requested_reply = bus_connections_check_reply (bus_connection_get_connections (sender),
12133251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                                                 transaction,
12143251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                                                 sender, addressed_recipient, message,
12153251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                                                 &error2);
12163251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  if (dbus_error_is_set (&error2))
12173251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                    {
12183251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      dbus_move_error (&error2, error);
12193251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      return FALSE;
12203251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                    }
12213251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                }
122264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington            }
1223e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        }
1224e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      else
1225e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        {
1226e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          /* Policy for inactive connections is that they can only send
1227e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington           * the hello message to the bus driver
1228e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington           */
1229a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          if (proposed_recipient == NULL &&
123068a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington              dbus_message_is_method_call (message,
1231248895207dc15914ac7970a6d1431308075dca1dColin Walters                                           DBUS_INTERFACE_DBUS,
123268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                           "Hello"))
1233e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington            {
1234e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              _dbus_verbose ("security check allowing %s message\n",
123595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                             "Hello");
1236e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              return TRUE;
1237e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington            }
1238e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          else
1239e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington            {
1240e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              _dbus_verbose ("security check disallowing non-%s message\n",
124195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                             "Hello");
1242e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington
1243e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1244e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                              "Client tried to send a message other than %s without being registered",
124595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                              "Hello");
1246e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington
1247e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              return FALSE;
1248e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington            }
1249b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington        }
1250777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1251777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  else
12523251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    {
12533251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      sender_policy = NULL;
12543251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
12553251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      /* If the sender is the bus driver, we assume any reply was a
12563251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington       * requested reply as bus driver won't send bogus ones
12573251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington       */
12583251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      if (addressed_recipient == proposed_recipient /* not eavesdropping */ &&
12593251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington          dbus_message_get_reply_serial (message) != 0)
12603251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington        requested_reply = TRUE;
12613251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    }
1262777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1263e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  _dbus_assert ((sender != NULL && sender_policy != NULL) ||
1264e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                (sender == NULL && sender_policy == NULL));
1265e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington
1266a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (proposed_recipient != NULL)
1267777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
1268e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      /* only the bus driver can send to an inactive recipient (as it
1269e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington       * owns no services, so other apps can't address it). Inactive
1270e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington       * recipients can receive any message.
1271e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington       */
1272a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (bus_connection_is_active (proposed_recipient))
1273b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington        {
1274a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          recipient_policy = bus_connection_get_policy (proposed_recipient);
1275e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_assert (recipient_policy != NULL);
1276e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        }
1277e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      else if (sender == NULL)
1278e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        {
1279e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_verbose ("security check using NULL recipient policy for message from bus\n");
1280e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          recipient_policy = NULL;
1281e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        }
1282e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      else
1283e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        {
1284e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_assert_not_reached ("a message was somehow sent to an inactive recipient from a source other than the message bus\n");
1285e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          recipient_policy = NULL;
1286b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington        }
1287777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1288777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  else
1289777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    recipient_policy = NULL;
1290e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington
1291a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_assert ((proposed_recipient != NULL && recipient_policy != NULL) ||
1292a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                (proposed_recipient != NULL && sender == NULL && recipient_policy == NULL) ||
1293a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                (proposed_recipient == NULL && recipient_policy == NULL));
1294e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington
1295e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (sender_policy &&
1296777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      !bus_client_policy_check_can_send (sender_policy,
12977c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington                                         context->registry,
12987c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington                                         requested_reply,
12997c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington                                         proposed_recipient,
1300777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                         message))
1301777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
1302935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      const char *dest;
1303935a41a04c3f638134fa905503fc41ddbd18902fColin Walters
1304935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      dest = dbus_message_get_destination (message);
1305777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1306777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                      "A security policy in place prevents this sender "
1307777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                      "from sending this message to this recipient, "
1308777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                      "see message bus configuration file (rejected message "
130995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\")",
131095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_interface (message) ?
131195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_interface (message) : "(unset)",
131295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_member (message) ?
131395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_member (message) : "(unset)",
131495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_error_name (message) ?
131595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_error_name (message) : "(unset)",
1316248895207dc15914ac7970a6d1431308075dca1dColin Walters                      dest ? dest : DBUS_SERVICE_DBUS);
1317306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      _dbus_verbose ("security policy disallowing message due to sender policy\n");
1318777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      return FALSE;
1319777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1320777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1321e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (recipient_policy &&
1322777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      !bus_client_policy_check_can_receive (recipient_policy,
13233251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                            context->registry,
13243251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                            requested_reply,
13253251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                            sender,
1326a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                            addressed_recipient, proposed_recipient,
1327777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                            message))
1328777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
1329935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      const char *dest;
1330935a41a04c3f638134fa905503fc41ddbd18902fColin Walters
1331935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      dest = dbus_message_get_destination (message);
1332777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1333777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                      "A security policy in place prevents this recipient "
1334777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                      "from receiving this message from this sender, "
1335777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                      "see message bus configuration file (rejected message "
13363251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      "had interface \"%s\" member \"%s\" error name \"%s\" destination \"%s\" reply serial %u requested_reply=%d)",
133795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_interface (message) ?
133895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_interface (message) : "(unset)",
133995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_member (message) ?
134095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_member (message) : "(unset)",
134195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_error_name (message) ?
134295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_error_name (message) : "(unset)",
1343248895207dc15914ac7970a6d1431308075dca1dColin Walters                      dest ? dest : DBUS_SERVICE_DBUS,
13443251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      dbus_message_get_reply_serial (message),
13453251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      requested_reply);
1346306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      _dbus_verbose ("security policy disallowing message due to recipient policy\n");
1347777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      return FALSE;
1348777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1349777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1350983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  /* See if limits on size have been exceeded */
1351a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (proposed_recipient &&
1352a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      dbus_connection_get_outgoing_size (proposed_recipient) >
13533185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington      context->limits.max_outgoing_bytes)
1354983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    {
1355935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      const char *dest;
1356935a41a04c3f638134fa905503fc41ddbd18902fColin Walters
1357935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      dest = dbus_message_get_destination (message);
1358983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
1359983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington                      "The destination service \"%s\" has a full message queue",
1360a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      dest ? dest : (proposed_recipient ?
1361a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                     bus_connection_get_name (proposed_recipient) :
1362248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_SERVICE_DBUS));
1363306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      _dbus_verbose ("security policy disallowing message due to full message queue\n");
1364983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      return FALSE;
1365983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    }
1366306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington
1367d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J  /* Record that we will allow a reply here in the future (don't
1368d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J   * bother if the recipient is the bus or this is an eavesdropping
1369d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J   * connection). Only the addressed recipient may reply.
1370d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J   */
1371d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J  if (type == DBUS_MESSAGE_TYPE_METHOD_CALL &&
1372d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      sender &&
1373d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      addressed_recipient &&
1374d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      addressed_recipient == proposed_recipient && /* not eavesdropping */
1375d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      !bus_connections_expect_reply (bus_connection_get_connections (sender),
1376d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J                                     transaction,
1377d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J                                     sender, addressed_recipient,
1378d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J                                     message, error))
137964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington    {
1380d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      _dbus_verbose ("Failed to record reply expectation or problem with the message expecting a reply\n");
1381d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      return FALSE;
138264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington    }
138364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington
1384306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington  _dbus_verbose ("security policy allowing message\n");
1385777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  return TRUE;
1386777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington}
1387