D-Bus  1.4.10
dbus-errors.c
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
2 /* dbus-errors.c Error reporting
3  *
4  * Copyright (C) 2002, 2004 Red Hat Inc.
5  * Copyright (C) 2003 CodeFactory AB
6  *
7  * Licensed under the Academic Free License version 2.1
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  *
23  */
24 
25 #include <config.h>
26 #include "dbus-errors.h"
27 #include "dbus-internals.h"
28 #include "dbus-string.h"
29 #include "dbus-protocol.h"
30 #include <stdarg.h>
31 #include <string.h>
32 
65 typedef struct
66 {
67  char *name;
68  char *message;
70  unsigned int const_message : 1;
72  unsigned int dummy2 : 1;
73  unsigned int dummy3 : 1;
74  unsigned int dummy4 : 1;
75  unsigned int dummy5 : 1;
77  void *padding1;
80 
89 static const char*
90 message_from_error (const char *error)
91 {
92  if (strcmp (error, DBUS_ERROR_FAILED) == 0)
93  return "Unknown error";
94  else if (strcmp (error, DBUS_ERROR_NO_MEMORY) == 0)
95  return "Not enough memory available";
96  else if (strcmp (error, DBUS_ERROR_IO_ERROR) == 0)
97  return "Error reading or writing data";
98  else if (strcmp (error, DBUS_ERROR_BAD_ADDRESS) == 0)
99  return "Could not parse address";
100  else if (strcmp (error, DBUS_ERROR_NOT_SUPPORTED) == 0)
101  return "Feature not supported";
102  else if (strcmp (error, DBUS_ERROR_LIMITS_EXCEEDED) == 0)
103  return "Resource limits exceeded";
104  else if (strcmp (error, DBUS_ERROR_ACCESS_DENIED) == 0)
105  return "Permission denied";
106  else if (strcmp (error, DBUS_ERROR_AUTH_FAILED) == 0)
107  return "Could not authenticate to server";
108  else if (strcmp (error, DBUS_ERROR_NO_SERVER) == 0)
109  return "No server available at address";
110  else if (strcmp (error, DBUS_ERROR_TIMEOUT) == 0)
111  return "Connection timed out";
112  else if (strcmp (error, DBUS_ERROR_NO_NETWORK) == 0)
113  return "Network unavailable";
114  else if (strcmp (error, DBUS_ERROR_ADDRESS_IN_USE) == 0)
115  return "Address already in use";
116  else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0)
117  return "Disconnected.";
118  else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0)
119  return "Invalid arguments.";
120  else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0)
121  return "Did not get a reply message.";
122  else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0)
123  return "File doesn't exist.";
124  else if (strcmp (error, DBUS_ERROR_OBJECT_PATH_IN_USE) == 0)
125  return "Object path already in use";
126  else
127  return error;
128 }
129  /* End of internals */
131 
185 void
187 {
188  DBusRealError *real;
189 
190  _dbus_return_if_fail (error != NULL);
191 
192  _dbus_assert (sizeof (DBusError) == sizeof (DBusRealError));
193 
194  real = (DBusRealError *)error;
195 
196  real->name = NULL;
197  real->message = NULL;
198 
199  real->const_message = TRUE;
200 }
201 
208 void
210 {
211  DBusRealError *real;
212 
213  _dbus_return_if_fail (error != NULL);
214 
215  real = (DBusRealError *)error;
216 
217  if (!real->const_message)
218  {
219  dbus_free (real->name);
220  dbus_free (real->message);
221  }
222 
223  dbus_error_init (error);
224 }
225 
240 void
242  const char *name,
243  const char *message)
244 {
245  DBusRealError *real;
246 
247  _dbus_return_if_error_is_set (error);
248  _dbus_return_if_fail (name != NULL);
249 
250  if (error == NULL)
251  return;
252 
253  _dbus_assert (error->name == NULL);
254  _dbus_assert (error->message == NULL);
255 
256  if (message == NULL)
257  message = message_from_error (name);
258 
259  real = (DBusRealError *)error;
260 
261  real->name = (char*) name;
262  real->message = (char *)message;
263  real->const_message = TRUE;
264 }
265 
276 void
278  DBusError *dest)
279 {
280  _dbus_return_if_error_is_set (dest);
281 
282  if (dest)
283  {
284  dbus_error_free (dest);
285  *dest = *src;
286  dbus_error_init (src);
287  }
288  else
289  dbus_error_free (src);
290 }
291 
301  const char *name)
302 {
303  _dbus_return_val_if_fail (error != NULL, FALSE);
304  _dbus_return_val_if_fail (name != NULL, FALSE);
305 
306  _dbus_assert ((error->name != NULL && error->message != NULL) ||
307  (error->name == NULL && error->message == NULL));
308 
309  if (error->name != NULL)
310  {
311  DBusString str1, str2;
312  _dbus_string_init_const (&str1, error->name);
313  _dbus_string_init_const (&str2, name);
314  return _dbus_string_equal (&str1, &str2);
315  }
316  else
317  return FALSE;
318 }
319 
328 {
329  _dbus_return_val_if_fail (error != NULL, FALSE);
330  _dbus_assert ((error->name != NULL && error->message != NULL) ||
331  (error->name == NULL && error->message == NULL));
332  return error->name != NULL;
333 }
334 
351 void
353  const char *name,
354  const char *format,
355  ...)
356 {
357  DBusRealError *real;
358  DBusString str;
359  va_list args;
360 
361  if (error == NULL)
362  return;
363 
364  /* it's a bug to pile up errors */
365  _dbus_return_if_error_is_set (error);
366  _dbus_return_if_fail (name != NULL);
367 
368  _dbus_assert (error->name == NULL);
369  _dbus_assert (error->message == NULL);
370 
371  if (!_dbus_string_init (&str))
372  goto nomem;
373 
374  if (format == NULL)
375  {
376  if (!_dbus_string_append (&str,
377  message_from_error (name)))
378  {
379  _dbus_string_free (&str);
380  va_end (args);
381  goto nomem;
382  }
383  }
384  else
385  {
386  va_start (args, format);
387  if (!_dbus_string_append_printf_valist (&str, format, args))
388  {
389  _dbus_string_free (&str);
390  va_end (args);
391  goto nomem;
392  }
393  va_end (args);
394  }
395 
396  real = (DBusRealError *)error;
397 
398  if (!_dbus_string_steal_data (&str, &real->message))
399  {
400  _dbus_string_free (&str);
401  goto nomem;
402  }
403  _dbus_string_free (&str);
404 
405  real->name = _dbus_strdup (name);
406  if (real->name == NULL)
407  {
408  dbus_free (real->message);
409  real->message = NULL;
410  goto nomem;
411  }
412  real->const_message = FALSE;
413 
414  return;
415 
416  nomem:
417  _DBUS_SET_OOM (error);
418 }
419  /* End public API */