rr_serialize.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include <cds/memory.h>
  2. #include <cds/logger.h>
  3. #include <cds/rr_serialize.h>
  4. #ifdef SER
  5. static void rr_dup(rr_t **dst, rr_t *pkg_rr)
  6. {
  7. rr_t *tmp = NULL;
  8. int res;
  9. tmp = pkg_rr;
  10. while (pkg_rr) {
  11. res = shm_duplicate_rr(dst, pkg_rr);
  12. dst = &(*dst)->next;
  13. pkg_rr = pkg_rr->next;
  14. }
  15. if (tmp) free_rr(&tmp);
  16. }
  17. static int serialize_route(sstream_t *ss, rr_t **_r)
  18. {
  19. int do_it = 0;
  20. int res = 0;
  21. if (is_input_sstream(ss)) { /* read route */
  22. if (serialize_int(ss, &do_it) != 0) return -1;
  23. *_r = NULL;
  24. }
  25. else { /* store route */
  26. if (*_r) do_it = 1;
  27. else do_it = 0;
  28. if (serialize_int(ss, &do_it) != 0) return -1;
  29. }
  30. if (do_it) {
  31. str s;
  32. if (*_r) {
  33. s.s = (*_r)->nameaddr.name.s;
  34. s.len = (*_r)->len;
  35. }
  36. res = serialize_str_ex(ss, &s) | res;
  37. if (is_input_sstream(ss)) {
  38. rr_t *pkg_rr = NULL;
  39. parse_rr_body(s.s, s.len, &pkg_rr);
  40. rr_dup(_r, pkg_rr);
  41. }
  42. }
  43. return res;
  44. }
  45. int serialize_route_set(sstream_t *ss, rr_t **route_set)
  46. {
  47. rr_t *r, *first = NULL, *last = NULL;
  48. int res = 0;
  49. if (is_input_sstream(ss)) { /* read */
  50. do {
  51. res = serialize_route(ss, &r) | res;
  52. if (last) last->next = r;
  53. else first = r;
  54. last = r;
  55. if (last) {
  56. /* due to parsing rr (may be more rr_t than 1) */
  57. while (last->next) last = last->next;
  58. }
  59. } while (r);
  60. *route_set = first;
  61. }
  62. else { /* store */
  63. r = *route_set;
  64. while (r) {
  65. serialize_route(ss, &r);
  66. r = r->next;
  67. }
  68. r = NULL;
  69. serialize_route(ss, &r); /* store terminating route */
  70. }
  71. return 0;
  72. }
  73. int route_set2str(rr_t *rr, str_t *dst_str)
  74. {
  75. int res = 0;
  76. sstream_t store;
  77. init_output_sstream(&store, 256);
  78. if (serialize_route_set(&store, &rr) != 0) {
  79. ERROR_LOG("can't serialize route set\n");
  80. res = -1;
  81. }
  82. else {
  83. if (get_serialized_sstream(&store, dst_str) != 0) {
  84. ERROR_LOG("can't get serialized data\n");
  85. res = -1;
  86. }
  87. }
  88. destroy_sstream(&store);
  89. return res;
  90. }
  91. int str2route_set(const str_t *s, rr_t **rr)
  92. {
  93. int res = 0;
  94. sstream_t store;
  95. if (!s) return -1;
  96. init_input_sstream(&store, s->s, s->len);
  97. if (serialize_route_set(&store, rr) != 0) {
  98. ERROR_LOG("can't de-serialize route set\n");
  99. res = -1;
  100. }
  101. destroy_sstream(&store);
  102. return res;
  103. }
  104. #endif