dbus-errors.c revision b09fadc1145570d752e7f709bfc0cf8c486d5146
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. 5041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 6041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Licensed under the Academic Free License version 1.2 7041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 8041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is free software; you can redistribute it and/or modify 9041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * it under the terms of the GNU General Public License as published by 10041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 11041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * (at your option) any later version. 12041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 13041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * This program is distributed in the hope that it will be useful, 14041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 15041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * GNU General Public License for more details. 17041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 18041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * You should have received a copy of the GNU General Public License 19041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * along with this program; if not, write to the Free Software 20041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 22041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 23041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington#include "dbus-errors.h" 24b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include "dbus-internals.h" 25b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include <stdarg.h> 26b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson#include <stdio.h> 27041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 28041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 29041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @defgroup DBusErrors Error reporting 30041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @ingroup DBus 31041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @brief Error reporting 32041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 33041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Types and functions related to reporting errors. 34041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 35041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 36041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * In essence D-BUS error reporting works as follows: 37041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 38041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @code 39041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * DBusResultCode result = DBUS_RESULT_SUCCESS; 40041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * dbus_some_function (arg1, arg2, &result); 41041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * if (result != DBUS_RESULT_SUCCESS) 42041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * printf ("an error occurred\n"); 43041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @endcode 44041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 45041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @{ 46041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 47041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 48b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssontypedef struct 49b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 50b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name; /**< error name */ 51b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson char *message; /**< error message */ 52b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 53b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson unsigned int const_message : 1; /** Message is not owned by DBusError */ 54b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} DBusRealError; 55b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 56041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 57041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Set a result code at a result code location, 58041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * if code_address is not #NULL. 59041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 60041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param code_address place to store the result code. 61041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param code the result code itself. 62041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 63041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonvoid 64041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_set_result (DBusResultCode *code_address, 65041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington DBusResultCode code) 66041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 67041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington if (code_address) 68041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington *code_address = code; 69041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 70041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 71041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** 72041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * Returns a string describing the given result code. 73041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * 74041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @param code the result code to describe. 75041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * @returns a constant string describing the code. 76041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 77041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtonconst char* 78041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Penningtondbus_result_to_string (DBusResultCode code) 79041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington{ 80041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington /* This is a switch to the compiler will complain if we 81041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington * aren't handling some codes 82041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington */ 83041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington switch (code) 84041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington { 85041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_SUCCESS: 86041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Success"; 87041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_FAILED: 88041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Unknown error"; 89041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_NO_MEMORY: 90041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Not enough memory available"; 91041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_IO_ERROR: 92041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Error reading or writing data"; 93041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_BAD_ADDRESS: 94041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Could not parse address"; 95041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_NOT_SUPPORTED: 96041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Feature not supported"; 97041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_LIMITS_EXCEEDED: 98041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Resource limits exceeded"; 99041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_ACCESS_DENIED: 100041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Permission denied"; 101041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_AUTH_FAILED: 102041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Could not authenticate to server"; 103041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_NO_SERVER: 104041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "No server"; 105041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_TIMEOUT: 106041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Connection timed out"; 107041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_NO_NETWORK: 108041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Network unavailable"; 109041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_ADDRESS_IN_USE: 110041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Address already in use"; 111041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington case DBUS_RESULT_DISCONNECTED: 112041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Disconnected."; 1131b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson case DBUS_RESULT_INVALID_FIELDS: 1141b9a4589f6836641ded324b7b5d003c5cbfb0b78Anders Carlsson return "Invalid fields."; 1154a85d321b4516c6a663e8bdd530ba59018c974dfAnders Carlsson case DBUS_RESULT_NO_REPLY: 1164a85d321b4516c6a663e8bdd530ba59018c974dfAnders Carlsson return "Did not get a reply message."; 1179a0b07f225be10c545a8b1de8555bca2dc3a9cabHavoc Pennington case DBUS_RESULT_FILE_NOT_FOUND: 1189a0b07f225be10c545a8b1de8555bca2dc3a9cabHavoc Pennington return "File doesn't exist."; 119041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 120041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington /* no default, it would break our compiler warnings */ 121041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington } 122041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 123041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington return "Invalid error code"; 124041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington} 125041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington 126b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 127b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_init (DBusError *error) 128b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 129b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 130b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 131b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson _dbus_assert (error != NULL); 132b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 133b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError)); 134b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 135b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 136b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 137b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->name = NULL; 138b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = NULL; 139b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 140b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = TRUE; 141b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 142b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 143b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 144b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_error_free (DBusError *error) 145b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 146b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 147b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 148b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 149b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 150b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (!real->const_message) 151b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson dbus_free (real->message); 152b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 153b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 154b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssonvoid 155b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error_const (DBusError *error, 156b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name, 157b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *message) 158b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 159b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 160b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 161b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (error == NULL) 162b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson return; 163b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 164b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson dbus_error_init (error); 165b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 166b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 167b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 168b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->name = name; 169b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = (char *)message; 170b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = TRUE; 171b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 172b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 173b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_bool_t 174b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlssondbus_set_error (DBusError *error, 175b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *name, 176b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson const char *format, 177b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson ...) 178b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson{ 179b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson DBusRealError *real; 180b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson va_list args, args2; 181b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson int message_length; 182b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson char *message; 183b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson char c; 184b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 185b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (error == NULL) 186b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson return TRUE; 187b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 188b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson va_start (args, format); 189b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 190b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson va_copy (args2, args); 191b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 192b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson /* Measure the message length */ 193b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson message_length = vsnprintf (&c, 1,format, args) + 1; 194b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 195b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson message = dbus_malloc (message_length); 196b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 197b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson vsprintf (message, format, args2); 198b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 199b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson if (!message) 200b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson return FALSE; 201b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 202b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson va_end (args); 203b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 204b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson dbus_error_init (error); 205b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real = (DBusRealError *)error; 206b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 207b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->name = name; 208b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->message = message; 209b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson real->const_message = FALSE; 210b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 211b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson return TRUE; 212b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson} 213b09fadc1145570d752e7f709bfc0cf8c486d5146Anders Carlsson 214041b0767b284034aee09e9a0de2a3844b8cc546aHavoc Pennington/** @} */ 215