dbus-errors.c revision dc33f4f7749ed303374ebdf00e48ea8a471afd25
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 */ 24041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-errors.h" 25b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include "dbus-internals.h" 261d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington#include "dbus-string.h" 27961e6ca41c1e9433055130569ce3492866e2126bHavoc Pennington#include "dbus-protocol.h" 28b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include <stdarg.h> 29ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington#include <string.h> 30041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 31041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 3285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrorInternals Error reporting internals 3385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup DBusInternals 3485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting internals 35041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{ 36041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 37262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie 38262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie/** 39a18ebe81bdcfcc95d721e70529d6791fc16d2483Simon McVittie * @def DBUS_ERROR_INIT 40262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 41262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * Expands to a suitable initializer for a DBusError on the stack. 42262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * Declaring a DBusError with: 43262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 44262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @code 45a18ebe81bdcfcc95d721e70529d6791fc16d2483Simon McVittie * DBusError error = DBUS_ERROR_INIT; 46262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 47262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * do_things_with (&error); 48262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @endcode 49262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 50262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * is a more concise form of: 51262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 52262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @code 53262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * DBusError error; 54262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * 55262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * dbus_error_init (&error); 56262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * do_things_with (&error); 57262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie * @endcode 58262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie */ 59262c02a9facebc8592fa60406d8971b1837725f5Simon McVittie 6085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** 6185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Internals of DBusError 6285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */ 63b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssontypedef struct 64b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 65222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J char *name; /**< error name */ 66b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson char *message; /**< error message */ 67b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 6885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington unsigned int const_message : 1; /**< Message is not owned by DBusError */ 69b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 70b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy2 : 1; /**< placeholder */ 71b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy3 : 1; /**< placeholder */ 72b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy4 : 1; /**< placeholder */ 73b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington unsigned int dummy5 : 1; /**< placeholder */ 74b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 75b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington void *padding1; /**< placeholder */ 76b544e59358251f0811c9fe35c149a67d5deafdbaHavoc Pennington 77b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} DBusRealError; 78b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 79041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 80ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * Returns a longer message describing an error name. 81ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * If the error name is unknown, returns the name 82ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * itself. 83041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 84ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @param error the error to describe 85ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * @returns a constant string describing the error. 86041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 87ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonstatic const char* 88ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Penningtonmessage_from_error (const char *error) 89041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 90ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington if (strcmp (error, DBUS_ERROR_FAILED) == 0) 91ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Unknown error"; 92ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NO_MEMORY) == 0) 93ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Not enough memory available"; 94ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_IO_ERROR) == 0) 95ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Error reading or writing data"; 96ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_BAD_ADDRESS) == 0) 97ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Could not parse address"; 98ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NOT_SUPPORTED) == 0) 99ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Feature not supported"; 100ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_LIMITS_EXCEEDED) == 0) 101ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Resource limits exceeded"; 102ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_ACCESS_DENIED) == 0) 103ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Permission denied"; 104ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_AUTH_FAILED) == 0) 105ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Could not authenticate to server"; 106ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NO_SERVER) == 0) 107e45e4382274149ca60c11f068ccca719f3598074Havoc Pennington return "No server available at address"; 108ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_TIMEOUT) == 0) 109ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Connection timed out"; 110ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NO_NETWORK) == 0) 111ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Network unavailable"; 112ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_ADDRESS_IN_USE) == 0) 113ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Address already in use"; 114ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0) 115ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Disconnected."; 116ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0) 117d86fc4071ccb8590d922e3456c5c80c0f7bb9d6fKristian Høgsberg return "Invalid arguments."; 118ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0) 119ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "Did not get a reply message."; 120ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0) 121ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return "File doesn't exist."; 122d7fbcb5e025b3c718dd1fd332b8759ae26c0d8dcSimon McVittie else if (strcmp (error, DBUS_ERROR_OBJECT_PATH_IN_USE) == 0) 123d7fbcb5e025b3c718dd1fd332b8759ae26c0d8dcSimon McVittie return "Object path already in use"; 124ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington else 125ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington return error; 126041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 127041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 12885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End of internals */ 12985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington 13085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** 13185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @defgroup DBusErrors Error reporting 13285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @ingroup DBus 13385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @brief Error reporting 13485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 13585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * Types and functions related to reporting errors. 13685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 13785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 1387652304bff969afb3969603149bb385efe861fe8John (J * In essence D-Bus error reporting works as follows: 13985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 14085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @code 14185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * DBusError error; 14285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_init (&error); 14385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_some_function (arg1, arg2, &error); 14485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if (dbus_error_is_set (&error)) 14585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * { 14685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * fprintf (stderr, "an error occurred: %s\n", error.message); 14785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_free (&error); 14885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * } 14985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @endcode 15085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 151afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * By convention, all functions allow #NULL instead of a DBusError*, 152afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * so callers who don't care about the error can ignore it. 153afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 1547652304bff969afb3969603149bb385efe861fe8John (J * There are some rules. An error passed to a D-Bus function must 15585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * always be unset; you can't pass in an error that's already set. If 15685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * a function has a return code indicating whether an error occurred, 15785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * and also a #DBusError parameter, then the error will always be set 15885ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * if and only if the return code indicates an error occurred. i.e. 15985ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * the return code and the error are never going to disagree. 16085ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 16185ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * An error only needs to be freed if it's been set, not if 16285ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * it's merely been initialized. 16385ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 16485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * You can check the specific error that occurred using 16585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * dbus_error_has_name(). 16685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * 167afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Errors will not be set for programming errors, such as passing 168afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * invalid arguments to the libdbus API. Instead, libdbus will print 169afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * warnings, exit on a failed assertion, or even crash in those cases 170afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * (in other words, incorrect use of the API results in undefined 171afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * behavior, possibly accompanied by helpful debugging output if 172afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * you're lucky). 173afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 17485ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington * @{ 17585ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington */ 17685ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington 177a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 178afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Initializes a DBusError structure. Does not allocate any memory; 179afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * the error only needs to be freed if it is set at some point. 180a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 181a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error the DBusError. 182a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 183b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 184b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_init (DBusError *error) 185b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 186b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 187b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 188c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_fail (error != NULL); 189b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 190b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError)); 191b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 192b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 193b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 194b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->name = NULL; 195b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = NULL; 196b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 197b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = TRUE; 198b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 199b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 200a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 20129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Frees an error that's been set (or just initialized), 20229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * then reinitializes the error as in dbus_error_init(). 203a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 204a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param error memory where the error is stored. 205a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 206b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 207b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_free (DBusError *error) 208b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 209b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 210b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 211c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_fail (error != NULL); 212c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 213b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 214b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 215b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (!real->const_message) 216f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington { 217f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington dbus_free (real->name); 218f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington dbus_free (real->message); 219f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington } 22029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 22129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_init (error); 222b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 223b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 224a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 225e0b284c7e38f0c002b2173d85ab89dc18700867cHavoc Pennington * Assigns an error name and message to a DBusError. Does nothing if 226afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * error is #NULL. The message may be #NULL, which means a default 227afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * message will be deduced from the name. The default message will be 228afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * totally useless, though, so using a #NULL message is not recommended. 229a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 230afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * Because this function does not copy the error name or message, you 231afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * must ensure the name and message are global data that won't be 232afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * freed. You probably want dbus_set_error() instead, in most cases. 233afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * 234afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error the error.or #NULL 235a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param name the error name (not copied!!!) 236a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param message the error message (not copied!!!) 237a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 238b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 239b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error_const (DBusError *error, 240b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name, 241b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *message) 242b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 243b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 244b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 245c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_error_is_set (error); 246c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_fail (name != NULL); 247c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 248b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (error == NULL) 249b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson return; 2502f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington 2512f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->name == NULL); 2522f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->message == NULL); 253ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington 254ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington if (message == NULL) 255ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington message = message_from_error (name); 256b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 257b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 258b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 259222bd07e9df5e3b5a367d1282b43fd3a827a7552John (J real->name = (char*) name; 260b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = (char *)message; 261b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = TRUE; 262b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 263b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 264a7c05492537b149f67760ecb1958350900843173Anders Carlsson/** 26529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * Moves an error src into dest, freeing src and 26629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * overwriting dest. Both src and dest must be initialized. 26729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * src is reinitialized to an empty error. dest may not 26829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * contain an existing error. If the destination is 26929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * #NULL, just frees and reinits the source error. 270410a80c43126376e9308a03a7cef108716018f5aHavoc Pennington * 27129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param src the source error 27229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington * @param dest the destination error or #NULL 27329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington */ 27429560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtonvoid 27529560adcc79a259a0be3511c056ee7453aa26c04Havoc Penningtondbus_move_error (DBusError *src, 27629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington DBusError *dest) 27729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington{ 278c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_error_is_set (dest); 27929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 28029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington if (dest) 28129560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington { 28229560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_free (dest); 28329560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington *dest = *src; 28429560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_init (src); 28529560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington } 28629560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington else 28729560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington dbus_error_free (src); 28829560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington} 28929560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington 29029560adcc79a259a0be3511c056ee7453aa26c04Havoc Pennington/** 2917e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether the error is set and has the given 2927e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * name. 2937e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error 2947e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param name the name 2957e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if the given named error occurred 2967e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */ 2977e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t 2987e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_has_name (const DBusError *error, 2997e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington const char *name) 3007e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{ 301c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (error != NULL, FALSE); 302c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (name != NULL, FALSE); 303c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 3047e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington _dbus_assert ((error->name != NULL && error->message != NULL) || 3057e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington (error->name == NULL && error->message == NULL)); 3067e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington 3077e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington if (error->name != NULL) 3087e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington { 3097e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington DBusString str1, str2; 3107e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington _dbus_string_init_const (&str1, error->name); 3117e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington _dbus_string_init_const (&str2, name); 3127e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington return _dbus_string_equal (&str1, &str2); 3137e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington } 3147e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington else 3157e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington return FALSE; 3167e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington} 3177e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington 3187e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/** 3197e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * Checks whether an error occurred (the error is set). 3207e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * 3217e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @param error the error object 3227e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington * @returns #TRUE if an error occurred 3237e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington */ 3247e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_bool_t 3257e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Penningtondbus_error_is_set (const DBusError *error) 3267e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington{ 327c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_val_if_fail (error != NULL, FALSE); 3287e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington _dbus_assert ((error->name != NULL && error->message != NULL) || 3297e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington (error->name == NULL && error->message == NULL)); 3307e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington return error->name != NULL; 3317e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington} 3327e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington 3337e050c88719553d0c74e3dc68caf7bc50ae99590Havoc Pennington/** 334a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Assigns an error name and message to a DBusError. 335a7c05492537b149f67760ecb1958350900843173Anders Carlsson * Does nothing if error is #NULL. 336a7c05492537b149f67760ecb1958350900843173Anders Carlsson * 337afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * The format may be #NULL, which means a (pretty much useless) 338afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * default message will be deduced from the name. This is not a good 339afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * idea, just go ahead and provide a useful error message. It won't 340afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * hurt you. 341ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington * 3422aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * If no memory can be allocated for the error message, 3432aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson * an out-of-memory error message will be set instead. 3446b40feaff4114ab3498ad06e13063fceff4d48e9Havoc Pennington * 345afa4ffbd852686633086569cd34942917c5c49afHavoc Pennington * @param error the error.or #NULL 346f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington * @param name the error name 347a7c05492537b149f67760ecb1958350900843173Anders Carlsson * @param format printf-style format string. 348a7c05492537b149f67760ecb1958350900843173Anders Carlsson */ 3492aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlssonvoid 350b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error (DBusError *error, 351b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name, 352b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *format, 353b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson ...) 354b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 355b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 3561d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington DBusString str; 3572f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington va_list args; 3581d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 359b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (error == NULL) 3602aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson return; 3612f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington 3622f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington /* it's a bug to pile up errors */ 363c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_error_is_set (error); 364c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington _dbus_return_if_fail (name != NULL); 365c9cd648f115759176d35508e9007dc5520a0dd3fHavoc Pennington 3662f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->name == NULL); 3672f38c959212d98e2194139daa9120fda37415b4fHavoc Pennington _dbus_assert (error->message == NULL); 368ce4fd314c6be9bfee16a172d5ca34e5097d309fcHavoc Pennington 3691d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (!_dbus_string_init (&str)) 3701d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington goto nomem; 3713c8db267892bbce5c82d5060cef993dd54dc6ed4Anders Carlsson 3721d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (format == NULL) 3732aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson { 3741d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (!_dbus_string_append (&str, 3751d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington message_from_error (name))) 3761d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington { 3771d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington _dbus_string_free (&str); 3781d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington goto nomem; 3791d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington } 3801d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington } 3811d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington else 3821d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington { 3831d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington va_start (args, format); 3841d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (!_dbus_string_append_printf_valist (&str, format, args)) 3851d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington { 3861d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington _dbus_string_free (&str); 38797872bf72ff327855e2e86a4760348cd2ca03b9eJohn (J va_end (args); 3881d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington goto nomem; 3891d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington } 3901d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington va_end (args); 3912aa38be20b015777ec6570d1e2fd7e072f5f3be9Anders Carlsson } 392b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 393b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 3941d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 3951d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington if (!_dbus_string_steal_data (&str, &real->message)) 3961d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington { 3971d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington _dbus_string_free (&str); 3981d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington goto nomem; 3991d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington } 400f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington _dbus_string_free (&str); 401b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 402f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington real->name = _dbus_strdup (name); 403f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington if (real->name == NULL) 404f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington { 405f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington dbus_free (real->message); 406f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington real->message = NULL; 407f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington goto nomem; 408f20cee8e12f647ba3acb08a69cd154c52dd3b6edHavoc Pennington } 409b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = FALSE; 4101d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 4111d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington return; 4121d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington 4131d1b0f20a467cf1cbdcaf81fbad3a111bcff6c48Havoc Pennington nomem: 414fabef9f3992a6a14bf649bbde73ce3d86542764eOlivier Andrieu _DBUS_SET_OOM (error); 415b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 416b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 41785ab0327d82e4945ad16630e583d8cc68df25a90Havoc Pennington/** @} */ /* End public API */ 418