dbus-errors.c revision 2f38c959212d98e2194139daa9120fda37415b4f
1041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/* -*- mode: C; c-file-style: "gnu" -*- */ 2041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/* dbus-errors.c Error reporting 3041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 4041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Copyright (C) 2002 Red Hat Inc. 52a751e51a7be07d48e4f9a25e90cad5d12ae0a61Richard Hult * Copyright (C) 2003 CodeFactory AB 6041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 7041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Licensed under the Academic Free License version 1.2 8041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 9041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is free software; you can redistribute it and/or modify 10041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * it under the terms of the GNU General Public License as published by 11041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 12041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * (at your option) any later version. 13041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 14041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is distributed in the hope that it will be useful, 15041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 16041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * GNU General Public License for more details. 18041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 19041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * You should have received a copy of the GNU General Public License 20041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * along with this program; if not, write to the Free Software 21041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 23041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 24041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-errors.h" 25b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include "dbus-internals.h" 26b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include <stdarg.h> 27b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include <stdio.h> 28041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 29041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 30041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @defgroup DBusErrors Error reporting 31041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @ingroup DBus 32041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @brief Error reporting 33041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 34041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Types and functions related to reporting errors. 35041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 36041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 37041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * In essence D-BUS error reporting works as follows: 38041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 39041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @code 40041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * DBusResultCode result = DBUS_RESULT_SUCCESS; 41041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * dbus_some_function (arg1, arg2, &result); 42041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * if (result != DBUS_RESULT_SUCCESS) 43041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * printf ("an error occurred\n"); 44041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @endcode 45b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington * 46b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington * @todo add docs with DBusError 47b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington * 48b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington * @todo add dbus_error_is_set() to check 49b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington * whether an error is set. 50041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 51041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{ 52041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 53041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 54b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssontypedef struct 55b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 56b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name; /**< error name */ 57b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson char *message; /**< error message */ 58b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 59b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson unsigned int const_message : 1; /** Message is not owned by DBusError */ 60b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 61b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy2 : 1; /**< placeholder */ 62b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy3 : 1; /**< placeholder */ 63b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy4 : 1; /**< placeholder */ 64b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy5 : 1; /**< placeholder */ 65b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 66b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington void *padding1; /**< placeholder */ 67b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 68b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} DBusRealError; 69b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 70041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 71041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Set a result code at a result code location, 72041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * if code_address is not #NULL. 73041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 74041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param code_address place to store the result code. 75041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param code the result code itself. 76041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 77041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 78041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_set_result (DBusResultCode *code_address, 79041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBusResultCode code) 80041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 81041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (code_address) 82041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *code_address = code; 83041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 84041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 85041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 86041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Returns a string describing the given result code. 87041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 88041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param code the result code to describe. 89041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns a constant string describing the code. 90041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 91041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonconst char* 92041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_result_to_string (DBusResultCode code) 93041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 94041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington /* This is a switch to the compiler will complain if we 95041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * aren't handling some codes 96041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 97041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington switch (code) 98041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington { 99041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_SUCCESS: 100041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Success"; 101041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_FAILED: 102041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Unknown error"; 103041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_NO_MEMORY: 104041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Not enough memory available"; 105041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_IO_ERROR: 106041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Error reading or writing data"; 107041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_BAD_ADDRESS: 108041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Could not parse address"; 109041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_NOT_SUPPORTED: 110041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Feature not supported"; 111041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_LIMITS_EXCEEDED: 112041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Resource limits exceeded"; 113041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_ACCESS_DENIED: 114041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Permission denied"; 115041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_AUTH_FAILED: 116041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Could not authenticate to server"; 117041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_NO_SERVER: 118041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "No server"; 119041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_TIMEOUT: 120041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Connection timed out"; 121041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_NO_NETWORK: 122041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Network unavailable"; 123041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_ADDRESS_IN_USE: 124041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Address already in use"; 125041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_DISCONNECTED: 126041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Disconnected."; 127aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson case DBUS_RESULT_INVALID_ARGS: 128aa4b4ef5955606659557a40a2220090ee9c108d4Anders Carlsson return "Invalid argumemts."; 1294a85d321b4516c6a663e8bdd530ba59018c974dfAnders Carlsson case DBUS_RESULT_NO_REPLY: 1304a85d321b4516c6a663e8bdd530ba59018c974dfAnders Carlsson return "Did not get a reply message."; 1319a0b07f225be10c545a8b1de8555bca2dc3a9cabHavoc Pennington case DBUS_RESULT_FILE_NOT_FOUND: 1329a0b07f225be10c545a8b1de8555bca2dc3a9cabHavoc Pennington return "File doesn't exist."; 133041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 134041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington /* no default, it would break our compiler warnings */ 135041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington } 136041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 137041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Invalid error code"; 138041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 139041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 140a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 141a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Initializes a DBusError structure. 142b822fb3913e175ff7c139e064453d5d97e758db0Havoc Pennington * 143b822fb3913e175ff7c139e064453d5d97e758db0Havoc Pennington * @todo calling dbus_error_init() in here is no good, 144b822fb3913e175ff7c139e064453d5d97e758db0Havoc Pennington * for the same reason a GError* has to be set to NULL 145b822fb3913e175ff7c139e064453d5d97e758db0Havoc Pennington * before you pass it in. 146a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 147a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the DBusError. 148a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 149b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 150b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_init (DBusError *error) 151b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 152b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 153b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 154b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson _dbus_assert (error != NULL); 155b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 156b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError)); 157b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 158b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 159b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 160b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->name = NULL; 161b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = NULL; 162b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 163b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = TRUE; 164b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 165b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 166a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 167a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Frees an error created by dbus_error_init(). 168a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 169a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error memory where the error is stored. 170a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 171b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 172b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_free (DBusError *error) 173b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 174b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 175b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 176b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 177b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 178b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (!real->const_message) 179b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson dbus_free (real->message); 180b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 181b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 182a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 183a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Assigns an error name and message to a DBusError. 184a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Does nothing if error is #NULL. 185a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 186a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the error. 187a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param name the error name (not copied!!!) 188a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param message the error message (not copied!!!) 189a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 190b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 191b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error_const (DBusError *error, 192b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name, 193b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *message) 194b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 195b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 196b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 197b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (error == NULL) 198b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson return; 1992f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington 2002f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington /* it's a bug to pile up errors */ 2012f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->name == NULL); 2022f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->message == NULL); 203b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 204b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 205b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 206b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->name = name; 207b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = (char *)message; 208b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = TRUE; 209b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 210b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 211a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 212a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Assigns an error name and message to a DBusError. 213a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Does nothing if error is #NULL. 214a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 2152aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * If no memory can be allocated for the error message, 2162aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * an out-of-memory error message will be set instead. 2176b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington * 2186b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington * @todo stdio.h shouldn't be included in this file, 2196b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington * should write _dbus_string_append_printf instead 2202aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * 221a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the error. 222a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param name the error name (not copied!!!) 223a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param format printf-style format string. 224a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 2252aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlssonvoid 226b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error (DBusError *error, 227b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name, 228b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *format, 229b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson ...) 230b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 231b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 2322f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington va_list args; 233b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson int message_length; 234b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson char *message; 235b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson char c; 236b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 237b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (error == NULL) 2382aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson return; 2392f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington 2402f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington /* it's a bug to pile up errors */ 2412f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->name == NULL); 2422f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->message == NULL); 243b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 244b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson va_start (args, format); 245b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson /* Measure the message length */ 2466b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington message_length = vsnprintf (&c, 1, format, args) + 1; 2473c8db267892bbce5c82d5060cef993dd54dc6ed4Anders Carlsson va_end (args); 2483c8db267892bbce5c82d5060cef993dd54dc6ed4Anders Carlsson 2496b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington message = dbus_malloc (message_length); 250b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 251b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (!message) 2522aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson { 2532aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson dbus_set_error_const (error, DBUS_ERROR_NO_MEMORY, 2542aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson "Failed to allocate memory for error message."); 2552aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson return; 2562aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson } 2572aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson 2586b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington va_start (args, format); 2592f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington vsprintf (message, format, args); 260b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson va_end (args); 261b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 262b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 263b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 264b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->name = name; 265b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = message; 266b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = FALSE; 267b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 268b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 269041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** @} */ 270