123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #include <cds/memory.h>
- #include <cds/logger.h>
- #include <cds/rr_serialize.h>
- #ifdef SER
- static void rr_dup(rr_t **dst, rr_t *pkg_rr)
- {
- rr_t *tmp = NULL;
- int res;
-
- tmp = pkg_rr;
-
- while (pkg_rr) {
- res = shm_duplicate_rr(dst, pkg_rr);
- dst = &(*dst)->next;
- pkg_rr = pkg_rr->next;
- }
- if (tmp) free_rr(&tmp);
- }
- static int serialize_route(sstream_t *ss, rr_t **_r)
- {
- int do_it = 0;
- int res = 0;
- if (is_input_sstream(ss)) { /* read route */
- if (serialize_int(ss, &do_it) != 0) return -1;
- *_r = NULL;
- }
- else { /* store route */
- if (*_r) do_it = 1;
- else do_it = 0;
- if (serialize_int(ss, &do_it) != 0) return -1;
- }
-
- if (do_it) {
- str s;
- if (*_r) {
- s.s = (*_r)->nameaddr.name.s;
- s.len = (*_r)->len;
- }
- res = serialize_str_ex(ss, &s) | res;
- if (is_input_sstream(ss)) {
- rr_t *pkg_rr = NULL;
-
- parse_rr_body(s.s, s.len, &pkg_rr);
- rr_dup(_r, pkg_rr);
- }
- }
-
- return res;
- }
- int serialize_route_set(sstream_t *ss, rr_t **route_set)
- {
- rr_t *r, *first = NULL, *last = NULL;
- int res = 0;
- if (is_input_sstream(ss)) { /* read */
- do {
- res = serialize_route(ss, &r) | res;
- if (last) last->next = r;
- else first = r;
- last = r;
- if (last) {
- /* due to parsing rr (may be more rr_t than 1) */
- while (last->next) last = last->next;
- }
- } while (r);
- *route_set = first;
- }
- else { /* store */
- r = *route_set;
- while (r) {
- serialize_route(ss, &r);
- r = r->next;
- }
- r = NULL;
- serialize_route(ss, &r); /* store terminating route */
- }
-
- return 0;
- }
- int route_set2str(rr_t *rr, str_t *dst_str)
- {
- int res = 0;
- sstream_t store;
-
- init_output_sstream(&store, 256);
-
- if (serialize_route_set(&store, &rr) != 0) {
- ERROR_LOG("can't serialize route set\n");
- res = -1;
- }
- else {
- if (get_serialized_sstream(&store, dst_str) != 0) {
- ERROR_LOG("can't get serialized data\n");
- res = -1;
- }
- }
- destroy_sstream(&store);
- return res;
- }
- int str2route_set(const str_t *s, rr_t **rr)
- {
- int res = 0;
- sstream_t store;
- if (!s) return -1;
-
- init_input_sstream(&store, s->s, s->len);
- if (serialize_route_set(&store, rr) != 0) {
- ERROR_LOG("can't de-serialize route set\n");
- res = -1;
- }
- destroy_sstream(&store);
-
- return res;
- }
- #endif
|