1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
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
7921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering *
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.
17921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering *
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
205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
216ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington *
226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington */
236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "bus.h"
266ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "activation.h"
276ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "connection.h"
286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "services.h"
296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include "utils.h"
30b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington#include "policy.h"
3129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington#include "config-parser.h"
32a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington#include "signals.h"
331e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington#include "selinux.h"
341d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen#include "dir-watch.h"
35b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington#include <dbus/dbus-list.h>
36b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington#include <dbus/dbus-hash.h>
37f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters#include <dbus/dbus-credentials.h>
386ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington#include <dbus/dbus-internals.h>
39401503681370c68c194a849f76f58b3a0b529bb0Ralf Habacker#ifdef DBUS_CYGWIN
400e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz#include <signal.h>
41401503681370c68c194a849f76f58b3a0b529bb0Ralf Habacker#endif
426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
436ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstruct BusContext
446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  int refcount;
4654b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  DBusGUID uuid;
47600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  char *config_file;
48eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  char *type;
496ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes  char *servicehelper;
50b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington  char *address;
513100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#ifdef WANT_PIDFILE
520e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington  char *pidfile;
533100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#endif
54600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  char *user;
55f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  char *log_prefix;
56df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  DBusLoop *loop;
5729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusList *servers;
586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusConnections *connections;
596ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusActivation *activation;
606ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusRegistry *registry;
61bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington  BusPolicy *policy;
62a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  BusMatchmaker *matchmaker;
633185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  BusLimits limits;
64600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  unsigned int fork : 1;
65bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  unsigned int syslog : 1;
660314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen  unsigned int keep_umask : 1;
6707a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker  unsigned int allow_anonymous : 1;
68b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  unsigned int systemd_activation : 1;
696ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington};
706ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
716843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Penningtonstatic dbus_int32_t server_data_slot = -1;
721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
731b08036103a70159e7a67b2349306710edcd6654Havoc Penningtontypedef struct
741b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
751b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
761b08036103a70159e7a67b2349306710edcd6654Havoc Pennington} BusServerData;
771b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
781b08036103a70159e7a67b2349306710edcd6654Havoc Pennington#define BUS_SERVER_DATA(server) (dbus_server_get_data ((server), server_data_slot))
791b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
801b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonstatic BusContext*
811b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonserver_get_context (DBusServer *server)
821b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
831b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
841b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusServerData *bd;
85921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
866843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington  if (!dbus_server_allocate_data_slot (&server_data_slot))
871b08036103a70159e7a67b2349306710edcd6654Havoc Pennington    return NULL;
881b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
891b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  bd = BUS_SERVER_DATA (server);
901b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  if (bd == NULL)
91e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington    {
926843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington      dbus_server_free_data_slot (&server_data_slot);
93e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington      return NULL;
94e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington    }
951b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
961b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = bd->context;
971b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
986843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington  dbus_server_free_data_slot (&server_data_slot);
991b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
1001b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  return context;
1011b08036103a70159e7a67b2349306710edcd6654Havoc Pennington}
1021b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
103b4a1100f4f81534e2aac0141afda750f318223d4Havoc Penningtonstatic dbus_bool_t
1046ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonserver_watch_callback (DBusWatch     *watch,
1056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                       unsigned int   condition,
1066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                       void          *data)
1076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
1083df260c07102745c5606c313af862558f105f83eHavoc Pennington  /* FIXME this can be done in dbus-mainloop.c
1093df260c07102745c5606c313af862558f105f83eHavoc Pennington   * if the code in activation.c for the babysitter
1103df260c07102745c5606c313af862558f105f83eHavoc Pennington   * watch handler is fixed.
1113df260c07102745c5606c313af862558f105f83eHavoc Pennington   */
112921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1133df260c07102745c5606c313af862558f105f83eHavoc Pennington  return dbus_watch_handle (watch, condition);
1146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
1156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1163bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
1176ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonadd_server_watch (DBusWatch  *watch,
11829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                  void       *data)
1196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
1201b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusServer *server = data;
1211b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
122921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1231b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = server_get_context (server);
124921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
125df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  return _dbus_loop_add_watch (context->loop,
126df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                               watch, server_watch_callback, server,
127df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                               NULL);
1286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
1296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1306ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstatic void
1316ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonremove_server_watch (DBusWatch  *watch,
13229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                     void       *data)
1336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
1341b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusServer *server = data;
1351b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
136921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1371b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = server_get_context (server);
138921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
139df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  _dbus_loop_remove_watch (context->loop,
140df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                           watch, server_watch_callback, server);
1416ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
1426ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1434c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington
1446ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonstatic void
1453bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonserver_timeout_callback (DBusTimeout   *timeout,
1463bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                         void          *data)
1473bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
148b4a1100f4f81534e2aac0141afda750f318223d4Havoc Pennington  /* can return FALSE on OOM but we just let it fire again later */
1493bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington  dbus_timeout_handle (timeout);
1503bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
1513bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1523bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic dbus_bool_t
1533bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonadd_server_timeout (DBusTimeout *timeout,
15429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                    void        *data)
1553bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
1561b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusServer *server = data;
1571b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
158921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1591b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = server_get_context (server);
1601b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
161df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  return _dbus_loop_add_timeout (context->loop,
162df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                                 timeout, server_timeout_callback, server, NULL);
1633bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
1643bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1653bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
1663bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonremove_server_timeout (DBusTimeout *timeout,
16729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                       void        *data)
1683bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington{
1691b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  DBusServer *server = data;
1701b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusContext *context;
171921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1721b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  context = server_get_context (server);
173921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
174df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington  _dbus_loop_remove_timeout (context->loop,
175df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington                             timeout, server_timeout_callback, server);
1763bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington}
1773bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington
1783bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Penningtonstatic void
1796ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonnew_connection_callback (DBusServer     *server,
1806ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                         DBusConnection *new_connection,
1816ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington                         void           *data)
1826ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
1836ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  BusContext *context = data;
184921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1856ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (!bus_connections_setup_connection (context->connections, new_connection))
186ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
187ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_verbose ("No memory to setup new connection\n");
1886ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
189ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      /* if we don't do this, it will get unref'd without
190ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * being disconnected... kind of strange really
191ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * that we have to do this, people won't get it right
192ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * in general.
193ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       */
19411fd3b965f9c8dc062913d82d6a2cf73b6ba0bdaJohn (J      dbus_connection_close (new_connection);
195ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
196983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
197983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  dbus_connection_set_max_received_size (new_connection,
1983185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington                                         context->limits.max_incoming_bytes);
199983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
200983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  dbus_connection_set_max_message_size (new_connection,
2013185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington                                        context->limits.max_message_size);
20264ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering
20364ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering  dbus_connection_set_max_received_unix_fds (new_connection,
20464ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering                                         context->limits.max_incoming_unix_fds);
20564ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering
20664ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering  dbus_connection_set_max_message_unix_fds (new_connection,
20764ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering                                        context->limits.max_message_unix_fds);
208921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
20907a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker  dbus_connection_set_allow_anonymous (new_connection,
21007a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker                                       context->allow_anonymous);
21107a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker
2124c95a9782c65f88e2904c44abeb734a1b00f6353Havoc Pennington  /* on OOM, we won't have ref'd the connection so it will die. */
2136ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
2146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
215b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Penningtonstatic void
2161b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonfree_server_data (void *data)
2171b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
218921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering  BusServerData *bd = data;
219921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
2201b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  dbus_free (bd);
2211b08036103a70159e7a67b2349306710edcd6654Havoc Pennington}
2221b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
22329c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonstatic dbus_bool_t
22429c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonsetup_server (BusContext *context,
22529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington              DBusServer *server,
22644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington              char      **auth_mechanisms,
22729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington              DBusError  *error)
22844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{
2291b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  BusServerData *bd;
23007e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington
23107e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington  bd = dbus_new0 (BusServerData, 1);
2324cc2bfa10e1a840e0da34a588f719779cc284a79John (J  if (bd == NULL || !dbus_server_set_data (server,
2334cc2bfa10e1a840e0da34a588f719779cc284a79John (J                                           server_data_slot,
2344cc2bfa10e1a840e0da34a588f719779cc284a79John (J                                           bd, free_server_data))
23507e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington    {
23607e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington      dbus_free (bd);
23707e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington      BUS_SET_OOM (error);
23807e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington      return FALSE;
23907e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington    }
24007e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington
24107e3f76f8e65af8d9de063c62af38c5b7495bc76Havoc Pennington  bd->context = context;
242921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
24344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  if (!dbus_server_set_auth_mechanisms (server, (const char**) auth_mechanisms))
24444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
24544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      BUS_SET_OOM (error);
24644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      return FALSE;
24744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
248921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
24929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  dbus_server_set_new_connection_function (server,
25029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                           new_connection_callback,
25129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                           context, NULL);
252921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
25329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!dbus_server_set_watch_functions (server,
25429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        add_server_watch,
25529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        remove_server_watch,
25629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        NULL,
25729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        server,
25829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                        NULL))
25929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
26029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      BUS_SET_OOM (error);
26129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      return FALSE;
26229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
26329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
26429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!dbus_server_set_timeout_functions (server,
26529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                          add_server_timeout,
26629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                          remove_server_timeout,
26729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                          NULL,
26829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                                          server, NULL))
26929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
27029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      BUS_SET_OOM (error);
27129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      return FALSE;
27229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
273921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
27429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  return TRUE;
27529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington}
27629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
277600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge/* This code only gets executed the first time the
27879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * config files are parsed.  It is not executed
27979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * when config files are reloaded.
28079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington */
281600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgestatic dbus_bool_t
282921bc585ca44b02684d368058a8df8300342dcd0Lennart Poetteringprocess_config_first_time_only (BusContext       *context,
283921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering				BusConfigParser  *parser,
284921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering                                const DBusString *address,
285b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering                                dbus_bool_t      systemd_activation,
286921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering				DBusError        *error)
2876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
288f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  DBusString log_prefix;
28929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusList *link;
29029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusList **addresses;
29179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  const char *user, *pidfile;
29244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  char **auth_mechanisms;
29344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  DBusList **auth_mechanisms_list;
29444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  int len;
295600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  dbus_bool_t retval;
29629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
297600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
298e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington
299600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  retval = FALSE;
30044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  auth_mechanisms = NULL;
301856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington
302b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  context->systemd_activation = systemd_activation;
303b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
3043100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#ifdef WANT_PIDFILE
305856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington  /* Check for an existing pid file. Of course this is a race;
306856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington   * we'd have to use fcntl() locks on the pid file to
307856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington   * avoid that. But we want to check for the pid file
308856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington   * before overwriting any existing sockets, etc.
309856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington   */
310856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington  pidfile = bus_config_parser_get_pidfile (parser);
311856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington  if (pidfile != NULL)
312856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington    {
313856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington      DBusString u;
314856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington      DBusStat stbuf;
315921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
316856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington      _dbus_string_init_const (&u, pidfile);
317f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
318eb37885909180e7e4c25e5337bec385082174dbdOlivier Andrieu      if (_dbus_stat (&u, &stbuf, NULL))
319f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        {
3200e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz#ifdef DBUS_CYGWIN
3210e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          DBusString p;
3220e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          long /* int */ pid;
3230e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz
3240e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          _dbus_string_init (&p);
3250e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          _dbus_file_get_contents(&p, &u, NULL);
3260e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          _dbus_string_parse_int(&p, 0, &pid, NULL);
3270e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          _dbus_string_free(&p);
3280e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz
3290e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          if ((kill((int)pid, 0))) {
3300e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz            dbus_set_error(NULL, DBUS_ERROR_FILE_EXISTS,
3310e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz                           "pid %ld not running, removing stale pid file\n",
3320e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz                           pid);
3330e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz            _dbus_delete_file(&u, NULL);
3340e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          } else {
3350e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz#endif
336f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters          dbus_set_error (error, DBUS_ERROR_FAILED,
337f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters		                  "The pid file \"%s\" exists, if the message bus is not running, remove this file",
338f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters                          pidfile);
339f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters	      goto failed;
3400e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz#ifdef DBUS_CYGWIN
3410e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz          }
3420e31935343644bb3eba77e2a1f4699ead3b33625Yaakov Selkowitz#endif
343f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        }
344856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington    }
345f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
346600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  /* keep around the pid filename so we can delete it later */
347600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->pidfile = _dbus_strdup (pidfile);
3483100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#endif
34944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
350f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  /* note that type may be NULL */
351f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  context->type = _dbus_strdup (bus_config_parser_get_type (parser));
352f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  if (bus_config_parser_get_type (parser) != NULL && context->type == NULL)
353f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    goto oom;
354f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
355f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  user = bus_config_parser_get_user (parser);
356f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  if (user != NULL)
357f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    {
358f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      context->user = _dbus_strdup (user);
359f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (context->user == NULL)
360f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom;
361f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    }
362f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
363f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  /* Set up the prefix for syslog messages */
364f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  if (!_dbus_string_init (&log_prefix))
365f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    goto oom;
366f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  if (context->type && !strcmp (context->type, "system"))
367f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    {
368f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (!_dbus_string_append (&log_prefix, "[system] "))
369f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom;
370f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    }
371f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  else if (context->type && !strcmp (context->type, "session"))
372f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    {
373f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      DBusCredentials *credentials;
374f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
375f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      credentials = _dbus_credentials_new_from_current_process ();
376f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (!credentials)
377f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom;
378f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (!_dbus_string_append (&log_prefix, "[session "))
379f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom;
380f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (!_dbus_credentials_to_string_append (credentials, &log_prefix))
381f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom;
382f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (!_dbus_string_append (&log_prefix, "] "))
383f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom;
384f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      _dbus_credentials_unref (credentials);
385f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    }
386f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  if (!_dbus_string_steal_data (&log_prefix, &context->log_prefix))
387f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    goto oom;
388f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  _dbus_string_free (&log_prefix);
389f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
39044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  /* Build an array of auth mechanisms */
391f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
39244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  auth_mechanisms_list = bus_config_parser_get_mechanisms (parser);
39344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  len = _dbus_list_get_length (auth_mechanisms_list);
39444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
39544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  if (len > 0)
39644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
39744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      int i;
39844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
39944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      auth_mechanisms = dbus_new0 (char*, len + 1);
40044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      if (auth_mechanisms == NULL)
401f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom;
402f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
40344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      i = 0;
40444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      link = _dbus_list_get_first_link (auth_mechanisms_list);
40544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      while (link != NULL)
40644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        {
40744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          auth_mechanisms[i] = _dbus_strdup (link->data);
40844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          if (auth_mechanisms[i] == NULL)
409f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters            goto oom;
41044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          link = _dbus_list_get_next_link (auth_mechanisms_list, link);
41144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        }
41244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
41344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  else
41444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
41544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      auth_mechanisms = NULL;
41644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
41744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
41844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  /* Listen on our addresses */
419921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
420921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering  if (address)
42129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
42229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      DBusServer *server;
423921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
424921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering      server = dbus_server_listen (_dbus_string_get_const_data(address), error);
42529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (server == NULL)
426921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering        {
427921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          _DBUS_ASSERT_ERROR_IS_SET (error);
428921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          goto failed;
429921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering        }
43044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      else if (!setup_server (context, server, auth_mechanisms, error))
431921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering        {
432921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          _DBUS_ASSERT_ERROR_IS_SET (error);
433921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          goto failed;
434921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering        }
43529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
43629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (!_dbus_list_append (&context->servers, server))
437f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom;
438921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering    }
439921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering  else
440921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering    {
441921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering      addresses = bus_config_parser_get_addresses (parser);
442921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
443921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering      link = _dbus_list_get_first_link (addresses);
444921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering      while (link != NULL)
445921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering        {
446921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          DBusServer *server;
447600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
448921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          server = dbus_server_listen (link->data, error);
449921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          if (server == NULL)
450921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering            {
451921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering              _DBUS_ASSERT_ERROR_IS_SET (error);
452921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering              goto failed;
453921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering            }
454921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          else if (!setup_server (context, server, auth_mechanisms, error))
455921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering            {
456921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering              _DBUS_ASSERT_ERROR_IS_SET (error);
457921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering              goto failed;
458921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering            }
459921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
460921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          if (!_dbus_list_append (&context->servers, server))
461921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering            goto oom;
462921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
463921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          link = _dbus_list_get_next_link (addresses, link);
464921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering        }
465600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
466600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
467600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->fork = bus_config_parser_get_fork (parser);
468bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  context->syslog = bus_config_parser_get_syslog (parser);
4690314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen  context->keep_umask = bus_config_parser_get_keep_umask (parser);
47007a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker  context->allow_anonymous = bus_config_parser_get_allow_anonymous (parser);
471f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
472600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
473600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  retval = TRUE;
474600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
475600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge failed:
476600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  dbus_free_string_array (auth_mechanisms);
477600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  return retval;
478f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
479f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters oom:
480f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  BUS_SET_OOM (error);
481f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  dbus_free_string_array (auth_mechanisms);
482f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  return FALSE;
483600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge}
484600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
485600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge/* This code gets executed every time the config files
48679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * are parsed: both during BusContext construction
48779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * and on reloads. This function is slightly screwy
48879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * since it can do a "half reload" in out-of-memory
48979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * situations. Realistically, unlikely to ever matter.
49079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington */
491600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgestatic dbus_bool_t
492600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgeprocess_config_every_time (BusContext      *context,
493600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge			   BusConfigParser *parser,
494600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge			   dbus_bool_t      is_reload,
495600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge			   DBusError       *error)
496600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge{
497600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  DBusString full_address;
498600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  DBusList *link;
4996ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes  DBusList **dirs;
5005d77d1503e61339a971b099b8a4d24ffc502045bRay Strode  BusActivation *new_activation;
5019a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J  char *addr;
50279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  const char *servicehelper;
50379d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  char *s;
504921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
505600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  dbus_bool_t retval;
506600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
507600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
508600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
5099a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J  addr = NULL;
510600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  retval = FALSE;
511600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
512600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (!_dbus_string_init (&full_address))
513600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
514600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
515600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      return FALSE;
516600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
517600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
518600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  /* get our limits and timeout lengths */
519600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  bus_config_parser_get_limits (parser, &context->limits);
520600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
5218343c971cdedfda6107b0f4f73210d88f64507c6Matthias Clasen  if (context->policy)
5228343c971cdedfda6107b0f4f73210d88f64507c6Matthias Clasen    bus_policy_unref (context->policy);
523600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->policy = bus_config_parser_steal_policy (parser);
524600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _dbus_assert (context->policy != NULL);
525600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
52629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  /* We have to build the address backward, so that
52729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington   * <listen> later in the config file have priority
52829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington   */
52929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  link = _dbus_list_get_last_link (&context->servers);
53029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  while (link != NULL)
53129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
53229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      addr = dbus_server_get_address (link->data);
53329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (addr == NULL)
53429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        {
53529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          BUS_SET_OOM (error);
53629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          goto failed;
53729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        }
53829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
53929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (_dbus_string_get_length (&full_address) > 0)
54029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        {
54129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          if (!_dbus_string_append (&full_address, ";"))
54229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington            {
54329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington              BUS_SET_OOM (error);
54429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington              goto failed;
54529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington            }
54629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        }
5476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
54829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      if (!_dbus_string_append (&full_address, addr))
54929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        {
55029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          BUS_SET_OOM (error);
55129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          goto failed;
55229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington        }
55329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
55429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      dbus_free (addr);
5559a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J      addr = NULL;
55629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
55729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      link = _dbus_list_get_prev_link (&context->servers, link);
55829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
55929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
560600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (is_reload)
561600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    dbus_free (context->address);
562600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
56329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!_dbus_string_copy_data (&full_address, &context->address))
5646ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
5656ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      BUS_SET_OOM (error);
5666ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      goto failed;
5676ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
56844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
5696ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes  /* get the service directories */
5706ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes  dirs = bus_config_parser_get_service_dirs (parser);
5716ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes
57279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  /* and the service helper */
57379d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  servicehelper = bus_config_parser_get_servicehelper (parser);
57479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington
57579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  s = _dbus_strdup(servicehelper);
57679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  if (s == NULL && servicehelper != NULL)
57779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    {
57879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington      BUS_SET_OOM (error);
57979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington      goto failed;
58079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    }
58179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington  else
58279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    {
58379d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington      dbus_free(context->servicehelper);
58479d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington      context->servicehelper = s;
58579d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington    }
586b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters
587600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  /* Create activation subsystem */
588b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters  if (context->activation)
589b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters    {
590b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters      if (!bus_activation_reload (context->activation, &full_address, dirs, error))
591b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters        goto failed;
592b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters    }
593b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters  else
594b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters    {
595b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters      context->activation = bus_activation_new (context, &full_address, dirs, error);
596b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters    }
597b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters
598b93476ce07acce83ff3b396616bb8a0eaf719916Colin Walters  if (context->activation == NULL)
599600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
600600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      _DBUS_ASSERT_ERROR_IS_SET (error);
601600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
602600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
603600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
604600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
605600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  retval = TRUE;
606600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
607600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge failed:
608600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _dbus_string_free (&full_address);
609921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
6109a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J  if (addr)
61110b79991cc13b8b9347c19db840e50d6f5ede4fbJohn (J    dbus_free (addr);
6129a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J
613600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  return retval;
614600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge}
615600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
616600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgestatic dbus_bool_t
6179c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walterslist_concat_new (DBusList **a,
6189c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters                 DBusList **b,
6199c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters                 DBusList **result)
6209c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters{
6219c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  DBusList *link;
6229c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters
6239c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  *result = NULL;
6249c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters
6259c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  link = _dbus_list_get_first_link (a);
6269c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  for (link = _dbus_list_get_first_link (a); link; link = _dbus_list_get_next_link (a, link))
6279c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters    {
6289c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters      if (!_dbus_list_append (result, link->data))
6299c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters        goto oom;
6309c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters    }
6319c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  for (link = _dbus_list_get_first_link (b); link; link = _dbus_list_get_next_link (b, link))
6329c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters    {
6339c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters      if (!_dbus_list_append (result, link->data))
6349c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters        goto oom;
6359c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters    }
6369c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters
6379c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  return TRUE;
6389c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Waltersoom:
6399c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  _dbus_list_clear (result);
6409c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  return FALSE;
6419c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters}
6429c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters
6439c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Waltersstatic dbus_bool_t
6445e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthenprocess_config_postinit (BusContext      *context,
645cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters			 BusConfigParser *parser,
6465e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen			 DBusError       *error)
647600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge{
648cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  DBusHashTable *service_context_table;
6499c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  DBusList *watched_dirs = NULL;
650600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
651cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  service_context_table = bus_config_parser_steal_service_context_table (parser);
652cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!bus_registry_set_service_context_table (context->registry,
653cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters					       service_context_table))
654600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
655cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      BUS_SET_OOM (error);
656cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      return FALSE;
657600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
658600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
659cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  _dbus_hash_table_unref (service_context_table);
6605e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen
6619c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  /* We need to monitor both the configuration directories and directories
6629c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters   * containing .service files.
6639c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters   */
6649c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  if (!list_concat_new (bus_config_parser_get_conf_dirs (parser),
6659c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters                        bus_config_parser_get_service_dirs (parser),
6669c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters                        &watched_dirs))
6679c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters    {
6689c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters      BUS_SET_OOM (error);
6699c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters      return FALSE;
6709c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters    }
6719c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters
6729c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  bus_set_watched_dirs (context, &watched_dirs);
6739c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters
6749c90fcd2dc4b1b7d818a35ef43d4686052902f59Colin Walters  _dbus_list_clear (&watched_dirs);
6755e948ff7cdc7e3023d53d06ad35c85be304f36c9David Zeuthen
676cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  return TRUE;
677600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge}
678600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
679600e411f25082bcf82d610a4c71b0dc3435b5a42Jon TrowbridgeBusContext*
680600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgebus_context_new (const DBusString *config_file,
681a24270a451c4ac7f8018bdd909a8f762e6abe80cDavid Zeuthen                 ForceForkSetting  force_fork,
6829362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington                 DBusPipe         *print_addr_pipe,
6839362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington                 DBusPipe         *print_pid_pipe,
684921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering                 const DBusString *address,
685b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering                 dbus_bool_t      systemd_activation,
686600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge                 DBusError        *error)
687600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge{
688f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  DBusString log_prefix;
689600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  BusContext *context;
690cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  BusConfigParser *parser;
69179b1e9966434bc3ca4b6009c19c77b91e7588180John (J
692600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
693600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
694cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  context = NULL;
695cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  parser = NULL;
696cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
697600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (!dbus_server_allocate_data_slot (&server_data_slot))
698600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
699600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
700600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      return NULL;
701600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
702600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
703600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context = dbus_new0 (BusContext, 1);
704600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (context == NULL)
705600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
706600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
707600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
708600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
709600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->refcount = 1;
710600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
71154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  _dbus_generate_uuid (&context->uuid);
7128a9880ffd2b81df38bb0e3492bda7a9636ac0280Colin Walters
713600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (!_dbus_string_copy_data (config_file, &context->config_file))
714600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
715600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
716600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
717600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
718600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
719600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  context->loop = _dbus_loop_new ();
720600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (context->loop == NULL)
721600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
722600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      BUS_SET_OOM (error);
723600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
724600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
725600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
7261e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  context->registry = bus_registry_new (context);
7271e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  if (context->registry == NULL)
7281e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington    {
7291e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington      BUS_SET_OOM (error);
7301e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington      goto failed;
7311e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington    }
732cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
733cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  parser = bus_config_load (config_file, TRUE, NULL, error);
734cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser == NULL)
735cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
736cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
737cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
738cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
739921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
740b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  if (!process_config_first_time_only (context, parser, address, systemd_activation, error))
741cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
742cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
743cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
744cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
745cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_every_time (context, parser, FALSE, error))
746600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    {
747600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      _DBUS_ASSERT_ERROR_IS_SET (error);
748600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      goto failed;
749600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    }
750921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
751600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  /* we need another ref of the server data slot for the context
752600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge   * to own
753600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge   */
754600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (!dbus_server_allocate_data_slot (&server_data_slot))
755600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge    _dbus_assert_not_reached ("second ref of server data slot failed");
756600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
7579362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington  /* Note that we don't know whether the print_addr_pipe is
758c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington   * one of the sockets we're using to listen on, or some
759c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington   * other random thing. But I think the answer is "don't do
760c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington   * that then"
761c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington   */
7629362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington  if (print_addr_pipe != NULL && _dbus_pipe_is_valid (print_addr_pipe))
763c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington    {
764c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      DBusString addr;
765c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      const char *a = bus_context_get_address (context);
766c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      int bytes;
767921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
768c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      _dbus_assert (a != NULL);
769c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      if (!_dbus_string_init (&addr))
770c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        {
771c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          BUS_SET_OOM (error);
772c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          goto failed;
773c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        }
774921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
775c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      if (!_dbus_string_append (&addr, a) ||
776c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          !_dbus_string_append (&addr, "\n"))
777c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        {
778c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          _dbus_string_free (&addr);
779c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          BUS_SET_OOM (error);
780c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          goto failed;
781c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        }
782c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington
783c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      bytes = _dbus_string_get_length (&addr);
7849362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington      if (_dbus_pipe_write (print_addr_pipe, &addr, 0, bytes, error) != bytes)
785c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        {
7869362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington          /* pipe write returns an error on failure but not short write */
7879362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington          if (error != NULL && !dbus_error_is_set (error))
7889362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington            {
7899362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington              dbus_set_error (error, DBUS_ERROR_FAILED,
7909362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington                              "Printing message bus address: did not write all bytes\n");
7919362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington            }
792c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          _dbus_string_free (&addr);
793c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington          goto failed;
794c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington        }
795c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington
7969362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington      if (!_dbus_pipe_is_stdout_or_stderr (print_addr_pipe))
7979362aac398e3f2ec680e30c61ebfcb1e407eff72Havoc Pennington        _dbus_pipe_close (print_addr_pipe, NULL);
798921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
799c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington      _dbus_string_free (&addr);
800c8991b0f95a3b53bc98de9e029780bbe0a0b3114Havoc Pennington    }
801921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
8026ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  context->connections = bus_connections_new (context);
8036ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (context->connections == NULL)
8046ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
8056ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      BUS_SET_OOM (error);
8066ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      goto failed;
8076ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
8086ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
809a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  context->matchmaker = bus_matchmaker_new ();
810a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (context->matchmaker == NULL)
811a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    {
812a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      BUS_SET_OOM (error);
813a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      goto failed;
814a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington    }
81579b1e9966434bc3ca4b6009c19c77b91e7588180John (J
81679b1e9966434bc3ca4b6009c19c77b91e7588180John (J  /* check user before we fork */
81779b1e9966434bc3ca4b6009c19c77b91e7588180John (J  if (context->user != NULL)
81879b1e9966434bc3ca4b6009c19c77b91e7588180John (J    {
81923832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      if (!_dbus_verify_daemon_user (context->user))
82079b1e9966434bc3ca4b6009c19c77b91e7588180John (J        {
82179b1e9966434bc3ca4b6009c19c77b91e7588180John (J          dbus_set_error (error, DBUS_ERROR_FAILED,
82279b1e9966434bc3ca4b6009c19c77b91e7588180John (J                          "Could not get UID and GID for username \"%s\"",
82379b1e9966434bc3ca4b6009c19c77b91e7588180John (J                          context->user);
82479b1e9966434bc3ca4b6009c19c77b91e7588180John (J          goto failed;
82579b1e9966434bc3ca4b6009c19c77b91e7588180John (J        }
82679b1e9966434bc3ca4b6009c19c77b91e7588180John (J    }
82779b1e9966434bc3ca4b6009c19c77b91e7588180John (J
828163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington  /* Now become a daemon if appropriate and write out pid file in any case */
829163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington  {
8303100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#ifdef WANT_PIDFILE
831163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington    DBusString u;
832163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington
833163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington    if (context->pidfile)
834163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington      _dbus_string_init_const (&u, context->pidfile);
835163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington
836163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington    if ((force_fork != FORK_NEVER && context->fork) || force_fork == FORK_ALWAYS)
837163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington      {
838163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington        _dbus_verbose ("Forking and becoming daemon\n");
839921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
840921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering        if (!_dbus_become_daemon (context->pidfile ? &u : NULL,
841163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington                                  print_pid_pipe,
8420314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen                                  error,
8430314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen                                  context->keep_umask))
8443100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project
845163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington          {
846163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington            _DBUS_ASSERT_ERROR_IS_SET (error);
847163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington            goto failed;
848163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington          }
849163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington      }
850163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington    else
851163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington      {
852163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington        _dbus_verbose ("Fork not requested\n");
853921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
854163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington        /* Need to write PID file and to PID pipe for ourselves,
855163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington         * not for the child process. This is a no-op if the pidfile
856163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington         * is NULL and print_pid_pipe is NULL.
857163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington         */
858163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington        if (!_dbus_write_pid_to_file_and_pipe (context->pidfile ? &u : NULL,
859163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington                                               print_pid_pipe,
860163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington                                               _dbus_getpid (),
861163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington                                               error))
862163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington          {
863163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington            _DBUS_ASSERT_ERROR_IS_SET (error);
864163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington            goto failed;
865163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington          }
866163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington      }
8673100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#else
8683100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project    if ((force_fork != FORK_NEVER && context->fork) || force_fork == FORK_ALWAYS)
8693100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project      {
8703100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project        if (!_dbus_become_daemon (NULL,
8713100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project                                  0,
87228c78cdf3df937d1cd72e3c358f7afa129a8cdabJaikumar Ganesh                                  error,
87328c78cdf3df937d1cd72e3c358f7afa129a8cdabJaikumar Ganesh                                  context->keep_umask))
8743100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project          {
8753100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project            _DBUS_ASSERT_ERROR_IS_SET (error);
8763100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project            goto failed;
8773100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project          }
8783100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project      }
8793100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#endif
880163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington  }
881163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington
882163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington  if (print_pid_pipe && _dbus_pipe_is_valid (print_pid_pipe) &&
883163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington      !_dbus_pipe_is_stdout_or_stderr (print_pid_pipe))
884163555c7ab56132ee27e3e7d9a26eb985682c1b5Havoc Pennington    _dbus_pipe_close (print_pid_pipe, NULL);
8850b17cee84d832b5df7c85a5e5b587fa5cd333964James Carter
8860b17cee84d832b5df7c85a5e5b587fa5cd333964James Carter  if (!bus_selinux_full_init ())
8870b17cee84d832b5df7c85a5e5b587fa5cd333964James Carter    {
888ce34415302af586ea6ca9b0da4b21a7025041ef7Colin Walters      bus_context_log (context, DBUS_SYSTEM_LOG_FATAL, "SELinux enabled but AVC initialization failed; check system log\n");
8890b17cee84d832b5df7c85a5e5b587fa5cd333964James Carter    }
890ce34415302af586ea6ca9b0da4b21a7025041ef7Colin Walters
891cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_postinit (context, parser, error))
892cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
893cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
894cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
895cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
8961d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen
897cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser != NULL)
8986b2af67ae1c675eda69bd0995f5e694591160ec5Colin Walters    {
8996b2af67ae1c675eda69bd0995f5e694591160ec5Colin Walters      bus_config_parser_unref (parser);
9006b2af67ae1c675eda69bd0995f5e694591160ec5Colin Walters      parser = NULL;
9016b2af67ae1c675eda69bd0995f5e694591160ec5Colin Walters    }
902921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
903fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington  /* Here we change our credentials if required,
904fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington   * as soon as we've set up our sockets and pidfile
905fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington   */
906600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge  if (context->user != NULL)
907fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington    {
90823832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      if (!_dbus_change_to_daemon_user (context->user, error))
909600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	{
910600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  _DBUS_ASSERT_ERROR_IS_SET (error);
911600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	  goto failed;
912600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge	}
913a8e32b6874cf4d6c2954d60e676562282bfce4eaHavoc Pennington
914a8e32b6874cf4d6c2954d60e676562282bfce4eaHavoc Pennington#ifdef HAVE_SELINUX
9155340b8de0b537380e0c445495300739d75abeb2fHavoc Pennington      /* FIXME - why not just put this in full_init() below? */
9165340b8de0b537380e0c445495300739d75abeb2fHavoc Pennington      bus_selinux_audit_init ();
917a8e32b6874cf4d6c2954d60e676562282bfce4eaHavoc Pennington#endif
918fff4709be676718a54e280fd3b4ac4b742554982Havoc Pennington    }
919e3d30a03225dd1d26012ecd39b09e4ccf91befb5Havoc Pennington
9206843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington  dbus_server_free_data_slot (&server_data_slot);
921921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
9226ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return context;
923921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
924921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering failed:
925cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser != NULL)
926cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    bus_config_parser_unref (parser);
92729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (context != NULL)
92829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    bus_context_unref (context);
92929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
930dd8b1b1d654c983ccc040b59143a11f239de0726Olivier Andrieu  if (server_data_slot >= 0)
931dd8b1b1d654c983ccc040b59143a11f239de0726Olivier Andrieu    dbus_server_free_data_slot (&server_data_slot);
932921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
9336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return NULL;
9346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
9356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
936600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgedbus_bool_t
93754b943432c7c947db88066751dd36a372cc9a618Havoc Penningtonbus_context_get_id (BusContext       *context,
93854b943432c7c947db88066751dd36a372cc9a618Havoc Pennington                    DBusString       *uuid)
93954b943432c7c947db88066751dd36a372cc9a618Havoc Pennington{
94054b943432c7c947db88066751dd36a372cc9a618Havoc Pennington  return _dbus_uuid_encode (&context->uuid, uuid);
94154b943432c7c947db88066751dd36a372cc9a618Havoc Pennington}
94254b943432c7c947db88066751dd36a372cc9a618Havoc Pennington
94354b943432c7c947db88066751dd36a372cc9a618Havoc Penningtondbus_bool_t
944600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridgebus_context_reload_config (BusContext *context,
945600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge			   DBusError  *error)
946600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge{
947cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  BusConfigParser *parser;
948cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  DBusString config_file;
949cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  dbus_bool_t ret;
950cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
951caf220015ba1afd9dfca2a93cfa5208058041610Sjoerd Simons  /* Flush the user database cache */
9527be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  _dbus_flush_caches ();
953caf220015ba1afd9dfca2a93cfa5208058041610Sjoerd Simons
954cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  ret = FALSE;
955cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  _dbus_string_init_const (&config_file, context->config_file);
956cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  parser = bus_config_load (&config_file, TRUE, NULL, error);
957cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser == NULL)
958cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
959cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
960cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
961cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
962921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
963cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_every_time (context, parser, TRUE, error))
964cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
965cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
966cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
967cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
968cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (!process_config_postinit (context, parser, error))
969cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    {
970cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      _DBUS_ASSERT_ERROR_IS_SET (error);
971cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters      goto failed;
972cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    }
973cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  ret = TRUE;
974cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters
97504cf3166002a86b9a22851be4e243c87b5b3048dColin Walters  bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Reloaded configuration");
97604cf3166002a86b9a22851be4e243c87b5b3048dColin Walters failed:
977bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  if (!ret)
97804cf3166002a86b9a22851be4e243c87b5b3048dColin Walters    bus_context_log (context, DBUS_SYSTEM_LOG_INFO, "Unable to reload configuration: %s", error->message);
979cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  if (parser != NULL)
980cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters    bus_config_parser_unref (parser);
981cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters  return ret;
982600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge}
983600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge
98429c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonstatic void
98529c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonshutdown_server (BusContext *context,
98629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington                 DBusServer *server)
9876ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
98829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (server == NULL ||
98929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      !dbus_server_get_is_connected (server))
9903bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    return;
991921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
99229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!dbus_server_set_watch_functions (server,
993f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                        NULL, NULL, NULL,
9943bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                        context,
9953bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                        NULL))
9963bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("setting watch functions to NULL failed");
997921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
99829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  if (!dbus_server_set_timeout_functions (server,
999f587ce7845edb0eb01451368d01b5bc86b5904cdHavoc Pennington                                          NULL, NULL, NULL,
10003bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                          context,
10013bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington                                          NULL))
10023bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington    _dbus_assert_not_reached ("setting timeout functions to NULL failed");
1003921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
100429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  dbus_server_disconnect (server);
100529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington}
100629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
100729c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonvoid
100829c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonbus_context_shutdown (BusContext  *context)
100929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington{
101029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  DBusList *link;
101129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
101229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  link = _dbus_list_get_first_link (&context->servers);
101329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington  while (link != NULL)
101429c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    {
101529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      shutdown_server (context, link->data);
101629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
101729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      link = _dbus_list_get_next_link (&context->servers, link);
101829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington    }
10196ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
10206ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
10219f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalBusContext *
10226ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_ref (BusContext *context)
10236ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
10246ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (context->refcount > 0);
10256ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  context->refcount += 1;
10269f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal
10279f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal  return context;
10286ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
10296ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
10306ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonvoid
10316ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_unref (BusContext *context)
10326ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
10336ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  _dbus_assert (context->refcount > 0);
10346ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  context->refcount -= 1;
10356ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
10366ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  if (context->refcount == 0)
10376ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    {
103829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      DBusList *link;
1039921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1040ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_verbose ("Finalizing bus context %p\n", context);
1041921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
10423bea935316ff048e68dea6a26c2e8e9fd314477fHavoc Pennington      bus_context_shutdown (context);
1043ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
1044ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (context->connections)
1045ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
1046ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_connections_unref (context->connections);
1047ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          context->connections = NULL;
1048ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
1049921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
10506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (context->registry)
1051ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
1052ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_registry_unref (context->registry);
1053ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          context->registry = NULL;
1054ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
1055921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
10566ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      if (context->activation)
1057ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
1058ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          bus_activation_unref (context->activation);
1059ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          context->activation = NULL;
1060ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
106129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington
106229c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      link = _dbus_list_get_first_link (&context->servers);
106329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      while (link != NULL)
1064ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
106529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          dbus_server_unref (link->data);
1066921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
106729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington          link = _dbus_list_get_next_link (&context->servers, link);
1068ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
106929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington      _dbus_list_clear (&context->servers);
1070b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington
1071bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington      if (context->policy)
1072b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington        {
1073bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington          bus_policy_unref (context->policy);
1074bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington          context->policy = NULL;
1075b6ffea177fccb6cc4e65992da7d8b390054277f7Havoc Pennington        }
1076921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
10771b08036103a70159e7a67b2349306710edcd6654Havoc Pennington      if (context->loop)
10781b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        {
1079df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc Pennington          _dbus_loop_unref (context->loop);
10801b08036103a70159e7a67b2349306710edcd6654Havoc Pennington          context->loop = NULL;
10811b08036103a70159e7a67b2349306710edcd6654Havoc Pennington        }
1082a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1083a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (context->matchmaker)
1084a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        {
1085a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          bus_matchmaker_unref (context->matchmaker);
1086a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          context->matchmaker = NULL;
1087a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington        }
1088f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
1089600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      dbus_free (context->config_file);
1090f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      dbus_free (context->log_prefix);
1091eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington      dbus_free (context->type);
10926ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      dbus_free (context->address);
1093600e411f25082bcf82d610a4c71b0dc3435b5a42Jon Trowbridge      dbus_free (context->user);
10946ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes      dbus_free (context->servicehelper);
10950e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington
10963100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#ifdef WANT_PIDFILE
10970e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington      if (context->pidfile)
10980e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	{
10990e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington          DBusString u;
11000e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington          _dbus_string_init_const (&u, context->pidfile);
11010e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington
11020e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington          /* Deliberately ignore errors here, since there's not much
11030e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	   * we can do about it, and we're exiting anyways.
11040e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	   */
11050e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	  _dbus_delete_file (&u, NULL);
11060e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington
1107921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering          dbus_free (context->pidfile);
11080e1945b3889f8be8e31e39ad2b982c8a192be41dHavoc Pennington	}
11093100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project#endif
11103100d06aa6965f2eaa3f8f393817d0a4858c5329The Android Open Source Project
11116ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington      dbus_free (context);
11121b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
11136843ad31769c088ca259020fd9ea8dfb3a51f68eHavoc Pennington      dbus_server_free_data_slot (&server_data_slot);
11146ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington    }
11156ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
11166ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
1117eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington/* type may be NULL */
1118eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonconst char*
1119eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonbus_context_get_type (BusContext *context)
1120eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington{
1121eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington  return context->type;
1122eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington}
1123eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington
1124e45e4382274149ca60c11f068ccca719f3598074Havoc Penningtonconst char*
1125e45e4382274149ca60c11f068ccca719f3598074Havoc Penningtonbus_context_get_address (BusContext *context)
1126e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington{
1127e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington  return context->address;
1128e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington}
1129e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington
11306ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughesconst char*
11316ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughesbus_context_get_servicehelper (BusContext *context)
11326ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes{
11336ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes  return context->servicehelper;
11346ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes}
11356ceffb591878e3a806d340ab07fbb12a2f74e79fRichard Hughes
1136b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poetteringdbus_bool_t
1137b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poetteringbus_context_get_systemd_activation (BusContext *context)
1138b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering{
1139b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering  return context->systemd_activation;
1140b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering}
1141b3ed8675a4eba35c6a7f43a86a89f706ffe07f84Lennart Poettering
11426ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusRegistry*
11436ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_get_registry (BusContext  *context)
11446ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
11456ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return context->registry;
11466ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
11476ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
11486ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusConnections*
11496ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_get_connections (BusContext  *context)
11506ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
11516ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return context->connections;
11526ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
11536ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington
11546ecc14ffabcffb69aa938a67940db48272e05046Havoc PenningtonBusActivation*
11556ecc14ffabcffb69aa938a67940db48272e05046Havoc Penningtonbus_context_get_activation (BusContext  *context)
11566ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington{
11576ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington  return context->activation;
11586ecc14ffabcffb69aa938a67940db48272e05046Havoc Pennington}
1159a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
1160a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc PenningtonBusMatchmaker*
1161a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_context_get_matchmaker (BusContext  *context)
1162a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
1163a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return context->matchmaker;
1164a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
1165a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
1166df008ef97deacd5bb00ac335e5d8671798fa09ddHavoc PenningtonDBusLoop*
11671b08036103a70159e7a67b2349306710edcd6654Havoc Penningtonbus_context_get_loop (BusContext *context)
11681b08036103a70159e7a67b2349306710edcd6654Havoc Pennington{
11691b08036103a70159e7a67b2349306710edcd6654Havoc Pennington  return context->loop;
11701b08036103a70159e7a67b2349306710edcd6654Havoc Pennington}
11711b08036103a70159e7a67b2349306710edcd6654Havoc Pennington
1172a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Penningtondbus_bool_t
11737be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonbus_context_allow_unix_user (BusContext   *context,
11747be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                             unsigned long uid)
1175a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
11767be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  return bus_policy_allow_unix_user (context->policy,
11777be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                     uid);
11787be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington}
11797be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington
11807be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington/* For now this is never actually called because the default
11817be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * DBusConnection behavior of 'same user that owns the bus can connect'
11827be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington * is all it would do.
11837be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington */
11847be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtondbus_bool_t
11857be5fd95cdccdca28937804f32ca8b1308887d09Havoc Penningtonbus_context_allow_windows_user (BusContext       *context,
11867be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                const char       *windows_sid)
11877be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington{
11887be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington  return bus_policy_allow_windows_user (context->policy,
11897be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington                                        windows_sid);
1190a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
1191a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington
11921e9b185b0c274ef0d684b1e43418388225321e72Havoc PenningtonBusPolicy *
11931e9b185b0c274ef0d684b1e43418388225321e72Havoc Penningtonbus_context_get_policy (BusContext *context)
11941e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington{
11951e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington  return context->policy;
11961e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington}
11971e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington
1198bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc PenningtonBusClientPolicy*
1199bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Penningtonbus_context_create_client_policy (BusContext      *context,
1200e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                                  DBusConnection  *connection,
1201e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                                  DBusError       *error)
1202a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington{
1203e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
1204e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  return bus_policy_create_client_policy (context->policy, connection,
1205e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                                          error);
1206a26607ab68bf0878f23d2dbddec781b4b760d034Havoc Pennington}
12072250539aeee0569f8861841d1f5ff16f1539715eHavoc Pennington
12082250539aeee0569f8861841d1f5ff16f1539715eHavoc Penningtonint
12092250539aeee0569f8861841d1f5ff16f1539715eHavoc Penningtonbus_context_get_activation_timeout (BusContext *context)
12102250539aeee0569f8861841d1f5ff16f1539715eHavoc Pennington{
1211921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
12123185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.activation_timeout;
12132250539aeee0569f8861841d1f5ff16f1539715eHavoc Pennington}
1214777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1215983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonint
1216983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_context_get_auth_timeout (BusContext *context)
1217983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{
12183185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.auth_timeout;
1219983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington}
1220983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
1221983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonint
1222983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_context_get_max_completed_connections (BusContext *context)
1223983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{
12243185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.max_completed_connections;
1225983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington}
1226983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
1227983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonint
1228983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_context_get_max_incomplete_connections (BusContext *context)
1229983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{
12303185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.max_incomplete_connections;
1231983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington}
1232983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
1233983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonint
1234983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Penningtonbus_context_get_max_connections_per_user (BusContext *context)
1235983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington{
12363185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington  return context->limits.max_connections_per_user;
1237983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington}
1238983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington
1239b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonint
1240b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonbus_context_get_max_pending_activations (BusContext *context)
1241b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington{
1242b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  return context->limits.max_pending_activations;
1243b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington}
1244b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington
1245b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonint
1246b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Penningtonbus_context_get_max_services_per_connection (BusContext *context)
1247b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington{
1248b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington  return context->limits.max_services_per_connection;
1249b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington}
1250b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington
1251a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonint
1252a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Penningtonbus_context_get_max_match_rules_per_connection (BusContext *context)
1253a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington{
1254a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  return context->limits.max_match_rules_per_connection;
1255a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington}
1256a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington
125764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonint
125864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_context_get_max_replies_per_connection (BusContext *context)
125964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{
126064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  return context->limits.max_replies_per_connection;
126164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington}
126264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington
126364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonint
126464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Penningtonbus_context_get_reply_timeout (BusContext *context)
126564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington{
126664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  return context->limits.reply_timeout;
126764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington}
126864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington
1269bb2a464067c6843320f367b590b0e4cb00225e50Colin Waltersvoid
127003bb3ce656e9b14fe643572dd0d39f82e955f1f5Colin Waltersbus_context_log (BusContext *context, DBusSystemLogSeverity severity, const char *msg, ...) _DBUS_GNUC_PRINTF (3, 4);
127103bb3ce656e9b14fe643572dd0d39f82e955f1f5Colin Walters
127203bb3ce656e9b14fe643572dd0d39f82e955f1f5Colin Waltersvoid
127304cf3166002a86b9a22851be4e243c87b5b3048dColin Waltersbus_context_log (BusContext *context, DBusSystemLogSeverity severity, const char *msg, ...)
1274bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters{
1275bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  va_list args;
1276bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters
1277f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  if (!context->syslog)
1278f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    return;
1279bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters
1280bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  va_start (args, msg);
1281bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters
1282f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  if (context->log_prefix)
1283f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    {
1284f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      DBusString full_msg;
1285f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
1286f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (!_dbus_string_init (&full_msg))
1287f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto out;
1288f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (!_dbus_string_append (&full_msg, context->log_prefix))
1289f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom_out;
1290f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      if (!_dbus_string_append_printf_valist (&full_msg, msg, args))
1291f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters        goto oom_out;
1292f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters
1293c4371e4bc8a561cf91516d22f00c9512dc7e8e53Colin Walters      _dbus_system_log (severity, "%s", _dbus_string_get_const_data (&full_msg));
1294f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    oom_out:
1295f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters      _dbus_string_free (&full_msg);
1296f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    }
1297f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters  else
1298f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Walters    _dbus_system_logv (severity, msg, args);
129969ed32cbccbec9d613447cb64e9d7b1ffa11ce3cColin Walters
1300f00c816c270ad5c01810231e1ed6bd54b1ab9652Colin Waltersout:
1301bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  va_end (args);
1302bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters}
1303bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters
13046a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington/*
13056a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * addressed_recipient is the recipient specified in the message.
13066a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington *
13076a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * proposed_recipient is the recipient we're considering sending
13086a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * to right this second, and may be an eavesdropper.
13096a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington *
13106a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * sender is the sender of the message.
13116a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington *
13126a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * NULL for proposed_recipient or sender definitely means the bus driver.
13136a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington *
13146a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * NULL for addressed_recipient may mean the bus driver, or may mean
13156a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington * no destination was specified in the message (e.g. a signal).
13166a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington */
1317777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtondbus_bool_t
1318777707ed8dff6958972a93894a87ec1945c65c14Havoc Penningtonbus_context_check_security_policy (BusContext     *context,
131964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington                                   BusTransaction *transaction,
1320777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                   DBusConnection *sender,
1321a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                   DBusConnection *addressed_recipient,
1322a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                   DBusConnection *proposed_recipient,
1323777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                   DBusMessage    *message,
1324777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington                                   DBusError      *error)
1325777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington{
13266053d2208e85d1a685df385620eff45895211b0cColin Walters  const char *dest;
1327777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  BusClientPolicy *sender_policy;
1328777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  BusClientPolicy *recipient_policy;
1329bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  dbus_int32_t toggles;
13306053d2208e85d1a685df385620eff45895211b0cColin Walters  dbus_bool_t log;
133164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  int type;
13323251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington  dbus_bool_t requested_reply;
1333bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  const char *sender_name;
1334e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters  const char *sender_loginfo;
1335e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters  const char *proposed_recipient_loginfo;
1336921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
133764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  type = dbus_message_get_type (message);
13386053d2208e85d1a685df385620eff45895211b0cColin Walters  dest = dbus_message_get_destination (message);
1339921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
134064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  /* dispatch.c was supposed to ensure these invariants */
13416053d2208e85d1a685df385620eff45895211b0cColin Walters  _dbus_assert (dest != NULL ||
1342eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington                type == DBUS_MESSAGE_TYPE_SIGNAL ||
1343eb9aa9da9564f2df788580394e67ae6105e517fbHavoc Pennington                (sender == NULL && !bus_connection_is_active (proposed_recipient)));
134464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington  _dbus_assert (type == DBUS_MESSAGE_TYPE_SIGNAL ||
134564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington                addressed_recipient != NULL ||
13466053d2208e85d1a685df385620eff45895211b0cColin Walters                strcmp (dest, DBUS_SERVICE_DBUS) == 0);
1347bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters
1348bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  /* Used in logging below */
1349bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  if (sender != NULL)
1350e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters    {
1351e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters      sender_name = bus_connection_get_name (sender);
1352e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters      sender_loginfo = bus_connection_get_loginfo (sender);
1353e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters    }
1354e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters  else
1355e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters    {
1356e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters      sender_name = NULL;
1357e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters      sender_loginfo = "(bus)";
1358e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters    }
1359921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1360e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters  if (proposed_recipient != NULL)
1361e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters    proposed_recipient_loginfo = bus_connection_get_loginfo (proposed_recipient);
1362bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters  else
1363e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters    proposed_recipient_loginfo = "bus";
1364921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
13653251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington  switch (type)
13663251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    {
13673251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    case DBUS_MESSAGE_TYPE_METHOD_CALL:
13683251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    case DBUS_MESSAGE_TYPE_SIGNAL:
13693251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    case DBUS_MESSAGE_TYPE_METHOD_RETURN:
13703251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    case DBUS_MESSAGE_TYPE_ERROR:
13713251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      break;
1372921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
13733251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    default:
13743251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      _dbus_verbose ("security check disallowing message of unknown type %d\n",
13753251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                     type);
13763251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
13773251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
13783251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      "Message bus will not accept messages of unknown type\n");
1379921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
13803251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      return FALSE;
13813251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    }
13823251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
13833251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington  requested_reply = FALSE;
1384921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1385777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  if (sender != NULL)
1386777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
13871e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington      /* First verify the SELinux access controls.  If allowed then
13881e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington       * go on with the standard checks.
13891e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington       */
1390935a41a04c3f638134fa905503fc41ddbd18902fColin Walters      if (!bus_selinux_allows_send (sender, proposed_recipient,
1391935a41a04c3f638134fa905503fc41ddbd18902fColin Walters				    dbus_message_type_to_string (dbus_message_get_type (message)),
1392935a41a04c3f638134fa905503fc41ddbd18902fColin Walters				    dbus_message_get_interface (message),
1393935a41a04c3f638134fa905503fc41ddbd18902fColin Walters				    dbus_message_get_member (message),
1394935a41a04c3f638134fa905503fc41ddbd18902fColin Walters				    dbus_message_get_error_name (message),
139544656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen				    dest ? dest : DBUS_SERVICE_DBUS, error))
13961e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington        {
13979db435926fb82409caa2b5a7139781a95f105a63John (J          if (error != NULL && !dbus_error_is_set (error))
13989db435926fb82409caa2b5a7139781a95f105a63John (J            {
13999db435926fb82409caa2b5a7139781a95f105a63John (J              dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
14009db435926fb82409caa2b5a7139781a95f105a63John (J                              "An SELinux policy prevents this sender "
14019db435926fb82409caa2b5a7139781a95f105a63John (J                              "from sending this message to this recipient "
1402bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters                              "(rejected message had sender \"%s\" interface \"%s\" "
14039db435926fb82409caa2b5a7139781a95f105a63John (J                              "member \"%s\" error name \"%s\" destination \"%s\")",
1404bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters                              sender_name ? sender_name : "(unset)",
14059db435926fb82409caa2b5a7139781a95f105a63John (J                              dbus_message_get_interface (message) ?
14069db435926fb82409caa2b5a7139781a95f105a63John (J                              dbus_message_get_interface (message) : "(unset)",
14079db435926fb82409caa2b5a7139781a95f105a63John (J                              dbus_message_get_member (message) ?
14089db435926fb82409caa2b5a7139781a95f105a63John (J                              dbus_message_get_member (message) : "(unset)",
14099db435926fb82409caa2b5a7139781a95f105a63John (J                              dbus_message_get_error_name (message) ?
14109db435926fb82409caa2b5a7139781a95f105a63John (J                              dbus_message_get_error_name (message) : "(unset)",
14119db435926fb82409caa2b5a7139781a95f105a63John (J                              dest ? dest : DBUS_SERVICE_DBUS);
14129db435926fb82409caa2b5a7139781a95f105a63John (J              _dbus_verbose ("SELinux security check denying send to service\n");
14139db435926fb82409caa2b5a7139781a95f105a63John (J            }
141444656f538f69e8f8709ddb6ab285db29f65f62ddDavid Zeuthen
14151e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington          return FALSE;
14161e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington        }
1417921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1418e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      if (bus_connection_is_active (sender))
1419b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington        {
1420e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          sender_policy = bus_connection_get_policy (sender);
1421e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_assert (sender_policy != NULL);
1422921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
14233251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington          /* Fill in requested_reply variable with TRUE if this is a
14243251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington           * reply and the reply was pending.
14253251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington           */
14263251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington          if (dbus_message_get_reply_serial (message) != 0)
142764f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington            {
142864f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington              if (proposed_recipient != NULL /* not to the bus driver */ &&
14293251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  addressed_recipient == proposed_recipient /* not eavesdropping */)
14303251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                {
1431921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering                  DBusError error2;
1432921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
14333251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  dbus_error_init (&error2);
14343251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  requested_reply = bus_connections_check_reply (bus_connection_get_connections (sender),
14353251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                                                 transaction,
14363251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                                                 sender, addressed_recipient, message,
14373251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                                                 &error2);
14383251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                  if (dbus_error_is_set (&error2))
14393251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                    {
14403251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      dbus_move_error (&error2, error);
14413251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      return FALSE;
14423251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                    }
14433251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                }
144464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington            }
1445e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        }
1446e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      else
1447e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        {
1448e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          /* Policy for inactive connections is that they can only send
1449e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington           * the hello message to the bus driver
1450e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington           */
1451a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          if (proposed_recipient == NULL &&
145268a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington              dbus_message_is_method_call (message,
1453248895207dc15914ac7970a6d1431308075dca1dColin Walters                                           DBUS_INTERFACE_DBUS,
145468a3c593b9e77b33614726363c7b6fd85d113021Havoc Pennington                                           "Hello"))
1455e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington            {
1456e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              _dbus_verbose ("security check allowing %s message\n",
145795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                             "Hello");
1458e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              return TRUE;
1459e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington            }
1460e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          else
1461e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington            {
1462e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              _dbus_verbose ("security check disallowing non-%s message\n",
146395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                             "Hello");
1464e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington
1465e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED,
1466e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                              "Client tried to send a message other than %s without being registered",
146795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                              "Hello");
1468921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1469e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington              return FALSE;
1470e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington            }
1471b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington        }
1472777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1473777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  else
14743251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    {
14753251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      sender_policy = NULL;
14763251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington
14773251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      /* If the sender is the bus driver, we assume any reply was a
14783251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington       * requested reply as bus driver won't send bogus ones
14793251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington       */
14803251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington      if (addressed_recipient == proposed_recipient /* not eavesdropping */ &&
14813251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington          dbus_message_get_reply_serial (message) != 0)
14823251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington        requested_reply = TRUE;
14833251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington    }
1484777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1485e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  _dbus_assert ((sender != NULL && sender_policy != NULL) ||
1486e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington                (sender == NULL && sender_policy == NULL));
1487921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1488a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (proposed_recipient != NULL)
1489777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
1490e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      /* only the bus driver can send to an inactive recipient (as it
1491e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington       * owns no services, so other apps can't address it). Inactive
1492e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington       * recipients can receive any message.
1493e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington       */
1494a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington      if (bus_connection_is_active (proposed_recipient))
1495b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington        {
1496a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington          recipient_policy = bus_connection_get_policy (proposed_recipient);
1497e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_assert (recipient_policy != NULL);
1498e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        }
1499e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      else if (sender == NULL)
1500e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        {
1501e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_verbose ("security check using NULL recipient policy for message from bus\n");
1502e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          recipient_policy = NULL;
1503e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        }
1504e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington      else
1505e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington        {
1506e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          _dbus_assert_not_reached ("a message was somehow sent to an inactive recipient from a source other than the message bus\n");
1507e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington          recipient_policy = NULL;
1508b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington        }
1509777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1510777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  else
1511777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    recipient_policy = NULL;
1512921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1513a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  _dbus_assert ((proposed_recipient != NULL && recipient_policy != NULL) ||
1514a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                (proposed_recipient != NULL && sender == NULL && recipient_policy == NULL) ||
1515a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                (proposed_recipient == NULL && recipient_policy == NULL));
1516921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
15176053d2208e85d1a685df385620eff45895211b0cColin Walters  log = FALSE;
1518e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (sender_policy &&
1519777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      !bus_client_policy_check_can_send (sender_policy,
15207c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington                                         context->registry,
15217c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington                                         requested_reply,
15227c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington                                         proposed_recipient,
15236053d2208e85d1a685df385620eff45895211b0cColin Walters                                         message, &toggles, &log))
1524777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
1525bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters      const char *msg = "Rejected send message, %d matched rules; "
15263af94cf25081502b6b55ff291e350f2685eef526Colin Walters                        "type=\"%s\", sender=\"%s\" (%s) interface=\"%s\" member=\"%s\" error name=\"%s\" requested_reply=%d destination=\"%s\" (%s))";
15276053d2208e85d1a685df385620eff45895211b0cColin Walters
1528bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, msg,
1529bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters                      toggles,
1530b45440148a81d3efc0ed1a670f6e498de129bc62Colin Walters                      dbus_message_type_to_string (dbus_message_get_type (message)),
1531bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters                      sender_name ? sender_name : "(unset)",
1532e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters                      sender_loginfo,
153395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_interface (message) ?
153495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_interface (message) : "(unset)",
153595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_member (message) ?
153695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_member (message) : "(unset)",
153795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_error_name (message) ?
153895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_error_name (message) : "(unset)",
15393af94cf25081502b6b55ff291e350f2685eef526Colin Walters                      requested_reply,
1540e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters                      dest ? dest : DBUS_SERVICE_DBUS,
1541e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters                      proposed_recipient_loginfo);
1542bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters      /* Needs to be duplicated to avoid calling malloc and having to handle OOM */
154304cf3166002a86b9a22851be4e243c87b5b3048dColin Walters      if (addressed_recipient == proposed_recipient)
154404cf3166002a86b9a22851be4e243c87b5b3048dColin Walters        bus_context_log (context, DBUS_SYSTEM_LOG_SECURITY, msg,
15453af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  toggles,
15463af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_type_to_string (dbus_message_get_type (message)),
15473af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  sender_name ? sender_name : "(unset)",
15483af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  sender_loginfo,
15493af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_interface (message) ?
15503af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_interface (message) : "(unset)",
15513af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_member (message) ?
15523af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_member (message) : "(unset)",
15533af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_error_name (message) ?
15543af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_error_name (message) : "(unset)",
15553af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  requested_reply,
15563af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dest ? dest : DBUS_SERVICE_DBUS,
15573af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  proposed_recipient_loginfo);
1558306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      _dbus_verbose ("security policy disallowing message due to sender policy\n");
1559777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      return FALSE;
1560777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1561777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
15626053d2208e85d1a685df385620eff45895211b0cColin Walters  if (log)
156304cf3166002a86b9a22851be4e243c87b5b3048dColin Walters    bus_context_log (context, DBUS_SYSTEM_LOG_SECURITY,
15646053d2208e85d1a685df385620eff45895211b0cColin Walters                              "Would reject message, %d matched rules; "
15653af94cf25081502b6b55ff291e350f2685eef526Colin Walters                              "type=\"%s\", sender=\"%s\" (%s) interface=\"%s\" member=\"%s\" error name=\"%s\" requested_reply=%d destination=\"%s\" (%s))",
15666053d2208e85d1a685df385620eff45895211b0cColin Walters                              toggles,
15676053d2208e85d1a685df385620eff45895211b0cColin Walters                              dbus_message_type_to_string (dbus_message_get_type (message)),
15686053d2208e85d1a685df385620eff45895211b0cColin Walters                              sender_name ? sender_name : "(unset)",
15693af94cf25081502b6b55ff291e350f2685eef526Colin Walters                              sender_loginfo,
15706053d2208e85d1a685df385620eff45895211b0cColin Walters                              dbus_message_get_interface (message) ?
15716053d2208e85d1a685df385620eff45895211b0cColin Walters                              dbus_message_get_interface (message) : "(unset)",
15726053d2208e85d1a685df385620eff45895211b0cColin Walters                              dbus_message_get_member (message) ?
15736053d2208e85d1a685df385620eff45895211b0cColin Walters                              dbus_message_get_member (message) : "(unset)",
15746053d2208e85d1a685df385620eff45895211b0cColin Walters                              dbus_message_get_error_name (message) ?
15756053d2208e85d1a685df385620eff45895211b0cColin Walters                              dbus_message_get_error_name (message) : "(unset)",
1576921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering                              requested_reply,
15773af94cf25081502b6b55ff291e350f2685eef526Colin Walters                              dest ? dest : DBUS_SERVICE_DBUS,
15783af94cf25081502b6b55ff291e350f2685eef526Colin Walters                              proposed_recipient_loginfo);
15796053d2208e85d1a685df385620eff45895211b0cColin Walters
1580e8d396efef695b9868b0112c4a6266c97678fa8aHavoc Pennington  if (recipient_policy &&
1581777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      !bus_client_policy_check_can_receive (recipient_policy,
15823251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                            context->registry,
15833251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                            requested_reply,
15843251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                                            sender,
1585a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                                            addressed_recipient, proposed_recipient,
1586bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters                                            message, &toggles))
1587777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    {
1588bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters      const char *msg = "Rejected receive message, %d matched rules; "
1589e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters                        "type=\"%s\" sender=\"%s\" (%s) interface=\"%s\" member=\"%s\" error name=\"%s\" reply serial=%u requested_reply=%d destination=\"%s\" (%s))";
1590935a41a04c3f638134fa905503fc41ddbd18902fColin Walters
1591bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters      dbus_set_error (error, DBUS_ERROR_ACCESS_DENIED, msg,
1592bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters                      toggles,
1593b45440148a81d3efc0ed1a670f6e498de129bc62Colin Walters                      dbus_message_type_to_string (dbus_message_get_type (message)),
1594bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters                      sender_name ? sender_name : "(unset)",
1595e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters                      sender_loginfo,
159695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_interface (message) ?
159795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_interface (message) : "(unset)",
159895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_member (message) ?
159995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_member (message) : "(unset)",
160095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_error_name (message) ?
160195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington                      dbus_message_get_error_name (message) : "(unset)",
16023251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington                      dbus_message_get_reply_serial (message),
1603e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters                      requested_reply,
1604e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters                      dest ? dest : DBUS_SERVICE_DBUS,
1605e6bbcbd903f9989cf9fe69ca4efa807848a6c11cColin Walters                      proposed_recipient_loginfo);
1606bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters      /* Needs to be duplicated to avoid calling malloc and having to handle OOM */
160704cf3166002a86b9a22851be4e243c87b5b3048dColin Walters      if (addressed_recipient == proposed_recipient)
160804cf3166002a86b9a22851be4e243c87b5b3048dColin Walters        bus_context_log (context, DBUS_SYSTEM_LOG_SECURITY, msg,
16093af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  toggles,
16103af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_type_to_string (dbus_message_get_type (message)),
16113af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  sender_name ? sender_name : "(unset)",
16123af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  sender_loginfo,
16133af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_interface (message) ?
16143af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_interface (message) : "(unset)",
16153af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_member (message) ?
16163af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_member (message) : "(unset)",
16173af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_error_name (message) ?
16183af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_error_name (message) : "(unset)",
16193af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dbus_message_get_reply_serial (message),
16203af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  requested_reply,
16213af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  dest ? dest : DBUS_SERVICE_DBUS,
16223af94cf25081502b6b55ff291e350f2685eef526Colin Walters                                  proposed_recipient_loginfo);
1623306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      _dbus_verbose ("security policy disallowing message due to recipient policy\n");
1624777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington      return FALSE;
1625777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington    }
1626777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington
1627983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington  /* See if limits on size have been exceeded */
1628a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington  if (proposed_recipient &&
162964ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering      ((dbus_connection_get_outgoing_size (proposed_recipient) > context->limits.max_outgoing_bytes) ||
163064ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering       (dbus_connection_get_outgoing_unix_fds (proposed_recipient) > context->limits.max_outgoing_unix_fds)))
1631983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    {
1632983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      dbus_set_error (error, DBUS_ERROR_LIMITS_EXCEEDED,
1633983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington                      "The destination service \"%s\" has a full message queue",
1634a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington                      dest ? dest : (proposed_recipient ?
1635921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering                                     bus_connection_get_name (proposed_recipient) :
1636248895207dc15914ac7970a6d1431308075dca1dColin Walters                                     DBUS_SERVICE_DBUS));
1637306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington      _dbus_verbose ("security policy disallowing message due to full message queue\n");
1638983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington      return FALSE;
1639983200f912f41ba75a873c011bfbcd3b0285bf4cHavoc Pennington    }
1640306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington
1641d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J  /* Record that we will allow a reply here in the future (don't
1642d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J   * bother if the recipient is the bus or this is an eavesdropping
1643d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J   * connection). Only the addressed recipient may reply.
1644d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J   */
1645d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J  if (type == DBUS_MESSAGE_TYPE_METHOD_CALL &&
1646921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering      sender &&
1647d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      addressed_recipient &&
1648d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      addressed_recipient == proposed_recipient && /* not eavesdropping */
1649d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      !bus_connections_expect_reply (bus_connection_get_connections (sender),
1650d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J                                     transaction,
1651d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J                                     sender, addressed_recipient,
1652d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J                                     message, error))
165364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington    {
1654d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      _dbus_verbose ("Failed to record reply expectation or problem with the message expecting a reply\n");
1655d062db4c27d7937ca0fb5367cb5a467554d47ee8John (J      return FALSE;
165664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington    }
1657921bc585ca44b02684d368058a8df8300342dcd0Lennart Poettering
1658306eab3e3d998472ad111146a12b7697ea96c9b9Havoc Pennington  _dbus_verbose ("security policy allowing message\n");
1659777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington  return TRUE;
1660777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington}
1661