1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
27652304bff969afb3969603149bb385efe861fe8John (J/* dbus-internals.h  random utility stuff (internal to D-Bus implementation)
3954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington *
4e45e4382274149ca60c11f068ccca719f3598074Havoc 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 */
23041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#ifdef DBUS_INSIDE_DBUS_H
24041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#error "You can't include dbus-internals.h in the public header dbus.h"
25041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#endif
26954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
27954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#ifndef DBUS_INTERNALS_H
28954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#define DBUS_INTERNALS_H
29954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
30954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include <dbus/dbus-memory.h>
31954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#include <dbus/dbus-types.h>
32041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include <dbus/dbus-errors.h>
33d4b870e7f91b7018524f7b85dc00b90cc64453bfHavoc Pennington#include <dbus/dbus-sysdeps.h>
347ce7502e1ae23766ba40105327de787c2d1cef9dHavoc Pennington#include <dbus/dbus-threads-internal.h>
35954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
36a9ff341aa66588c12275529ee2d16843b493cb4fOlivier AndrieuDBUS_BEGIN_DECLS
37954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
382f48b5a5a19f171fc42ff91c1b259351640fcaccRalf Habacker#ifndef DBUS_SESSION_BUS_DEFAULT_ADDRESS
39f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira#define DBUS_SESSION_BUS_DEFAULT_ADDRESS	"autolaunch:"
402f48b5a5a19f171fc42ff91c1b259351640fcaccRalf Habacker#endif
41f6fa010403cb2badd88ce096ae91f664418508d1Thiago Macieira
42eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Penningtonvoid _dbus_warn               (const char *format,
43eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington                               ...) _DBUS_GNUC_PRINTF (1, 2);
446ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington
45f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Penningtonvoid _dbus_warn_check_failed  (const char *format,
46f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                               ...) _DBUS_GNUC_PRINTF (1, 2);
47f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
48f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington
49c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#if defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
50c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _DBUS_FUNCTION_NAME __func__
51b88d6bad1c5c0cd44c9c0a0c5a4f2ee7ba48d908Ralf Habacker#elif defined(__GNUC__) || defined(_MSC_VER)
52c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _DBUS_FUNCTION_NAME __FUNCTION__
53c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#else
54c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _DBUS_FUNCTION_NAME "unknown function"
55c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#endif
56c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
5775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington/*
5875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * (code from GLib)
5975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington *
6075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * The _DBUS_LIKELY and _DBUS_UNLIKELY macros let the programmer give hints to
6175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * the compiler about the expected result of an expression. Some compilers
6275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * can use this information for optimizations.
6375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington *
6475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * The _DBUS_BOOLEAN_EXPR macro is intended to trigger a gcc warning when
6575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington * putting assignments in the macro arg
6675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington */
6775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
6875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_BOOLEAN_EXPR(expr)                \
6975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington __extension__ ({                               \
7075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington   int _dbus_boolean_var_;                      \
7175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington   if (expr)                                    \
7275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      _dbus_boolean_var_ = 1;                   \
7375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington   else                                         \
7475742242000e782719bc1656f0a7da72b059e88eHavoc Pennington      _dbus_boolean_var_ = 0;                   \
7575742242000e782719bc1656f0a7da72b059e88eHavoc Pennington   _dbus_boolean_var_;                          \
7675742242000e782719bc1656f0a7da72b059e88eHavoc Pennington})
7775742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_LIKELY(expr) (__builtin_expect (_DBUS_BOOLEAN_EXPR(expr), 1))
7875742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_UNLIKELY(expr) (__builtin_expect (_DBUS_BOOLEAN_EXPR(expr), 0))
7975742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#else
8075742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_LIKELY(expr) (expr)
8175742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#define _DBUS_UNLIKELY(expr) (expr)
8275742242000e782719bc1656f0a7da72b059e88eHavoc Pennington#endif
8375742242000e782719bc1656f0a7da72b059e88eHavoc Pennington
846ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#ifdef DBUS_ENABLE_VERBOSE_MODE
857bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
867f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker/*
877f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker at least gnu cc and msvc compiler are known to
887f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker have support for variable macro argument lists
897f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker add other compilers is required
907f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker*/
917f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#if defined(__GNUC__) || defined(_MSC_VER)
927f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#define DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS
937f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#endif
947f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker
957f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#ifdef DBUS_CPP_SUPPORTS_VARIABLE_MACRO_ARGUMENTS
967f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habackervoid _dbus_verbose_real       (const char *file, const int line, const char *function,
977f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker                               const char *format,...) _DBUS_GNUC_PRINTF (4, 5);
987f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#  define _dbus_verbose(fmt,...) _dbus_verbose_real( __FILE__,__LINE__,__FUNCTION__,fmt, ## __VA_ARGS__)
997f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#else
1007bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonvoid _dbus_verbose_real       (const char *format,
1017bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington                               ...) _DBUS_GNUC_PRINTF (1, 2);
1027f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#  define _dbus_verbose _dbus_verbose_real
1037f3e29ffdfdbe4cd7c6c76ef066a516e675dee26Ralf Habacker#endif
1047bf62e31a3c820852271768fafc04ba95c31a19fHavoc Penningtonvoid _dbus_verbose_reset_real (void);
10505d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (Jdbus_bool_t _dbus_is_verbose_real (void);
1067bf62e31a3c820852271768fafc04ba95c31a19fHavoc Pennington
107eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington#  define _dbus_verbose_reset _dbus_verbose_reset_real
10805d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J#  define _dbus_is_verbose _dbus_is_verbose_real
1096ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#else
1106ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#  ifdef HAVE_ISO_VARARGS
1116ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#    define _dbus_verbose(...)
1126ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#  elif defined (HAVE_GNUC_VARARGS)
1136ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#    define _dbus_verbose(format...)
1146ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#  else
11579aafc193176253454dd455a4cfc45a1a2e36c00John (Jstatic void _dbus_verbose(const char * x,...) {;}
1166ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#  endif
117eb63ba5039c8afe61210cf2b217ec75b4a86356eHavoc Pennington#  define _dbus_verbose_reset()
11805d90f4f20c1fbbb6c532b5f62531c97ced7d63eJohn (J#  define _dbus_is_verbose() FALSE
1196ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#endif /* !DBUS_ENABLE_VERBOSE_MODE */
120041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
121041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonconst char* _dbus_strerror (int error_number);
122041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
1236ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#ifdef DBUS_DISABLE_ASSERT
1246ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#define _dbus_assert(condition)
1256ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#else
1262f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Penningtonvoid _dbus_real_assert (dbus_bool_t  condition,
1272f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                        const char  *condition_text,
1282f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                        const char  *file,
129aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington                        int          line,
130aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington                        const char  *func);
131954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#define _dbus_assert(condition)                                         \
132aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington  _dbus_real_assert ((condition) != 0, #condition, __FILE__, __LINE__, _DBUS_FUNCTION_NAME)
1336ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#endif /* !DBUS_DISABLE_ASSERT */
134954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
1356ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#ifdef DBUS_DISABLE_ASSERT
1366ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#define _dbus_assert_not_reached(explanation)
1376ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#else
1382f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Penningtonvoid _dbus_real_assert_not_reached (const char *explanation,
1392f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington                                    const char *file,
140bc983ecf15455f49e7a92d038c93e181ae2cb438Havoc Pennington                                    int         line) _DBUS_GNUC_NORETURN;
141954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#define _dbus_assert_not_reached(explanation)                                   \
1422f3fbd451d2bed1737052c672974e3dc31ad015fHavoc Pennington  _dbus_real_assert_not_reached (explanation, __FILE__, __LINE__)
1436ac750b03fb32591769d0a6ece8840932622feadHavoc Pennington#endif /* !DBUS_DISABLE_ASSERT */
144954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
145c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#ifdef DBUS_DISABLE_CHECKS
146c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _dbus_return_if_fail(condition)
147c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _dbus_return_val_if_fail(condition, val)
148c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#else
149fdcd044555dc51cd52e8e3e8626acd45489d4eb6Romain Pokrzywka
150e183399391bb1740c2013b44b89c05cbad3796eaRalf Habackerextern const char *_dbus_return_if_fail_warning_format;
151c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
152f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington#define _dbus_return_if_fail(condition) do {                                       \
153f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington   _dbus_assert ((*(const char*)_DBUS_FUNCTION_NAME) != '_');                      \
154f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington  if (!(condition)) {                                                              \
155f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    _dbus_warn_check_failed (_dbus_return_if_fail_warning_format,                  \
156f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                             _DBUS_FUNCTION_NAME, #condition, __FILE__, __LINE__); \
157f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    return;                                                                        \
158c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  } } while (0)
159c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
160d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington#define _dbus_return_val_if_fail(condition, val) do {                                   \
161aad6fa897f85486386b030847151cb09943c97c0Havoc Pennington   _dbus_assert ((*(const char*)_DBUS_FUNCTION_NAME) != '_');                           \
162d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington  if (!(condition)) {                                                                   \
163f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington    _dbus_warn_check_failed (_dbus_return_if_fail_warning_format,                       \
164f1ca9b89e92de4d876dc5e7e85710c4d2dc87638Havoc Pennington                             _DBUS_FUNCTION_NAME, #condition, __FILE__, __LINE__);      \
165d6e1b2adb3d8e51ce1bb47295cef12d9fe1a15a8Havoc Pennington    return (val);                                                                       \
166c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington  } } while (0)
167c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
168c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#endif /* !DBUS_DISABLE_ASSERT */
169c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
170d4b870e7f91b7018524f7b85dc00b90cc64453bfHavoc Pennington#define _DBUS_N_ELEMENTS(array) ((int) (sizeof ((array)) / sizeof ((array)[0])))
171954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
172c096c5cb9ac636626e158ed327b3d9279c4de347Fridrich Å trba#define _DBUS_POINTER_TO_INT(pointer) ((intptr_t)(pointer))
173c096c5cb9ac636626e158ed327b3d9279c4de347Fridrich Å trba#define _DBUS_INT_TO_POINTER(integer) ((void*)((intptr_t)(integer)))
174954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
175041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#define _DBUS_ZERO(object) (memset (&(object), '\0', sizeof ((object))))
176041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
177c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#define _DBUS_STRUCT_OFFSET(struct_type, member)	\
178c096c5cb9ac636626e158ed327b3d9279c4de347Fridrich Å trba    ((intptr_t) ((unsigned char*) &((struct_type*) 0)->member))
179c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington
180d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#ifdef DBUS_DISABLE_CHECKS
181d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/* this is an assert and not an error, but in the typical --disable-checks case (you're trying
182d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * to really minimize code size), disabling these assertions makes sense.
183d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
184d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#define _DBUS_ASSERT_ERROR_IS_SET(error)
185d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#define _DBUS_ASSERT_ERROR_IS_CLEAR(error)
1860d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu#define _DBUS_ASSERT_ERROR_CONTENT_IS_SET(error)
1870d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu#define _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR(error)
188d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#else
189ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington#define _DBUS_ASSERT_ERROR_IS_SET(error)   _dbus_assert ((error) == NULL || dbus_error_is_set ((error)))
190ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington#define _DBUS_ASSERT_ERROR_IS_CLEAR(error) _dbus_assert ((error) == NULL || !dbus_error_is_set ((error)))
1910d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu#define _DBUS_ASSERT_ERROR_CONTENT_IS_SET(error)   _dbus_assert (dbus_error_is_set ((error)))
1920d2584b4a1bed3ccb3c83682abb453d3ff2b68a4Jing Yu#define _DBUS_ASSERT_ERROR_CONTENT_IS_CLEAR(error) _dbus_assert (!dbus_error_is_set ((error)))
193d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#endif
19429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
195c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _dbus_return_if_error_is_set(error) _dbus_return_if_fail ((error) == NULL || !dbus_error_is_set ((error)))
196c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington#define _dbus_return_val_if_error_is_set(error, val) _dbus_return_val_if_fail ((error) == NULL || !dbus_error_is_set ((error)), (val))
197c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington
1981b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/* This alignment thing is from ORBit2 */
1991b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/* Align a value upward to a boundary, expressed as a number of bytes.
2001b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson * E.g. align to an 8-byte boundary with argument of 8.
2011b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */
2021b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson
2031b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson/*
2041b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson *   (this + boundary - 1)
2051b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson *          &
2061b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson *    ~(boundary - 1)
2071b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson */
2081b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson
2091b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson#define _DBUS_ALIGN_VALUE(this, boundary) \
210c096c5cb9ac636626e158ed327b3d9279c4de347Fridrich Å trba  (( ((uintptr_t)(this)) + (((uintptr_t)(boundary)) -1)) & (~(((uintptr_t)(boundary))-1)))
2111b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson
2121b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson#define _DBUS_ALIGN_ADDRESS(this, boundary) \
2131b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson  ((void*)_DBUS_ALIGN_VALUE(this, boundary))
2141b53cbcce333381754b0568b740ece550a8f6ac9Anders Carlsson
2159c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington
21644ed933284589134603913b05f55ca55e8c5a566Havoc Penningtonchar*       _dbus_strdup                (const char  *str);
217cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Penningtonvoid*       _dbus_memdup                (const void  *mem,
218cefb84edc5f84011c5a171e5d052e37c56c55d27Havoc Pennington                                         size_t       n_bytes);
21944ed933284589134603913b05f55ca55e8c5a566Havoc Penningtondbus_bool_t _dbus_string_array_contains (const char **array,
22044ed933284589134603913b05f55ca55e8c5a566Havoc Pennington                                         const char  *str);
22144ed933284589134603913b05f55ca55e8c5a566Havoc Penningtonchar**      _dbus_dup_string_array      (const char **array);
22244ed933284589134603913b05f55ca55e8c5a566Havoc Pennington
2233ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT16_MIN	 ((dbus_int16_t) 0x8000)
2243ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT16_MAX	 ((dbus_int16_t) 0x7fff)
2253ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_UINT16_MAX ((dbus_uint16_t)0xffff)
2263ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT32_MIN	 ((dbus_int32_t) 0x80000000)
2273ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT32_MAX	 ((dbus_int32_t) 0x7fffffff)
2283ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_UINT32_MAX ((dbus_uint32_t)0xffffffff)
2293ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington/* using 32-bit here is sort of bogus */
2303ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT_MIN	 _DBUS_INT32_MIN
2313ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT_MAX	 _DBUS_INT32_MAX
2323ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_UINT_MAX	 _DBUS_UINT32_MAX
233b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington#ifdef DBUS_HAVE_INT64
2343ed9db546e1143bc9aa2d83a6f423fdd81227352Havoc Pennington#define _DBUS_INT64_MAX	 DBUS_INT64_CONSTANT  (0x7fffffffffffffff)
235b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington#define _DBUS_UINT64_MAX DBUS_UINT64_CONSTANT (0xffffffffffffffff)
236b29d0c534a631b211f1f94168e7672c604c8f815Havoc Pennington#endif
237ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington#define _DBUS_ONE_KILOBYTE 1024
238ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington#define _DBUS_ONE_MEGABYTE 1024 * _DBUS_ONE_KILOBYTE
2397265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington#define _DBUS_ONE_HOUR_IN_MILLISECONDS (1000 * 60 * 60)
2407265423411609c14ddb9e6643463b840afcaa09bHavoc Pennington#define _DBUS_USEC_PER_SECOND          (1000000)
241041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
242c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#undef	MAX
243c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
244c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington
245c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#undef	MIN
246c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
247c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington
248c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#undef	ABS
249c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington#define ABS(a)	   (((a) < 0) ? -(a) : (a))
250c92339de11a2f27198aee3b4242aa6fccc12a004Havoc Pennington
251f3228b477df95ba247c90cc54189ce6d62059251Havoc Pennington#define _DBUS_ISASCII(c) ((c) != '\0' && (((c) & ~0x7f) == 0))
252f3228b477df95ba247c90cc54189ce6d62059251Havoc Pennington
253041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtontypedef void (* DBusForeachFunction) (void *element,
254041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington                                      void *data);
255041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington
256041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_bool_t _dbus_set_fd_nonblocking (int             fd,
257ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington                                      DBusError      *error);
258576cdb6e0b1274e9fa5276e01337aef330dd4e8cHavoc Pennington
259b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Penningtonvoid _dbus_verbose_bytes           (const unsigned char *data,
2609c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                    int                  len,
2619c3d566e95c9080f6040c64531b0ccae22bd5d74Havoc Pennington                                    int                  offset);
262b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Penningtonvoid _dbus_verbose_bytes_of_string (const DBusString    *str,
263b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Pennington                                    int                  start,
264b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Pennington                                    int                  len);
265b3ef8b0e9bd2719d502c7f2e0cf829e151386162Havoc Pennington
266daf8d6579e1ae0ea748810b63180bd5eea2ab9c4Mark McLoughlinconst char* _dbus_header_field_to_string (int header_field);
267ff5283ab92c668453fd2f28c1715a1e0e9b949f5Havoc Pennington
268e183399391bb1740c2013b44b89c05cbad3796eaRalf Habackerextern const char *_dbus_no_memory_message;
269fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu#define _DBUS_SET_OOM(error) dbus_set_error_const ((error), DBUS_ERROR_NO_MEMORY, _dbus_no_memory_message)
27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington
27107a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#ifdef DBUS_BUILD_TESTS
27207a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington/* Memory debugging */
273c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonvoid        _dbus_set_fail_alloc_counter        (int  until_next_fail);
274c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonint         _dbus_get_fail_alloc_counter        (void);
275bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonvoid        _dbus_set_fail_alloc_failures       (int  failures_per_failure);
276bf99381351b802fb3348a24037898222aae631e2Havoc Penningtonint         _dbus_get_fail_alloc_failures       (void);
277c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtondbus_bool_t _dbus_decrement_fail_alloc_counter  (void);
278c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtondbus_bool_t _dbus_disable_mem_pools             (void);
279c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonint         _dbus_get_malloc_blocks_outstanding (void);
280bf99381351b802fb3348a24037898222aae631e2Havoc Pennington
281bf99381351b802fb3348a24037898222aae631e2Havoc Penningtontypedef dbus_bool_t (* DBusTestMemoryFunction)  (void *data);
282bf99381351b802fb3348a24037898222aae631e2Havoc Penningtondbus_bool_t _dbus_test_oom_handling (const char             *description,
283bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                                     DBusTestMemoryFunction  func,
284bf99381351b802fb3348a24037898222aae631e2Havoc Pennington                                     void                   *data);
28507a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#else
28607a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#define _dbus_set_fail_alloc_counter(n)
28707a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#define _dbus_get_fail_alloc_counter _DBUS_INT_MAX
288ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
289ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington/* These are constant expressions so that blocks
290ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington * they protect should be optimized away
291ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington */
292c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _dbus_decrement_fail_alloc_counter() (FALSE)
293c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _dbus_disable_mem_pools()            (FALSE)
294c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _dbus_get_malloc_blocks_outstanding  (0)
29507a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#endif /* !DBUS_BUILD_TESTS */
29607a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington
297c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtontypedef void (* DBusShutdownFunction) (void *data);
298c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtondbus_bool_t _dbus_register_shutdown_func (DBusShutdownFunction  function,
299c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington                                          void                 *data);
300c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
301c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Penningtonextern int _dbus_current_generation;
302c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
303c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington/* Thread initializers */
304c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _DBUS_LOCK_NAME(name)           _dbus_lock_##name
305c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _DBUS_DECLARE_GLOBAL_LOCK(name) extern DBusMutex  *_dbus_lock_##name
306c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington#define _DBUS_DEFINE_GLOBAL_LOCK(name)  DBusMutex         *_dbus_lock_##name
307cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington#define _DBUS_LOCK(name)                _dbus_mutex_lock   (_dbus_lock_##name)
308cc73b3da32ff6d4bebe9013b812f2845ad282cf7Havoc Pennington#define _DBUS_UNLOCK(name)              _dbus_mutex_unlock (_dbus_lock_##name)
309c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington
310eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington/* 1-5 */
311c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (list);
312c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (connection_slots);
313583994cb3b7f5562fb7b8c37b4cb0d5af78e4ce2Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (pending_call_slots);
314c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (server_slots);
315958805418359aca169cd363a4a3279f0fdab753cHavoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (message_slots);
316eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington/* 5-10 */
317c3af5ccdbc22e8990d04ec2f89ad1f2e053655e9Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (bus);
318eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (bus_datas);
319bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (shutdown_funcs);
32088cd5da3c0ec86fed29942b062c2f7bf0f8fda44Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (system_users);
321a58180de0e720f7fca46a5af69a7b27b5e102a1dHavoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (message_cache);
3229293e823767daee79386cc797510808f4eed01a3Lennart Poettering/* 10-14 */
323ee27481d7b7d6d9a4f41b7d641a2618dedf676ddHavoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (shared_connections);
3247cd52919443f190fa1601a3d1bac5c8ce8d9ecc1John (J_DBUS_DECLARE_GLOBAL_LOCK (win_fds);
3257cd52919443f190fa1601a3d1bac5c8ce8d9ecc1John (J_DBUS_DECLARE_GLOBAL_LOCK (sid_atom_cache);
326d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington_DBUS_DECLARE_GLOBAL_LOCK (machine_uuid);
3279293e823767daee79386cc797510808f4eed01a3Lennart Poettering
3289293e823767daee79386cc797510808f4eed01a3Lennart Poettering#if !DBUS_USE_SYNC
3299293e823767daee79386cc797510808f4eed01a3Lennart Poettering_DBUS_DECLARE_GLOBAL_LOCK (atomic);
330eaefe03a8891b84e3f9e1f99f9098d65567e3092Havoc Pennington#define _DBUS_N_GLOBAL_LOCKS (15)
3319293e823767daee79386cc797510808f4eed01a3Lennart Poettering#else
3329293e823767daee79386cc797510808f4eed01a3Lennart Poettering#define _DBUS_N_GLOBAL_LOCKS (14)
3339293e823767daee79386cc797510808f4eed01a3Lennart Poettering#endif
334c21511c01ab56d75f3aa4643761e9fd096a7f8beHavoc Pennington
335bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Penningtondbus_bool_t _dbus_threads_init_debug (void);
336bc8b061eec0fd9de6552a9e6118c40283863b6dcHavoc Pennington
337aa4f823781185fb18187714798795d7e4b0c9b65Havoc Penningtondbus_bool_t   _dbus_address_append_escaped (DBusString       *escaped,
338aa4f823781185fb18187714798795d7e4b0c9b65Havoc Pennington                                            const DBusString *unescaped);
339aa4f823781185fb18187714798795d7e4b0c9b65Havoc Pennington
340fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Penningtonvoid          _dbus_set_bad_address        (DBusError         *error,
341fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                                            const char        *address_problem_type,
342fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                                            const char        *address_problem_field,
343fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington                                            const char        *address_problem_other);
344fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington
345d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington#define DBUS_UUID_LENGTH_BYTES 16
346dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington#define DBUS_UUID_LENGTH_WORDS (DBUS_UUID_LENGTH_BYTES / 4)
347dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington#define DBUS_UUID_LENGTH_HEX   (DBUS_UUID_LENGTH_BYTES * 2)
348d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
349d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington/**
350d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * A globally unique ID ; we have one for each DBusServer, and also one for each
351d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington * machine with libdbus installed on it.
352d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington */
353d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonunion DBusGUID
354d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington{
355dbc061b8123799e9352ab069b4dc1b5ea394587dHavoc Pennington  dbus_uint32_t as_uint32s[DBUS_UUID_LENGTH_WORDS];     /**< guid as four uint32 values */
35615ef0ef6fbba7827453b7973e62b6c1853576601Havoc Pennington  char as_bytes[DBUS_UUID_LENGTH_BYTES];                /**< guid as 16 single-byte values */
357d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington};
358d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
359d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtonvoid        _dbus_generate_uuid  (DBusGUID         *uuid);
360d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t _dbus_uuid_encode    (const DBusGUID   *uuid,
361d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                  DBusString       *encoded);
362d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t _dbus_read_uuid_file (const DBusString *filename,
363d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                  DBusGUID         *uuid,
364d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                  dbus_bool_t       create_if_not_found,
365d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington                                  DBusError        *error);
366d8155bf51bf6484a94e734601526bf211053a5e1Havoc Pennington
367d8155bf51bf6484a94e734601526bf211053a5e1Havoc Penningtondbus_bool_t _dbus_get_local_machine_uuid_encoded (DBusString *uuid_str);
368fe4715b656237b89767b5dc0cba4c107541b6e0dHavoc Pennington
369a9ff341aa66588c12275529ee2d16843b493cb4fOlivier AndrieuDBUS_END_DECLS
370954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington
371954c4c7550879bd80315811b8548adfcb415766eHavoc Pennington#endif /* DBUS_INTERNALS_H */
372