1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 2041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/* dbus-errors.c Error reporting 3041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 4961e6ca41c1e9433055130569ce3492866e2126bHavoc Pennington * Copyright (C) 2002, 2004 Red Hat Inc. 52a751e51a7be07d48e4f9a25e90cad5d12ae0a61Richard Hult * Copyright (C) 2003 CodeFactory AB 6041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 743605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 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 21dc33f4f7749ed303374ebdf00e48ea8a471afd25Tobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 23041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann 25dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h> 26041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-errors.h" 27b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include "dbus-internals.h" 281d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington#include "dbus-string.h" 29961e6ca41c1e9433055130569ce3492866e2126bHavoc Pennington#include "dbus-protocol.h" 30b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include <stdarg.h> 31ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington#include <string.h> 32041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 33041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrorInternals Error reporting internals 3585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup DBusInternals 3685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting internals 37041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{ 38041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 39262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie 40262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie/** 41a18ebe81bdcfcc95d721e70529d6791fc16d2483Simon McVittie * @def DBUS_ERROR_INIT 42262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 43262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * Expands to a suitable initializer for a DBusError on the stack. 44262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * Declaring a DBusError with: 45262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 46262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @code 47a18ebe81bdcfcc95d721e70529d6791fc16d2483Simon McVittie * DBusError error = DBUS_ERROR_INIT; 48262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 49262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * do_things_with (&error); 50262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @endcode 51262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 52262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * is a more concise form of: 53262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 54262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @code 55262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * DBusError error; 56262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 57262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * dbus_error_init (&error); 58262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * do_things_with (&error); 59262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @endcode 60262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie */ 61262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie 6285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** 6385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Internals of DBusError 6485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */ 65b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssontypedef struct 66b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 67222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J char *name; /**< error name */ 68b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson char *message; /**< error message */ 69b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 7085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington unsigned int const_message : 1; /**< Message is not owned by DBusError */ 71b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 72b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy2 : 1; /**< placeholder */ 73b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy3 : 1; /**< placeholder */ 74b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy4 : 1; /**< placeholder */ 75b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy5 : 1; /**< placeholder */ 76b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 77b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington void *padding1; /**< placeholder */ 78b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 79b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} DBusRealError; 80b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 81041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 82ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * Returns a longer message describing an error name. 83ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * If the error name is unknown, returns the name 84ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * itself. 85041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 86ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @param error the error to describe 87ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @returns a constant string describing the error. 88041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 89ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonstatic const char* 90ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonmessage_from_error (const char *error) 91041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 92ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington if (strcmp (error, DBUS_ERROR_FAILED) == 0) 93ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Unknown error"; 94ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NO_MEMORY) == 0) 95ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Not enough memory available"; 96ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_IO_ERROR) == 0) 97ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Error reading or writing data"; 98ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_BAD_ADDRESS) == 0) 99ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Could not parse address"; 100ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NOT_SUPPORTED) == 0) 101ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Feature not supported"; 102ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_LIMITS_EXCEEDED) == 0) 103ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Resource limits exceeded"; 104ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_ACCESS_DENIED) == 0) 105ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Permission denied"; 106ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_AUTH_FAILED) == 0) 107ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Could not authenticate to server"; 108ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NO_SERVER) == 0) 109e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington return "No server available at address"; 110ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_TIMEOUT) == 0) 111ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Connection timed out"; 112ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NO_NETWORK) == 0) 113ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Network unavailable"; 114ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_ADDRESS_IN_USE) == 0) 115ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Address already in use"; 116ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0) 117ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Disconnected."; 118ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0) 119d86fc4071ccb8590d922e3456c5c80c0f7bb9d6fKristian Høgsberg return "Invalid arguments."; 120ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0) 121ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Did not get a reply message."; 122ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0) 123ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "File doesn't exist."; 124d7fbcb5e025b3c718dd1fd332b8759ae26c0d8dcSimon McVittie else if (strcmp (error, DBUS_ERROR_OBJECT_PATH_IN_USE) == 0) 125d7fbcb5e025b3c718dd1fd332b8759ae26c0d8dcSimon McVittie return "Object path already in use"; 126ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else 127ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return error; 128041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 129041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 13085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End of internals */ 13185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington 13285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** 13385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrors Error reporting 13485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup DBus 13585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting 13685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 13785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Types and functions related to reporting errors. 13885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 13985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 1407652304bff969afb3969603149bb385efe861fe8John (J * In essence D-Bus error reporting works as follows: 14185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 14285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @code 14385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * DBusError error; 14485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_init (&error); 14585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_some_function (arg1, arg2, &error); 14685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if (dbus_error_is_set (&error)) 14785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * { 14885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * fprintf (stderr, "an error occurred: %s\n", error.message); 14985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_free (&error); 15085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * } 15185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @endcode 15285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 153afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * By convention, all functions allow #NULL instead of a DBusError*, 154afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * so callers who don't care about the error can ignore it. 155afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1567652304bff969afb3969603149bb385efe861fe8John (J * There are some rules. An error passed to a D-Bus function must 15785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * always be unset; you can't pass in an error that's already set. If 15885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * a function has a return code indicating whether an error occurred, 15985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * and also a #DBusError parameter, then the error will always be set 16085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if and only if the return code indicates an error occurred. i.e. 16185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * the return code and the error are never going to disagree. 16285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 16385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * An error only needs to be freed if it's been set, not if 16485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * it's merely been initialized. 16585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 16685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * You can check the specific error that occurred using 16785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_has_name(). 16885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 169afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Errors will not be set for programming errors, such as passing 170afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * invalid arguments to the libdbus API. Instead, libdbus will print 171afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * warnings, exit on a failed assertion, or even crash in those cases 172afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * (in other words, incorrect use of the API results in undefined 173afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * behavior, possibly accompanied by helpful debugging output if 174afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * you're lucky). 175afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 17685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @{ 17785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */ 17885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington 179a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 180afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Initializes a DBusError structure. Does not allocate any memory; 181afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the error only needs to be freed if it is set at some point. 182a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 183a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the DBusError. 184a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 185b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 186b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_init (DBusError *error) 187b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 188b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 189b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 190c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_fail (error != NULL); 191b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 192b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError)); 193b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 194b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 195b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 196b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->name = NULL; 197b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = NULL; 198b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 199b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = TRUE; 200b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 201b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 202a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 20329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Frees an error that's been set (or just initialized), 20429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then reinitializes the error as in dbus_error_init(). 205a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 206a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error memory where the error is stored. 207a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 208b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 209b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_free (DBusError *error) 210b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 211b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 212b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 213c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_fail (error != NULL); 214c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 215b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 216b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 217b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (!real->const_message) 218f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington { 219f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington dbus_free (real->name); 220f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington dbus_free (real->message); 221f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington } 22229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 22329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_init (error); 224b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 225b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 226a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 227e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * Assigns an error name and message to a DBusError. Does nothing if 228afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * error is #NULL. The message may be #NULL, which means a default 229afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * message will be deduced from the name. The default message will be 230afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * totally useless, though, so using a #NULL message is not recommended. 231a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 232afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Because this function does not copy the error name or message, you 233afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * must ensure the name and message are global data that won't be 234afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * freed. You probably want dbus_set_error() instead, in most cases. 235afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 236afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error the error.or #NULL 237a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param name the error name (not copied!!!) 238a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param message the error message (not copied!!!) 239a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 240b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 241b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error_const (DBusError *error, 242b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name, 243b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *message) 244b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 245b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 246b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 247c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_error_is_set (error); 248c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_fail (name != NULL); 249c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 250b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (error == NULL) 251b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson return; 2522f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington 2532f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->name == NULL); 2542f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->message == NULL); 255ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington 256ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington if (message == NULL) 257ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington message = message_from_error (name); 258b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 259b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 260b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 261222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J real->name = (char*) name; 262b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = (char *)message; 263b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = TRUE; 264b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 265b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 266a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Moves an error src into dest, freeing src and 26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * overwriting dest. Both src and dest must be initialized. 26929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * src is reinitialized to an empty error. dest may not 27029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * contain an existing error. If the destination is 27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * #NULL, just frees and reinits the source error. 272410a80c43126376e9308a03a7cef108716018f5aHavoc Pennington * 27329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param src the source error 27429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param dest the destination error or #NULL 27529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 27629560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_move_error (DBusError *src, 27829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *dest) 27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 280c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_error_is_set (dest); 28129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (dest) 28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 28429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_free (dest); 28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington *dest = *src; 28629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_init (src); 28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_free (src); 29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 29129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 29229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 2937e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether the error is set and has the given 2947e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * name. 2957e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error 2967e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param name the name 2977e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if the given named error occurred 2987e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */ 2997e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t 3007e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_has_name (const DBusError *error, 3017e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington const char *name) 3027e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{ 303c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (error != NULL, FALSE); 304c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (name != NULL, FALSE); 305c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 3067e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington _dbus_assert ((error->name != NULL && error->message != NULL) || 3077e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington (error->name == NULL && error->message == NULL)); 3087e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington 3097e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington if (error->name != NULL) 3107e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington { 3117e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington DBusString str1, str2; 3127e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington _dbus_string_init_const (&str1, error->name); 3137e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington _dbus_string_init_const (&str2, name); 3147e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington return _dbus_string_equal (&str1, &str2); 3157e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington } 3167e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington else 3177e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington return FALSE; 3187e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington} 3197e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington 3207e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/** 3217e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether an error occurred (the error is set). 3227e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * 3237e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error object 3247e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if an error occurred 3257e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */ 3267e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t 3277e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_is_set (const DBusError *error) 3287e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{ 329c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (error != NULL, FALSE); 3307e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington _dbus_assert ((error->name != NULL && error->message != NULL) || 3317e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington (error->name == NULL && error->message == NULL)); 3327e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington return error->name != NULL; 3337e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington} 3347e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington 3357e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/** 336a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Assigns an error name and message to a DBusError. 337a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Does nothing if error is #NULL. 338a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 339afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The format may be #NULL, which means a (pretty much useless) 340afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * default message will be deduced from the name. This is not a good 341afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * idea, just go ahead and provide a useful error message. It won't 342afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * hurt you. 343ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * 3442aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * If no memory can be allocated for the error message, 3452aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * an out-of-memory error message will be set instead. 3466b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington * 347afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error the error.or #NULL 348f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington * @param name the error name 349a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param format printf-style format string. 350a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 3512aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlssonvoid 352b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error (DBusError *error, 353b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name, 354b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *format, 355b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson ...) 356b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 357b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 3581d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington DBusString str; 3592f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington va_list args; 3601d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 361b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (error == NULL) 3622aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson return; 3632f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington 3642f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington /* it's a bug to pile up errors */ 365c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_error_is_set (error); 366c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_fail (name != NULL); 367c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 3682f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->name == NULL); 3692f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->message == NULL); 370ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington 3711d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (!_dbus_string_init (&str)) 3721d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington goto nomem; 3733c8db267892bbce5c82d5060cef993dd54dc6ed4Anders Carlsson 3741d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (format == NULL) 3752aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson { 3761d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (!_dbus_string_append (&str, 3771d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington message_from_error (name))) 3781d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington { 3791d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington _dbus_string_free (&str); 380922c6f3285c429af364a44cbc19950fff92bb62bKimmo Hämäläinen va_end (args); 3811d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington goto nomem; 3821d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington } 3831d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington } 3841d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington else 3851d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington { 3861d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington va_start (args, format); 3871d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (!_dbus_string_append_printf_valist (&str, format, args)) 3881d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington { 3891d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington _dbus_string_free (&str); 39097872bf72ff327855e2e86a4760348cd2ca03b9eJohn (J va_end (args); 3911d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington goto nomem; 3921d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington } 3931d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington va_end (args); 3942aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson } 395b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 396b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 3971d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 3981d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (!_dbus_string_steal_data (&str, &real->message)) 3991d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington { 4001d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington _dbus_string_free (&str); 4011d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington goto nomem; 4021d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington } 403f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington _dbus_string_free (&str); 404b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 405f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington real->name = _dbus_strdup (name); 406f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington if (real->name == NULL) 407f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington { 408f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington dbus_free (real->message); 409f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington real->message = NULL; 410f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington goto nomem; 411f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington } 412b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = FALSE; 4131d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 4141d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington return; 4151d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 4161d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington nomem: 417fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu _DBUS_SET_OOM (error); 418b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 419b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 42085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End public API */ 421