Permalink
Cannot retrieve contributors at this time
Fetching contributors…
| #include "unp.h" | |
| #ifdef HAVE_SOCKADDR_DL_STRUCT | |
| #include <net/if_dl.h> | |
| #endif | |
| /* include sock_ntop */ | |
| char * | |
| sock_ntop(const struct sockaddr *sa, socklen_t salen) | |
| { | |
| char portstr[8]; | |
| static char str[128]; /* Unix domain is largest */ | |
| switch (sa->sa_family) { | |
| case AF_INET: { | |
| struct sockaddr_in *sin = (struct sockaddr_in *) sa; | |
| if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL) | |
| return(NULL); | |
| if (ntohs(sin->sin_port) != 0) { | |
| snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port)); | |
| strcat(str, portstr); | |
| } | |
| return(str); | |
| } | |
| /* end sock_ntop */ | |
| #ifdef IPV6 | |
| case AF_INET6: { | |
| struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa; | |
| str[0] = '['; | |
| if (inet_ntop(AF_INET6, &sin6->sin6_addr, str + 1, sizeof(str) - 1) == NULL) | |
| return(NULL); | |
| if (ntohs(sin6->sin6_port) != 0) { | |
| snprintf(portstr, sizeof(portstr), "]:%d", ntohs(sin6->sin6_port)); | |
| strcat(str, portstr); | |
| return(str); | |
| } | |
| return (str + 1); | |
| } | |
| #endif | |
| #ifdef AF_UNIX | |
| case AF_UNIX: { | |
| struct sockaddr_un *unp = (struct sockaddr_un *) sa; | |
| /* OK to have no pathname bound to the socket: happens on | |
| every connect() unless client calls bind() first. */ | |
| if (unp->sun_path[0] == 0) | |
| strcpy(str, "(no pathname bound)"); | |
| else | |
| snprintf(str, sizeof(str), "%s", unp->sun_path); | |
| return(str); | |
| } | |
| #endif | |
| #ifdef HAVE_SOCKADDR_DL_STRUCT | |
| case AF_LINK: { | |
| struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa; | |
| if (sdl->sdl_nlen > 0) | |
| snprintf(str, sizeof(str), "%*s (index %d)", | |
| sdl->sdl_nlen, &sdl->sdl_data[0], sdl->sdl_index); | |
| else | |
| snprintf(str, sizeof(str), "AF_LINK, index=%d", sdl->sdl_index); | |
| return(str); | |
| } | |
| #endif | |
| default: | |
| snprintf(str, sizeof(str), "sock_ntop: unknown AF_xxx: %d, len %d", | |
| sa->sa_family, salen); | |
| return(str); | |
| } | |
| return (NULL); | |
| } | |
| char * | |
| Sock_ntop(const struct sockaddr *sa, socklen_t salen) | |
| { | |
| char *ptr; | |
| if ( (ptr = sock_ntop(sa, salen)) == NULL) | |
| err_sys("sock_ntop error"); /* inet_ntop() sets errno */ | |
| return(ptr); | |
| } |