dbus-internals.c revision dbc061b8123799e9352ab069b4dc1b5ea394587d
1954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */
27652304bff969afb3969603149bb385efe861fe8John (J/* dbus-internals.c  random utility stuff (internal to D-Bus implementation)
3954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Copyright (C) 2002, 2003  Red Hat, Inc.
5954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
7954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
8954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * This program is free software; you can redistribute it and/or modify
9954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * it under the terms of the GNU General Public License as published by
10954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * the Free Software Foundation; either version 2 of the License, or
11954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * (at your option) any later version.
12954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
13954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * This program is distributed in the hope that it will be useful,
14954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
15954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * GNU General Public License for more details.
17954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
18954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * You should have received a copy of the GNU General Public License
19954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * along with this program; if not, write to the Free Software
20954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
22954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
23954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include "dbus-internals.h"
241f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson#include "dbus-protocol.h"
25dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington#include "dbus-marshal-basic.h"
26993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington#include "dbus-test.h"
27954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include <stdio.h>
28954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include <stdarg.h>
29041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include <string.h>
30993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington#include <stdlib.h>
31954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
32954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
3315ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @defgroup DBusInternals D-Bus secret internal implementation details
347652304bff969afb3969603149bb385efe861fe8John (J * @brief Documentation useful when developing or debugging D-Bus itself.
35954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
36954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
37954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
38954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
39041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @defgroup DBusInternalsUtils Utilities and portability
40954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @ingroup DBusInternals
41954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @brief Utility functions (_dbus_assert(), _dbus_warn(), etc.)
42954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @{
43954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
44954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
45954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
46954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _dbus_assert
47954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
48954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Aborts with an error message if the condition is false.
49954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
50954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param condition condition which must be true.
51954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
52954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
53954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
54954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _dbus_assert_not_reached
55954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
56954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Aborts with an error message if called.
57954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * The given explanation will be printed.
58954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
59954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param explanation explanation of what happened if the code was reached.
60954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
61954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
62954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
63954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _DBUS_N_ELEMENTS
64954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
65954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Computes the number of elements in a fixed-size array using
66954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * sizeof().
67954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
68954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param array the array to count elements in.
69954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
70954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
71954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
72954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _DBUS_POINTER_TO_INT
73954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
74954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Safely casts a void* to an integer; should only be used on void*
75954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * that actually contain integers, for example one created with
76954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * _DBUS_INT_TO_POINTER.  Only guaranteed to preserve 32 bits.
77954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * (i.e. it's used to store 32-bit ints in pointers, but
78954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * can't be used to store 64-bit pointers in ints.)
79954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
80954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param pointer pointer to extract an integer from.
81954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
82954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
83954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _DBUS_INT_TO_POINTER
84954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
85954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Safely stuffs an integer into a pointer, to be extracted later with
86954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * _DBUS_POINTER_TO_INT. Only guaranteed to preserve 32 bits.
87954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
88954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param integer the integer to stuff into a pointer.
89954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
90041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
91041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @def _DBUS_ZERO
92041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
93041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Sets all bits in an object to zero.
94041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
95041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param object the object to be zeroed.
96041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
97954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
983ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_INT16_MIN
993ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1003ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Minimum value of type "int16"
1013ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1023ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1033ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_INT16_MAX
1043ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1053ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "int16"
1063ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1073ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1083ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_UINT16_MAX
1093ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1103ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "uint16"
1113ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1123ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington
1133ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1143ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_INT32_MIN
1153ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1163ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Minimum value of type "int32"
1173ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1183ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1193ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_INT32_MAX
1203ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1213ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "int32"
1223ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1233ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1243ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_UINT32_MAX
1253ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1263ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "uint32"
1273ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1283ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington
1293ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
130576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington * @def _DBUS_INT_MIN
131576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington *
132576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington * Minimum value of type "int"
133576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington */
134576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington/**
135576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington * @def _DBUS_INT_MAX
136576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington *
137576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington * Maximum value of type "int"
138576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington */
1393ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1403ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_UINT_MAX
1413ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1423ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "uint"
1433ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
144041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
145041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
146041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @typedef DBusForeachFunction
147041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
148041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Used to iterate over each item in a collection, such as
149041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * a DBusList.
150041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
151576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington
152576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington/**
153c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_LOCK_NAME
154c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
155c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Expands to name of a global lock variable.
156c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
157c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
158c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
159c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_DEFINE_GLOBAL_LOCK
160c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
161c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Defines a global lock variable with the given name.
162c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * The lock must be added to the list to initialize
163c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * in dbus_threads_init().
164c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
165c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
166c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
167c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_DECLARE_GLOBAL_LOCK
168c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
169c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Expands to declaration of a global lock defined
170c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * with _DBUS_DEFINE_GLOBAL_LOCK.
171c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * The lock must be added to the list to initialize
172c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * in dbus_threads_init().
173c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
174c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
175c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
176c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_LOCK
177c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
178c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Locks a global lock
179c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
180c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
181c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
182c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_UNLOCK
183c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
184c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Unlocks a global lock
185c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
186c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
187c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
18829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Fixed "out of memory" error message, just to avoid
18929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * making up a different string every time and wasting
19029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * space.
19129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
19229560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonconst char _dbus_no_memory_message[] = "Not enough memory";
19329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
194a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Penningtonstatic dbus_bool_t warn_initted = FALSE;
195a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Penningtonstatic dbus_bool_t fatal_warnings = FALSE;
196f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtonstatic dbus_bool_t fatal_warnings_on_check_failed = TRUE;
197f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
198f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtonstatic void
199f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtoninit_warnings(void)
200f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington{
201f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (!warn_initted)
202f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    {
203f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      const char *s;
204f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      s = _dbus_getenv ("DBUS_FATAL_WARNINGS");
205f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      if (s && *s)
206f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington        {
207f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington          if (*s == '0')
208f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            {
209f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fatal_warnings = FALSE;
210f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fatal_warnings_on_check_failed = FALSE;
211f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            }
212f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington          else if (*s == '1')
213f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            {
214f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fatal_warnings = TRUE;
215f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fatal_warnings_on_check_failed = TRUE;
216f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            }
217f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington          else
218f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            {
219f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fprintf(stderr, "DBUS_FATAL_WARNINGS should be set to 0 or 1 if set, not '%s'",
220f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                      s);
221f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            }
222f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington        }
223f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
224f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      warn_initted = TRUE;
225f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    }
226f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington}
227a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington
22829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
229f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * Prints a warning message to stderr. Can optionally be made to exit
230f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * fatally by setting DBUS_FATAL_WARNINGS, but this is rarely
231f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * used. This function should be considered pretty much equivalent to
232f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * fprintf(stderr). _dbus_warn_check_failed() on the other hand is
233f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * suitable for use when a programming mistake has been made.
234954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
235954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param format printf-style format string.
236954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
237954c4c7550879bd80315811b8548adfcb415766eHavoc Penningtonvoid
238954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington_dbus_warn (const char *format,
239954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington            ...)
240954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington{
241954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  va_list args;
242954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
243a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington  if (!warn_initted)
244f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    init_warnings ();
245f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
246f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  va_start (args, format);
247f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  vfprintf (stderr, format, args);
248f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  va_end (args);
249a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington
250f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (fatal_warnings)
251f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    {
252f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      fflush (stderr);
253f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      _dbus_abort ();
254a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington    }
255f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington}
256f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
257f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington/**
258f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * Prints a "critical" warning to stderr when an assertion fails;
259f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * differs from _dbus_warn primarily in that it prefixes the pid and
260f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * defaults to fatal. This should be used only when a programming
261f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * error has been detected. (NOT for unavoidable errors that an app
262f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * might handle - those should be returned as DBusError.) Calling this
263f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * means "there is a bug"
264f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington */
265f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtonvoid
266f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington_dbus_warn_check_failed(const char *format,
267f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                        ...)
268f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington{
269f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  va_list args;
270f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
271f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (!warn_initted)
272f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    init_warnings ();
273f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
274f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  fprintf (stderr, "process %lu: ", _dbus_getpid ());
275a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington
276954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  va_start (args, format);
277954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  vfprintf (stderr, format, args);
278954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  va_end (args);
279a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington
280f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (fatal_warnings_on_check_failed)
281a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington    {
282a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington      fflush (stderr);
283a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington      _dbus_abort ();
284a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington    }
285954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington}
286954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
2877bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#ifdef DBUS_ENABLE_VERBOSE_MODE
2887bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
289eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Penningtonstatic dbus_bool_t verbose_initted = FALSE;
29005d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (Jstatic dbus_bool_t verbose = TRUE;
291eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
29215ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/** Whether to show the current thread in verbose messages */
293be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#define PTHREAD_IN_VERBOSE 0
294be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#if PTHREAD_IN_VERBOSE
2957f2973c8d1e124f4744af0bee73679607511f3a4Havoc Pennington#include <pthread.h>
296be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#endif
297be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington
29805d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (Jstatic inline void
29905d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J_dbus_verbose_init (void)
30005d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J{
30105d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J  if (!verbose_initted)
30205d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J    {
30305d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J      const char *p = _dbus_getenv ("DBUS_VERBOSE");
30405d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J      verbose = p != NULL && *p == '1';
30505d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J      verbose_initted = TRUE;
30605d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J    }
30705d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J}
30805d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J
30915ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/**
31015ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * Implementation of dbus_is_verbose() macro if built with verbose logging
31115ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * enabled.
31215ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @returns whether verbose logging is active.
31315ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */
31405d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (Jdbus_bool_t
31505d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J_dbus_is_verbose_real (void)
31605d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J{
31705d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J  _dbus_verbose_init ();
31805d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J  return verbose;
31905d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J}
32005d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J
321954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
322041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Prints a warning message to stderr
323041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * if the user has enabled verbose mode.
3246ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington * This is the real function implementation,
3256ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington * use _dbus_verbose() macro in code.
326041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
327041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param format printf-style format string.
328041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
329041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid
3306ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington_dbus_verbose_real (const char *format,
3316ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington                    ...)
332041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
333041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  va_list args;
3346a109938f7a4fc726997985b6de66cf573961986Havoc Pennington  static dbus_bool_t need_pid = TRUE;
335dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  int len;
3361708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington
3374a74f8fcaba1b9d7ff962fd3c5655e57c2c32c81Havoc Pennington  /* things are written a bit oddly here so that
3384a74f8fcaba1b9d7ff962fd3c5655e57c2c32c81Havoc Pennington   * in the non-verbose case we just have the one
3394a74f8fcaba1b9d7ff962fd3c5655e57c2c32c81Havoc Pennington   * conditional and return immediately.
3404a74f8fcaba1b9d7ff962fd3c5655e57c2c32c81Havoc Pennington   */
34105d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J  if (!_dbus_is_verbose_real())
342041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    return;
3431708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington
344dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  /* Print out pid before the line */
3456a109938f7a4fc726997985b6de66cf573961986Havoc Pennington  if (need_pid)
346be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington    {
347be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#if PTHREAD_IN_VERBOSE
348be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington      fprintf (stderr, "%lu: 0x%lx: ", _dbus_getpid (), pthread_self ());
349be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#else
350be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington      fprintf (stderr, "%lu: ", _dbus_getpid ());
351be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#endif
352be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington    }
353be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington
354dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington
355dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  /* Only print pid again if the next line is a new line */
356dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  len = strlen (format);
357dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  if (format[len-1] == '\n')
358dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    need_pid = TRUE;
359dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  else
360dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    need_pid = FALSE;
361041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
362041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  va_start (args, format);
363041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  vfprintf (stderr, format, args);
364041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  va_end (args);
365d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington
366d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington  fflush (stderr);
367041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
368041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
369041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
370eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington * Reinitializes the verbose logging code, used
371eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington * as a hack in dbus-spawn.c so that a child
372eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington * process re-reads its pid
373eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington *
374eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington */
375eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Penningtonvoid
376eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington_dbus_verbose_reset_real (void)
377eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington{
378eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington  verbose_initted = FALSE;
379eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington}
380eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
3817bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#endif /* DBUS_ENABLE_VERBOSE_MODE */
3827bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
383eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington/**
384954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Duplicates a string. Result must be freed with
385954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * dbus_free(). Returns #NULL if memory allocation fails.
386954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * If the string to be duplicated is #NULL, returns #NULL.
387954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
388954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param str string to duplicate.
389954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @returns newly-allocated copy.
390954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
391954c4c7550879bd80315811b8548adfcb415766eHavoc Penningtonchar*
392954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington_dbus_strdup (const char *str)
393954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington{
394cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  size_t len;
395954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  char *copy;
396954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
397954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  if (str == NULL)
398954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington    return NULL;
399954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
400954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  len = strlen (str);
401954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
402954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  copy = dbus_malloc (len + 1);
403954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  if (copy == NULL)
404954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington    return NULL;
405954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
406954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  memcpy (copy, str, len + 1);
407954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
408954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  return copy;
409954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington}
410954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
411cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington/**
412cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * Duplicates a block of memory. Returns
413cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * #NULL on failure.
414cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington *
415cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * @param mem memory to copy
416cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * @param n_bytes number of bytes to copy
417cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * @returns the copy
418cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington */
419cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Penningtonvoid*
420cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington_dbus_memdup (const void  *mem,
421cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington              size_t       n_bytes)
422cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington{
423cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  void *copy;
424cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington
425cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  copy = dbus_malloc (n_bytes);
426cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  if (copy == NULL)
427cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington    return NULL;
428cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington
429cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  memcpy (copy, mem, n_bytes);
430cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington
431cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  return copy;
432cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington}
433cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington
434041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
43544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * Duplicates a string array. Result may be freed with
43644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * dbus_free_string_array(). Returns #NULL if memory allocation fails.
43744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * If the array to be duplicated is #NULL, returns #NULL.
43844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington *
43944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param array array to duplicate.
44044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @returns newly-allocated copy.
44144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington */
44244ed933284589134603913b05f55ca55e8c5a566Havoc Penningtonchar**
44344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington_dbus_dup_string_array (const char **array)
44444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{
44544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  int len;
44644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  int i;
44744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  char **copy;
44844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
44944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  if (array == NULL)
45044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    return NULL;
45144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
45244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  for (len = 0; array[len] != NULL; ++len)
45344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    ;
45444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
45544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  copy = dbus_new0 (char*, len + 1);
45644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  if (copy == NULL)
45744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    return NULL;
45844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
45944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  i = 0;
46044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  while (i < len)
46144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
46244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      copy[i] = _dbus_strdup (array[i]);
46344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      if (copy[i] == NULL)
46444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        {
46544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          dbus_free_string_array (copy);
46644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          return NULL;
46744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        }
46844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
46944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      ++i;
47044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
47144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
47244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  return copy;
47344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington}
47444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
47544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington/**
47644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * Checks whether a string array contains the given string.
47744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington *
47844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param array array to search.
47944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param str string to look for
48044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @returns #TRUE if array contains string
48144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington */
48244ed933284589134603913b05f55ca55e8c5a566Havoc Penningtondbus_bool_t
48344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington_dbus_string_array_contains (const char **array,
48444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington                             const char  *str)
48544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{
48644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  int i;
48744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
48844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  i = 0;
48944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  while (array[i] != NULL)
49044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
49144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      if (strcmp (array[i], str) == 0)
49244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        return TRUE;
49344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      ++i;
49444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
49544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
49644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  return FALSE;
49744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington}
49844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
499d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
500d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * Generates a new UUID. If you change how this is done,
501d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * there's some text about it in the spec that should also change.
502d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington *
503d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param uuid the uuid to initialize
504d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
505d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonvoid
506d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_generate_uuid (DBusGUID *uuid)
507d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
508d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  long now;
509d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
510d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_get_current_time (&now, NULL);
511d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
512dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington  uuid->as_uint32s[DBUS_UUID_LENGTH_WORDS - 1] = DBUS_UINT32_TO_BE (now);
513d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
514dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington  _dbus_generate_random_bytes_buffer (uuid->as_bytes, DBUS_UUID_LENGTH_BYTES - 4);
515d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
516d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
517d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
518d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * Hex-encode a UUID.
519d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington *
520d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param uuid the uuid
521d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param encoded string to append hex uuid to
522d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @returns #FALSE if no memory
523d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
524d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t
525d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_uuid_encode (const DBusGUID *uuid,
526d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                   DBusString     *encoded)
527d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
528d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusString binary;
529d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_init_const_len (&binary, uuid->as_bytes, DBUS_UUID_LENGTH_BYTES);
530d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return _dbus_string_hex_encode (&binary, 0, encoded, _dbus_string_get_length (encoded));
531d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
532d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
533d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic dbus_bool_t
534d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_read_uuid_file_without_creating (const DBusString *filename,
535d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                       DBusGUID         *uuid,
536d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                       DBusError        *error)
537d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
538d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusString contents;
539d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusString decoded;
540d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  int end;
541d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
542d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_init (&contents);
543d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_init (&decoded);
544d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
545d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_file_get_contents (&contents, filename, error))
546d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    goto error;
547d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
548d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_chop_white (&contents);
549d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
550d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (_dbus_string_get_length (&contents) != DBUS_UUID_LENGTH_HEX)
551d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
552d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT,
553d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      "UUID file '%s' should contain a hex string of length %d, not length %d, with no other text",
554d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_const_data (filename),
555d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      DBUS_UUID_LENGTH_HEX,
556d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_length (&contents));
557d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
558d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
559d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
560d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_string_hex_decode (&contents, 0, &end, &decoded, 0))
561d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
562d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _DBUS_SET_OOM (error);
563d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
564d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
565d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
566d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (end == 0)
567d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
568d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT,
569d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      "UUID file '%s' contains invalid hex data",
570d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_const_data (filename));
571d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
572d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
573d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
574d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (_dbus_string_get_length (&decoded) != DBUS_UUID_LENGTH_BYTES)
575d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
576d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT,
577d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      "UUID file '%s' contains %d bytes of hex-encoded data instead of %d",
578d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_const_data (filename),
579d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_length (&decoded),
580d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      DBUS_UUID_LENGTH_BYTES);
581d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
582d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
583d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
584d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_copy_to_buffer (&decoded, uuid->as_bytes, DBUS_UUID_LENGTH_BYTES);
585d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
586d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&decoded);
587d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&contents);
588d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
589d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
590d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
591d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return TRUE;
592d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
593d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington error:
594d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
595d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&contents);
596d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&decoded);
597d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return FALSE;
598d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
599d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
600d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic dbus_bool_t
601d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_create_uuid_file_exclusively (const DBusString *filename,
602d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                    DBusGUID         *uuid,
603d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                    DBusError        *error)
604d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
605d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusString encoded;
606d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
607d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_init (&encoded);
608d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
609d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_generate_uuid (uuid);
610d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
611d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_uuid_encode (uuid, &encoded))
612d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
613d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _DBUS_SET_OOM (error);
614d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
615d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
616d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
617d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  /* FIXME this is racy; we need a save_file_exclusively
618d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * function. But in practice this should be fine for now.
619d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   *
620d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * - first be sure we can create the file and it
621d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   *   doesn't exist by creating it empty with O_EXCL
622d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * - then create it by creating a temporary file and
623d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   *   overwriting atomically with rename()
624d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   */
625d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_create_file_exclusively (filename, error))
626d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    goto error;
627d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
628d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_string_append_byte (&encoded, '\n'))
629d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
630d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _DBUS_SET_OOM (error);
631d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
632d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
633d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
634d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_string_save_to_file (&encoded, filename, error))
635d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    goto error;
636d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
6379bb44a470ffd4eace9307b47be37f9ccab276eecThiago Macieira  if (!_dbus_make_file_world_readable (filename, error))
6389bb44a470ffd4eace9307b47be37f9ccab276eecThiago Macieira    goto error;
639d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
640d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&encoded);
641d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
642d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
643d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return TRUE;
644d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
645d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington error:
646d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
647d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&encoded);
648d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return FALSE;
649d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
650d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
651d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
652d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * Reads (and optionally writes) a uuid to a file. Initializes the uuid
653d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * unless an error is returned.
654d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington *
655d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param filename the name of the file
656d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param uuid uuid to be initialized with the loaded uuid
657d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param create_if_not_found #TRUE to create a new uuid and save it if the file doesn't exist
658d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param error the error return
659d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @returns #FALSE if the error is set
660d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
661d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t
662d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_read_uuid_file (const DBusString *filename,
663d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      DBusGUID         *uuid,
664d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      dbus_bool_t       create_if_not_found,
665d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      DBusError        *error)
666d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
667d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusError read_error;
668d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
669d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  dbus_error_init (&read_error);
670d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
671d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (_dbus_read_uuid_file_without_creating (filename, uuid, &read_error))
672d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    return TRUE;
673d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
674d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!create_if_not_found)
675d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
676d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_move_error (&read_error, error);
677d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
678d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
679d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
680d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  /* If the file exists and contains junk, we want to keep that error
681d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * message instead of overwriting it with a "file exists" error
682d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * message when we try to write
683d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   */
684d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (dbus_error_has_name (&read_error, DBUS_ERROR_INVALID_FILE_CONTENT))
685d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
686d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_move_error (&read_error, error);
687d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
688d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
689d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  else
690d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
691d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_error_free (&read_error);
692d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return _dbus_create_uuid_file_exclusively (filename, uuid, error);
693d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
694d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
695d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
696d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (machine_uuid);
697d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic int machine_uuid_initialized_generation = 0;
698d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic DBusGUID machine_uuid;
699d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
700d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
701d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * Gets the hex-encoded UUID of the machine this function is
702d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * executed on. This UUID is guaranteed to be the same for a given
703d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * machine at least until it next reboots, though it also
704d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * makes some effort to be the same forever, it may change if the
705d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * machine is reconfigured or its hardware is modified.
706d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington *
707d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param uuid_str string to append hex-encoded machine uuid to
708d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @returns #FALSE if no memory
709d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
710d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t
711d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_get_local_machine_uuid_encoded (DBusString *uuid_str)
712d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
713d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  dbus_bool_t ok;
714d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
715d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_LOCK (machine_uuid);
716d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (machine_uuid_initialized_generation != _dbus_current_generation)
717d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
718d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      DBusError error;
719d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_error_init (&error);
720d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      if (!_dbus_read_local_machine_uuid (&machine_uuid, FALSE,
721d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                          &error))
722d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington        {
723d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#ifndef DBUS_BUILD_TESTS
724d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington          /* For the test suite, we may not be installed so just continue silently
725d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington           * here. But in a production build, we want to be nice and loud about
726d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington           * this.
727d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington           */
728f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington          _dbus_warn_check_failed ("D-Bus library appears to be incorrectly set up; failed to read machine uuid: %s\n"
729f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                                   "See the manual page for dbus-uuidgen to correct this issue.\n",
730f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                                   error.message);
731d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#endif
732d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
733d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington          dbus_error_free (&error);
734d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
735d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington          _dbus_generate_uuid (&machine_uuid);
736d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington        }
737d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
738d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
739d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  ok = _dbus_uuid_encode (&machine_uuid, uuid_str);
740d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
741d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_UNLOCK (machine_uuid);
742d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
743d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return ok;
744d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
745d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
7467bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#ifdef DBUS_BUILD_TESTS
74744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington/**
748daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin * Returns a string describing the given name.
749daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin *
750daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin * @param header_field the field to describe
751daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin * @returns a constant string describing the field
752daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin */
753daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlinconst char *
754daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin_dbus_header_field_to_string (int header_field)
755daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin{
756daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin  switch (header_field)
757daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    {
758daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_INVALID:
759daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "invalid";
760daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_PATH:
761daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "path";
762daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_INTERFACE:
763daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "interface";
764daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_MEMBER:
765daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "member";
766daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_ERROR_NAME:
767daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "error-name";
768daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_REPLY_SERIAL:
769daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "reply-serial";
770c24e6e11a6f9cabfd0311242f8388c8d82e840dcJohn (J    case DBUS_HEADER_FIELD_DESTINATION:
771c24e6e11a6f9cabfd0311242f8388c8d82e840dcJohn (J      return "destination";
772c24e6e11a6f9cabfd0311242f8388c8d82e840dcJohn (J    case DBUS_HEADER_FIELD_SENDER:
773c24e6e11a6f9cabfd0311242f8388c8d82e840dcJohn (J      return "sender";
774dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    case DBUS_HEADER_FIELD_SIGNATURE:
775dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      return "signature";
776daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    default:
777daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "unknown";
778daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    }
779daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin}
7807bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#endif /* DBUS_BUILD_TESTS */
781daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin
782c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#ifndef DBUS_DISABLE_CHECKS
78385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** String used in _dbus_return_if_fail macro */
784c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Penningtonconst char _dbus_return_if_fail_warning_format[] =
785f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington"arguments to %s() were incorrect, assertion \"%s\" failed in file %s line %d.\n"
7867652304bff969afb3969603149bb385efe861fe8John (J"This is normally a bug in some application using the D-Bus library.\n";
787c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#endif
788c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
7892f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington#ifndef DBUS_DISABLE_ASSERT
7902f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington/**
7912f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * Internals of _dbus_assert(); it's a function
7922f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * rather than a macro with the inline code so
7932f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * that the assertion failure blocks don't show up
7942f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * in test suite coverage, and to shrink code size.
7952f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington *
7962f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param condition TRUE if assertion succeeded
7972f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param condition_text condition as a string
7982f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param file file the assertion is in
7992f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param line line the assertion is in
800aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington * @param func function the assertion is in
8012f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington */
8022f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Penningtonvoid
8032f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington_dbus_real_assert (dbus_bool_t  condition,
8042f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                   const char  *condition_text,
8052f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                   const char  *file,
806aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington                   int          line,
807aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington                   const char  *func)
8082f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington{
80975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  if (_DBUS_UNLIKELY (!condition))
8102f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington    {
811aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington      _dbus_warn ("%lu: assertion failed \"%s\" file \"%s\" line %d function %s\n",
812aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington                  _dbus_getpid (), condition_text, file, line, func);
8132f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington      _dbus_abort ();
8142f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington    }
8152f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington}
8162f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington
8172f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington/**
8182f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * Internals of _dbus_assert_not_reached(); it's a function
8192f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * rather than a macro with the inline code so
8202f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * that the assertion failure blocks don't show up
8212f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * in test suite coverage, and to shrink code size.
8222f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington *
8232f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param explanation what was reached that shouldn't have been
8242f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param file file the assertion is in
8252f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param line line the assertion is in
8262f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington */
8272f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Penningtonvoid
8282f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington_dbus_real_assert_not_reached (const char *explanation,
8292f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                               const char *file,
8302f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                               int         line)
8312f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington{
83251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_warn ("File \"%s\" line %d process %lu should not have been reached: %s\n",
83351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington              file, line, _dbus_getpid (), explanation);
8342f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington  _dbus_abort ();
8352f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington}
8362f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington#endif /* DBUS_DISABLE_ASSERT */
8372f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington
83818c470cd2c7245f33f5d924d23972e95e3d347a0Havoc Pennington#ifdef DBUS_BUILD_TESTS
839bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonstatic dbus_bool_t
840bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonrun_failing_each_malloc (int                    n_mallocs,
841bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         const char            *description,
842bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         DBusTestMemoryFunction func,
843bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         void                  *data)
844bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{
845bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  n_mallocs += 10; /* fudge factor to ensure reallocs etc. are covered */
846bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
847bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  while (n_mallocs >= 0)
848bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    {
849bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      _dbus_set_fail_alloc_counter (n_mallocs);
850bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
851bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      _dbus_verbose ("\n===\n%s: (will fail malloc %d with %d failures)\n===\n",
852bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                     description, n_mallocs,
853bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                     _dbus_get_fail_alloc_failures ());
854bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
855bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      if (!(* func) (data))
856bf99381351b802fb3348a24037898222aae631e2Havoc Pennington        return FALSE;
857bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
858bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      n_mallocs -= 1;
859bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    }
860bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
861bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
862bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
863bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  return TRUE;
864bf99381351b802fb3348a24037898222aae631e2Havoc Pennington}
865bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
866bf99381351b802fb3348a24037898222aae631e2Havoc Pennington/**
867bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * Tests how well the given function responds to out-of-memory
868bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * situations. Calls the function repeatedly, failing a different
869bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * call to malloc() each time. If the function ever returns #FALSE,
870bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * the test fails. The function should return #TRUE whenever something
871bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * valid (such as returning an error, or succeeding) occurs, and #FALSE
872bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * if it gets confused in some way.
873bf99381351b802fb3348a24037898222aae631e2Havoc Pennington *
874bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * @param description description of the test used in verbose output
875bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * @param func function to call
876bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * @param data data to pass to function
877bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * @returns #TRUE if the function never returns FALSE
878bf99381351b802fb3348a24037898222aae631e2Havoc Pennington */
879bf99381351b802fb3348a24037898222aae631e2Havoc Penningtondbus_bool_t
880bf99381351b802fb3348a24037898222aae631e2Havoc Pennington_dbus_test_oom_handling (const char             *description,
881bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         DBusTestMemoryFunction  func,
882bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         void                   *data)
883bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{
884bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  int approx_mallocs;
8859c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *setting;
8869c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int max_failures_to_try;
8879c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int i;
888bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
889bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  /* Run once to see about how many mallocs are involved */
890bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
891bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
892bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
89351781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("Running once to count mallocs\n");
89451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
895bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  if (!(* func) (data))
896bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    return FALSE;
897bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington
898bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  approx_mallocs = _DBUS_INT_MAX - _dbus_get_fail_alloc_counter ();
899bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
90051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("\n=================\n%s: about %d mallocs total\n=================\n",
901bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                 description, approx_mallocs);
902bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
9039c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  setting = _dbus_getenv ("DBUS_TEST_MALLOC_FAILURES");
9049c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (setting != NULL)
9059c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
9069c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      DBusString str;
9079c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      long v;
9089c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      _dbus_string_init_const (&str, setting);
9099c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      v = 4;
9109c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (!_dbus_string_parse_int (&str, 0, &v, NULL))
9119c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        _dbus_warn ("couldn't parse '%s' as integer\n", setting);
9129c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      max_failures_to_try = v;
9139c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
9149c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  else
9159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
9169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      max_failures_to_try = 4;
9179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
918bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
9199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  i = setting ? max_failures_to_try - 1 : 1;
9209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (i < max_failures_to_try)
9219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
9229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      _dbus_set_fail_alloc_failures (i);
9239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (!run_failing_each_malloc (approx_mallocs, description, func, data))
9249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        return FALSE;
9259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++i;
9269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
927bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
92851781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("\n=================\n%s: all iterations passed\n=================\n",
929bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                 description);
930bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
931bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  return TRUE;
932bf99381351b802fb3348a24037898222aae631e2Havoc Pennington}
93318c470cd2c7245f33f5d924d23972e95e3d347a0Havoc Pennington#endif /* DBUS_BUILD_TESTS */
934bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
935954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/** @} */
936