1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
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
205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
22954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
23dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann
24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
25954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include "dbus-internals.h"
261f23ea99b37bfc8197f1c6a376f9afe08037f0f6Anders Carlsson#include "dbus-protocol.h"
27dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington#include "dbus-marshal-basic.h"
28993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington#include "dbus-test.h"
29954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include <stdio.h>
30954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include <stdarg.h>
31041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include <string.h>
32993be1059afcb0e9a5b67f5287fb1122d6c48ce6Havoc Pennington#include <stdlib.h>
33807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#ifdef DBUS_USE_OUTPUT_DEBUG_STRING
34807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#include <windows.h>
35127bd1f0c3bd8181815b1bec62be8b4e9af3e850Romain Pokrzywka#include <mbstring.h>
36807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#endif
37954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
387de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#ifdef DBUS_ANDROID_LOG
397de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#define LOG_TAG "libdbus"
407de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#include <cutils/log.h>
417de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#endif /* DBUS_ANDROID_LOG */
427de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly
43954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
4415ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @defgroup DBusInternals D-Bus secret internal implementation details
457652304bff969afb3969603149bb385efe861fe8John (J * @brief Documentation useful when developing or debugging D-Bus itself.
46954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
47954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
48954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
49954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
50041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @defgroup DBusInternalsUtils Utilities and portability
51954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @ingroup DBusInternals
52954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @brief Utility functions (_dbus_assert(), _dbus_warn(), etc.)
53954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @{
54954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
55954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
56954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
57954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _dbus_assert
58954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
59954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Aborts with an error message if the condition is false.
60954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
61954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param condition condition which must be true.
62954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
63954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
64954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
65954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _dbus_assert_not_reached
66954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
67954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Aborts with an error message if called.
68954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * The given explanation will be printed.
69954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
70954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param explanation explanation of what happened if the code was reached.
71954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
72954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
73954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
74954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _DBUS_N_ELEMENTS
75954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
76954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Computes the number of elements in a fixed-size array using
77954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * sizeof().
78954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
79954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param array the array to count elements in.
80954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
81954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
82954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
83954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _DBUS_POINTER_TO_INT
84954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
85954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Safely casts a void* to an integer; should only be used on void*
86954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * that actually contain integers, for example one created with
87954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * _DBUS_INT_TO_POINTER.  Only guaranteed to preserve 32 bits.
88954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * (i.e. it's used to store 32-bit ints in pointers, but
89954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * can't be used to store 64-bit pointers in ints.)
90954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
91954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param pointer pointer to extract an integer from.
92954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
93954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
94954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @def _DBUS_INT_TO_POINTER
95954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
96954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Safely stuffs an integer into a pointer, to be extracted later with
97954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * _DBUS_POINTER_TO_INT. Only guaranteed to preserve 32 bits.
98954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
99954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param integer the integer to stuff into a pointer.
100954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
101041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
102041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @def _DBUS_ZERO
103041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
104041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Sets all bits in an object to zero.
105041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
106041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param object the object to be zeroed.
107041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
108954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
1093ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_INT16_MIN
1103ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1113ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Minimum value of type "int16"
1123ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1133ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1143ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_INT16_MAX
1153ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1163ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "int16"
1173ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1183ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1193ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_UINT16_MAX
1203ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1213ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "uint16"
1223ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1233ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington
1243ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1253ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_INT32_MIN
1263ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1273ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Minimum value of type "int32"
1283ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1293ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1303ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_INT32_MAX
1313ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1323ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "int32"
1333ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1343ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1353ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_UINT32_MAX
1363ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1373ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "uint32"
1383ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
1393ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington
1403ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
141576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington * @def _DBUS_INT_MIN
142576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington *
143576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington * Minimum value of type "int"
144576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington */
145576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington/**
146576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington * @def _DBUS_INT_MAX
147576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington *
148576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington * Maximum value of type "int"
149576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington */
1503ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/**
1513ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * @def _DBUS_UINT_MAX
1523ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington *
1533ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington * Maximum value of type "uint"
1543ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington */
155041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
156041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
157041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @typedef DBusForeachFunction
158041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
159041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Used to iterate over each item in a collection, such as
160041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * a DBusList.
161041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
162576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington
163576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington/**
164c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_LOCK_NAME
165c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
166c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Expands to name of a global lock variable.
167c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
168c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
169c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
170c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_DEFINE_GLOBAL_LOCK
171c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
172c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Defines a global lock variable with the given name.
173c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * The lock must be added to the list to initialize
174c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * in dbus_threads_init().
175c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
176c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
177c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
178c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_DECLARE_GLOBAL_LOCK
179c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
180c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Expands to declaration of a global lock defined
181c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * with _DBUS_DEFINE_GLOBAL_LOCK.
182c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * The lock must be added to the list to initialize
183c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * in dbus_threads_init().
184c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
185c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
186c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
187c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_LOCK
188c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
189c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Locks a global lock
190c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
191c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
192c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
193c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * @def _DBUS_UNLOCK
194c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington *
195c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington * Unlocks a global lock
196c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington */
197c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
198c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington/**
19929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Fixed "out of memory" error message, just to avoid
20029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * making up a different string every time and wasting
20129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * space.
20229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */
203230caac4758028d0524a96a0947bd1b14ded803fTor Lillqvistconst char *_dbus_no_memory_message = "Not enough memory";
20429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
205a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Penningtonstatic dbus_bool_t warn_initted = FALSE;
206a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Penningtonstatic dbus_bool_t fatal_warnings = FALSE;
207f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtonstatic dbus_bool_t fatal_warnings_on_check_failed = TRUE;
208f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
209f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtonstatic void
210f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtoninit_warnings(void)
211f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington{
212f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (!warn_initted)
213f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    {
214f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      const char *s;
215a44d08711c64e7ae807d2b4f181cefa848e2aa32Will Thompson      s = _dbus_getenv ("DBUS_FATAL_WARNINGS");
216f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      if (s && *s)
217f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington        {
218f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington          if (*s == '0')
219f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            {
220f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fatal_warnings = FALSE;
221f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fatal_warnings_on_check_failed = FALSE;
222f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            }
223f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington          else if (*s == '1')
224f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            {
225f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fatal_warnings = TRUE;
226f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fatal_warnings_on_check_failed = TRUE;
227f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            }
228f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington          else
229f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            {
230f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington              fprintf(stderr, "DBUS_FATAL_WARNINGS should be set to 0 or 1 if set, not '%s'",
231f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                      s);
232f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington            }
233f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington        }
234f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
235f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      warn_initted = TRUE;
236f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    }
237f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington}
238a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington
23929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/**
240f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * Prints a warning message to stderr. Can optionally be made to exit
241f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * fatally by setting DBUS_FATAL_WARNINGS, but this is rarely
242f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * used. This function should be considered pretty much equivalent to
243f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * fprintf(stderr). _dbus_warn_check_failed() on the other hand is
244f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * suitable for use when a programming mistake has been made.
245954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
246954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param format printf-style format string.
247954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
248954c4c7550879bd80315811b8548adfcb415766eHavoc Penningtonvoid
249954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington_dbus_warn (const char *format,
250954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington            ...)
251954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington{
252954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  va_list args;
253954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
254a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington  if (!warn_initted)
255f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    init_warnings ();
256f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
257f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  va_start (args, format);
2587de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#ifdef DBUS_ANDROID_LOG
2597de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly  LOG_PRI_VA(ANDROID_LOG_WARN, LOG_TAG, format, args);
2607de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#else
261f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  vfprintf (stderr, format, args);
2627de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#endif /* DBUS_ANDROID_LOG */
263f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  va_end (args);
264a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington
265f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (fatal_warnings)
266f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    {
267f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      fflush (stderr);
268f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington      _dbus_abort ();
269a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington    }
270f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington}
271f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
272f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington/**
273f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * Prints a "critical" warning to stderr when an assertion fails;
274f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * differs from _dbus_warn primarily in that it prefixes the pid and
275f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * defaults to fatal. This should be used only when a programming
276f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * error has been detected. (NOT for unavoidable errors that an app
277f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * might handle - those should be returned as DBusError.) Calling this
278f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington * means "there is a bug"
279f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington */
280f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtonvoid
281f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington_dbus_warn_check_failed(const char *format,
282f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                        ...)
283f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington{
284f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  va_list args;
285f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
286f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (!warn_initted)
287f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    init_warnings ();
288f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
28923832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington  fprintf (stderr, "process %lu: ", _dbus_pid_for_log ());
290a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington
291954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  va_start (args, format);
2927de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#ifdef DBUS_ANDROID_LOG
2937de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly  LOG_PRI_VA(ANDROID_LOG_ERROR, LOG_TAG, format, args);
2947de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#else
295954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  vfprintf (stderr, format, args);
2967de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#endif /* DBUS_ANDROID_LOG */
297954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  va_end (args);
298a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington
299f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (fatal_warnings_on_check_failed)
300a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington    {
301a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington      fflush (stderr);
302a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington      _dbus_abort ();
303a2129f7cccaf0265fffe0da79ca0510b6e01131bHavoc Pennington    }
304954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington}
305954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
3067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#ifdef DBUS_ENABLE_VERBOSE_MODE
3077bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
308eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Penningtonstatic dbus_bool_t verbose_initted = FALSE;
30905d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (Jstatic dbus_bool_t verbose = TRUE;
310eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
31115ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/** Whether to show the current thread in verbose messages */
312be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#define PTHREAD_IN_VERBOSE 0
313be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#if PTHREAD_IN_VERBOSE
3147f2973c8d1e124f4744af0bee73679607511f3a4Havoc Pennington#include <pthread.h>
315be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#endif
316be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington
3178a7f49a51edcc9b6bb5c104bbff832b7ed84dd36Tor Lillqvist#ifdef _MSC_VER
3186b83766121ce27db759d5fa56dbcfc74ffa86987Ralf Habacker#define inline
3196b83766121ce27db759d5fa56dbcfc74ffa86987Ralf Habacker#endif
320807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#ifdef DBUS_USE_OUTPUT_DEBUG_STRING
321807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habackerstatic char module_name[1024];
322807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#endif
3236b83766121ce27db759d5fa56dbcfc74ffa86987Ralf Habacker
32405d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (Jstatic inline void
32505d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J_dbus_verbose_init (void)
32605d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J{
32705d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J  if (!verbose_initted)
32805d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J    {
3297de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#ifdef DBUS_ANDROID_LOG
3307de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly      /* Don't bother checking environment variable - just print the
3317de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly         verbose logs (can still be disabled with DBUS_ENABLE_VERBOSE_MODE) */
3327de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly      verbose = TRUE;
3337de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#else
3347de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly      const char *p = _dbus_getenv ("DBUS_VERBOSE");
33505d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J      verbose = p != NULL && *p == '1';
3367de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#endif
33705d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J      verbose_initted = TRUE;
338807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#ifdef DBUS_USE_OUTPUT_DEBUG_STRING
339459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist      {
340459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist        char *last_period, *last_slash;
341459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist        GetModuleFileName(0,module_name,sizeof(module_name)-1);
342459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist        last_period = _mbsrchr(module_name,'.');
343459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist        if (last_period)
344459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist          *last_period ='\0';
345459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist        last_slash = _mbsrchr(module_name,'\\');
346459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist        if (last_slash)
347459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist          strcpy(module_name,last_slash+1);
348459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist        strcat(module_name,": ");
349459c19b9dd157cd360c3082d015a4c5ae4689cf8Tor Lillqvist      }
350807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#endif
35105d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J    }
35205d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J}
35305d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J
3547f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker/** @def DBUS_IS_DIR_SEPARATOR(c)
3557f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker * macro for checking if character c is a patch separator
3567f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker *
3577f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker * @todo move to a header file so that others can use this too
3587f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker */
3597f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#ifdef DBUS_WIN
3607f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#define DBUS_IS_DIR_SEPARATOR(c) (c == '\\' || c == '/')
3617f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#else
3627f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#define DBUS_IS_DIR_SEPARATOR(c) (c == '/')
3637f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#endif
3647f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker
3657f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker/**
3667f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker remove source root from file path
3677f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker the source root is determined by
3687f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker*/
3697f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habackerstatic char *_dbus_file_path_extract_elements_from_tail(const char *file,int level)
3707f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker{
3717f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker  static int prefix = -1;
3727f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker  char *p;
3737f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker
3747f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker  if (prefix == -1)
3757f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker    {
3767f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker      char *p = (char *)file + strlen(file);
3777f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker      int i = 0;
3787f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker      prefix = 0;
3797f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker      for (;p >= file;p--)
3807f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker        {
3817f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker          if (DBUS_IS_DIR_SEPARATOR(*p))
3827f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker            {
3837f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker              if (++i >= level)
3847f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker                {
3857f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker                  prefix = p-file+1;
3867f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker                  break;
3877f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker                }
3887f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker           }
3897f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker        }
3907f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker    }
3917f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker  return (char *)file+prefix;
3927f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker}
3937f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker
39415ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington/**
39515ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * Implementation of dbus_is_verbose() macro if built with verbose logging
39615ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * enabled.
39715ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington * @returns whether verbose logging is active.
39815ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington */
39905d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (Jdbus_bool_t
40005d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J_dbus_is_verbose_real (void)
40105d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J{
40205d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J  _dbus_verbose_init ();
40305d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J  return verbose;
40405d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J}
40505d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J
406954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/**
407041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Prints a warning message to stderr
408041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * if the user has enabled verbose mode.
4096ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington * This is the real function implementation,
4106ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington * use _dbus_verbose() macro in code.
411041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *
412041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param format printf-style format string.
413041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */
414041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid
4157f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#ifdef DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS
4167f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker_dbus_verbose_real (const char *file,
4177f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker                    const int line,
4187f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker                    const char *function,
4197f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker                    const char *format,
4207f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#else
4216ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington_dbus_verbose_real (const char *format,
4227f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#endif
4236ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington                    ...)
424041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{
425041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  va_list args;
4266a109938f7a4fc726997985b6de66cf573961986Havoc Pennington  static dbus_bool_t need_pid = TRUE;
427dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  int len;
4287de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly
4294a74f8fcaba1b9d7ff962fd3c5655e57c2c32c81Havoc Pennington  /* things are written a bit oddly here so that
4304a74f8fcaba1b9d7ff962fd3c5655e57c2c32c81Havoc Pennington   * in the non-verbose case we just have the one
4314a74f8fcaba1b9d7ff962fd3c5655e57c2c32c81Havoc Pennington   * conditional and return immediately.
4324a74f8fcaba1b9d7ff962fd3c5655e57c2c32c81Havoc Pennington   */
43305d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J  if (!_dbus_is_verbose_real())
434041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington    return;
4351708094c0e00ab433bb0a51981f8b77d24aee256Havoc Pennington
436807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#ifndef DBUS_USE_OUTPUT_DEBUG_STRING
437dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  /* Print out pid before the line */
4386a109938f7a4fc726997985b6de66cf573961986Havoc Pennington  if (need_pid)
439be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington    {
440be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#if PTHREAD_IN_VERBOSE
44123832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      fprintf (stderr, "%lu: 0x%lx: ", _dbus_pid_for_log (), pthread_self ());
442be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#else
44323832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington      fprintf (stderr, "%lu: ", _dbus_pid_for_log ());
444be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington#endif
445be672187a56300d5aa15b1e5b3bfa5dc0fe48818Havoc Pennington    }
446807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#endif
447dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington
448dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  /* Only print pid again if the next line is a new line */
449dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  len = strlen (format);
450dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  if (format[len-1] == '\n')
451dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    need_pid = TRUE;
452dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington  else
453dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    need_pid = FALSE;
4547f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker
455041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  va_start (args, format);
456807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#ifdef DBUS_USE_OUTPUT_DEBUG_STRING
457807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker  {
458807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker  char buf[1024];
459807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker  strcpy(buf,module_name);
4607f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#ifdef DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS
461127bd1f0c3bd8181815b1bec62be8b4e9af3e850Romain Pokrzywka  sprintf (buf+strlen(buf), "[%s(%d):%s] ",_dbus_file_path_extract_elements_from_tail(file,2),line,function);
4627f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#endif
463807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker  vsprintf (buf+strlen(buf),format, args);
464807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker  va_end (args);
4652313832d3880ae17edc0629f981d4ec0980e4defMarcus Brinkmann  OutputDebugStringA(buf);
466807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker  }
467807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#else
4687f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#ifdef DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS
4697f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker  fprintf (stderr, "[%s(%d):%s] ",_dbus_file_path_extract_elements_from_tail(file,2),line,function);
4707f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#endif
4717f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker
4727de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#ifdef DBUS_ANDROID_LOG
4737de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly  LOG_PRI_VA(ANDROID_LOG_DEBUG, LOG_TAG, format, args);
4747de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#else
475041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  vfprintf (stderr, format, args);
4767de15def0c10145a1368a5ca52fe5920aecf4c63Nick Pelly#endif /* DBUS_ANDROID_LOG */
477041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington  va_end (args);
478d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington
479d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington  fflush (stderr);
480807fd7e7318a28d9d9677e07727652db1322b6d0Ralf Habacker#endif
481041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington}
482041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
483041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
484eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington * Reinitializes the verbose logging code, used
485eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington * as a hack in dbus-spawn.c so that a child
486eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington * process re-reads its pid
487eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington *
488eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington */
489eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Penningtonvoid
490eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington_dbus_verbose_reset_real (void)
491eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington{
492eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington  verbose_initted = FALSE;
493eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington}
494eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington
4957bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#endif /* DBUS_ENABLE_VERBOSE_MODE */
4967bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
497eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington/**
498954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * Duplicates a string. Result must be freed with
499954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * dbus_free(). Returns #NULL if memory allocation fails.
500954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * If the string to be duplicated is #NULL, returns #NULL.
501954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
502954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @param str string to duplicate.
503954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington * @returns newly-allocated copy.
504954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington */
505954c4c7550879bd80315811b8548adfcb415766eHavoc Penningtonchar*
506954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington_dbus_strdup (const char *str)
507954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington{
508cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  size_t len;
509954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  char *copy;
510954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
511954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  if (str == NULL)
512954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington    return NULL;
513954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
514954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  len = strlen (str);
515954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
516954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  copy = dbus_malloc (len + 1);
517954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  if (copy == NULL)
518954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington    return NULL;
519954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
520954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  memcpy (copy, str, len + 1);
521954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
522954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington  return copy;
523954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington}
524954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
525cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington/**
526cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * Duplicates a block of memory. Returns
527cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * #NULL on failure.
528cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington *
529cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * @param mem memory to copy
530cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * @param n_bytes number of bytes to copy
531cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington * @returns the copy
532cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington */
533cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Penningtonvoid*
534cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington_dbus_memdup (const void  *mem,
535cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington              size_t       n_bytes)
536cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington{
537cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  void *copy;
538cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington
539cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  copy = dbus_malloc (n_bytes);
540cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  if (copy == NULL)
541cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington    return NULL;
542cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington
543cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  memcpy (copy, mem, n_bytes);
544cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington
545cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington  return copy;
546cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington}
547cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington
548041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/**
54944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * Duplicates a string array. Result may be freed with
55044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * dbus_free_string_array(). Returns #NULL if memory allocation fails.
55144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * If the array to be duplicated is #NULL, returns #NULL.
55244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington *
55344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param array array to duplicate.
55444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @returns newly-allocated copy.
55544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington */
55644ed933284589134603913b05f55ca55e8c5a566Havoc Penningtonchar**
55744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington_dbus_dup_string_array (const char **array)
55844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{
55944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  int len;
56044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  int i;
56144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  char **copy;
56244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
56344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  if (array == NULL)
56444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    return NULL;
56544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
56644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  for (len = 0; array[len] != NULL; ++len)
56744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    ;
56844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
56944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  copy = dbus_new0 (char*, len + 1);
57044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  if (copy == NULL)
57144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    return NULL;
57244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
57344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  i = 0;
57444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  while (i < len)
57544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
57644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      copy[i] = _dbus_strdup (array[i]);
57744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      if (copy[i] == NULL)
57844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        {
57944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          dbus_free_string_array (copy);
58044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington          return NULL;
58144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        }
58244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
58344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      ++i;
58444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
58544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
58644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  return copy;
58744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington}
58844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
58944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington/**
59044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * Checks whether a string array contains the given string.
59144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington *
59244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param array array to search.
59344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @param str string to look for
59444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington * @returns #TRUE if array contains string
59544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington */
59644ed933284589134603913b05f55ca55e8c5a566Havoc Penningtondbus_bool_t
59744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington_dbus_string_array_contains (const char **array,
59844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington                             const char  *str)
59944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington{
60044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  int i;
60144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
60244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  i = 0;
60344ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  while (array[i] != NULL)
60444ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    {
60544ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      if (strcmp (array[i], str) == 0)
60644ed933284589134603913b05f55ca55e8c5a566Havoc Pennington        return TRUE;
60744ed933284589134603913b05f55ca55e8c5a566Havoc Pennington      ++i;
60844ed933284589134603913b05f55ca55e8c5a566Havoc Pennington    }
60944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
61044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington  return FALSE;
61144ed933284589134603913b05f55ca55e8c5a566Havoc Pennington}
61244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
613d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
614d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * Generates a new UUID. If you change how this is done,
615d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * there's some text about it in the spec that should also change.
616d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington *
617d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param uuid the uuid to initialize
618d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
619d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonvoid
620d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_generate_uuid (DBusGUID *uuid)
621d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
622d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  long now;
623d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
624d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_get_current_time (&now, NULL);
625d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
626dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington  uuid->as_uint32s[DBUS_UUID_LENGTH_WORDS - 1] = DBUS_UINT32_TO_BE (now);
627d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
628dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington  _dbus_generate_random_bytes_buffer (uuid->as_bytes, DBUS_UUID_LENGTH_BYTES - 4);
629d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
630d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
631d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
632d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * Hex-encode a UUID.
633d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington *
634d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param uuid the uuid
635d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param encoded string to append hex uuid to
636d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @returns #FALSE if no memory
637d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
638d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t
639d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_uuid_encode (const DBusGUID *uuid,
640d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                   DBusString     *encoded)
641d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
642d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusString binary;
643d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_init_const_len (&binary, uuid->as_bytes, DBUS_UUID_LENGTH_BYTES);
644d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return _dbus_string_hex_encode (&binary, 0, encoded, _dbus_string_get_length (encoded));
645d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
646d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
647d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic dbus_bool_t
648d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_read_uuid_file_without_creating (const DBusString *filename,
649d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                       DBusGUID         *uuid,
650d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                       DBusError        *error)
651d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
652d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusString contents;
653d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusString decoded;
654d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  int end;
655d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
656c18415e2c6e151b773a90e66188714124ee8b867John (J  if (!_dbus_string_init (&contents))
657c18415e2c6e151b773a90e66188714124ee8b867John (J    {
658c18415e2c6e151b773a90e66188714124ee8b867John (J      _DBUS_SET_OOM (error);
659c18415e2c6e151b773a90e66188714124ee8b867John (J      return FALSE;
660c18415e2c6e151b773a90e66188714124ee8b867John (J    }
661c18415e2c6e151b773a90e66188714124ee8b867John (J
662c18415e2c6e151b773a90e66188714124ee8b867John (J  if (!_dbus_string_init (&decoded))
663c18415e2c6e151b773a90e66188714124ee8b867John (J    {
664c18415e2c6e151b773a90e66188714124ee8b867John (J      _dbus_string_free (&contents);
665c18415e2c6e151b773a90e66188714124ee8b867John (J      _DBUS_SET_OOM (error);
666c18415e2c6e151b773a90e66188714124ee8b867John (J      return FALSE;
667c18415e2c6e151b773a90e66188714124ee8b867John (J    }
668d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
669d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_file_get_contents (&contents, filename, error))
670d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    goto error;
671d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
672d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_chop_white (&contents);
673d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
674d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (_dbus_string_get_length (&contents) != DBUS_UUID_LENGTH_HEX)
675d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
676d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT,
677d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      "UUID file '%s' should contain a hex string of length %d, not length %d, with no other text",
678d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_const_data (filename),
679d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      DBUS_UUID_LENGTH_HEX,
680d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_length (&contents));
681d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
682d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
683d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
684d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_string_hex_decode (&contents, 0, &end, &decoded, 0))
685d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
686d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _DBUS_SET_OOM (error);
687d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
688d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
689d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
690d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (end == 0)
691d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
692d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT,
693d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      "UUID file '%s' contains invalid hex data",
694d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_const_data (filename));
695d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
696d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
697d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
698d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (_dbus_string_get_length (&decoded) != DBUS_UUID_LENGTH_BYTES)
699d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
700d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_set_error (error, DBUS_ERROR_INVALID_FILE_CONTENT,
701d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      "UUID file '%s' contains %d bytes of hex-encoded data instead of %d",
702d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_const_data (filename),
703d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      _dbus_string_get_length (&decoded),
704d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      DBUS_UUID_LENGTH_BYTES);
705d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
706d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
707d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
708d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_copy_to_buffer (&decoded, uuid->as_bytes, DBUS_UUID_LENGTH_BYTES);
709d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
710d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&decoded);
711d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&contents);
712d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
713d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
714d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
715d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return TRUE;
716d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
717d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington error:
718d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
719d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&contents);
720d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&decoded);
721d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return FALSE;
722d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
723d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
724d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic dbus_bool_t
725d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_create_uuid_file_exclusively (const DBusString *filename,
726d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                    DBusGUID         *uuid,
727d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                    DBusError        *error)
728d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
729d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  DBusString encoded;
730d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
731c18415e2c6e151b773a90e66188714124ee8b867John (J  if (!_dbus_string_init (&encoded))
732c18415e2c6e151b773a90e66188714124ee8b867John (J    {
733c18415e2c6e151b773a90e66188714124ee8b867John (J      _DBUS_SET_OOM (error);
734c18415e2c6e151b773a90e66188714124ee8b867John (J      return FALSE;
735c18415e2c6e151b773a90e66188714124ee8b867John (J    }
736d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
737d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_generate_uuid (uuid);
738d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
739d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_uuid_encode (uuid, &encoded))
740d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
741d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _DBUS_SET_OOM (error);
742d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
743d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
744d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
745d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!_dbus_string_append_byte (&encoded, '\n'))
746d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
747d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      _DBUS_SET_OOM (error);
748d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      goto error;
749d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
750d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
75145d53565bc13678d6aa5edec1d4efb5bf8a64e0bColin Walters  if (!_dbus_string_save_to_file (&encoded, filename, TRUE, error))
7529bb44a470ffd4eace9307b47be37f9ccab276eecThiago Macieira    goto error;
753d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
754d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&encoded);
755d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
756d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_ASSERT_ERROR_IS_CLEAR (error);
757d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return TRUE;
758d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
759d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington error:
760d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_ASSERT_ERROR_IS_SET (error);
761d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _dbus_string_free (&encoded);
762d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return FALSE;
763d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
764d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
765d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
766d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * Reads (and optionally writes) a uuid to a file. Initializes the uuid
767d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * unless an error is returned.
768d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington *
769d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param filename the name of the file
770d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param uuid uuid to be initialized with the loaded uuid
771d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param create_if_not_found #TRUE to create a new uuid and save it if the file doesn't exist
772d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param error the error return
773d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @returns #FALSE if the error is set
774d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
775d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t
776d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_read_uuid_file (const DBusString *filename,
777d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      DBusGUID         *uuid,
778d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      dbus_bool_t       create_if_not_found,
779d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                      DBusError        *error)
780d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
781f55897af74ac072d3447e5cf513d0f4718b142c7Simon McVittie  DBusError read_error = DBUS_ERROR_INIT;
782d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
783d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (_dbus_read_uuid_file_without_creating (filename, uuid, &read_error))
784d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    return TRUE;
785d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
786d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (!create_if_not_found)
787d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
788d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_move_error (&read_error, error);
789d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
790d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
791d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
792d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  /* If the file exists and contains junk, we want to keep that error
793d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * message instead of overwriting it with a "file exists" error
794d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   * message when we try to write
795d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington   */
796d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (dbus_error_has_name (&read_error, DBUS_ERROR_INVALID_FILE_CONTENT))
797d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
798d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_move_error (&read_error, error);
799d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return FALSE;
800d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
801d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  else
802d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
803d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      dbus_error_free (&read_error);
804d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      return _dbus_create_uuid_file_exclusively (filename, uuid, error);
805d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
806d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
807d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
808d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_DBUS_DEFINE_GLOBAL_LOCK (machine_uuid);
809d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic int machine_uuid_initialized_generation = 0;
810d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonstatic DBusGUID machine_uuid;
811d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
812d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
813d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * Gets the hex-encoded UUID of the machine this function is
814d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * executed on. This UUID is guaranteed to be the same for a given
815d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * machine at least until it next reboots, though it also
816d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * makes some effort to be the same forever, it may change if the
817d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * machine is reconfigured or its hardware is modified.
818d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington *
819d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @param uuid_str string to append hex-encoded machine uuid to
820d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * @returns #FALSE if no memory
821d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
822d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t
823d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_dbus_get_local_machine_uuid_encoded (DBusString *uuid_str)
824d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
825d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  dbus_bool_t ok;
826d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
827d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_LOCK (machine_uuid);
828d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  if (machine_uuid_initialized_generation != _dbus_current_generation)
829d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    {
830f55897af74ac072d3447e5cf513d0f4718b142c7Simon McVittie      DBusError error = DBUS_ERROR_INIT;
831f55897af74ac072d3447e5cf513d0f4718b142c7Simon McVittie
832d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington      if (!_dbus_read_local_machine_uuid (&machine_uuid, FALSE,
833d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                          &error))
834d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington        {
835d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#ifndef DBUS_BUILD_TESTS
836d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington          /* For the test suite, we may not be installed so just continue silently
837d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington           * here. But in a production build, we want to be nice and loud about
838d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington           * this.
839d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington           */
840f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington          _dbus_warn_check_failed ("D-Bus library appears to be incorrectly set up; failed to read machine uuid: %s\n"
841f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                                   "See the manual page for dbus-uuidgen to correct this issue.\n",
842f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                                   error.message);
843d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#endif
844d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
845d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington          dbus_error_free (&error);
846d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
847d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington          _dbus_generate_uuid (&machine_uuid);
848d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington        }
849d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington    }
850d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
851d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  ok = _dbus_uuid_encode (&machine_uuid, uuid_str);
852d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
853d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  _DBUS_UNLOCK (machine_uuid);
854d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
855d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington  return ok;
856d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington}
857d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
8587bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#ifdef DBUS_BUILD_TESTS
85944ed933284589134603913b05f55ca55e8c5a566Havoc Pennington/**
860daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin * Returns a string describing the given name.
861daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin *
862daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin * @param header_field the field to describe
863daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin * @returns a constant string describing the field
864daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin */
865daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlinconst char *
866daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin_dbus_header_field_to_string (int header_field)
867daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin{
868daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin  switch (header_field)
869daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    {
870daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_INVALID:
871daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "invalid";
872daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_PATH:
873daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "path";
874daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_INTERFACE:
875daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "interface";
876daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_MEMBER:
877daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "member";
878daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_ERROR_NAME:
879daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "error-name";
880daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    case DBUS_HEADER_FIELD_REPLY_SERIAL:
881daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "reply-serial";
882c24e6e11a6f9cabfd0311242f8388c8d82e840dcJohn (J    case DBUS_HEADER_FIELD_DESTINATION:
883c24e6e11a6f9cabfd0311242f8388c8d82e840dcJohn (J      return "destination";
884c24e6e11a6f9cabfd0311242f8388c8d82e840dcJohn (J    case DBUS_HEADER_FIELD_SENDER:
885c24e6e11a6f9cabfd0311242f8388c8d82e840dcJohn (J      return "sender";
886dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington    case DBUS_HEADER_FIELD_SIGNATURE:
887dbdea921b5967ed25b24a9e5af5d6a3db54c5ec7Havoc Pennington      return "signature";
888daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    default:
889daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin      return "unknown";
890daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin    }
891daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin}
8927bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington#endif /* DBUS_BUILD_TESTS */
893daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlin
894c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#ifndef DBUS_DISABLE_CHECKS
89585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** String used in _dbus_return_if_fail macro */
896230caac4758028d0524a96a0947bd1b14ded803fTor Lillqvistconst char *_dbus_return_if_fail_warning_format =
897f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington"arguments to %s() were incorrect, assertion \"%s\" failed in file %s line %d.\n"
8987652304bff969afb3969603149bb385efe861fe8John (J"This is normally a bug in some application using the D-Bus library.\n";
899c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#endif
900c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
9012f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington#ifndef DBUS_DISABLE_ASSERT
9022f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington/**
9032f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * Internals of _dbus_assert(); it's a function
9042f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * rather than a macro with the inline code so
9052f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * that the assertion failure blocks don't show up
9062f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * in test suite coverage, and to shrink code size.
9072f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington *
9082f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param condition TRUE if assertion succeeded
9092f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param condition_text condition as a string
9102f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param file file the assertion is in
9112f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param line line the assertion is in
912aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington * @param func function the assertion is in
9132f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington */
9142f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Penningtonvoid
9152f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington_dbus_real_assert (dbus_bool_t  condition,
9162f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                   const char  *condition_text,
9172f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                   const char  *file,
918aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington                   int          line,
919aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington                   const char  *func)
9202f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington{
92175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington  if (_DBUS_UNLIKELY (!condition))
9222f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington    {
923aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington      _dbus_warn ("%lu: assertion failed \"%s\" file \"%s\" line %d function %s\n",
92423832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington                  _dbus_pid_for_log (), condition_text, file, line, func);
9252f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington      _dbus_abort ();
9262f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington    }
9272f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington}
9282f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington
9292f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington/**
9302f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * Internals of _dbus_assert_not_reached(); it's a function
9312f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * rather than a macro with the inline code so
9322f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * that the assertion failure blocks don't show up
9332f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * in test suite coverage, and to shrink code size.
9342f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington *
9352f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param explanation what was reached that shouldn't have been
9362f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param file file the assertion is in
9372f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington * @param line line the assertion is in
9382f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington */
9392f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Penningtonvoid
9402f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington_dbus_real_assert_not_reached (const char *explanation,
9412f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                               const char *file,
9422f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                               int         line)
9432f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington{
94451781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_warn ("File \"%s\" line %d process %lu should not have been reached: %s\n",
94523832672266bb4ff23b66247c0cfa1a2ed0cc97bHavoc Pennington              file, line, _dbus_pid_for_log (), explanation);
9462f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington  _dbus_abort ();
9472f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington}
9482f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington#endif /* DBUS_DISABLE_ASSERT */
9492f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington
95018c470cd2c7245f33f5d924d23972e95e3d347a0Havoc Pennington#ifdef DBUS_BUILD_TESTS
951bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonstatic dbus_bool_t
952bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonrun_failing_each_malloc (int                    n_mallocs,
953bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         const char            *description,
954bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         DBusTestMemoryFunction func,
955bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         void                  *data)
956bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{
957bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  n_mallocs += 10; /* fudge factor to ensure reallocs etc. are covered */
958bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
959bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  while (n_mallocs >= 0)
960bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    {
961bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      _dbus_set_fail_alloc_counter (n_mallocs);
962bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
963bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      _dbus_verbose ("\n===\n%s: (will fail malloc %d with %d failures)\n===\n",
964bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                     description, n_mallocs,
965bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                     _dbus_get_fail_alloc_failures ());
966bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
967bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      if (!(* func) (data))
968bf99381351b802fb3348a24037898222aae631e2Havoc Pennington        return FALSE;
969bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
970bf99381351b802fb3348a24037898222aae631e2Havoc Pennington      n_mallocs -= 1;
971bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    }
972bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
973bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
974bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
975bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  return TRUE;
976bf99381351b802fb3348a24037898222aae631e2Havoc Pennington}
977bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
978bf99381351b802fb3348a24037898222aae631e2Havoc Pennington/**
979bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * Tests how well the given function responds to out-of-memory
980bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * situations. Calls the function repeatedly, failing a different
981bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * call to malloc() each time. If the function ever returns #FALSE,
982bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * the test fails. The function should return #TRUE whenever something
983bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * valid (such as returning an error, or succeeding) occurs, and #FALSE
984bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * if it gets confused in some way.
985bf99381351b802fb3348a24037898222aae631e2Havoc Pennington *
986bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * @param description description of the test used in verbose output
987bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * @param func function to call
988bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * @param data data to pass to function
989bf99381351b802fb3348a24037898222aae631e2Havoc Pennington * @returns #TRUE if the function never returns FALSE
990bf99381351b802fb3348a24037898222aae631e2Havoc Pennington */
991bf99381351b802fb3348a24037898222aae631e2Havoc Penningtondbus_bool_t
992bf99381351b802fb3348a24037898222aae631e2Havoc Pennington_dbus_test_oom_handling (const char             *description,
993bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         DBusTestMemoryFunction  func,
994bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                         void                   *data)
995bf99381351b802fb3348a24037898222aae631e2Havoc Pennington{
996bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  int approx_mallocs;
9979c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  const char *setting;
9989c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int max_failures_to_try;
9999c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  int i;
1000bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
1001bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  /* Run once to see about how many mallocs are involved */
1002bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
1003bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
1004bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
100551781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("Running once to count mallocs\n");
100651781f541094a4936d47119cd62682e0431c41e9Havoc Pennington
1007bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  if (!(* func) (data))
1008bf99381351b802fb3348a24037898222aae631e2Havoc Pennington    return FALSE;
1009bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington
1010bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  approx_mallocs = _DBUS_INT_MAX - _dbus_get_fail_alloc_counter ();
1011bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
101251781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("\n=================\n%s: about %d mallocs total\n=================\n",
1013bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                 description, approx_mallocs);
1014bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
1015a44d08711c64e7ae807d2b4f181cefa848e2aa32Will Thompson  setting = _dbus_getenv ("DBUS_TEST_MALLOC_FAILURES");
10169c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  if (setting != NULL)
10179c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
10189c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      DBusString str;
10199c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      long v;
10209c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      _dbus_string_init_const (&str, setting);
10219c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      v = 4;
10229c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (!_dbus_string_parse_int (&str, 0, &v, NULL))
10239c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        _dbus_warn ("couldn't parse '%s' as integer\n", setting);
10249c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      max_failures_to_try = v;
10259c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
10269c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  else
10279c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
10289c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      max_failures_to_try = 4;
10299c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
1030bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
10319c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  i = setting ? max_failures_to_try - 1 : 1;
10329c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington  while (i < max_failures_to_try)
10339c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    {
10349c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      _dbus_set_fail_alloc_failures (i);
10359c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      if (!run_failing_each_malloc (approx_mallocs, description, func, data))
10369c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington        return FALSE;
10379c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington      ++i;
10389c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington    }
1039bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
104051781f541094a4936d47119cd62682e0431c41e9Havoc Pennington  _dbus_verbose ("\n=================\n%s: all iterations passed\n=================\n",
1041bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                 description);
1042bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
1043bf99381351b802fb3348a24037898222aae631e2Havoc Pennington  return TRUE;
1044bf99381351b802fb3348a24037898222aae631e2Havoc Pennington}
104518c470cd2c7245f33f5d924d23972e95e3d347a0Havoc Pennington#endif /* DBUS_BUILD_TESTS */
1046bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
1047954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington/** @} */
1048