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