* The module provides an override for queried address records.
*/
+#include <ccan/json/json.h>
#include <libknot/packet/pkt.h>
#include <libknot/descriptor.h>
#include <libknot/internal/lists.h>
}
char *result = NULL;
- asprintf(&result, "{ \"result\": %s }", ret == 0 ? "true" : "false");
+ asprintf(&result, "{ \"result\": %s", ret == 0 ? "true" : "false");
return result;
}
struct kr_zonecut *hints = module->data;
knot_dname_t key[KNOT_DNAME_MAXLEN];
pack_t *pack = NULL;
- size_t bufsize = 4096;
if (knot_dname_from_str(key, args, sizeof(key))) {
pack = kr_zonecut_find(hints, key);
}
return NULL;
}
- auto_free char *hint_buf = malloc(bufsize);
- if (hint_buf == NULL) {
- return NULL;
- }
- char *p = hint_buf, *endp = hint_buf + bufsize;
+ char buf[SOCKADDR_STRLEN];
+ JsonNode *root = json_mkarray();
uint8_t *addr = pack_head(*pack);
while (addr != pack_tail(*pack)) {
size_t len = pack_obj_len(addr);
int family = len == sizeof(struct in_addr) ? AF_INET : AF_INET6;
- if (!inet_ntop(family, pack_obj_val(addr), p, endp - p)) {
+ if (!inet_ntop(family, pack_obj_val(addr), buf, sizeof(buf))) {
break;
}
- p += strlen(p);
+ json_append_element(root, json_mkstring(buf));
addr = pack_obj_next(addr);
- if (p + 2 < endp && addr != pack_tail(*pack)) {
- strcpy(p, " ");
- p += 1;
- }
}
- char *result = NULL;
- asprintf(&result, "{ \"result\": [ %s ] }", hint_buf);
+ char *result = json_encode(root);
+ json_delete(root);
return result;
}
-hints_SOURCES := modules/hints/hints.c
+hints_SOURCES := modules/hints/hints.c contrib/ccan/json/json.c
hints_DEPEND := $(libkresolve)
hints_LIBS := $(libkresolve_TARGET) $(libkresolve_LIBS)
$(call make_c_module,hints)
\ No newline at end of file