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