| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #include "unp.h"
- #ifdef HAVE_SOCKADDR_DL_STRUCT
- #include <net/if_dl.h>
- #endif
- char *
- sock_ntop_host(const struct sockaddr *sa, socklen_t salen)
- {
- 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);
- return(str);
- }
- #ifdef IPV6
- case AF_INET6: {
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;
- if (inet_ntop(AF_INET6, &sin6->sin6_addr, str, sizeof(str)) == NULL)
- return(NULL);
- return(str);
- }
- #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",
- sdl->sdl_nlen, &sdl->sdl_data[0]);
- else
- snprintf(str, sizeof(str), "AF_LINK, index=%d", sdl->sdl_index);
- return(str);
- }
- #endif
- default:
- snprintf(str, sizeof(str), "sock_ntop_host: unknown AF_xxx: %d, len %d",
- sa->sa_family, salen);
- return(str);
- }
- return (NULL);
- }
- char *
- Sock_ntop_host(const struct sockaddr *sa, socklen_t salen)
- {
- char *ptr;
- if ( (ptr = sock_ntop_host(sa, salen)) == NULL)
- err_sys("sock_ntop_host error"); /* inet_ntop() sets errno */
- return(ptr);
- }
|