| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #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);
- }
|