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