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