-static void socket_to_sockaddr(int af, const struct socket *s,
- struct sockaddr *sa, size_t *ssz)
-{
- sa->sa_family = af;
- switch (af) {
- case AF_INET: {
- struct sockaddr_in *sin = (struct sockaddr_in *)sa;
- sin->sin_addr = s->addr.ipv4;
- sin->sin_port = htons(s->port);
- *ssz = sizeof(*sin);
- } break;
- case AF_INET6: {
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sa;
- sin6->sin6_addr = s->addr.ipv6;
- sin6->sin6_port = htons(s->port);
- sin6->sin6_flowinfo = 0;
- sin6->sin6_scope_id = 0;
- *ssz = sizeof(*sin6);
- } break;
- default: abort();
- }
-}
-
-static void sockaddr_to_addr(const struct sockaddr *sa, union addr *a)
-{
- switch (sa->sa_family) {
- case AF_INET: a->ipv4 = ((struct sockaddr_in *)sa)->sin_addr; break;
- case AF_INET6: a->ipv6 = ((struct sockaddr_in6 *)sa)->sin6_addr; break;
- default: abort();
- }
-}
-
-static void dputsock(dstr *d, int af, const struct socket *s)
-{
- char buf[ADDRLEN];
-
- inet_ntop(af, &s->addr, buf, sizeof(buf));
- if (!s->port || af != AF_INET6) dstr_puts(d, buf);
- else { dstr_putc(d, '['); dstr_puts(d, buf); dstr_putc(d, ']'); }
- if (s->port) dstr_putf(d, ":%d", s->port);
-}
-