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