error.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * QEMU Error Objects
  3. *
  4. * Copyright IBM, Corp. 2011
  5. *
  6. * Authors:
  7. * Anthony Liguori <aliguori@us.ibm.com>
  8. *
  9. * This work is licensed under the terms of the GNU LGPL, version 2. See
  10. * the COPYING.LIB file in the top-level directory.
  11. */
  12. #include "qemu-common.h"
  13. #include "error.h"
  14. #include "qjson.h"
  15. #include "qdict.h"
  16. #include "qapi-types.h"
  17. #include "qerror.h"
  18. struct Error
  19. {
  20. char *msg;
  21. ErrorClass err_class;
  22. };
  23. void error_set(Error **errp, ErrorClass err_class, const char *fmt, ...)
  24. {
  25. Error *err;
  26. va_list ap;
  27. if (errp == NULL) {
  28. return;
  29. }
  30. assert(*errp == NULL);
  31. err = g_malloc0(sizeof(*err));
  32. va_start(ap, fmt);
  33. err->msg = g_strdup_vprintf(fmt, ap);
  34. va_end(ap);
  35. err->err_class = err_class;
  36. *errp = err;
  37. }
  38. Error *error_copy(const Error *err)
  39. {
  40. Error *err_new;
  41. err_new = g_malloc0(sizeof(*err));
  42. err_new->msg = g_strdup(err->msg);
  43. err_new->err_class = err->err_class;
  44. return err_new;
  45. }
  46. bool error_is_set(Error **errp)
  47. {
  48. return (errp && *errp);
  49. }
  50. ErrorClass error_get_class(const Error *err)
  51. {
  52. return err->err_class;
  53. }
  54. const char *error_get_pretty(Error *err)
  55. {
  56. return err->msg;
  57. }
  58. void error_free(Error *err)
  59. {
  60. if (err) {
  61. g_free(err->msg);
  62. g_free(err);
  63. }
  64. }
  65. void error_propagate(Error **dst_err, Error *local_err)
  66. {
  67. if (dst_err && !*dst_err) {
  68. *dst_err = local_err;
  69. } else if (local_err) {
  70. error_free(local_err);
  71. }
  72. }