static void ipx_status(int s __unused, const struct ifaddrs *ifa) { struct sockaddr_ipx *sipx, null_sipx; sipx = (struct sockaddr_ipx *)ifa->ifa_addr; if (sipx == NULL) return; printf("\tipx %s ", ipx_ntoa(sipx->sipx_addr)); if (ifa->ifa_flags & IFF_POINTOPOINT) { sipx = (struct sockaddr_ipx *)ifa->ifa_dstaddr; if (sipx == NULL) { memset(&null_sipx, 0, sizeof(null_sipx)); sipx = &null_sipx; } printf("--> %s ", ipx_ntoa(sipx->sipx_addr)); } putchar('\n'); }
static void ktrsockaddr(struct sockaddr *sa) { /* TODO: Support additional address families #include <netmpls/mpls.h> struct sockaddr_mpls *mpls; */ char addr[64]; /* * note: ktrstruct() has already verified that sa points to a * buffer at least sizeof(struct sockaddr) bytes long and exactly * sa->sa_len bytes long. */ printf("struct sockaddr { "); sockfamilyname(sa->sa_family); printf(", "); #define check_sockaddr_len(n) \ if (sa_##n->s##n##_len < sizeof(struct sockaddr_##n)) { \ printf("invalid"); \ break; \ } switch(sa->sa_family) { case AF_INET: { struct sockaddr_in *sa_in; sa_in = (struct sockaddr_in *)sa; check_sockaddr_len(in); inet_ntop(AF_INET, &sa_in->sin_addr, addr, sizeof addr); printf("%s:%u", addr, ntohs(sa_in->sin_port)); break; } case AF_INET6: { struct sockaddr_in6 *sa_in6; sa_in6 = (struct sockaddr_in6 *)sa; check_sockaddr_len(in6); inet_ntop(AF_INET6, &sa_in6->sin6_addr, addr, sizeof addr); printf("[%s]:%u", addr, htons(sa_in6->sin6_port)); break; } #ifdef IPX case AF_IPX: { struct sockaddr_ipx *sa_ipx; sa_ipx = (struct sockaddr_ipx *)sa; check_sockaddr_len(ipx); /* XXX wish we had ipx_ntop */ printf("%s", ipx_ntoa(sa_ipx->sipx_addr)); break; } #endif case AF_UNIX: { struct sockaddr_un *sa_un; sa_un = (struct sockaddr_un *)sa; if (sa_un->sun_len <= sizeof(sa_un->sun_len) + sizeof(sa_un->sun_family)) { printf("invalid"); break; } printf("\"%.*s\"", (int)(sa_un->sun_len - sizeof(sa_un->sun_len) - sizeof(sa_un->sun_family)), sa_un->sun_path); break; } default: printf("unknown address family"); } printf(" }\n"); }