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