+static int srccmp(const struct source *a, const struct source *b)
+{
+ int c;
+
+ if((c = a->len - b->len) != 0)
+ return(c);
+ if((c = a->type - b->type) != 0)
+ return(c);
+ return(memcmp(a->data, b->data, a->len));
+}
+
+static const char *formatsrc(const struct source *src)
+{
+ static char buf[128];
+ struct in_addr a4;
+ struct in6_addr a6;
+
+ switch(src->type) {
+ case AF_INET:
+ memcpy(&a4, src->data, sizeof(a4));
+ if(!inet_ntop(AF_INET, &a4, buf, sizeof(buf)))
+ return("<invalid ipv4>");
+ return(buf);
+ case AF_INET6:
+ memcpy(&a6, src->data, sizeof(a6));
+ if(!inet_ntop(AF_INET6, &a6, buf, sizeof(buf)))
+ return("<invalid ipv6>");
+ return(buf);
+ default:
+ return("<invalid source record>");
+ }
+}
+