/crypto/heimdal/lib/roken/getnameinfo.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 124 lines · 79 code · 10 blank · 35 comment · 25 complexity · 1045b6585f176c47ef955cfc44fb87b5 MD5 · raw file

  1. /*
  2. * Copyright (c) 1999 - 2001 Kungliga Tekniska Hรถgskolan
  3. * (Royal Institute of Technology, Stockholm, Sweden).
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. *
  13. * 2. Redistributions in binary form must reproduce the above copyright
  14. * notice, this list of conditions and the following disclaimer in the
  15. * documentation and/or other materials provided with the distribution.
  16. *
  17. * 3. Neither the name of the Institute nor the names of its contributors
  18. * may be used to endorse or promote products derived from this software
  19. * without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
  22. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24. * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
  25. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31. * SUCH DAMAGE.
  32. */
  33. #include <config.h>
  34. #include "roken.h"
  35. static int
  36. doit (int af,
  37. const void *addr,
  38. size_t addrlen,
  39. int port,
  40. char *host, size_t hostlen,
  41. char *serv, size_t servlen,
  42. int flags)
  43. {
  44. if (host != NULL) {
  45. if (flags & NI_NUMERICHOST) {
  46. if (inet_ntop (af, addr, host, hostlen) == NULL)
  47. return EAI_SYSTEM;
  48. } else {
  49. struct hostent *he = gethostbyaddr (addr,
  50. addrlen,
  51. af);
  52. if (he != NULL) {
  53. strlcpy (host, hostent_find_fqdn(he), hostlen);
  54. if (flags & NI_NOFQDN) {
  55. char *dot = strchr (host, '.');
  56. if (dot != NULL)
  57. *dot = '\0';
  58. }
  59. } else if (flags & NI_NAMEREQD) {
  60. return EAI_NONAME;
  61. } else if (inet_ntop (af, addr, host, hostlen) == NULL)
  62. return EAI_SYSTEM;
  63. }
  64. }
  65. if (serv != NULL) {
  66. if (flags & NI_NUMERICSERV) {
  67. snprintf (serv, servlen, "%u", ntohs(port));
  68. } else {
  69. const char *proto = "tcp";
  70. struct servent *se;
  71. if (flags & NI_DGRAM)
  72. proto = "udp";
  73. se = getservbyport (port, proto);
  74. if (se == NULL) {
  75. snprintf (serv, servlen, "%u", ntohs(port));
  76. } else {
  77. strlcpy (serv, se->s_name, servlen);
  78. }
  79. }
  80. }
  81. return 0;
  82. }
  83. /*
  84. *
  85. */
  86. ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
  87. getnameinfo(const struct sockaddr *sa, socklen_t salen,
  88. char *host, size_t hostlen,
  89. char *serv, size_t servlen,
  90. int flags)
  91. {
  92. switch (sa->sa_family) {
  93. #ifdef HAVE_IPV6
  94. case AF_INET6 : {
  95. const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sa;
  96. return doit (AF_INET6, &sin6->sin6_addr, sizeof(sin6->sin6_addr),
  97. sin6->sin6_port,
  98. host, hostlen,
  99. serv, servlen,
  100. flags);
  101. }
  102. #endif
  103. case AF_INET : {
  104. const struct sockaddr_in *sin4 = (const struct sockaddr_in *)sa;
  105. return doit (AF_INET, &sin4->sin_addr, sizeof(sin4->sin_addr),
  106. sin4->sin_port,
  107. host, hostlen,
  108. serv, servlen,
  109. flags);
  110. }
  111. default :
  112. return EAI_FAMILY;
  113. }
  114. }