const char *rt_addr_n2a_r(int af, int len, const void *addr, char *buf, int buflen) { switch (af) { case AF_INET: case AF_INET6: return inet_ntop(af, addr, buf, buflen); case AF_MPLS: return mpls_ntop(af, addr, buf, buflen); case AF_IPX: return ipx_ntop(af, addr, buf, buflen); case AF_DECnet: { struct dn_naddr dna = { 2, { 0, 0, } }; memcpy(dna.a_addr, addr, 2); return dnet_ntop(af, &dna, buf, buflen); } case AF_PACKET: return ll_addr_n2a(addr, len, ARPHRD_VOID, buf, buflen); case AF_BRIDGE: { const union { struct sockaddr sa; struct sockaddr_in sin; struct sockaddr_in6 sin6; } *sa = addr; switch (sa->sa.sa_family) { case AF_INET: return inet_ntop(AF_INET, &sa->sin.sin_addr, buf, buflen); case AF_INET6: return inet_ntop(AF_INET6, &sa->sin6.sin6_addr, buf, buflen); } /* fallthrough */ } default: return "???"; } }
const char *rt_addr_n2a(int af, int len, const void *addr, char *buf, int buflen) { switch (af) { case AF_INET: case AF_INET6: return inet_ntop(af, addr, buf, buflen); case AF_MPLS: return mpls_ntop(af, addr, buf, buflen); case AF_IPX: return ipx_ntop(af, addr, buf, buflen); case AF_DECnet: { struct dn_naddr dna = { 2, { 0, 0, }}; memcpy(dna.a_addr, addr, 2); return dnet_ntop(af, &dna, buf, buflen); } case AF_PACKET: return ll_addr_n2a(addr, len, ARPHRD_VOID, buf, buflen); default: return "???"; } }