sock_ntop.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "unp.h"
  2. #ifdef HAVE_SOCKADDR_DL_STRUCT
  3. #include <net/if_dl.h>
  4. #endif
  5. /* include sock_ntop */
  6. char *
  7. sock_ntop(const struct sockaddr *sa, socklen_t salen)
  8. {
  9. char portstr[8];
  10. static char str[128]; /* Unix domain is largest */
  11. switch (sa->sa_family) {
  12. case AF_INET: {
  13. struct sockaddr_in *sin = (struct sockaddr_in *) sa;
  14. if (inet_ntop(AF_INET, &sin->sin_addr, str, sizeof(str)) == NULL)
  15. return(NULL);
  16. if (ntohs(sin->sin_port) != 0) {
  17. snprintf(portstr, sizeof(portstr), ":%d", ntohs(sin->sin_port));
  18. strcat(str, portstr);
  19. }
  20. return(str);
  21. }
  22. /* end sock_ntop */
  23. #ifdef IPV6
  24. case AF_INET6: {
  25. struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) sa;
  26. str[0] = '[';
  27. if (inet_ntop(AF_INET6, &sin6->sin6_addr, str + 1, sizeof(str) - 1) == NULL)
  28. return(NULL);
  29. if (ntohs(sin6->sin6_port) != 0) {
  30. snprintf(portstr, sizeof(portstr), "]:%d", ntohs(sin6->sin6_port));
  31. strcat(str, portstr);
  32. return(str);
  33. }
  34. return (str + 1);
  35. }
  36. #endif
  37. #ifdef AF_UNIX
  38. case AF_UNIX: {
  39. struct sockaddr_un *unp = (struct sockaddr_un *) sa;
  40. /* OK to have no pathname bound to the socket: happens on
  41. every connect() unless client calls bind() first. */
  42. if (unp->sun_path[0] == 0)
  43. strcpy(str, "(no pathname bound)");
  44. else
  45. snprintf(str, sizeof(str), "%s", unp->sun_path);
  46. return(str);
  47. }
  48. #endif
  49. #ifdef HAVE_SOCKADDR_DL_STRUCT
  50. case AF_LINK: {
  51. struct sockaddr_dl *sdl = (struct sockaddr_dl *) sa;
  52. if (sdl->sdl_nlen > 0)
  53. snprintf(str, sizeof(str), "%*s (index %d)",
  54. sdl->sdl_nlen, &sdl->sdl_data[0], sdl->sdl_index);
  55. else
  56. snprintf(str, sizeof(str), "AF_LINK, index=%d", sdl->sdl_index);
  57. return(str);
  58. }
  59. #endif
  60. default:
  61. snprintf(str, sizeof(str), "sock_ntop: unknown AF_xxx: %d, len %d",
  62. sa->sa_family, salen);
  63. return(str);
  64. }
  65. return (NULL);
  66. }
  67. char *
  68. Sock_ntop(const struct sockaddr *sa, socklen_t salen)
  69. {
  70. char *ptr;
  71. if ( (ptr = sock_ntop(sa, salen)) == NULL)
  72. err_sys("sock_ntop error"); /* inet_ntop() sets errno */
  73. return(ptr);
  74. }