1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington/* config-parser.c XML-library-agnostic configuration file parser 317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * 47c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington * Copyright (C) 2003, 2004 Red Hat, Inc. 517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * 643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 7bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington * 817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * This program is free software; you can redistribute it and/or modify 917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * it under the terms of the GNU General Public License as published by 1017e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * the Free Software Foundation; either version 2 of the License, or 1117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * (at your option) any later version. 1217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * 1317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * This program is distributed in the hope that it will be useful, 1417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 1517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * GNU General Public License for more details. 17bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington * 1817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * You should have received a copy of the GNU General Public License 1917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * along with this program; if not, write to the Free Software 205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 2117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington * 2217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington */ 23dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann 24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h> 250cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes#include "config-parser-common.h" 2617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington#include "config-parser.h" 2790ed1d84588a84697051e643175452c50d682eceHavoc Pennington#include "test.h" 2894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington#include "utils.h" 29bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington#include "policy.h" 301e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington#include "selinux.h" 3190ed1d84588a84697051e643175452c50d682eceHavoc Pennington#include <dbus/dbus-list.h> 3290ed1d84588a84697051e643175452c50d682eceHavoc Pennington#include <dbus/dbus-internals.h> 3317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington#include <string.h> 3417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 3517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtontypedef enum 3617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 378aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington /* we ignore policies for unknown groups/users */ 388aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington POLICY_IGNORED, 398aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 408aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington /* non-ignored */ 418aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington POLICY_DEFAULT, 428aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington POLICY_MANDATORY, 438aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington POLICY_USER, 44b78d222083d1a1186743e2bb3aded49b5a950fe2John (J POLICY_GROUP, 45b78d222083d1a1186743e2bb3aded49b5a950fe2John (J POLICY_CONSOLE 468aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington} PolicyType; 478aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 4817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtontypedef struct 4917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 5017e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington ElementType type; 5117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 52bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington unsigned int had_content : 1; 53bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 5417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington union 5517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington { 5617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington struct 5717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington { 58bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington unsigned int ignore_missing : 1; 59736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters unsigned int if_selinux_enabled : 1; 60ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters unsigned int selinux_root_relative : 1; 6117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington } include; 6217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 6317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington struct 6417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington { 658aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington PolicyType type; 66b78d222083d1a1186743e2bb3aded49b5a950fe2John (J unsigned long gid_uid_or_at_console; 6717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington } policy; 6817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 693185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington struct 703185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 713185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington char *name; 723185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington long value; 733185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } limit; 743185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 7517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington } d; 76bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 7717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington} Element; 7817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 7985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** 8085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Parser for bus configuration file. 8185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */ 8217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtonstruct BusConfigParser 8317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 8485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington int refcount; /**< Reference count */ 8517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 8694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington DBusString basedir; /**< Directory we resolve paths relative to */ 8794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 88bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington DBusList *stack; /**< stack of Element */ 8990ed1d84588a84697051e643175452c50d682eceHavoc Pennington 90bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington char *user; /**< user to run as */ 91bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 920cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes char *servicehelper; /**< location of the setuid helper */ 930cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 94eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington char *bus_type; /**< Message bus type */ 95eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 96bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington DBusList *listen_on; /**< List of addresses to listen to */ 9744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 9844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington DBusList *mechanisms; /**< Auth mechanisms */ 99cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 1000cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusList *service_dirs; /**< Directories to look for session services in */ 101bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 1021d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen DBusList *conf_dirs; /**< Directories to look for policy configuration in */ 1031d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 104bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington BusPolicy *policy; /**< Security policy */ 1053185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 1063185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington BusLimits limits; /**< Limits */ 107893d859ed4ab785f46485fad28779f026fa166a1Havoc Pennington 108893d859ed4ab785f46485fad28779f026fa166a1Havoc Pennington char *pidfile; /**< PID file */ 109893d859ed4ab785f46485fad28779f026fa166a1Havoc Pennington 1100da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge DBusList *included_files; /**< Included files stack */ 1110da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 112cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters DBusHashTable *service_context_table; /**< Map service names to SELinux contexts */ 1131e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 11444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington unsigned int fork : 1; /**< TRUE to fork into daemon mode */ 115856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 116bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters unsigned int syslog : 1; /**< TRUE to enable syslog */ 1176663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen unsigned int keep_umask : 1; /**< TRUE to keep original umask when forking */ 118bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters 119893d859ed4ab785f46485fad28779f026fa166a1Havoc Pennington unsigned int is_toplevel : 1; /**< FALSE if we are a sub-config-file inside another one */ 12007a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker 12107a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker unsigned int allow_anonymous : 1; /**< TRUE to allow anonymous connections */ 12217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington}; 12317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 12490ed1d84588a84697051e643175452c50d682eceHavoc Penningtonstatic Element* 12590ed1d84588a84697051e643175452c50d682eceHavoc Penningtonpush_element (BusConfigParser *parser, 12690ed1d84588a84697051e643175452c50d682eceHavoc Pennington ElementType type) 12790ed1d84588a84697051e643175452c50d682eceHavoc Pennington{ 12890ed1d84588a84697051e643175452c50d682eceHavoc Pennington Element *e; 12990ed1d84588a84697051e643175452c50d682eceHavoc Pennington 130bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert (type != ELEMENT_NONE); 131bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 13290ed1d84588a84697051e643175452c50d682eceHavoc Pennington e = dbus_new0 (Element, 1); 13390ed1d84588a84697051e643175452c50d682eceHavoc Pennington if (e == NULL) 13490ed1d84588a84697051e643175452c50d682eceHavoc Pennington return NULL; 135bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 136bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!_dbus_list_append (&parser->stack, e)) 137bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 138bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_free (e); 139bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return NULL; 140bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 14190ed1d84588a84697051e643175452c50d682eceHavoc Pennington 14290ed1d84588a84697051e643175452c50d682eceHavoc Pennington e->type = type; 14390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 14490ed1d84588a84697051e643175452c50d682eceHavoc Pennington return e; 14590ed1d84588a84697051e643175452c50d682eceHavoc Pennington} 14690ed1d84588a84697051e643175452c50d682eceHavoc Pennington 14790ed1d84588a84697051e643175452c50d682eceHavoc Penningtonstatic void 148bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonelement_free (Element *e) 149bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 1503185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (e->type == ELEMENT_LIMIT) 1513185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington dbus_free (e->d.limit.name); 1523185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 153bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_free (e); 154bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 155bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 156bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic void 15790ed1d84588a84697051e643175452c50d682eceHavoc Penningtonpop_element (BusConfigParser *parser) 15890ed1d84588a84697051e643175452c50d682eceHavoc Pennington{ 15990ed1d84588a84697051e643175452c50d682eceHavoc Pennington Element *e; 16090ed1d84588a84697051e643175452c50d682eceHavoc Pennington 16190ed1d84588a84697051e643175452c50d682eceHavoc Pennington e = _dbus_list_pop_last (&parser->stack); 162bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 163bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington element_free (e); 164bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 16590ed1d84588a84697051e643175452c50d682eceHavoc Pennington 166bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic Element* 167bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonpeek_element (BusConfigParser *parser) 168bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 169bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington Element *e; 170bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 171bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e = _dbus_list_get_last (&parser->stack); 172bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 173bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return e; 174bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 175bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 176bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic ElementType 177bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtontop_element_type (BusConfigParser *parser) 178bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 179bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington Element *e; 180bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 181bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e = _dbus_list_get_last (&parser->stack); 182bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 183bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (e) 184bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return e->type; 185bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else 186bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return ELEMENT_NONE; 187bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 188bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 189bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic dbus_bool_t 190cdac3e058b922431f387351fd8ebf60a764485d1Colin Waltersmerge_service_context_hash (DBusHashTable *dest, 191cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters DBusHashTable *from) 192cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters{ 193cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters DBusHashIter iter; 1949a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J char *service_copy; 1959a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J char *context_copy; 1969a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 1979a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J service_copy = NULL; 1989a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J context_copy = NULL; 1999a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 200cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters _dbus_hash_iter_init (from, &iter); 201cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters while (_dbus_hash_iter_next (&iter)) 202cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters { 203cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters const char *service = _dbus_hash_iter_get_string_key (&iter); 204cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters const char *context = _dbus_hash_iter_get_value (&iter); 205cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters 206cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters service_copy = _dbus_strdup (service); 207cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters if (service_copy == NULL) 2089a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J goto fail; 209cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters context_copy = _dbus_strdup (context); 210cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters if (context_copy == NULL) 2119a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J goto fail; 212cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters 213cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters if (!_dbus_hash_table_insert_string (dest, service_copy, context_copy)) 2149a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J goto fail; 2159a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 2169a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J service_copy = NULL; 2179a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J context_copy = NULL; 218cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters } 219cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters 220cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters return TRUE; 2219a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 2229a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J fail: 2239a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J if (service_copy) 2249a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J dbus_free (service_copy); 2259a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 2269a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J if (context_copy) 2279a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J dbus_free (context_copy); 2289a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 2299a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J return FALSE; 230cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters} 231cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters 232cdac3e058b922431f387351fd8ebf60a764485d1Colin Waltersstatic dbus_bool_t 233feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (Jservice_dirs_find_dir (DBusList **service_dirs, 234feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J const char *dir) 235feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J{ 236feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J DBusList *link; 237feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J 238feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J _dbus_assert (dir != NULL); 239feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J 240a157ec7f72839473113934fc12581645b421e6d9John (J for (link = *service_dirs; link; link = _dbus_list_get_next_link(service_dirs, link)) 241feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J { 242feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J const char *link_dir; 243feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J 244feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J link_dir = (const char *)link->data; 245feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J if (strcmp (dir, link_dir) == 0) 246feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J return TRUE; 247feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J } 248feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J 249feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J return FALSE; 250feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J} 251feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J 252feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (Jstatic dbus_bool_t 253feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (Jservice_dirs_append_unique_or_free (DBusList **service_dirs, 254feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J char *dir) 255feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J{ 256feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J if (!service_dirs_find_dir (service_dirs, dir)) 257feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J return _dbus_list_append (service_dirs, dir); 258feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J 259feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J dbus_free (dir); 260feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J return TRUE; 261feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J} 262feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J 263feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (Jstatic void 264feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (Jservice_dirs_append_link_unique_or_free (DBusList **service_dirs, 265feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J DBusList *dir_link) 266feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J{ 267feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J if (!service_dirs_find_dir (service_dirs, dir_link->data)) 268feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J { 269feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J _dbus_list_append_link (service_dirs, dir_link); 270feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J } 271feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J else 272feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J { 273feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J dbus_free (dir_link->data); 274feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J _dbus_list_free_link (dir_link); 275feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J } 276feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J} 277feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J 278feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (Jstatic dbus_bool_t 279bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonmerge_included (BusConfigParser *parser, 280bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington BusConfigParser *included, 281bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington DBusError *error) 282bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 283bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington DBusList *link; 284bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2858826fea41716e30987511b7739f9cffab7b814c4Havoc Pennington if (!bus_policy_merge (parser->policy, 2868826fea41716e30987511b7739f9cffab7b814c4Havoc Pennington included->policy)) 2878826fea41716e30987511b7739f9cffab7b814c4Havoc Pennington { 2888826fea41716e30987511b7739f9cffab7b814c4Havoc Pennington BUS_SET_OOM (error); 2898826fea41716e30987511b7739f9cffab7b814c4Havoc Pennington return FALSE; 2908826fea41716e30987511b7739f9cffab7b814c4Havoc Pennington } 2911e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 292cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters if (!merge_service_context_hash (parser->service_context_table, 293cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters included->service_context_table)) 2941e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 2951e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington BUS_SET_OOM (error); 2961e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 2971e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 2988826fea41716e30987511b7739f9cffab7b814c4Havoc Pennington 299bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (included->user != NULL) 300bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 301bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_free (parser->user); 302bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington parser->user = included->user; 303bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington included->user = NULL; 304bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 305bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 306eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington if (included->bus_type != NULL) 307eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington { 308eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington dbus_free (parser->bus_type); 309eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington parser->bus_type = included->bus_type; 310eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington included->bus_type = NULL; 311eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington } 312eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 31344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington if (included->fork) 31444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington parser->fork = TRUE; 315856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 3160314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen if (included->keep_umask) 3170314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen parser->keep_umask = TRUE; 3180314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen 319856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington if (included->pidfile != NULL) 320856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington { 321856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington dbus_free (parser->pidfile); 322856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington parser->pidfile = included->pidfile; 323856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington included->pidfile = NULL; 324856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington } 32544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 326bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington while ((link = _dbus_list_pop_first_link (&included->listen_on))) 327bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_list_append_link (&parser->listen_on, link); 328bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 32944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington while ((link = _dbus_list_pop_first_link (&included->mechanisms))) 33044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington _dbus_list_append_link (&parser->mechanisms, link); 331cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 332cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington while ((link = _dbus_list_pop_first_link (&included->service_dirs))) 333feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J service_dirs_append_link_unique_or_free (&parser->service_dirs, link); 3341d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 3351d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen while ((link = _dbus_list_pop_first_link (&included->conf_dirs))) 3361d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen _dbus_list_append_link (&parser->conf_dirs, link); 33744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 338bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 33990ed1d84588a84697051e643175452c50d682eceHavoc Pennington} 34090ed1d84588a84697051e643175452c50d682eceHavoc Pennington 3410da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridgestatic dbus_bool_t 3420da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridgeseen_include (BusConfigParser *parser, 3430da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge const DBusString *file) 3440da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge{ 3450da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge DBusList *iter; 3460da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 3470da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge iter = parser->included_files; 3480da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge while (iter != NULL) 3490da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge { 3500da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge if (! strcmp (_dbus_string_get_const_data (file), iter->data)) 3510da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge return TRUE; 3520da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 3530da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge iter = _dbus_list_get_next_link (&parser->included_files, iter); 3540da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge } 3550da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 3560da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge return FALSE; 3570da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge} 3580da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 35917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc PenningtonBusConfigParser* 360e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgebus_config_parser_new (const DBusString *basedir, 361e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_bool_t is_toplevel, 362e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge const BusConfigParser *parent) 36317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 36417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington BusConfigParser *parser; 36517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 36617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington parser = dbus_new0 (BusConfigParser, 1); 36717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington if (parser == NULL) 36817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington return NULL; 36917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 370893d859ed4ab785f46485fad28779f026fa166a1Havoc Pennington parser->is_toplevel = !!is_toplevel; 371893d859ed4ab785f46485fad28779f026fa166a1Havoc Pennington 37294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_string_init (&parser->basedir)) 37394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 37494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington dbus_free (parser); 37594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington return NULL; 37694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 37794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 378bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington if (((parser->policy = bus_policy_new ()) == NULL) || 3791e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington !_dbus_string_copy (basedir, 0, &parser->basedir, 0) || 380cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters ((parser->service_context_table = _dbus_hash_table_new (DBUS_HASH_STRING, 381cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters dbus_free, 382cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters dbus_free)) == NULL)) 38394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 384b09b7ca33cbaa7eae4f56b9cd699c8d0283dd754Havoc Pennington if (parser->policy) 385b09b7ca33cbaa7eae4f56b9cd699c8d0283dd754Havoc Pennington bus_policy_unref (parser->policy); 386b09b7ca33cbaa7eae4f56b9cd699c8d0283dd754Havoc Pennington 38794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&parser->basedir); 3881e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 38994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington dbus_free (parser); 39094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington return NULL; 39194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 3923185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 393e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (parent != NULL) 394e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 395e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* Initialize the parser's limits from the parent. */ 396e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge parser->limits = parent->limits; 3970da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 3980da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge /* Use the parent's list of included_files to avoid 3990da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge circular inclusions. */ 4000da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge parser->included_files = parent->included_files; 401e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 402e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge else 403e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 404a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 405e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* Make up some numbers! woot! */ 4068d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington parser->limits.max_incoming_bytes = _DBUS_ONE_MEGABYTE * 127; 4078d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington parser->limits.max_outgoing_bytes = _DBUS_ONE_MEGABYTE * 127; 408e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge parser->limits.max_message_size = _DBUS_ONE_MEGABYTE * 32; 40964ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering 41064ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering /* We set relatively conservative values here since due to the 41164ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering way SCM_RIGHTS works we need to preallocate an array for the 41264ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering maximum number of file descriptors we can receive. Picking a 41364ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering high value here thus translates directly to more memory 41464ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering allocation. */ 41564ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering parser->limits.max_incoming_unix_fds = 1024*4; 41664ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering parser->limits.max_outgoing_unix_fds = 1024*4; 41764ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering parser->limits.max_message_unix_fds = 1024; 418e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 419e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* Making this long means the user has to wait longer for an error 420e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge * message if something screws up, but making it too short means 421e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge * they might see a false failure. 422e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge */ 423e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge parser->limits.activation_timeout = 25000; /* 25 seconds */ 42464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 425e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* Making this long risks making a DOS attack easier, but too short 426e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge * and legitimate auth will fail. If interactive auth (ask user for 427e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge * password) is allowed, then potentially it has to be quite long. 428e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge */ 429e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge parser->limits.auth_timeout = 30000; /* 30 seconds */ 430e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 4318d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington parser->limits.max_incomplete_connections = 64; 4328d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington parser->limits.max_connections_per_user = 256; 433e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 434e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* Note that max_completed_connections / max_connections_per_user 435e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge * is the number of users that would have to work together to 436e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge * DOS all the other users. 437e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge */ 4388d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington parser->limits.max_completed_connections = 2048; 439e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 4408d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington parser->limits.max_pending_activations = 512; 4418d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington parser->limits.max_services_per_connection = 512; 442ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington 443ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington /* For this one, keep in mind that it isn't only the memory used 444ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington * by the match rules, but slowdown from linearly walking a big 445ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington * list of them. A client adding more than this is almost 446ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington * certainly a bad idea for that reason, and should change to a 447ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington * smaller number of wider-net match rules - getting every last 448ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington * message to the bus is probably better than having a thousand 449ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington * match rules. 450ebb99420e577a0760e36ed38556aa833ace24996Havoc Pennington */ 451ded3a8efb1162126a79a81a786073c37087c3388David Zeuthen parser->limits.max_match_rules_per_connection = 512; 452e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 4538f1d2a2fa8ba2f25121465ad82289c0e09c9675aScott James Remnant parser->limits.reply_timeout = -1; /* never */ 4548d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington 4558d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington /* this is effectively a limit on message queue size for messages 4568d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington * that require a reply 4578d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington */ 4588d3d8ff55739eebd84d0d53a20a025329feafc3bHavoc Pennington parser->limits.max_replies_per_connection = 1024*8; 459e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 460e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 46117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington parser->refcount = 1; 462e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 46317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington return parser; 46417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington} 46517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 4669f1a60dbba69844c0a04b3dd86280352736187ceMikael HallendalBusConfigParser * 46717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtonbus_config_parser_ref (BusConfigParser *parser) 46817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 46917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington _dbus_assert (parser->refcount > 0); 47017e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 47117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington parser->refcount += 1; 4729f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal 4739f1a60dbba69844c0a04b3dd86280352736187ceMikael Hallendal return parser; 47417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington} 47517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 47617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtonvoid 47717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtonbus_config_parser_unref (BusConfigParser *parser) 47817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 47917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington _dbus_assert (parser->refcount > 0); 48017e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 48117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington parser->refcount -= 1; 48217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 48317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington if (parser->refcount == 0) 48417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington { 48590ed1d84588a84697051e643175452c50d682eceHavoc Pennington while (parser->stack != NULL) 48690ed1d84588a84697051e643175452c50d682eceHavoc Pennington pop_element (parser); 487bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 48890ed1d84588a84697051e643175452c50d682eceHavoc Pennington dbus_free (parser->user); 4890cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dbus_free (parser->servicehelper); 490eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington dbus_free (parser->bus_type); 491856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington dbus_free (parser->pidfile); 492eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 493bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_list_foreach (&parser->listen_on, 494bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington (DBusForeachFunction) dbus_free, 495bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington NULL); 496bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 497bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_list_clear (&parser->listen_on); 498bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 499cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington _dbus_list_foreach (&parser->service_dirs, 500cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington (DBusForeachFunction) dbus_free, 501cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington NULL); 502cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 503cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington _dbus_list_clear (&parser->service_dirs); 50494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 5051d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen _dbus_list_foreach (&parser->conf_dirs, 5061d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen (DBusForeachFunction) dbus_free, 5071d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen NULL); 5081d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 5091d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen _dbus_list_clear (&parser->conf_dirs); 5101d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 511eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington _dbus_list_foreach (&parser->mechanisms, 512eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington (DBusForeachFunction) dbus_free, 513eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington NULL); 514eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 515eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington _dbus_list_clear (&parser->mechanisms); 516eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 51794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&parser->basedir); 518bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 519bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington if (parser->policy) 520bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington bus_policy_unref (parser->policy); 5210da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 522cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters if (parser->service_context_table) 523cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters _dbus_hash_table_unref (parser->service_context_table); 5241e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 52517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington dbus_free (parser); 52617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington } 52717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington} 52817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 52917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtondbus_bool_t 53017e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtonbus_config_parser_check_doctype (BusConfigParser *parser, 53117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington const char *doctype, 53217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington DBusError *error) 53317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 53490ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 535bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 53617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington if (strcmp (doctype, "busconfig") != 0) 53717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington { 53817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington dbus_set_error (error, 53917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington DBUS_ERROR_FAILED, 540bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Configuration file has the wrong document type %s", 54117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington doctype); 54217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington return FALSE; 54317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington } 54417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington else 54517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington return TRUE; 54617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington} 54717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 548bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtontypedef struct 549bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 550bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *name; 551bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **retloc; 552bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} LocateAttr; 553bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 554bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic dbus_bool_t 555bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonlocate_attributes (BusConfigParser *parser, 556bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *element_name, 557bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **attribute_names, 558bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **attribute_values, 559bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington DBusError *error, 560bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *first_attribute_name, 561bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **first_attribute_retloc, 562bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington ...) 563bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 564bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington va_list args; 565bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *name; 566bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **retloc; 567bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington int n_attrs; 568bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington#define MAX_ATTRS 24 569bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington LocateAttr attrs[MAX_ATTRS]; 570bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_bool_t retval; 571bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington int i; 572bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 573bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert (first_attribute_name != NULL); 574bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert (first_attribute_retloc != NULL); 575bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 576bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington retval = TRUE; 577bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 578bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington n_attrs = 1; 579bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attrs[0].name = first_attribute_name; 580bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attrs[0].retloc = first_attribute_retloc; 581bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington *first_attribute_retloc = NULL; 582bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 583bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington va_start (args, first_attribute_retloc); 584bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 585bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington name = va_arg (args, const char*); 586bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington retloc = va_arg (args, const char**); 587bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 588bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington while (name != NULL) 589bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 590bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert (retloc != NULL); 591bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert (n_attrs < MAX_ATTRS); 592bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 593bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attrs[n_attrs].name = name; 594bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attrs[n_attrs].retloc = retloc; 595bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington n_attrs += 1; 596bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington *retloc = NULL; 597bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 598bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington name = va_arg (args, const char*); 599bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington retloc = va_arg (args, const char**); 600bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 601bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 602bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington va_end (args); 603bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 604bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington i = 0; 605bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington while (attribute_names[i]) 606bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 607bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington int j; 608bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_bool_t found; 609bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 610bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington found = FALSE; 611bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington j = 0; 612bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington while (j < n_attrs) 613bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 614bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (strcmp (attrs[j].name, attribute_names[i]) == 0) 615bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 616bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington retloc = attrs[j].retloc; 617bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 618bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (*retloc != NULL) 619bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 620bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 621bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Attribute \"%s\" repeated twice on the same <%s> element", 622bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attrs[j].name, element_name); 623bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington retval = FALSE; 624bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington goto out; 625bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 626bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 627bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington *retloc = attribute_values[i]; 628bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington found = TRUE; 629bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 630bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 631bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington ++j; 632bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 633bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 634bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!found) 635bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 636bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 637bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Attribute \"%s\" is invalid on <%s> element in this context", 638bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attribute_names[i], element_name); 639bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington retval = FALSE; 640bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington goto out; 641bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 642bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 643bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington ++i; 644bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 645bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 646bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington out: 647bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return retval; 648bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 649bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 650bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic dbus_bool_t 651bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtoncheck_no_attributes (BusConfigParser *parser, 652bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *element_name, 653bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **attribute_names, 654bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **attribute_values, 655bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington DBusError *error) 656bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 657bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (attribute_names[0] != NULL) 658bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 659bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 660bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Attribute \"%s\" is invalid on <%s> element in this context", 661bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attribute_names[0], element_name); 662bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 663bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 664bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 665bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 666bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 667bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 668bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic dbus_bool_t 669bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstart_busconfig_child (BusConfigParser *parser, 670bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *element_name, 671bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **attribute_names, 672bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **attribute_values, 673bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington DBusError *error) 674bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 6750cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes ElementType element_type; 6760cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 6770cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes element_type = bus_config_parser_element_name_to_type (element_name); 6780cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 6790cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (element_type == ELEMENT_USER) 680bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 681bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!check_no_attributes (parser, "user", attribute_names, attribute_values, error)) 682bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 683bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 684bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (push_element (parser, ELEMENT_USER) == NULL) 685bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 686eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 687eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington return FALSE; 688eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington } 689eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 690eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington return TRUE; 691eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington } 6920cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_TYPE) 693eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington { 694eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington if (!check_no_attributes (parser, "type", attribute_names, attribute_values, error)) 695eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington return FALSE; 696eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 697eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington if (push_element (parser, ELEMENT_TYPE) == NULL) 698eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington { 699eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 700bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 701bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 702bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 703bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 704bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 7050cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_FORK) 70644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington { 70744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington if (!check_no_attributes (parser, "fork", attribute_names, attribute_values, error)) 70844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return FALSE; 70944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 71044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington if (push_element (parser, ELEMENT_FORK) == NULL) 71144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington { 712eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 71344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return FALSE; 71444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington } 71544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 71644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington parser->fork = TRUE; 71744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 71844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return TRUE; 71944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington } 72069ed32cbccbec9d613447cb64e9d7b1ffa11ce3cColin Walters else if (element_type == ELEMENT_SYSLOG) 7210314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen { 72269ed32cbccbec9d613447cb64e9d7b1ffa11ce3cColin Walters if (!check_no_attributes (parser, "syslog", attribute_names, attribute_values, error)) 7230314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen return FALSE; 7240314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen 72569ed32cbccbec9d613447cb64e9d7b1ffa11ce3cColin Walters if (push_element (parser, ELEMENT_SYSLOG) == NULL) 7260314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen { 7270314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen BUS_SET_OOM (error); 7280314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen return FALSE; 7290314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen } 7306663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen 73169ed32cbccbec9d613447cb64e9d7b1ffa11ce3cColin Walters parser->syslog = TRUE; 7320314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen 7330314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen return TRUE; 7340314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen } 7356663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen else if (element_type == ELEMENT_KEEP_UMASK) 736bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters { 7376663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen if (!check_no_attributes (parser, "keep_umask", attribute_names, attribute_values, error)) 738bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters return FALSE; 739bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters 7406663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen if (push_element (parser, ELEMENT_KEEP_UMASK) == NULL) 741bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters { 742bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters BUS_SET_OOM (error); 743bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters return FALSE; 744bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters } 745bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters 7466663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen parser->keep_umask = TRUE; 747bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters 748bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters return TRUE; 749bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters } 7500cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_PIDFILE) 751856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington { 752856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington if (!check_no_attributes (parser, "pidfile", attribute_names, attribute_values, error)) 753856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington return FALSE; 754856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 755856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington if (push_element (parser, ELEMENT_PIDFILE) == NULL) 756856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington { 757856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington BUS_SET_OOM (error); 758856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington return FALSE; 759856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington } 760856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 761856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington return TRUE; 762856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington } 7630cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_LISTEN) 764bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 765bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!check_no_attributes (parser, "listen", attribute_names, attribute_values, error)) 766bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 767bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 768bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (push_element (parser, ELEMENT_LISTEN) == NULL) 769bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 770eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 771bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 772bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 773bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 774bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 775bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 7760cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_AUTH) 77744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington { 77844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington if (!check_no_attributes (parser, "auth", attribute_names, attribute_values, error)) 77944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return FALSE; 78044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 78144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington if (push_element (parser, ELEMENT_AUTH) == NULL) 78244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington { 783eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 78444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return FALSE; 78544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington } 7861e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 78744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return TRUE; 78844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington } 7890cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_SERVICEHELPER) 7900cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 7910cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!check_no_attributes (parser, "servicehelper", attribute_names, attribute_values, error)) 7920cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 7930cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 7940cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (push_element (parser, ELEMENT_SERVICEHELPER) == NULL) 7950cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 7960cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes BUS_SET_OOM (error); 7970cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 7980cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 7990cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 8000cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return TRUE; 8010cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 8020cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_INCLUDEDIR) 803cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 804cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (!check_no_attributes (parser, "includedir", attribute_names, attribute_values, error)) 805cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return FALSE; 806cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 807cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (push_element (parser, ELEMENT_INCLUDEDIR) == NULL) 808cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 809eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 810cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return FALSE; 811cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 812cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 813cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return TRUE; 814cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 8150cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_STANDARD_SESSION_SERVICEDIRS) 8165640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 817a157ec7f72839473113934fc12581645b421e6d9John (J DBusList *link; 818a157ec7f72839473113934fc12581645b421e6d9John (J DBusList *dirs; 819a157ec7f72839473113934fc12581645b421e6d9John (J dirs = NULL; 820a157ec7f72839473113934fc12581645b421e6d9John (J 8215640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J if (!check_no_attributes (parser, "standard_session_servicedirs", attribute_names, attribute_values, error)) 8225640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return FALSE; 8235640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 8245640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J if (push_element (parser, ELEMENT_STANDARD_SESSION_SERVICEDIRS) == NULL) 8255640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 8265640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J BUS_SET_OOM (error); 8275640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return FALSE; 8285640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J } 8295640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 830a157ec7f72839473113934fc12581645b421e6d9John (J if (!_dbus_get_standard_session_servicedirs (&dirs)) 831a157ec7f72839473113934fc12581645b421e6d9John (J { 832a157ec7f72839473113934fc12581645b421e6d9John (J BUS_SET_OOM (error); 833a157ec7f72839473113934fc12581645b421e6d9John (J return FALSE; 834a157ec7f72839473113934fc12581645b421e6d9John (J } 835a157ec7f72839473113934fc12581645b421e6d9John (J 836a157ec7f72839473113934fc12581645b421e6d9John (J while ((link = _dbus_list_pop_first_link (&dirs))) 837a157ec7f72839473113934fc12581645b421e6d9John (J service_dirs_append_link_unique_or_free (&parser->service_dirs, link); 838a157ec7f72839473113934fc12581645b421e6d9John (J 8395640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return TRUE; 8405640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J } 8410cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_STANDARD_SYSTEM_SERVICEDIRS) 8420cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 8430cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusList *link; 8440cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusList *dirs; 8450cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dirs = NULL; 8460cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 8470cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!check_no_attributes (parser, "standard_system_servicedirs", attribute_names, attribute_values, error)) 8480cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 8490cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 8500cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (push_element (parser, ELEMENT_STANDARD_SYSTEM_SERVICEDIRS) == NULL) 8510cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 8520cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes BUS_SET_OOM (error); 8530cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 8540cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 8550cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 8560cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_get_standard_system_servicedirs (&dirs)) 8570cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 8580cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes BUS_SET_OOM (error); 8590cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 8600cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 8610cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 8620cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes while ((link = _dbus_list_pop_first_link (&dirs))) 8630cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes service_dirs_append_link_unique_or_free (&parser->service_dirs, link); 8640cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 8650cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return TRUE; 8660cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 86707a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker else if (element_type == ELEMENT_ALLOW_ANONYMOUS) 86807a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker { 86907a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker if (!check_no_attributes (parser, "allow_anonymous", attribute_names, attribute_values, error)) 87007a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker return FALSE; 87107a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker 87207a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker if (push_element (parser, ELEMENT_ALLOW_ANONYMOUS) == NULL) 87307a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker { 87407a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker BUS_SET_OOM (error); 87507a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker return FALSE; 87607a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker } 87707a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker 87807a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker parser->allow_anonymous = TRUE; 87907a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker return TRUE; 88007a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker } 8810cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_SERVICEDIR) 882cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 883cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (!check_no_attributes (parser, "servicedir", attribute_names, attribute_values, error)) 884cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return FALSE; 885cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 886cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (push_element (parser, ELEMENT_SERVICEDIR) == NULL) 887cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 888eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 889cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return FALSE; 890cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 891cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 892cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return TRUE; 893cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 8940cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_INCLUDE) 895bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 896bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington Element *e; 897736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters const char *if_selinux_enabled; 898bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *ignore_missing; 899ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters const char *selinux_root_relative; 900bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 901bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if ((e = push_element (parser, ELEMENT_INCLUDE)) == NULL) 902bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 903eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 904bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 905bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 906bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 907bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e->d.include.ignore_missing = FALSE; 908736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters e->d.include.if_selinux_enabled = FALSE; 909ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters e->d.include.selinux_root_relative = FALSE; 910bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 911bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!locate_attributes (parser, "include", 912bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attribute_names, 913bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attribute_values, 914bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington error, 915bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "ignore_missing", &ignore_missing, 916736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters "if_selinux_enabled", &if_selinux_enabled, 917ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters "selinux_root_relative", &selinux_root_relative, 918bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington NULL)) 919bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 920bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 921bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (ignore_missing != NULL) 922bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 923bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (strcmp (ignore_missing, "yes") == 0) 924bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e->d.include.ignore_missing = TRUE; 925bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else if (strcmp (ignore_missing, "no") == 0) 926bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e->d.include.ignore_missing = FALSE; 927bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else 928bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 929bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 930bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "ignore_missing attribute must have value \"yes\" or \"no\""); 931bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 932bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 933bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 934736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters 935736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters if (if_selinux_enabled != NULL) 936736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters { 937736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters if (strcmp (if_selinux_enabled, "yes") == 0) 938736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters e->d.include.if_selinux_enabled = TRUE; 939736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters else if (strcmp (if_selinux_enabled, "no") == 0) 940736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters e->d.include.if_selinux_enabled = FALSE; 941736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters else 942736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters { 943736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters dbus_set_error (error, DBUS_ERROR_FAILED, 944736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters "if_selinux_enabled attribute must have value" 945736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters " \"yes\" or \"no\""); 946736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters return FALSE; 947736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters } 948736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters } 949ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters 950ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters if (selinux_root_relative != NULL) 951ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters { 952ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters if (strcmp (selinux_root_relative, "yes") == 0) 953ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters e->d.include.selinux_root_relative = TRUE; 954ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters else if (strcmp (selinux_root_relative, "no") == 0) 955ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters e->d.include.selinux_root_relative = FALSE; 956ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters else 957ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters { 958ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters dbus_set_error (error, DBUS_ERROR_FAILED, 959ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters "selinux_root_relative attribute must have value" 960ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters " \"yes\" or \"no\""); 961ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters return FALSE; 962ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters } 963ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters } 964bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 965bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 966bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 9670cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_POLICY) 968bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 969bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington Element *e; 970bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *context; 971bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *user; 972bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *group; 973b78d222083d1a1186743e2bb3aded49b5a950fe2John (J const char *at_console; 974bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 975bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if ((e = push_element (parser, ELEMENT_POLICY)) == NULL) 976bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 977eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 978bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 979bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 980bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 9818aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington e->d.policy.type = POLICY_IGNORED; 9828aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 983bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington if (!locate_attributes (parser, "policy", 984bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attribute_names, 985bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attribute_values, 986bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington error, 987bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "context", &context, 988bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "user", &user, 989bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "group", &group, 990b78d222083d1a1186743e2bb3aded49b5a950fe2John (J "at_console", &at_console, 991bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington NULL)) 992bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 993bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 994bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington if (((context && user) || 995b78d222083d1a1186743e2bb3aded49b5a950fe2John (J (context && group) || 996b78d222083d1a1186743e2bb3aded49b5a950fe2John (J (context && at_console)) || 997b78d222083d1a1186743e2bb3aded49b5a950fe2John (J ((user && group) || 998b78d222083d1a1186743e2bb3aded49b5a950fe2John (J (user && at_console)) || 999b78d222083d1a1186743e2bb3aded49b5a950fe2John (J (group && at_console) || 1000b78d222083d1a1186743e2bb3aded49b5a950fe2John (J !(context || user || group || at_console)) 1001bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington { 1002bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1003b78d222083d1a1186743e2bb3aded49b5a950fe2John (J "<policy> element must have exactly one of (context|user|group|at_console) attributes"); 1004bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington return FALSE; 1005bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington } 1006bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 1007bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington if (context != NULL) 1008bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington { 1009bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington if (strcmp (context, "default") == 0) 1010bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington { 10118aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington e->d.policy.type = POLICY_DEFAULT; 1012bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington } 1013bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington else if (strcmp (context, "mandatory") == 0) 1014bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington { 10158aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington e->d.policy.type = POLICY_MANDATORY; 1016bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington } 1017bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington else 1018bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington { 1019bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1020bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington "context attribute on <policy> must have the value \"default\" or \"mandatory\", not \"%s\"", 1021bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington context); 1022bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington return FALSE; 1023bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington } 1024bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington } 1025bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington else if (user != NULL) 1026bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington { 10278aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington DBusString username; 10288aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_string_init_const (&username, user); 1029bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 10307be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (_dbus_parse_unix_user_from_config (&username, 10317be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington &e->d.policy.gid_uid_or_at_console)) 10328aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington e->d.policy.type = POLICY_USER; 10338aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else 10348aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_warn ("Unknown username \"%s\" in message bus configuration file\n", 10358aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington user); 1036bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington } 1037bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington else if (group != NULL) 1038bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington { 10398aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington DBusString group_name; 10408aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_string_init_const (&group_name, group); 1041bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 10427be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (_dbus_parse_unix_group_from_config (&group_name, 10437be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington &e->d.policy.gid_uid_or_at_console)) 10448aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington e->d.policy.type = POLICY_GROUP; 10458aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else 10468aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_warn ("Unknown group \"%s\" in message bus configuration file\n", 10478aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington group); 1048bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington } 1049b78d222083d1a1186743e2bb3aded49b5a950fe2John (J else if (at_console != NULL) 1050b78d222083d1a1186743e2bb3aded49b5a950fe2John (J { 1051b78d222083d1a1186743e2bb3aded49b5a950fe2John (J dbus_bool_t t; 1052b78d222083d1a1186743e2bb3aded49b5a950fe2John (J t = (strcmp (at_console, "true") == 0); 1053b78d222083d1a1186743e2bb3aded49b5a950fe2John (J if (t || strcmp (at_console, "false") == 0) 1054b78d222083d1a1186743e2bb3aded49b5a950fe2John (J { 1055b78d222083d1a1186743e2bb3aded49b5a950fe2John (J e->d.policy.gid_uid_or_at_console = t; 1056b78d222083d1a1186743e2bb3aded49b5a950fe2John (J e->d.policy.type = POLICY_CONSOLE; 1057b78d222083d1a1186743e2bb3aded49b5a950fe2John (J } 1058b78d222083d1a1186743e2bb3aded49b5a950fe2John (J else 1059b78d222083d1a1186743e2bb3aded49b5a950fe2John (J { 1060b78d222083d1a1186743e2bb3aded49b5a950fe2John (J dbus_set_error (error, DBUS_ERROR_FAILED, 1061b78d222083d1a1186743e2bb3aded49b5a950fe2John (J "Unknown value \"%s\" for at_console in message bus configuration file", 1062b78d222083d1a1186743e2bb3aded49b5a950fe2John (J at_console); 1063b78d222083d1a1186743e2bb3aded49b5a950fe2John (J 1064b78d222083d1a1186743e2bb3aded49b5a950fe2John (J return FALSE; 1065b78d222083d1a1186743e2bb3aded49b5a950fe2John (J } 1066b78d222083d1a1186743e2bb3aded49b5a950fe2John (J } 1067bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington else 1068bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington { 1069bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington _dbus_assert_not_reached ("all <policy> attributes null and we didn't set error"); 1070bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington } 1071bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1072bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 1073bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 10740cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_LIMIT) 10753185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 10763185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington Element *e; 10773185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington const char *name; 10783185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 10793185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if ((e = push_element (parser, ELEMENT_LIMIT)) == NULL) 10803185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 10813185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington BUS_SET_OOM (error); 10823185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 10833185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 10843185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 10853185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (!locate_attributes (parser, "limit", 10863185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington attribute_names, 10873185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington attribute_values, 10883185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington error, 10893185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington "name", &name, 10903185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington NULL)) 10913185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 10923185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 10933185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (name == NULL) 10943185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 10953185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 10963185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington "<limit> element must have a \"name\" attribute"); 10973185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 10983185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 10993185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 11003185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington e->d.limit.name = _dbus_strdup (name); 11013185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (e->d.limit.name == NULL) 11023185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 11033185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington BUS_SET_OOM (error); 11043185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 11053185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 11063185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 11073185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return TRUE; 11083185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 11090cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes else if (element_type == ELEMENT_SELINUX) 11101e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 11111e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (!check_no_attributes (parser, "selinux", attribute_names, attribute_values, error)) 11121e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 11131e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 11141e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (push_element (parser, ELEMENT_SELINUX) == NULL) 11151e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 11161e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington BUS_SET_OOM (error); 11171e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 11181e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 11191e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 11201e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return TRUE; 11211e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 1122bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else 1123bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1124bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1125bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Element <%s> not allowed inside <%s> in configuration file", 1126bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington element_name, "busconfig"); 1127bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1128bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1129bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 1130bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1131bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic dbus_bool_t 11328aabca8dd28a113712389be51e75ea8c2fd17838Havoc Penningtonappend_rule_from_element (BusConfigParser *parser, 11338aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington const char *element_name, 11348aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington const char **attribute_names, 11358aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington const char **attribute_values, 11368aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington dbus_bool_t allow, 11378aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington DBusError *error) 11388aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington{ 11396053d2208e85d1a685df385620eff45895211b0cColin Walters const char *log; 114095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington const char *send_interface; 114195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington const char *send_member; 114295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington const char *send_error; 1143a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington const char *send_destination; 114483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington const char *send_path; 114583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington const char *send_type; 114695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington const char *receive_interface; 114795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington const char *receive_member; 114895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington const char *receive_error; 1149a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington const char *receive_sender; 115083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington const char *receive_path; 115183e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington const char *receive_type; 1152a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington const char *eavesdrop; 11537c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington const char *send_requested_reply; 11547c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington const char *receive_requested_reply; 11558aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington const char *own; 11568aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington const char *user; 11578aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington const char *group; 1158b78d222083d1a1186743e2bb3aded49b5a950fe2John (J 11598aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington BusPolicyRule *rule; 11608aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 11618aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (!locate_attributes (parser, element_name, 11628aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington attribute_names, 11638aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington attribute_values, 11648aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington error, 116595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington "send_interface", &send_interface, 116695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington "send_member", &send_member, 116795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington "send_error", &send_error, 1168a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "send_destination", &send_destination, 116983e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington "send_path", &send_path, 117083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington "send_type", &send_type, 117195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington "receive_interface", &receive_interface, 117295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington "receive_member", &receive_member, 117395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington "receive_error", &receive_error, 1174a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "receive_sender", &receive_sender, 117583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington "receive_path", &receive_path, 117683e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington "receive_type", &receive_type, 1177a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "eavesdrop", &eavesdrop, 11787c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington "send_requested_reply", &send_requested_reply, 11797c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington "receive_requested_reply", &receive_requested_reply, 11808aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington "own", &own, 11818aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington "user", &user, 11828aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington "group", &group, 11836053d2208e85d1a685df385620eff45895211b0cColin Walters "log", &log, 11848aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington NULL)) 11858aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington return FALSE; 11868aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 1187a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (!(send_interface || send_member || send_error || send_destination || 118883e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington send_type || send_path || 1189a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington receive_interface || receive_member || receive_error || receive_sender || 11907c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington receive_type || receive_path || eavesdrop || 11917c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington send_requested_reply || receive_requested_reply || 119295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington own || user || group)) 11938aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 11948aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 11958aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington "Element <%s> must have one or more attributes", 11968aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington element_name); 11978aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington return FALSE; 11988aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 11998aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 120083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if ((send_member && (send_interface == NULL && send_path == NULL)) || 120183e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (receive_member && (receive_interface == NULL && receive_path == NULL))) 120295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington { 120395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 120483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington "On element <%s>, if you specify a member you must specify an interface or a path. Keep in mind that not all messages have an interface field.", 120595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington element_name); 120695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington return FALSE; 120795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington } 120895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 120995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington /* Allowed combinations of elements are: 121095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * 121195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * base, must be all send or all receive: 121283e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington * nothing 121395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * interface 121495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * interface + member 121595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * error 121695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * 12177c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington * base send_ can combine with send_destination, send_path, send_type, send_requested_reply 12187c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington * base receive_ with receive_sender, receive_path, receive_type, receive_requested_reply, eavesdrop 121995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * 122095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington * user, group, own must occur alone 1221a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * 1222a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington * Pretty sure the below stuff is broken, FIXME think about it more. 122395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington */ 12248aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 122595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (((send_interface && send_error) || 122695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_interface && receive_interface) || 122795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_interface && receive_member) || 122895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_interface && receive_error) || 1229a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_interface && receive_sender) || 12307c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_interface && receive_requested_reply) || 123195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_interface && own) || 123295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_interface && user) || 123395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_interface && group)) || 123495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 123595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington ((send_member && send_error) || 123695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_member && receive_interface) || 123795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_member && receive_member) || 123895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_member && receive_error) || 1239a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_member && receive_sender) || 12407c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_member && receive_requested_reply) || 124195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_member && own) || 124295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_member && user) || 124395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_member && group)) || 124495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 124595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington ((send_error && receive_interface) || 124695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_error && receive_member) || 124795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_error && receive_error) || 1248a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_error && receive_sender) || 12497c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_error && receive_requested_reply) || 125095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_error && own) || 125195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_error && user) || 125295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (send_error && group)) || 125395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 1254a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington ((send_destination && receive_interface) || 1255a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_destination && receive_member) || 1256a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_destination && receive_error) || 1257a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_destination && receive_sender) || 12587c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_destination && receive_requested_reply) || 1259a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_destination && own) || 1260a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_destination && user) || 1261a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_destination && group)) || 126295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 126383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington ((send_type && receive_interface) || 126483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_type && receive_member) || 126583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_type && receive_error) || 1266a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_type && receive_sender) || 12677c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_type && receive_requested_reply) || 126883e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_type && own) || 126983e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_type && user) || 127083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_type && group)) || 127183e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington 127283e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington ((send_path && receive_interface) || 127383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_path && receive_member) || 127483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_path && receive_error) || 1275a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (send_path && receive_sender) || 12767c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_path && receive_requested_reply) || 127783e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_path && own) || 127883e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_path && user) || 127983e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington (send_path && group)) || 12807c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington 12817c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington ((send_requested_reply && receive_interface) || 12827c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_requested_reply && receive_member) || 12837c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_requested_reply && receive_error) || 12847c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_requested_reply && receive_sender) || 12857c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_requested_reply && receive_requested_reply) || 12867c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_requested_reply && own) || 12877c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_requested_reply && user) || 12887c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (send_requested_reply && group)) || 128983e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington 129095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington ((receive_interface && receive_error) || 129195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (receive_interface && own) || 129295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (receive_interface && user) || 129395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (receive_interface && group)) || 129495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 129595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington ((receive_member && receive_error) || 129695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (receive_member && own) || 129795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (receive_member && user) || 129895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (receive_member && group)) || 1299a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 130095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington ((receive_error && own) || 130195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (receive_error && user) || 130295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (receive_error && group)) || 130395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 1304a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington ((eavesdrop && own) || 1305a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (eavesdrop && user) || 1306a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington (eavesdrop && group)) || 13073251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 13087c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington ((receive_requested_reply && own) || 13097c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (receive_requested_reply && user) || 13107c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington (receive_requested_reply && group)) || 1311a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 131295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington ((own && user) || 131395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington (own && group)) || 13148aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 131595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington ((user && group))) 13168aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 13178aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1318a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington "Invalid combination of attributes on element <%s>", 13198aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington element_name); 13208aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington return FALSE; 13218aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 132283e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington 13238aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule = NULL; 13248aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 13258aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington /* In BusPolicyRule, NULL represents wildcard. 13268aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington * In the config file, '*' represents it. 13278aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington */ 13288aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington#define IS_WILDCARD(str) ((str) && ((str)[0]) == '*' && ((str)[1]) == '\0') 13298aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 1330a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (send_interface || send_member || send_error || send_destination || 13317c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington send_path || send_type || send_requested_reply) 13328aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 133383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington int message_type; 13348aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 133595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (IS_WILDCARD (send_interface)) 133695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington send_interface = NULL; 133795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (IS_WILDCARD (send_member)) 133895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington send_member = NULL; 133995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (IS_WILDCARD (send_error)) 134095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington send_error = NULL; 1341a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (IS_WILDCARD (send_destination)) 1342a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington send_destination = NULL; 134383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (IS_WILDCARD (send_path)) 134483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington send_path = NULL; 134583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (IS_WILDCARD (send_type)) 134683e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington send_type = NULL; 134783e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington 134883e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington message_type = DBUS_MESSAGE_TYPE_INVALID; 134983e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (send_type != NULL) 135083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington { 13516a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington message_type = dbus_message_type_from_string (send_type); 135283e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (message_type == DBUS_MESSAGE_TYPE_INVALID) 135383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington { 135483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 135583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington "Bad message type \"%s\"", 135683e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington send_type); 135783e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington return FALSE; 135883e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington } 135983e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington } 13607c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington 1361cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker if (eavesdrop && 1362cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker !(strcmp (eavesdrop, "true") == 0 || 1363cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker strcmp (eavesdrop, "false") == 0)) 1364cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker { 1365cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker dbus_set_error (error, DBUS_ERROR_FAILED, 1366cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker "Bad value \"%s\" for %s attribute, must be true or false", 1367cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker "eavesdrop", eavesdrop); 1368cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker return FALSE; 1369cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker } 1370cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker 13717c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington if (send_requested_reply && 13727c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington !(strcmp (send_requested_reply, "true") == 0 || 13737c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington strcmp (send_requested_reply, "false") == 0)) 13747c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington { 13757c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 13767c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington "Bad value \"%s\" for %s attribute, must be true or false", 13777c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington "send_requested_reply", send_requested_reply); 13787c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington return FALSE; 13797c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington } 138095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 138183e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington rule = bus_policy_rule_new (BUS_POLICY_RULE_SEND, allow); 138283e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (rule == NULL) 138383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington goto nomem; 1384a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1385cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker if (eavesdrop) 1386cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker rule->d.send.eavesdrop = (strcmp (eavesdrop, "true") == 0); 1387cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker 13886053d2208e85d1a685df385620eff45895211b0cColin Walters if (log) 13896053d2208e85d1a685df385620eff45895211b0cColin Walters rule->d.send.log = (strcmp (log, "true") == 0); 13906053d2208e85d1a685df385620eff45895211b0cColin Walters 13917c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington if (send_requested_reply) 13927c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington rule->d.send.requested_reply = (strcmp (send_requested_reply, "true") == 0); 1393cd57ebe33b758755906d3823bbe3cef3ddd58f2dRalf Habacker 139483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington rule->d.send.message_type = message_type; 139583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington rule->d.send.path = _dbus_strdup (send_path); 139695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington rule->d.send.interface = _dbus_strdup (send_interface); 139795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington rule->d.send.member = _dbus_strdup (send_member); 139895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington rule->d.send.error = _dbus_strdup (send_error); 1399a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule->d.send.destination = _dbus_strdup (send_destination); 140083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (send_path && rule->d.send.path == NULL) 140183e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington goto nomem; 140295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (send_interface && rule->d.send.interface == NULL) 140395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington goto nomem; 140495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (send_member && rule->d.send.member == NULL) 14058aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 140695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (send_error && rule->d.send.error == NULL) 140795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington goto nomem; 1408a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (send_destination && rule->d.send.destination == NULL) 14098aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 14108aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 1411a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington else if (receive_interface || receive_member || receive_error || receive_sender || 14127c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington receive_path || receive_type || eavesdrop || receive_requested_reply) 14138aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 141483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington int message_type; 14158aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 141695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (IS_WILDCARD (receive_interface)) 141795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington receive_interface = NULL; 141895717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (IS_WILDCARD (receive_member)) 141995717a938b237d12211935f6a7467ef610288fe5Havoc Pennington receive_member = NULL; 142095717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (IS_WILDCARD (receive_error)) 142195717a938b237d12211935f6a7467ef610288fe5Havoc Pennington receive_error = NULL; 1422a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (IS_WILDCARD (receive_sender)) 1423a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington receive_sender = NULL; 142483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (IS_WILDCARD (receive_path)) 142583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington receive_path = NULL; 142683e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (IS_WILDCARD (receive_type)) 142783e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington receive_type = NULL; 142883e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington 142983e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington message_type = DBUS_MESSAGE_TYPE_INVALID; 143083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (receive_type != NULL) 143183e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington { 14326a65f4802e95ba442c520f8e225da837e0a9f73bHavoc Pennington message_type = dbus_message_type_from_string (receive_type); 143383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (message_type == DBUS_MESSAGE_TYPE_INVALID) 143483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington { 143583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 143683e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington "Bad message type \"%s\"", 143783e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington receive_type); 143883e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington return FALSE; 143983e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington } 144083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington } 1441a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1442a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 1443a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (eavesdrop && 1444a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington !(strcmp (eavesdrop, "true") == 0 || 1445a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington strcmp (eavesdrop, "false") == 0)) 1446a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington { 1447a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 14483251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington "Bad value \"%s\" for %s attribute, must be true or false", 14493251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington "eavesdrop", eavesdrop); 14503251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington return FALSE; 14513251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington } 14523251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 14537c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington if (receive_requested_reply && 14547c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington !(strcmp (receive_requested_reply, "true") == 0 || 14557c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington strcmp (receive_requested_reply, "false") == 0)) 14563251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington { 14573251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 14583251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington "Bad value \"%s\" for %s attribute, must be true or false", 14597c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington "receive_requested_reply", receive_requested_reply); 1460a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington return FALSE; 1461a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington } 146283e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington 146383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington rule = bus_policy_rule_new (BUS_POLICY_RULE_RECEIVE, allow); 146483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (rule == NULL) 146583e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington goto nomem; 146695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington 1467a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (eavesdrop) 1468a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule->d.receive.eavesdrop = (strcmp (eavesdrop, "true") == 0); 14693251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 14707c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington if (receive_requested_reply) 14717c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington rule->d.receive.requested_reply = (strcmp (receive_requested_reply, "true") == 0); 1472a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington 147383e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington rule->d.receive.message_type = message_type; 147483e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington rule->d.receive.path = _dbus_strdup (receive_path); 147595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington rule->d.receive.interface = _dbus_strdup (receive_interface); 147695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington rule->d.receive.member = _dbus_strdup (receive_member); 147795717a938b237d12211935f6a7467ef610288fe5Havoc Pennington rule->d.receive.error = _dbus_strdup (receive_error); 1478a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington rule->d.receive.origin = _dbus_strdup (receive_sender); 14793251264ac483680b4a5fe808729f7e3b34f41fd4Havoc Pennington 148083e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington if (receive_path && rule->d.receive.path == NULL) 148183e41dff82abe99e1a35e70ca0bb60672204ffcdHavoc Pennington goto nomem; 148295717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (receive_interface && rule->d.receive.interface == NULL) 148395717a938b237d12211935f6a7467ef610288fe5Havoc Pennington goto nomem; 148495717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (receive_member && rule->d.receive.member == NULL) 148595717a938b237d12211935f6a7467ef610288fe5Havoc Pennington goto nomem; 148695717a938b237d12211935f6a7467ef610288fe5Havoc Pennington if (receive_error && rule->d.receive.error == NULL) 14878aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 1488a683a80c409cc4f2e57ba6a3e60d52f91b8657d0Havoc Pennington if (receive_sender && rule->d.receive.origin == NULL) 14898aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 14908aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 14918aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else if (own) 14928aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 14938aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule = bus_policy_rule_new (BUS_POLICY_RULE_OWN, allow); 14948aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (rule == NULL) 14958aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 14968aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 14978aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (IS_WILDCARD (own)) 14988aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington own = NULL; 14998aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15008aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule->d.own.service_name = _dbus_strdup (own); 15018aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (own && rule->d.own.service_name == NULL) 15028aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 15038aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15048aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else if (user) 15058aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15068aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (IS_WILDCARD (user)) 15078aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15088aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule = bus_policy_rule_new (BUS_POLICY_RULE_USER, allow); 15098aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (rule == NULL) 15108aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 15118aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 1512777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington rule->d.user.uid = DBUS_UID_UNSET; 15138aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15148aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else 15158aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15168aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington DBusString username; 15178aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington dbus_uid_t uid; 15188aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15198aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_string_init_const (&username, user); 15208aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15217be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (_dbus_parse_unix_user_from_config (&username, &uid)) 15228aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15238aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule = bus_policy_rule_new (BUS_POLICY_RULE_USER, allow); 15248aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (rule == NULL) 15258aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 1526777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 15278aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule->d.user.uid = uid; 15288aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15298aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else 15308aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15318aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_warn ("Unknown username \"%s\" on element <%s>\n", 15328aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington user, element_name); 15338aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15348aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15358aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15368aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else if (group) 15378aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15388aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (IS_WILDCARD (group)) 15398aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15408aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule = bus_policy_rule_new (BUS_POLICY_RULE_GROUP, allow); 15418aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (rule == NULL) 15428aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 15438aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 1544777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington rule->d.group.gid = DBUS_GID_UNSET; 15458aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15468aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else 15478aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15488aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington DBusString groupname; 15498aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington dbus_gid_t gid; 15508aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15518aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_string_init_const (&groupname, group); 15528aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15537be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington if (_dbus_parse_unix_group_from_config (&groupname, &gid)) 15548aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15558aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule = bus_policy_rule_new (BUS_POLICY_RULE_GROUP, allow); 15568aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (rule == NULL) 15578aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 1558777707ed8dff6958972a93894a87ec1945c65c14Havoc Pennington 15598aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule->d.group.gid = gid; 15608aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15618aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else 15628aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15638aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_warn ("Unknown group \"%s\" on element <%s>\n", 15648aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington group, element_name); 15658aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15668aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15678aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 15688aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington else 15698aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_assert_not_reached ("Did not handle some combination of attributes on <allow> or <deny>"); 15708aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15718aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (rule != NULL) 15728aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15738aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington Element *pe; 15748aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15758aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington pe = peek_element (parser); 15768aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_assert (pe != NULL); 15778aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington _dbus_assert (pe->type == ELEMENT_POLICY); 15788aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15798aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington switch (pe->d.policy.type) 15808aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15818aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington case POLICY_IGNORED: 15828aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington /* drop the rule on the floor */ 15838aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington break; 15848aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 15858aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington case POLICY_DEFAULT: 15868aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (!bus_policy_append_default_rule (parser->policy, rule)) 15878aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 15888aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington break; 15898aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington case POLICY_MANDATORY: 15908aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (!bus_policy_append_mandatory_rule (parser->policy, rule)) 15918aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 15928aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington break; 15938aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington case POLICY_USER: 15948aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (!BUS_POLICY_RULE_IS_PER_CLIENT (rule)) 15958aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 15968aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 15978aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington "<%s> rule cannot be per-user because it has bus-global semantics", 15988aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington element_name); 15998aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto failed; 16008aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 16018aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 1602b78d222083d1a1186743e2bb3aded49b5a950fe2John (J if (!bus_policy_append_user_rule (parser->policy, pe->d.policy.gid_uid_or_at_console, 16038aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule)) 16048aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 16058aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington break; 16068aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington case POLICY_GROUP: 16078aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (!BUS_POLICY_RULE_IS_PER_CLIENT (rule)) 16088aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington { 16098aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 16108aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington "<%s> rule cannot be per-group because it has bus-global semantics", 16118aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington element_name); 16128aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto failed; 16138aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 16148aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 1615b78d222083d1a1186743e2bb3aded49b5a950fe2John (J if (!bus_policy_append_group_rule (parser->policy, pe->d.policy.gid_uid_or_at_console, 1616b78d222083d1a1186743e2bb3aded49b5a950fe2John (J rule)) 1617b78d222083d1a1186743e2bb3aded49b5a950fe2John (J goto nomem; 1618b78d222083d1a1186743e2bb3aded49b5a950fe2John (J break; 1619b78d222083d1a1186743e2bb3aded49b5a950fe2John (J 1620b78d222083d1a1186743e2bb3aded49b5a950fe2John (J 1621b78d222083d1a1186743e2bb3aded49b5a950fe2John (J case POLICY_CONSOLE: 1622b78d222083d1a1186743e2bb3aded49b5a950fe2John (J if (!bus_policy_append_console_rule (parser->policy, pe->d.policy.gid_uid_or_at_console, 16237be5fd95cdccdca28937804f32ca8b1308887d09Havoc Pennington rule)) 16248aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington goto nomem; 16258aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington break; 16268aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 1627b78d222083d1a1186743e2bb3aded49b5a950fe2John (J 16288aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington bus_policy_rule_unref (rule); 16298aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington rule = NULL; 16308aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington } 16318aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 16328aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington return TRUE; 16338aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 16348aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington nomem: 16358aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington BUS_SET_OOM (error); 16368aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington failed: 16378aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (rule) 16388aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington bus_policy_rule_unref (rule); 16398aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington return FALSE; 16408aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington} 16418aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 16428aabca8dd28a113712389be51e75ea8c2fd17838Havoc Penningtonstatic dbus_bool_t 1643bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstart_policy_child (BusConfigParser *parser, 1644bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *element_name, 1645bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **attribute_names, 1646bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char **attribute_values, 1647bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington DBusError *error) 1648bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 1649bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (strcmp (element_name, "allow") == 0) 1650bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 16518aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (!append_rule_from_element (parser, element_name, 16528aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington attribute_names, attribute_values, 16538aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington TRUE, error)) 16548aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington return FALSE; 16558aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 1656bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (push_element (parser, ELEMENT_ALLOW) == NULL) 1657bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1658eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 1659bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1660bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1661bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1662bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 1663bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1664bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else if (strcmp (element_name, "deny") == 0) 1665bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 16668aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington if (!append_rule_from_element (parser, element_name, 16678aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington attribute_names, attribute_values, 16688aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington FALSE, error)) 16698aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington return FALSE; 16708aabca8dd28a113712389be51e75ea8c2fd17838Havoc Pennington 1671bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (push_element (parser, ELEMENT_DENY) == NULL) 1672bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1673eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 1674bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1675bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1676bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1677bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 1678bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1679bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else 1680bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1681bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1682bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Element <%s> not allowed inside <%s> in configuration file", 1683bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington element_name, "policy"); 1684bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1685bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1686bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 1687bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 16881e9b185b0c274ef0d684b1e43418388225321e72Havoc Penningtonstatic dbus_bool_t 16891e9b185b0c274ef0d684b1e43418388225321e72Havoc Penningtonstart_selinux_child (BusConfigParser *parser, 16901e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington const char *element_name, 16911e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington const char **attribute_names, 16921e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington const char **attribute_values, 16931e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington DBusError *error) 16941e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington{ 16959a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J char *own_copy; 16969a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J char *context_copy; 16979a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 16989a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J own_copy = NULL; 16999a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J context_copy = NULL; 17009a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 17011e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (strcmp (element_name, "associate") == 0) 17021e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 17031e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington const char *own; 17041e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington const char *context; 17051e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 17061e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (!locate_attributes (parser, "associate", 17071e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington attribute_names, 17081e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington attribute_values, 17091e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington error, 17101e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington "own", &own, 17111e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington "context", &context, 17121e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington NULL)) 17131e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 17141e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 17151e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (push_element (parser, ELEMENT_ASSOCIATE) == NULL) 17161e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 17171e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington BUS_SET_OOM (error); 17181e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 17191e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 17201e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 17211e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington if (own == NULL || context == NULL) 17221e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 17231e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 17241e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington "Element <associate> must have attributes own=\"<servicename>\" and context=\"<selinux context>\""); 17251e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 17261e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 17271e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 1728cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters own_copy = _dbus_strdup (own); 1729cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters if (own_copy == NULL) 17309a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J goto oom; 1731cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters context_copy = _dbus_strdup (context); 1732cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters if (context_copy == NULL) 17339a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J goto oom; 1734cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters 1735cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters if (!_dbus_hash_table_insert_string (parser->service_context_table, 1736cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters own_copy, context_copy)) 17379a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J goto oom; 17389a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 17391e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return TRUE; 17401e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 17411e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington else 17421e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 17431e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 17441e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington "Element <%s> not allowed inside <%s> in configuration file", 17451e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington element_name, "selinux"); 17461e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return FALSE; 17471e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 17489a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 17499a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J oom: 17509a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J if (own_copy) 17519a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J dbus_free (own_copy); 17529a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 17539a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J if (context_copy) 17549a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J dbus_free (context_copy); 17559a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 17569a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J BUS_SET_OOM (error); 17579a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J return FALSE; 17581e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington} 17591e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 176017e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtondbus_bool_t 176117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtonbus_config_parser_start_element (BusConfigParser *parser, 176217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington const char *element_name, 176317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington const char **attribute_names, 176417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington const char **attribute_values, 176517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington DBusError *error) 176617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 1767bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington ElementType t; 176817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 1769bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 1770bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1771bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington /* printf ("START: %s\n", element_name); */ 1772bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1773bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington t = top_element_type (parser); 1774bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1775bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (t == ELEMENT_NONE) 1776bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1777bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (strcmp (element_name, "busconfig") == 0) 1778bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1779bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!check_no_attributes (parser, "busconfig", attribute_names, attribute_values, error)) 1780bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1781bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1782bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (push_element (parser, ELEMENT_BUSCONFIG) == NULL) 1783bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1784eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington BUS_SET_OOM (error); 1785bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1786bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1787bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1788bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 1789bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1790bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else 1791bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1792bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1793bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Unknown element <%s> at root of configuration file", 1794bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington element_name); 1795bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1796bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1797bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1798bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else if (t == ELEMENT_BUSCONFIG) 1799bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1800bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return start_busconfig_child (parser, element_name, 1801bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attribute_names, attribute_values, 1802bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington error); 1803bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1804bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else if (t == ELEMENT_POLICY) 1805bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1806bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return start_policy_child (parser, element_name, 1807bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington attribute_names, attribute_values, 1808bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington error); 1809bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 18101e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington else if (t == ELEMENT_SELINUX) 18111e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington { 18121e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return start_selinux_child (parser, element_name, 18131e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington attribute_names, attribute_values, 18141e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington error); 18151e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington } 1816bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else 1817bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1818bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1819bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Element <%s> is not allowed in this context", 1820bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington element_name); 1821bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1822bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 182317e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington} 182417e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 18253185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Penningtonstatic dbus_bool_t 18263185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Penningtonset_limit (BusConfigParser *parser, 18273185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington const char *name, 18283185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington long value, 18293185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington DBusError *error) 18303185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington{ 18313185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington dbus_bool_t must_be_positive; 18323185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington dbus_bool_t must_be_int; 18333185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 18343185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_int = FALSE; 18353185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = FALSE; 18363185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 18373185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (strcmp (name, "max_incoming_bytes") == 0) 18383185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 18393185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = TRUE; 18403185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington parser->limits.max_incoming_bytes = value; 18413185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 184264ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering else if (strcmp (name, "max_incoming_unix_fds") == 0) 184364ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering { 184464ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering must_be_positive = TRUE; 184564ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering parser->limits.max_incoming_unix_fds = value; 184664ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering } 18473185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington else if (strcmp (name, "max_outgoing_bytes") == 0) 18483185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 18493185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = TRUE; 18503185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington parser->limits.max_outgoing_bytes = value; 18513185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 185264ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering else if (strcmp (name, "max_outgoing_unix_fds") == 0) 185364ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering { 185464ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering must_be_positive = TRUE; 185564ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering parser->limits.max_outgoing_unix_fds = value; 185664ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering } 18573185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington else if (strcmp (name, "max_message_size") == 0) 18583185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 18593185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = TRUE; 18603185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington parser->limits.max_message_size = value; 18613185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 186264ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering else if (strcmp (name, "max_message_unix_fds") == 0) 186364ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering { 186464ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering must_be_positive = TRUE; 186564ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering parser->limits.max_message_unix_fds = value; 186664ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering } 18678873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington else if (strcmp (name, "service_start_timeout") == 0) 18683185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 18693185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = TRUE; 18703185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_int = TRUE; 18713185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington parser->limits.activation_timeout = value; 18723185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 18733185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington else if (strcmp (name, "auth_timeout") == 0) 18743185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 18753185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = TRUE; 18763185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_int = TRUE; 18773185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington parser->limits.auth_timeout = value; 18783185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 187964f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington else if (strcmp (name, "reply_timeout") == 0) 188064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 188164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington must_be_positive = TRUE; 188264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington must_be_int = TRUE; 188364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington parser->limits.reply_timeout = value; 188464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 18853185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington else if (strcmp (name, "max_completed_connections") == 0) 18863185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 18873185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = TRUE; 18883185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_int = TRUE; 18893185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington parser->limits.max_completed_connections = value; 18903185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 18913185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington else if (strcmp (name, "max_incomplete_connections") == 0) 18923185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 18933185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = TRUE; 18943185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_int = TRUE; 18953185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington parser->limits.max_incomplete_connections = value; 18963185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 18973185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington else if (strcmp (name, "max_connections_per_user") == 0) 18983185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 18993185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_positive = TRUE; 19003185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington must_be_int = TRUE; 19013185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington parser->limits.max_connections_per_user = value; 19023185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 19038873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington else if (strcmp (name, "max_pending_service_starts") == 0) 1904b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 1905b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington must_be_positive = TRUE; 1906b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington must_be_int = TRUE; 1907b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington parser->limits.max_pending_activations = value; 1908b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 19098873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington else if (strcmp (name, "max_names_per_connection") == 0) 1910b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington { 1911b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington must_be_positive = TRUE; 1912b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington must_be_int = TRUE; 1913b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington parser->limits.max_services_per_connection = value; 1914b3bd48edfc1aab0a9dc64bfa4c380d845d218e73Havoc Pennington } 19158a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu else if (strcmp (name, "max_match_rules_per_connection") == 0) 19168a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu { 19178a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu must_be_positive = TRUE; 19188a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu must_be_int = TRUE; 19198a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu parser->limits.max_match_rules_per_connection = value; 19208a2c91b8a549402040c94b45b063311975583efdOlivier Andrieu } 192164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington else if (strcmp (name, "max_replies_per_connection") == 0) 192264f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington { 192364f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington must_be_positive = TRUE; 192464f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington must_be_int = TRUE; 192564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington parser->limits.max_replies_per_connection = value; 192664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington } 19273185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington else 19283185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 19293185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 19303185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington "There is no limit called \"%s\"\n", 19313185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington name); 19323185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 19333185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 19343185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 19353185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (must_be_positive && value < 0) 19363185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 19373185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 19383185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington "<limit name=\"%s\"> must be a positive number\n", 19393185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington name); 19403185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 19413185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 19423185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 19433185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (must_be_int && 19443185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington (value < _DBUS_INT_MIN || value > _DBUS_INT_MAX)) 19453185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 19463185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 19473185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington "<limit name=\"%s\"> value is too large\n", 19483185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington name); 19493185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 19503185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 19513185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 19523185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return TRUE; 19533185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington} 19543185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 195517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtondbus_bool_t 195617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtonbus_config_parser_end_element (BusConfigParser *parser, 195717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington const char *element_name, 195817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington DBusError *error) 195917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 1960bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington ElementType t; 1961bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *n; 1962bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington Element *e; 1963bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 196490ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 196517e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 1966bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington /* printf ("END: %s\n", element_name); */ 1967bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1968bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington t = top_element_type (parser); 1969bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1970bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (t == ELEMENT_NONE) 1971bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1972bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington /* should probably be an assertion failure but 1973bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington * being paranoid about XML parsers 1974bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington */ 1975bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1976bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "XML parser ended element with no element on the stack"); 1977bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1978bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1979bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 19800cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes n = bus_config_parser_element_type_to_name (t); 1981bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert (n != NULL); 1982bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (strcmp (n, element_name) != 0) 1983bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1984bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington /* should probably be an assertion failure but 1985bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington * being paranoid about XML parsers 1986bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington */ 1987bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 1988eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington "XML element <%s> ended but topmost element on the stack was <%s>", 1989eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington element_name, n); 1990bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 1991bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 1992bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1993bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e = peek_element (parser); 1994bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert (e != NULL); 1995bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 1996bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington switch (e->type) 1997bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 1998bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_NONE: 1999bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert_not_reached ("element in stack has no type"); 2000bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington break; 2001bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2002bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_INCLUDE: 2003bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_USER: 2004eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington case ELEMENT_TYPE: 2005bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_LISTEN: 2006856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington case ELEMENT_PIDFILE: 2007bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_AUTH: 2008cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington case ELEMENT_SERVICEDIR: 20090cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes case ELEMENT_SERVICEHELPER: 2010cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington case ELEMENT_INCLUDEDIR: 20113185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington case ELEMENT_LIMIT: 2012bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!e->had_content) 2013bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2014bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 2015bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "XML element <%s> was expected to have content inside it", 20160cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes bus_config_parser_element_type_to_name (e->type)); 2017bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 2018bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 20193185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 20203185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (e->type == ELEMENT_LIMIT) 20213185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 20223185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (!set_limit (parser, e->d.limit.name, e->d.limit.value, 20233185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington error)) 20243185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 20253185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 2026bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington break; 2027bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2028bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_BUSCONFIG: 2029bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_POLICY: 2030bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_ALLOW: 2031bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_DENY: 203244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington case ELEMENT_FORK: 2033bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters case ELEMENT_SYSLOG: 20346663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen case ELEMENT_KEEP_UMASK: 20351e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington case ELEMENT_SELINUX: 20361e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington case ELEMENT_ASSOCIATE: 20375640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J case ELEMENT_STANDARD_SESSION_SERVICEDIRS: 20380cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS: 203907a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker case ELEMENT_ALLOW_ANONYMOUS: 2040bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington break; 2041bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2042bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2043bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington pop_element (parser); 2044bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2045269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return TRUE; 204617e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington} 204717e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 2048bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonstatic dbus_bool_t 2049bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Penningtonall_whitespace (const DBusString *str) 2050bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington{ 2051bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington int i; 2052bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2053bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_string_skip_white (str, 0, &i); 2054bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2055bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return i == _dbus_string_get_length (str); 2056bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington} 2057bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2058cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Penningtonstatic dbus_bool_t 205994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Penningtonmake_full_path (const DBusString *basedir, 206094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington const DBusString *filename, 206194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington DBusString *full_path) 206294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington{ 206394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (_dbus_path_is_absolute (filename)) 206494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 206594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington return _dbus_string_copy (filename, 0, full_path, 0); 206694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 206794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington else 206894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 206994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_string_copy (basedir, 0, full_path, 0)) 207094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington return FALSE; 207194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 207294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_concat_dir_and_file (full_path, filename)) 207394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington return FALSE; 207494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 207594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington return TRUE; 207694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 207794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington} 207894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 207994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Penningtonstatic dbus_bool_t 2080cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Penningtoninclude_file (BusConfigParser *parser, 2081cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington const DBusString *filename, 2082cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington dbus_bool_t ignore_missing, 2083cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington DBusError *error) 2084cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington{ 2085cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington /* FIXME good test case for this would load each config file in the 2086cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington * test suite both alone, and as an include, and check 2087cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington * that the result is the same 2088cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington */ 2089cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington BusConfigParser *included; 20900da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge const char *filename_str; 2091cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington DBusError tmp_error; 2092cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2093cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington dbus_error_init (&tmp_error); 2094e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 20950da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge filename_str = _dbus_string_get_const_data (filename); 20960da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 20970da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge /* Check to make sure this file hasn't already been included. */ 20980da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge if (seen_include (parser, filename)) 20990da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge { 21000da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge dbus_set_error (error, DBUS_ERROR_FAILED, 21010da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge "Circular inclusion of file '%s'", 21020da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge filename_str); 21030da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge return FALSE; 21040da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge } 21050da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 21060da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge if (! _dbus_list_append (&parser->included_files, (void *) filename_str)) 21070da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge { 21080da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge BUS_SET_OOM (error); 21090da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge return FALSE; 21100da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge } 21110da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 2112e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* Since parser is passed in as the parent, included 2113e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge inherits parser's limits. */ 2114e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge included = bus_config_load (filename, FALSE, parser, &tmp_error); 2115e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 21160da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge _dbus_list_pop_last (&parser->included_files); 21170da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 2118cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (included == NULL) 2119cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 21200d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_SET (&tmp_error); 2121cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2122cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (dbus_error_has_name (&tmp_error, DBUS_ERROR_FILE_NOT_FOUND) && 2123cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington ignore_missing) 2124cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 2125cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington dbus_error_free (&tmp_error); 2126cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return TRUE; 2127cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2128cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington else 2129cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 2130cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington dbus_move_error (&tmp_error, error); 2131cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return FALSE; 2132cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2133cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2134cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington else 2135cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 21360d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR (&tmp_error); 2137cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2138cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (!merge_included (parser, included, error)) 2139cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 2140cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington bus_config_parser_unref (included); 2141cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return FALSE; 2142cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2143cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2144e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* Copy included's limits back to parser. */ 2145e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge parser->limits = included->limits; 2146e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2147cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington bus_config_parser_unref (included); 2148cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return TRUE; 2149cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2150cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington} 2151cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2152cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Penningtonstatic dbus_bool_t 21530cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughesservicehelper_path (BusConfigParser *parser, 21540cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes const DBusString *filename, 21550cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusError *error) 21560cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes{ 21570cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes const char *filename_str; 21580cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes char *servicehelper; 21590cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 216079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington filename_str = _dbus_string_get_const_data (filename); 21610cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 21620cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes /* copy to avoid overwriting with NULL on OOM */ 21630cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes servicehelper = _dbus_strdup (filename_str); 21640cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 21650cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes /* check for OOM */ 21660cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (servicehelper == NULL) 21670cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 21680cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes BUS_SET_OOM (error); 21690cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 21700cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 21710cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 21720cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes /* save the latest servicehelper only if not OOM */ 21730cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dbus_free (parser->servicehelper); 21740cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes parser->servicehelper = servicehelper; 21750cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 217679d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington /* We don't check whether the helper exists; instead we 217779d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * would just fail to ever activate anything if it doesn't. 217879d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * This allows an admin to fix the problem if it doesn't exist. 217979d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * It also allows the parser test suite to successfully parse 218079d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington * test cases without installing the helper. ;-) 218179d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington */ 218279d3004e26f490ef37ae0298495ea66f322ce374Havoc Pennington 21830cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return TRUE; 21840cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes} 21850cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 21860cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughesstatic dbus_bool_t 2187cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Penningtoninclude_dir (BusConfigParser *parser, 2188cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington const DBusString *dirname, 2189cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington DBusError *error) 2190cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington{ 2191cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington DBusString filename; 2192cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington dbus_bool_t retval; 2193cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington DBusError tmp_error; 2194cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington DBusDirIter *dir; 21951d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen char *s; 2196cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2197cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (!_dbus_string_init (&filename)) 2198cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 219994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington BUS_SET_OOM (error); 2200cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return FALSE; 2201cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2202cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2203cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington retval = FALSE; 2204cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2205cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington dir = _dbus_directory_open (dirname, error); 2206cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2207cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (dir == NULL) 2208cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington goto failed; 220994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 221094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington dbus_error_init (&tmp_error); 2211cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington while (_dbus_directory_get_next_file (dir, &filename, &tmp_error)) 2212cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 221394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington DBusString full_path; 221494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 221594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_string_init (&full_path)) 221694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 221794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington BUS_SET_OOM (error); 221894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto failed; 221994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 222094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 222194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_string_copy (dirname, 0, &full_path, 0)) 222294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 222394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington BUS_SET_OOM (error); 222494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 222594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto failed; 222694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 222794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 222894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_concat_dir_and_file (&full_path, &filename)) 222994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 223094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington BUS_SET_OOM (error); 223194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 223294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto failed; 223394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 223494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 223594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (_dbus_string_ends_with_c_str (&full_path, ".conf")) 2236cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 223794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!include_file (parser, &full_path, TRUE, error)) 223894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 223994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 224094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto failed; 224194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 2242cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 224394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 224494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 2245cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2246cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2247cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (dbus_error_is_set (&tmp_error)) 2248cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 2249cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington dbus_move_error (&tmp_error, error); 2250cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington goto failed; 2251cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 22521d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 22531d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 22541d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen if (!_dbus_string_copy_data (dirname, &s)) 22551d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen { 22561d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen BUS_SET_OOM (error); 22571d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen goto failed; 22581d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen } 22591d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 22601d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen if (!_dbus_list_append (&parser->conf_dirs, s)) 22611d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen { 22621d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen dbus_free (s); 22631d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen BUS_SET_OOM (error); 22641d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen goto failed; 22651d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen } 22661d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 2267cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington retval = TRUE; 2268cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2269cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington failed: 2270cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington _dbus_string_free (&filename); 2271cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2272cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington if (dir) 2273cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington _dbus_directory_close (dir); 2274cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2275cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return retval; 2276cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington} 2277cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 227817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtondbus_bool_t 227917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Penningtonbus_config_parser_content (BusConfigParser *parser, 228017e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington const DBusString *content, 228117e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington DBusError *error) 228217e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington{ 2283bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington Element *e; 2284bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 228590ed1d84588a84697051e643175452c50d682eceHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 228690ed1d84588a84697051e643175452c50d682eceHavoc Pennington 2287bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington#if 0 2288bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2289bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington const char *c_str; 2290bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2291bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_string_get_const_data (content, &c_str); 2292bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2293bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington printf ("CONTENT %d bytes: %s\n", _dbus_string_get_length (content), c_str); 2294bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2295bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington#endif 2296bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2297bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e = peek_element (parser); 2298bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (e == NULL) 2299bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2300bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 2301bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Text content outside of any XML element in configuration file"); 2302bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 2303bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2304bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else if (e->had_content) 2305bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2306bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert_not_reached ("Element had multiple content blocks"); 2307bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 2308bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2309bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2310bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington switch (top_element_type (parser)) 2311bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2312bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_NONE: 2313bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _dbus_assert_not_reached ("element at top of stack has no type"); 2314bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 2315bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2316bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_BUSCONFIG: 2317bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_POLICY: 2318bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_ALLOW: 2319bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_DENY: 232044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington case ELEMENT_FORK: 2321bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters case ELEMENT_SYSLOG: 23226663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen case ELEMENT_KEEP_UMASK: 2323a157ec7f72839473113934fc12581645b421e6d9John (J case ELEMENT_STANDARD_SESSION_SERVICEDIRS: 23240cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes case ELEMENT_STANDARD_SYSTEM_SERVICEDIRS: 232507a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker case ELEMENT_ALLOW_ANONYMOUS: 23261e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington case ELEMENT_SELINUX: 23271e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington case ELEMENT_ASSOCIATE: 2328bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (all_whitespace (content)) 2329bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return TRUE; 2330bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington else 2331bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2332bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 2333bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "No text content expected inside XML element %s in configuration file", 23340cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes bus_config_parser_element_type_to_name (top_element_type (parser))); 2335bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 2336bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2337bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2338856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington case ELEMENT_PIDFILE: 2339856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington { 2340856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington char *s; 2341856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 2342856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington e->had_content = TRUE; 2343856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 2344856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington if (!_dbus_string_copy_data (content, &s)) 2345856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington goto nomem; 2346856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 2347856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington dbus_free (parser->pidfile); 2348856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington parser->pidfile = s; 2349856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington } 2350856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington break; 2351856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 2352bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_INCLUDE: 2353bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2354ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters DBusString full_path, selinux_policy_root; 2355ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters 2356bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e->had_content = TRUE; 2357bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2358736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters if (e->d.include.if_selinux_enabled 2359736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters && !bus_selinux_enabled ()) 2360736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters break; 2361736fa825e15c8d72eac85080e6cdf028c2f8df43Colin Walters 236294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_string_init (&full_path)) 236394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto nomem; 2364ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters 2365ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters if (e->d.include.selinux_root_relative) 2366ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters { 2367ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters if (!bus_selinux_get_policy_root ()) 2368ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters { 2369ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters dbus_set_error (error, DBUS_ERROR_FAILED, 2370ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters "Could not determine SELinux policy root for relative inclusion"); 2371ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters _dbus_string_free (&full_path); 2372ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters return FALSE; 2373ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters } 2374ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters _dbus_string_init_const (&selinux_policy_root, 2375ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters bus_selinux_get_policy_root ()); 2376ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters if (!make_full_path (&selinux_policy_root, content, &full_path)) 2377ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters { 2378ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters _dbus_string_free (&full_path); 2379ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters goto nomem; 2380ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters } 2381ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters } 2382ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters else if (!make_full_path (&parser->basedir, content, &full_path)) 238394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 238494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 238594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto nomem; 238694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 2387ee78f2800f2642b4fff962b736296d87a7f12a17Colin Walters 238894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!include_file (parser, &full_path, 2389cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington e->d.include.ignore_missing, error)) 239094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 239194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 239294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington return FALSE; 239394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 239494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 239594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 2396bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2397bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington break; 2398bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 23990cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes case ELEMENT_SERVICEHELPER: 24000cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 24010cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusString full_path; 24020cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 24030cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes e->had_content = TRUE; 24040cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 24050cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_string_init (&full_path)) 24060cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes goto nomem; 24070cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 24080cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!make_full_path (&parser->basedir, content, &full_path)) 24090cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 24100cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&full_path); 24110cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes goto nomem; 24120cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 24130cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 24140cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!servicehelper_path (parser, &full_path, error)) 24150cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 24160cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&full_path); 24170cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 24180cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 24190cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 24200cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&full_path); 24210cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 24220cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes break; 24230cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 2424cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington case ELEMENT_INCLUDEDIR: 2425cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 242694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington DBusString full_path; 242794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 2428cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington e->had_content = TRUE; 242994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 243094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_string_init (&full_path)) 243194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto nomem; 2432cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 243394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!make_full_path (&parser->basedir, content, &full_path)) 243494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 243594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 243694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto nomem; 243794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 243894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 243994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!include_dir (parser, &full_path, error)) 244094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 244194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 244294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington return FALSE; 244394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 244494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 244594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 2446cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2447cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington break; 2448cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2449bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_USER: 2450bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2451bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington char *s; 2452bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2453bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e->had_content = TRUE; 2454bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2455bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!_dbus_string_copy_data (content, &s)) 2456bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington goto nomem; 2457bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2458bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_free (parser->user); 2459bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington parser->user = s; 2460bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2461bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington break; 2462bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2463eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington case ELEMENT_TYPE: 2464eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington { 2465eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington char *s; 2466eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 2467eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington e->had_content = TRUE; 2468eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 2469eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington if (!_dbus_string_copy_data (content, &s)) 2470eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington goto nomem; 2471eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 2472eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington dbus_free (parser->bus_type); 2473eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington parser->bus_type = s; 2474eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington } 2475eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington break; 2476eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 2477bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_LISTEN: 2478bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2479bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington char *s; 2480bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2481bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e->had_content = TRUE; 2482bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2483bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!_dbus_string_copy_data (content, &s)) 2484bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington goto nomem; 2485bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2486bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!_dbus_list_append (&parser->listen_on, 2487bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington s)) 2488bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2489bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_free (s); 2490bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington goto nomem; 2491bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2492bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2493bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington break; 2494bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2495bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington case ELEMENT_AUTH: 2496bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 249744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington char *s; 249844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 2499bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington e->had_content = TRUE; 250044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 250144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington if (!_dbus_string_copy_data (content, &s)) 250244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington goto nomem; 250344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 250444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington if (!_dbus_list_append (&parser->mechanisms, 250544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington s)) 250644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington { 250744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington dbus_free (s); 250844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington goto nomem; 250944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington } 2510bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2511bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington break; 2512cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 2513cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington case ELEMENT_SERVICEDIR: 2514cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 2515cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington char *s; 251694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington DBusString full_path; 2517cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 251894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington e->had_content = TRUE; 251994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 252094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_string_init (&full_path)) 2521cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington goto nomem; 252294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 252394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!make_full_path (&parser->basedir, content, &full_path)) 252494790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 252594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 252694790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto nomem; 252794790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 252894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 252994790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington if (!_dbus_string_copy_data (&full_path, &s)) 253094790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington { 253194790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 253294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington goto nomem; 253394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington } 2534cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 25350cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes /* _only_ extra session directories can be specified */ 2536feb7d3a0f0e2404e81fbe6252864ab599e1fa38dJohn (J if (!service_dirs_append_unique_or_free (&parser->service_dirs, s)) 2537cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington { 253894790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 2539cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington dbus_free (s); 2540cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington goto nomem; 2541cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 254294790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington 254394790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington _dbus_string_free (&full_path); 2544cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington } 2545cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington break; 25463185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 25473185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington case ELEMENT_LIMIT: 25483185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 25493185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington long val; 25503185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 25513185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington e->had_content = TRUE; 25523185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 25533185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington val = 0; 25543185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington if (!_dbus_string_parse_int (content, 0, &val, NULL)) 25553185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington { 25563185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 25573185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington "<limit name=\"%s\"> element has invalid value (could not parse as integer)", 25583185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington e->d.limit.name); 25593185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington return FALSE; 25603185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 25613185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 25623185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington e->d.limit.value = val; 25633185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 25643185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington _dbus_verbose ("Loaded value %ld for limit %s\n", 25653185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington e->d.limit.value, 25663185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington e->d.limit.name); 25673185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington } 25683185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington break; 2569bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 2570bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2571bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 2572269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return TRUE; 2573bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2574bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington nomem: 257594790fef4a846ef2bed9bf1825c4c2b0ca7b8566Havoc Pennington BUS_SET_OOM (error); 2576bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 257790ed1d84588a84697051e643175452c50d682eceHavoc Pennington} 257890ed1d84588a84697051e643175452c50d682eceHavoc Pennington 257990ed1d84588a84697051e643175452c50d682eceHavoc Penningtondbus_bool_t 258090ed1d84588a84697051e643175452c50d682eceHavoc Penningtonbus_config_parser_finished (BusConfigParser *parser, 258190ed1d84588a84697051e643175452c50d682eceHavoc Pennington DBusError *error) 258290ed1d84588a84697051e643175452c50d682eceHavoc Pennington{ 2583bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (error); 2584bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2585bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (parser->stack != NULL) 2586bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2587bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 2588bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington "Element <%s> was not closed in configuration file", 25890cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes bus_config_parser_element_type_to_name (top_element_type (parser))); 259090ed1d84588a84697051e643175452c50d682eceHavoc Pennington 2591bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return FALSE; 2592bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington } 259329c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 2594893d859ed4ab785f46485fad28779f026fa166a1Havoc Pennington if (parser->is_toplevel && parser->listen_on == NULL) 259529c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington { 259629c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington dbus_set_error (error, DBUS_ERROR_FAILED, 259729c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington "Configuration file needs one or more <listen> elements giving addresses"); 259829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return FALSE; 259929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington } 2600bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2601269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return TRUE; 260290ed1d84588a84697051e643175452c50d682eceHavoc Pennington} 260390ed1d84588a84697051e643175452c50d682eceHavoc Pennington 260490ed1d84588a84697051e643175452c50d682eceHavoc Penningtonconst char* 260590ed1d84588a84697051e643175452c50d682eceHavoc Penningtonbus_config_parser_get_user (BusConfigParser *parser) 260690ed1d84588a84697051e643175452c50d682eceHavoc Pennington{ 2607bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington return parser->user; 260817e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington} 260917e82f5728d3fc8abd41c816b1c34c506339c7a7Havoc Pennington 2610eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonconst char* 2611eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Penningtonbus_config_parser_get_type (BusConfigParser *parser) 2612eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington{ 2613eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington return parser->bus_type; 2614eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington} 2615eeb88949d8d2ca84d9cbe54c07e73b9907d3163eHavoc Pennington 261629c71168cd17b11eed65023c97aff401d5305b01Havoc PenningtonDBusList** 261729c71168cd17b11eed65023c97aff401d5305b01Havoc Penningtonbus_config_parser_get_addresses (BusConfigParser *parser) 261829c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington{ 261929c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington return &parser->listen_on; 262029c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington} 262129c71168cd17b11eed65023c97aff401d5305b01Havoc Pennington 262244ed933284589134603913b05f55ca55e8c5a566Havoc PenningtonDBusList** 262344ed933284589134603913b05f55ca55e8c5a566Havoc Penningtonbus_config_parser_get_mechanisms (BusConfigParser *parser) 262444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{ 262544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return &parser->mechanisms; 262644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington} 262744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 2628cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc PenningtonDBusList** 2629cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Penningtonbus_config_parser_get_service_dirs (BusConfigParser *parser) 2630cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington{ 2631cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington return &parser->service_dirs; 2632cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington} 2633cfa261b49dd9cafb172deae3db22dba0c2e54bf9Havoc Pennington 26341d19fc62e9034cc5700c0903f68787a84f485315David ZeuthenDBusList** 26351d19fc62e9034cc5700c0903f68787a84f485315David Zeuthenbus_config_parser_get_conf_dirs (BusConfigParser *parser) 26361d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen{ 26371d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen return &parser->conf_dirs; 26381d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen} 26391d19fc62e9034cc5700c0903f68787a84f485315David Zeuthen 264044ed933284589134603913b05f55ca55e8c5a566Havoc Penningtondbus_bool_t 264144ed933284589134603913b05f55ca55e8c5a566Havoc Penningtonbus_config_parser_get_fork (BusConfigParser *parser) 264244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{ 264344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington return parser->fork; 264444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington} 264544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington 26460314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchendbus_bool_t 264769ed32cbccbec9d613447cb64e9d7b1ffa11ce3cColin Waltersbus_config_parser_get_syslog (BusConfigParser *parser) 26480314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen{ 264969ed32cbccbec9d613447cb64e9d7b1ffa11ce3cColin Walters return parser->syslog; 26500314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen} 26510314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen 265207a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemakerdbus_bool_t 26536663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchenbus_config_parser_get_keep_umask (BusConfigParser *parser) 2654bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters{ 26556663d1dd35f94717209cd6fca86045bca853ef79Matt McCutchen return parser->keep_umask; 2656bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters} 2657bb2a464067c6843320f367b590b0e4cb00225e50Colin Walters 2658bb2a464067c6843320f367b590b0e4cb00225e50Colin Waltersdbus_bool_t 265907a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemakerbus_config_parser_get_allow_anonymous (BusConfigParser *parser) 266007a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker{ 266107a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker return parser->allow_anonymous; 266207a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker} 266307a4ad4b04702fc384b324e5f902a5b2279b0c25Dennis Kaarsemaker 2664856361ff5b8ce701cdb447085931d3076ee52008Havoc Penningtonconst char * 2665856361ff5b8ce701cdb447085931d3076ee52008Havoc Penningtonbus_config_parser_get_pidfile (BusConfigParser *parser) 2666856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington{ 2667856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington return parser->pidfile; 2668856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington} 2669856361ff5b8ce701cdb447085931d3076ee52008Havoc Pennington 26700cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughesconst char * 26710cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughesbus_config_parser_get_servicehelper (BusConfigParser *parser) 26720cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes{ 26730cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return parser->servicehelper; 26740cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes} 26750cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 2676bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc PenningtonBusPolicy* 2677bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Penningtonbus_config_parser_steal_policy (BusConfigParser *parser) 2678bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington{ 2679bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington BusPolicy *policy; 2680bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 2681bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington _dbus_assert (parser->policy != NULL); /* can only steal the policy 1 time */ 2682bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 2683bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington policy = parser->policy; 2684bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 2685bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington parser->policy = NULL; 2686bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 2687bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington return policy; 2688bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington} 2689bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington 26903185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington/* Overwrite any limits that were set in the configuration file */ 26913185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Penningtonvoid 26923185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Penningtonbus_config_parser_get_limits (BusConfigParser *parser, 26933185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington BusLimits *limits) 26943185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington{ 26953185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington *limits = parser->limits; 26963185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington} 26973185d7edde8ffc7672aa7d771966b0f1e0158aeaHavoc Pennington 26981e9b185b0c274ef0d684b1e43418388225321e72Havoc PenningtonDBusHashTable* 2699cdac3e058b922431f387351fd8ebf60a764485d1Colin Waltersbus_config_parser_steal_service_context_table (BusConfigParser *parser) 27001e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington{ 27011e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington DBusHashTable *table; 27021e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 2703cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters _dbus_assert (parser->service_context_table != NULL); /* can only steal once */ 27041e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 2705cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters table = parser->service_context_table; 27061e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 2707cdac3e058b922431f387351fd8ebf60a764485d1Colin Walters parser->service_context_table = NULL; 27081e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 27091e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington return table; 27101e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington} 27111e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 271290ed1d84588a84697051e643175452c50d682eceHavoc Pennington#ifdef DBUS_BUILD_TESTS 2713269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington#include <stdio.h> 2714269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2715269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Penningtontypedef enum 2716269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington{ 2717269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington VALID, 2718269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington INVALID, 2719269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington UNKNOWN 2720269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington} Validity; 2721269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2722269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Penningtonstatic dbus_bool_t 2723269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Penningtondo_load (const DBusString *full_path, 2724269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington Validity validity, 2725269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_bool_t oom_possible) 2726269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington{ 2727269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington BusConfigParser *parser; 2728269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington DBusError error; 2729269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2730269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_error_init (&error); 2731bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2732e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge parser = bus_config_load (full_path, TRUE, NULL, &error); 2733269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (parser == NULL) 2734269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2735269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _DBUS_ASSERT_ERROR_IS_SET (&error); 2736bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2737269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (oom_possible && 2738269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_error_has_name (&error, DBUS_ERROR_NO_MEMORY)) 2739269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2740269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_verbose ("Failed to load valid file due to OOM\n"); 2741269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_error_free (&error); 2742269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return TRUE; 2743269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2744269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington else if (validity == VALID) 2745bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington { 2746269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_warn ("Failed to load valid file but still had memory: %s\n", 2747269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington error.message); 2748269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2749269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_error_free (&error); 2750269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return FALSE; 2751269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2752269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington else 2753269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2754269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_error_free (&error); 2755269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return TRUE; 2756269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2757269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2758269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington else 2759269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2760269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _DBUS_ASSERT_ERROR_IS_CLEAR (&error); 2761bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2762269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington bus_config_parser_unref (parser); 2763bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2764269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (validity == INVALID) 2765269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2766269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_warn ("Accepted invalid file\n"); 2767269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return FALSE; 2768269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2769269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2770269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return TRUE; 2771269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2772269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington} 2773269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2774bf99381351b802fb3348a24037898222aae631e2Havoc Penningtontypedef struct 2775269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington{ 2776bf99381351b802fb3348a24037898222aae631e2Havoc Pennington const DBusString *full_path; 2777bf99381351b802fb3348a24037898222aae631e2Havoc Pennington Validity validity; 2778bf99381351b802fb3348a24037898222aae631e2Havoc Pennington} LoaderOomData; 2779269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2780bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonstatic dbus_bool_t 2781bf99381351b802fb3348a24037898222aae631e2Havoc Penningtoncheck_loader_oom_func (void *data) 2782bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{ 2783bf99381351b802fb3348a24037898222aae631e2Havoc Pennington LoaderOomData *d = data; 2784269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2785bf99381351b802fb3348a24037898222aae631e2Havoc Pennington return do_load (d->full_path, d->validity, TRUE); 2786269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington} 2787269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2788269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Penningtonstatic dbus_bool_t 2789e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgeprocess_test_valid_subdir (const DBusString *test_base_dir, 2790e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge const char *subdir, 2791e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge Validity validity) 2792269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington{ 2793269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington DBusString test_directory; 2794269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington DBusString filename; 2795269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington DBusDirIter *dir; 2796269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_bool_t retval; 2797269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington DBusError error; 2798269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2799269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington retval = FALSE; 2800269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dir = NULL; 2801bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2802fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&test_directory)) 2803269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_assert_not_reached ("didn't allocate test_directory\n"); 2804269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2805269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_string_init_const (&filename, subdir); 2806bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2807269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (!_dbus_string_copy (test_base_dir, 0, 2808269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington &test_directory, 0)) 2809269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_assert_not_reached ("couldn't copy test_base_dir to test_directory"); 2810bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2811bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington if (!_dbus_concat_dir_and_file (&test_directory, &filename)) 2812269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_assert_not_reached ("couldn't allocate full path"); 2813269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2814269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_string_free (&filename); 2815fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&filename)) 2816269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_assert_not_reached ("didn't allocate filename string\n"); 2817269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2818269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_error_init (&error); 2819269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dir = _dbus_directory_open (&test_directory, &error); 2820269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (dir == NULL) 2821269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2822fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_warn ("Could not open %s: %s\n", 2823fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_string_get_const_data (&test_directory), 2824269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington error.message); 2825269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_error_free (&error); 2826269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington goto failed; 2827269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2828269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 28290da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge if (validity == VALID) 28300da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge printf ("Testing valid files:\n"); 28310da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge else if (validity == INVALID) 28320da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge printf ("Testing invalid files:\n"); 28330da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge else 28340da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge printf ("Testing unknown files:\n"); 2835bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2836269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington next: 2837269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington while (_dbus_directory_get_next_file (dir, &filename, &error)) 2838269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2839269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington DBusString full_path; 2840bf99381351b802fb3348a24037898222aae631e2Havoc Pennington LoaderOomData d; 2841bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2842fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington if (!_dbus_string_init (&full_path)) 2843269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_assert_not_reached ("couldn't init string"); 2844269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2845269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (!_dbus_string_copy (&test_directory, 0, &full_path, 0)) 2846269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_assert_not_reached ("couldn't copy dir to full_path"); 2847269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2848269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (!_dbus_concat_dir_and_file (&full_path, &filename)) 2849269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_assert_not_reached ("couldn't concat file to dir"); 2850269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2851269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (!_dbus_string_ends_with_c_str (&full_path, ".conf")) 2852269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2853269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_verbose ("Skipping non-.conf file %s\n", 2854fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_string_get_const_data (&filename)); 2855e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_free (&full_path); 2856269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington goto next; 2857269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2858269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2859fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington printf (" %s\n", _dbus_string_get_const_data (&filename)); 2860bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2861269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_verbose (" expecting %s\n", 2862269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington validity == VALID ? "valid" : 2863269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington (validity == INVALID ? "invalid" : 2864269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington (validity == UNKNOWN ? "unknown" : "???"))); 2865269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2866bf99381351b802fb3348a24037898222aae631e2Havoc Pennington d.full_path = &full_path; 2867bf99381351b802fb3348a24037898222aae631e2Havoc Pennington d.validity = validity; 2868bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 28697c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington /* FIXME hackaround for an expat problem, see 28707c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington * https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=124747 28717c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington * http://freedesktop.org/pipermail/dbus/2004-May/001153.html 28727c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington */ 28737c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington /* if (!_dbus_test_oom_handling ("config-loader", check_loader_oom_func, &d)) */ 28747c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington if (!check_loader_oom_func (&d)) 28757c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington _dbus_assert_not_reached ("test failed"); 28767c77664c5a38d44b14044286e7e5aa7def858889Havoc Pennington 2877269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_string_free (&full_path); 2878269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2879269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2880269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (dbus_error_is_set (&error)) 2881269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 2882269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_warn ("Could not get next file in %s: %s\n", 2883fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington _dbus_string_get_const_data (&test_directory), 2884fa05de9230d62e7c427b5313796fc6ccd4d0ff60Havoc Pennington error.message); 2885269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington dbus_error_free (&error); 2886269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington goto failed; 2887269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 2888bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2889269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington retval = TRUE; 2890bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 2891269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington failed: 2892269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2893269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (dir) 2894269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_directory_close (dir); 2895269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_string_free (&test_directory); 2896269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_string_free (&filename); 2897269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington 2898269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return retval; 2899269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington} 290090ed1d84588a84697051e643175452c50d682eceHavoc Pennington 2901e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 2902e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgebools_equal (dbus_bool_t a, 2903e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_bool_t b) 2904e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 2905e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return a ? b : !b; 2906e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 2907e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2908e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 2909e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestrings_equal_or_both_null (const char *a, 2910e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge const char *b) 2911e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 2912e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (a == NULL || b == NULL) 2913e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return a == b; 2914e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge else 2915e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return !strcmp (a, b); 2916e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 2917e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2918e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 2919e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgeelements_equal (const Element *a, 2920e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge const Element *b) 2921e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 2922e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (a->type != b->type) 2923e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2924e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2925e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!bools_equal (a->had_content, b->had_content)) 2926e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2927e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2928e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge switch (a->type) 2929e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 2930e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2931e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge case ELEMENT_INCLUDE: 2932e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!bools_equal (a->d.include.ignore_missing, 2933e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge b->d.include.ignore_missing)) 2934e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2935e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge break; 2936e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2937e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge case ELEMENT_POLICY: 2938e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (a->d.policy.type != b->d.policy.type) 2939e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2940b78d222083d1a1186743e2bb3aded49b5a950fe2John (J if (a->d.policy.gid_uid_or_at_console != b->d.policy.gid_uid_or_at_console) 2941e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2942e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge break; 2943e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2944e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge case ELEMENT_LIMIT: 2945e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (strcmp (a->d.limit.name, b->d.limit.name)) 2946e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2947e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (a->d.limit.value != b->d.limit.value) 2948e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2949e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge break; 2950e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2951e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge default: 2952e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* do nothing */ 2953e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge break; 2954e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 2955e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2956e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return TRUE; 2957e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2958e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 2959e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2960e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 2961e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgelists_of_elements_equal (DBusList *a, 2962e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusList *b) 2963e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 2964e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusList *ia; 2965e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusList *ib; 2966e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2967e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge ia = a; 2968e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge ib = b; 2969e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2970e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge while (ia != NULL && ib != NULL) 2971e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 2972e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (elements_equal (ia->data, ib->data)) 2973e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2974e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge ia = _dbus_list_get_next_link (&a, ia); 2975e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge ib = _dbus_list_get_next_link (&b, ib); 2976e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 2977e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2978e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return ia == NULL && ib == NULL; 2979e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 2980e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2981e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 2982e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgelists_of_c_strings_equal (DBusList *a, 2983e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusList *b) 2984e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 2985e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusList *ia; 2986e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusList *ib; 2987e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2988e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge ia = a; 2989e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge ib = b; 2990e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2991e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge while (ia != NULL && ib != NULL) 2992e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 2993e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (strcmp (ia->data, ib->data)) 2994e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 2995e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge ia = _dbus_list_get_next_link (&a, ia); 2996e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge ib = _dbus_list_get_next_link (&b, ib); 2997e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 2998e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 2999e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return ia == NULL && ib == NULL; 3000e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 3001e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3002e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 3003e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgelimits_equal (const BusLimits *a, 3004e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge const BusLimits *b) 3005e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 3006e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return 3007e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge (a->max_incoming_bytes == b->max_incoming_bytes 300864ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering || a->max_incoming_unix_fds == b->max_incoming_unix_fds 3009e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_outgoing_bytes == b->max_outgoing_bytes 301064ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering || a->max_outgoing_unix_fds == b->max_outgoing_unix_fds 3011e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_message_size == b->max_message_size 301264ad8449679c53fefd20baea88fa593f226d59b0Lennart Poettering || a->max_message_unix_fds == b->max_message_unix_fds 3013e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->activation_timeout == b->activation_timeout 3014e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->auth_timeout == b->auth_timeout 3015e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_completed_connections == b->max_completed_connections 3016e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_incomplete_connections == b->max_incomplete_connections 3017e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_connections_per_user == b->max_connections_per_user 3018e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_pending_activations == b->max_pending_activations 3019e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_services_per_connection == b->max_services_per_connection 3020e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_match_rules_per_connection == b->max_match_rules_per_connection 3021e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->max_replies_per_connection == b->max_replies_per_connection 3022e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge || a->reply_timeout == b->reply_timeout); 3023e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 3024e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3025e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 3026e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgeconfig_parsers_equal (const BusConfigParser *a, 3027e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge const BusConfigParser *b) 3028e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 3029e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_equal (&a->basedir, &b->basedir)) 3030e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3031e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3032e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!lists_of_elements_equal (a->stack, b->stack)) 3033e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3034e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3035e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!strings_equal_or_both_null (a->user, b->user)) 3036e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3037e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3038e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!lists_of_c_strings_equal (a->listen_on, b->listen_on)) 3039e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3040e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3041e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!lists_of_c_strings_equal (a->mechanisms, b->mechanisms)) 3042e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3043e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3044e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!lists_of_c_strings_equal (a->service_dirs, b->service_dirs)) 3045e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3046e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3047e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* FIXME: compare policy */ 3048e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 30491e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington /* FIXME: compare service selinux ID table */ 30501e9b185b0c274ef0d684b1e43418388225321e72Havoc Pennington 3051e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (! limits_equal (&a->limits, &b->limits)) 3052e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3053e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3054e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!strings_equal_or_both_null (a->pidfile, b->pidfile)) 3055e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3056e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3057e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (! bools_equal (a->fork, b->fork)) 3058e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3059e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 30600314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen if (! bools_equal (a->keep_umask, b->keep_umask)) 30610314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen return FALSE; 30620314e701c812565bd7bdac548cadfea5d310d66cMatt McCutchen 3063e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (! bools_equal (a->is_toplevel, b->is_toplevel)) 3064e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3065e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3066e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return TRUE; 3067e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 3068e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3069e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 3070e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgeall_are_equiv (const DBusString *target_directory) 3071e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 3072e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusString filename; 3073e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusDirIter *dir; 3074e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge BusConfigParser *first_parser; 3075e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge BusConfigParser *parser; 3076e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusError error; 3077e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_bool_t equal; 3078e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_bool_t retval; 3079e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3080e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dir = NULL; 3081e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge first_parser = NULL; 3082e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge parser = NULL; 3083e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge retval = FALSE; 3084e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3085e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_init (&filename)) 3086e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("didn't allocate filename string"); 3087e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3088e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_error_init (&error); 3089e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dir = _dbus_directory_open (target_directory, &error); 3090e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (dir == NULL) 3091e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 3092e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_warn ("Could not open %s: %s\n", 3093e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_get_const_data (target_directory), 3094e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge error.message); 3095e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_error_free (&error); 3096e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge goto finished; 3097e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 3098e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 30990da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge printf ("Comparing equivalent files:\n"); 3100e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3101e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge next: 3102e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge while (_dbus_directory_get_next_file (dir, &filename, &error)) 3103e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 3104e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusString full_path; 3105e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3106e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_init (&full_path)) 3107e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("couldn't init string"); 3108e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3109e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_copy (target_directory, 0, &full_path, 0)) 3110e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("couldn't copy dir to full_path"); 3111e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3112e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_concat_dir_and_file (&full_path, &filename)) 3113e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("couldn't concat file to dir"); 3114e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3115e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_ends_with_c_str (&full_path, ".conf")) 3116e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 3117e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_verbose ("Skipping non-.conf file %s\n", 3118e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_get_const_data (&filename)); 3119e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_free (&full_path); 3120e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge goto next; 3121e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 3122e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3123e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge printf (" %s\n", _dbus_string_get_const_data (&filename)); 3124e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3125e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge parser = bus_config_load (&full_path, TRUE, NULL, &error); 3126e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3127e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (parser == NULL) 3128e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 3129e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_warn ("Could not load file %s: %s\n", 3130e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_get_const_data (&full_path), 3131e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge error.message); 31328873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_string_free (&full_path); 3133e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_error_free (&error); 3134e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge goto finished; 3135e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 3136e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge else if (first_parser == NULL) 3137e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 31388873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_string_free (&full_path); 3139e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge first_parser = parser; 3140e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 3141e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge else 3142e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 31438873c90f99303f9cc308f15f8d03e637911f5b9eHavoc Pennington _dbus_string_free (&full_path); 3144e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge equal = config_parsers_equal (first_parser, parser); 3145e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge bus_config_parser_unref (parser); 3146e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (! equal) 3147e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge goto finished; 3148e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 3149e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 3150e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3151e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge retval = TRUE; 3152e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3153e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge finished: 3154e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_free (&filename); 3155e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (first_parser) 3156e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge bus_config_parser_unref (first_parser); 3157e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (dir) 3158e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_directory_close (dir); 3159e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3160e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return retval; 3161e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3162e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 3163e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3164e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgestatic dbus_bool_t 3165e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridgeprocess_test_equiv_subdir (const DBusString *test_base_dir, 3166e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge const char *subdir) 3167e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge{ 3168e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusString test_directory; 3169e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusString filename; 3170e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusDirIter *dir; 3171e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusError error; 3172e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_bool_t equal; 3173e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_bool_t retval; 3174e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3175e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dir = NULL; 3176e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge retval = FALSE; 3177e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3178e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_init (&test_directory)) 3179e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("didn't allocate test_directory"); 3180e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3181e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_init_const (&filename, subdir); 3182e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3183e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_copy (test_base_dir, 0, 3184e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge &test_directory, 0)) 3185e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("couldn't copy test_base_dir to test_directory"); 3186e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3187e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_concat_dir_and_file (&test_directory, &filename)) 3188e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("couldn't allocate full path"); 3189e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3190e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_free (&filename); 3191e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_init (&filename)) 3192e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("didn't allocate filename string"); 3193e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3194e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_error_init (&error); 3195e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dir = _dbus_directory_open (&test_directory, &error); 3196e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (dir == NULL) 3197e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 3198e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_warn ("Could not open %s: %s\n", 3199e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_get_const_data (&test_directory), 3200e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge error.message); 3201e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge dbus_error_free (&error); 3202e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge goto finished; 3203e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 3204e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3205e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge while (_dbus_directory_get_next_file (dir, &filename, &error)) 3206e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge { 3207e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge DBusString full_path; 3208e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3209e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge /* Skip CVS's magic directories! */ 3210e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (_dbus_string_equal_c_str (&filename, "CVS")) 3211e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge continue; 3212e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3213e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_init (&full_path)) 3214e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("couldn't init string"); 3215e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3216e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_string_copy (&test_directory, 0, &full_path, 0)) 3217e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("couldn't copy dir to full_path"); 3218e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3219e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!_dbus_concat_dir_and_file (&full_path, &filename)) 3220e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_assert_not_reached ("couldn't concat file to dir"); 3221e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3222e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge equal = all_are_equiv (&full_path); 3223e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_free (&full_path); 3224e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3225e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!equal) 3226e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge goto finished; 3227e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge } 3228e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3229e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge retval = TRUE; 3230e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3231e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge finished: 3232e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_free (&test_directory); 3233e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_string_free (&filename); 3234e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (dir) 3235e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge _dbus_directory_close (dir); 3236e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3237e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return retval; 3238e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 3239e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge} 32405640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 32410cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughesstatic const char *test_session_service_dir_matches[] = 32425640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 3243e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker#ifdef DBUS_UNIX 32445640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J "/testusr/testlocal/testshare/dbus-1/services", 32455640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J "/testusr/testshare/dbus-1/services", 32465bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker#endif 32475bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker DBUS_DATADIR"/dbus-1/services", 32485bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker#ifdef DBUS_UNIX 32495bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker "/testhome/foo/.testlocal/testshare/dbus-1/services", 32505bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker#endif 325173b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#ifdef DBUS_WIN 325273b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker NULL, 325373b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#endif 32545640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J NULL 32555640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J }; 32565640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 32575640f7a57b6c8b2e1847e99db412db3c41c9eb98John (Jstatic dbus_bool_t 32585640f7a57b6c8b2e1847e99db412db3c41c9eb98John (Jtest_default_session_servicedirs (void) 32595640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J{ 32605640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J DBusList *dirs; 32615640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J DBusList *link; 3262e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker DBusString progs; 3263e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker const char *common_progs; 32645640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J int i; 32655640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 32665bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker /* On Unix we don't actually use this variable, but it's easier to handle the 32675bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker * deallocation if we always allocate it, whether needed or not */ 32685bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker if (!_dbus_string_init (&progs)) 32695bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker _dbus_assert_not_reached ("OOM allocating progs"); 32705bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker 3271e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker common_progs = _dbus_getenv ("CommonProgramFiles"); 32725bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker#ifndef DBUS_UNIX 3273e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker if (common_progs) 3274e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker { 3275e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker if (!_dbus_string_append (&progs, common_progs)) 3276e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker { 3277e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_string_free (&progs); 3278e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker return FALSE; 3279e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker } 3280e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker 3281e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker if (!_dbus_string_append (&progs, "/dbus-1/services")) 3282e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker { 3283e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_string_free (&progs); 3284e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker return FALSE; 3285e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker } 32860cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes test_session_service_dir_matches[1] = _dbus_string_get_const_data(&progs); 3287e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker } 32885bd59d4a6c4d25f2cff6bcb45de647e09cf682cdRalf Habacker#endif 32895640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J dirs = NULL; 32905640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 3291e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker printf ("Testing retrieving the default session service directories\n"); 32925640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J if (!_dbus_get_standard_session_servicedirs (&dirs)) 32935640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J _dbus_assert_not_reached ("couldn't get stardard dirs"); 32945640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 32955640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J /* make sure our defaults end with share/dbus-1/service */ 32965640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J while ((link = _dbus_list_pop_first_link (&dirs))) 32975640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 32985640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J DBusString path; 32995640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 33005640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J printf (" default service dir: %s\n", (char *)link->data); 33015640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J _dbus_string_init_const (&path, (char *)link->data); 3302e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker if (!_dbus_string_ends_with_c_str (&path, "dbus-1/services")) 33035640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 33045640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J printf ("error with default session service directories\n"); 3305e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker dbus_free (link->data); 3306e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_list_free_link (link); 3307e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_string_free (&progs); 33085640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return FALSE; 33095640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J } 33105640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 33115640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J dbus_free (link->data); 33125640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J _dbus_list_free_link (link); 33135640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J } 33145640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 3315e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker#ifdef DBUS_UNIX 33165640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J if (!_dbus_setenv ("XDG_DATA_HOME", "/testhome/foo/.testlocal/testshare")) 33175640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J _dbus_assert_not_reached ("couldn't setenv XDG_DATA_HOME"); 33185640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 33195640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J if (!_dbus_setenv ("XDG_DATA_DIRS", ":/testusr/testlocal/testshare: :/testusr/testshare:")) 33205640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J _dbus_assert_not_reached ("couldn't setenv XDG_DATA_DIRS"); 3321e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker#endif 33225640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J if (!_dbus_get_standard_session_servicedirs (&dirs)) 33235640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J _dbus_assert_not_reached ("couldn't get stardard dirs"); 33245640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 33255640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J /* make sure we read and parse the env variable correctly */ 33265640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J i = 0; 33275640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J while ((link = _dbus_list_pop_first_link (&dirs))) 33285640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 33295640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J printf (" test service dir: %s\n", (char *)link->data); 33300cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (test_session_service_dir_matches[i] == NULL) 33315640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 33325640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J printf ("more directories parsed than in match set\n"); 3333e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker dbus_free (link->data); 3334e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_list_free_link (link); 3335e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_string_free (&progs); 33365640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return FALSE; 33375640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J } 33385640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 33390cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (strcmp (test_session_service_dir_matches[i], 33405640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J (char *)link->data) != 0) 33415640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 33425640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J printf ("%s directory does not match %s in the match set\n", 33435640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J (char *)link->data, 33440cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes test_session_service_dir_matches[i]); 3345e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker dbus_free (link->data); 3346e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_list_free_link (link); 3347e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_string_free (&progs); 33485640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return FALSE; 33495640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J } 33505640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 33515640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J ++i; 33525640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 33535640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J dbus_free (link->data); 33545640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J _dbus_list_free_link (link); 33555640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J } 33565640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 33570cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (test_session_service_dir_matches[i] != NULL) 33585640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J { 33595640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J printf ("extra data %s in the match set was not matched\n", 33600cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes test_session_service_dir_matches[i]); 33615640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 3362e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_string_free (&progs); 33635640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return FALSE; 33645640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J } 33655640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 3366e02f8b1c00f99f5fbd0890e6aa24ad6c082db7f6Ralf Habacker _dbus_string_free (&progs); 33675640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return TRUE; 33685640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J} 33690cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 33700cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughesstatic const char *test_system_service_dir_matches[] = 33710cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 33720cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes#ifdef DBUS_UNIX 33730cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes "/testusr/testlocal/testshare/dbus-1/system-services", 33740cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes "/testusr/testshare/dbus-1/system-services", 33750cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes#endif 33760cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBUS_DATADIR"/dbus-1/system-services", 337773b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#ifdef DBUS_WIN 337873b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker NULL, 337973b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#endif 33800cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes NULL 33810cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes }; 33820cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 33830cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughesstatic dbus_bool_t 33840cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughestest_default_system_servicedirs (void) 33850cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes{ 33860cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusList *dirs; 33870cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusList *link; 33880cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusString progs; 33890cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes const char *common_progs; 33900cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes int i; 33910cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 33920cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes /* On Unix we don't actually use this variable, but it's easier to handle the 33930cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes * deallocation if we always allocate it, whether needed or not */ 33940cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_string_init (&progs)) 33950cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_assert_not_reached ("OOM allocating progs"); 33960cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 33970cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes common_progs = _dbus_getenv ("CommonProgramFiles"); 33980cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes#ifndef DBUS_UNIX 33990cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (common_progs) 34000cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34010cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_string_append (&progs, common_progs)) 34020cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34030cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&progs); 34040cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 34050cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34060cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34070cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_string_append (&progs, "/dbus-1/system-services")) 34080cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34090cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&progs); 34100cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 34110cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34120cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes test_system_service_dir_matches[1] = _dbus_string_get_const_data(&progs); 34130cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34140cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes#endif 34150cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dirs = NULL; 34160cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34170cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes printf ("Testing retrieving the default system service directories\n"); 34180cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_get_standard_system_servicedirs (&dirs)) 34190cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_assert_not_reached ("couldn't get stardard dirs"); 34200cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34210cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes /* make sure our defaults end with share/dbus-1/system-service */ 34220cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes while ((link = _dbus_list_pop_first_link (&dirs))) 34230cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34240cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes DBusString path; 34250cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34260cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes printf (" default service dir: %s\n", (char *)link->data); 34270cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_init_const (&path, (char *)link->data); 34280cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_string_ends_with_c_str (&path, "dbus-1/system-services")) 34290cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34300cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes printf ("error with default system service directories\n"); 34310cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dbus_free (link->data); 34320cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_list_free_link (link); 34330cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&progs); 34340cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 34350cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34360cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34370cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dbus_free (link->data); 34380cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_list_free_link (link); 34390cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34400cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34410cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes#ifdef DBUS_UNIX 34420cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_setenv ("XDG_DATA_HOME", "/testhome/foo/.testlocal/testshare")) 34430cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_assert_not_reached ("couldn't setenv XDG_DATA_HOME"); 34440cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34450cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_setenv ("XDG_DATA_DIRS", ":/testusr/testlocal/testshare: :/testusr/testshare:")) 34460cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_assert_not_reached ("couldn't setenv XDG_DATA_DIRS"); 34470cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes#endif 34480cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!_dbus_get_standard_system_servicedirs (&dirs)) 34490cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_assert_not_reached ("couldn't get stardard dirs"); 34500cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34510cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes /* make sure we read and parse the env variable correctly */ 34520cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes i = 0; 34530cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes while ((link = _dbus_list_pop_first_link (&dirs))) 34540cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34550cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes printf (" test service dir: %s\n", (char *)link->data); 34560cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (test_system_service_dir_matches[i] == NULL) 34570cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34580cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes printf ("more directories parsed than in match set\n"); 34590cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dbus_free (link->data); 34600cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_list_free_link (link); 34610cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&progs); 34620cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 34630cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34640cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34650cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (strcmp (test_system_service_dir_matches[i], 34660cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes (char *)link->data) != 0) 34670cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34680cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes printf ("%s directory does not match %s in the match set\n", 34690cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes (char *)link->data, 34700cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes test_system_service_dir_matches[i]); 34710cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dbus_free (link->data); 34720cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_list_free_link (link); 34730cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&progs); 34740cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 34750cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34760cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34770cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes ++i; 34780cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34790cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes dbus_free (link->data); 34800cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_list_free_link (link); 34810cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34820cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34830cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (test_system_service_dir_matches[i] != NULL) 34840cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes { 34850cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes printf ("extra data %s in the match set was not matched\n", 34860cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes test_system_service_dir_matches[i]); 34870cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34880cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&progs); 34890cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 34900cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes } 34910cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 34920cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes _dbus_string_free (&progs); 34930cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return TRUE; 34940cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes} 34950cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 349690ed1d84588a84697051e643175452c50d682eceHavoc Penningtondbus_bool_t 349790ed1d84588a84697051e643175452c50d682eceHavoc Penningtonbus_config_parser_test (const DBusString *test_data_dir) 349890ed1d84588a84697051e643175452c50d682eceHavoc Pennington{ 3499269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington if (test_data_dir == NULL || 3500269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington _dbus_string_get_length (test_data_dir) == 0) 3501269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington { 3502269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington printf ("No test data\n"); 3503269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return TRUE; 3504269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington } 3505bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 35065640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J if (!test_default_session_servicedirs()) 35075640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J return FALSE; 35085640f7a57b6c8b2e1847e99db412db3c41c9eb98John (J 350973b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#ifdef DBUS_WIN 351073b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker printf("default system service dir skipped\n"); 351173b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#else 35120cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes if (!test_default_system_servicedirs()) 35130cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes return FALSE; 351473b926275f7208f4663771b98a580f10e3aebb18Ralf Habacker#endif 35150cb8dd64a94fd3b57b37a68a6611a125689bf5dfRichard Hughes 3516e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!process_test_valid_subdir (test_data_dir, "valid-config-files", VALID)) 3517e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge return FALSE; 3518e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge 35190da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge if (!process_test_valid_subdir (test_data_dir, "invalid-config-files", INVALID)) 35200da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge return FALSE; 35210da46fa5a48dee0ac2be00886a6ed5fe429f20beJon Trowbridge 3522e039be5838a6befdb4a378fcdc1fc2e7606d4222Jon Trowbridge if (!process_test_equiv_subdir (test_data_dir, "equiv-config-files")) 3523269d74f214f87bed0f6fd58f1c848240d31e0b9fHavoc Pennington return FALSE; 3524bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington 352590ed1d84588a84697051e643175452c50d682eceHavoc Pennington return TRUE; 352690ed1d84588a84697051e643175452c50d682eceHavoc Pennington} 352790ed1d84588a84697051e643175452c50d682eceHavoc Pennington 352890ed1d84588a84697051e643175452c50d682eceHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 3529