2
0

error.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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 "error_int.h"
  17. #include "qerror.h"
  18. struct Error
  19. {
  20. QDict *obj;
  21. const char *fmt;
  22. char *msg;
  23. };
  24. void error_set(Error **errp, const char *fmt, ...)
  25. {
  26. Error *err;
  27. va_list ap;
  28. if (errp == NULL) {
  29. return;
  30. }
  31. err = g_malloc0(sizeof(*err));
  32. va_start(ap, fmt);
  33. err->obj = qobject_to_qdict(qobject_from_jsonv(fmt, &ap));
  34. va_end(ap);
  35. err->fmt = fmt;
  36. *errp = err;
  37. }
  38. bool error_is_set(Error **errp)
  39. {
  40. return (errp && *errp);
  41. }
  42. const char *error_get_pretty(Error *err)
  43. {
  44. if (err->msg == NULL) {
  45. QString *str;
  46. str = qerror_format(err->fmt, err->obj);
  47. err->msg = g_strdup(qstring_get_str(str));
  48. QDECREF(str);
  49. }
  50. return err->msg;
  51. }
  52. const char *error_get_field(Error *err, const char *field)
  53. {
  54. if (strcmp(field, "class") == 0) {
  55. return qdict_get_str(err->obj, field);
  56. } else {
  57. QDict *dict = qdict_get_qdict(err->obj, "data");
  58. return qdict_get_str(dict, field);
  59. }
  60. }
  61. QDict *error_get_data(Error *err)
  62. {
  63. QDict *data = qdict_get_qdict(err->obj, "data");
  64. QINCREF(data);
  65. return data;
  66. }
  67. void error_set_field(Error *err, const char *field, const char *value)
  68. {
  69. QDict *dict = qdict_get_qdict(err->obj, "data");
  70. return qdict_put(dict, field, qstring_from_str(value));
  71. }
  72. void error_free(Error *err)
  73. {
  74. if (err) {
  75. QDECREF(err->obj);
  76. g_free(err->msg);
  77. g_free(err);
  78. }
  79. }
  80. bool error_is_type(Error *err, const char *fmt)
  81. {
  82. const char *error_class;
  83. char *ptr;
  84. char *end;
  85. if (!err) {
  86. return false;
  87. }
  88. ptr = strstr(fmt, "'class': '");
  89. assert(ptr != NULL);
  90. ptr += strlen("'class': '");
  91. end = strchr(ptr, '\'');
  92. assert(end != NULL);
  93. error_class = error_get_field(err, "class");
  94. if (strlen(error_class) != end - ptr) {
  95. return false;
  96. }
  97. return strncmp(ptr, error_class, end - ptr) == 0;
  98. }
  99. void error_propagate(Error **dst_err, Error *local_err)
  100. {
  101. if (dst_err) {
  102. *dst_err = local_err;
  103. } else if (local_err) {
  104. error_free(local_err);
  105. }
  106. }
  107. QObject *error_get_qobject(Error *err)
  108. {
  109. QINCREF(err->obj);
  110. return QOBJECT(err->obj);
  111. }
  112. void error_set_qobject(Error **errp, QObject *obj)
  113. {
  114. Error *err;
  115. if (errp == NULL) {
  116. return;
  117. }
  118. err = g_malloc0(sizeof(*err));
  119. err->obj = qobject_to_qdict(obj);
  120. qobject_incref(obj);
  121. *errp = err;
  122. }