Rgethostbyname.c
上传用户:zm130024
上传日期:2007-01-04
资源大小:432k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1997, 1998, 1999
  3.  *      Inferno Nettverk A/S, Norway.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. The above copyright notice, this list of conditions and the following
  9.  *    disclaimer must appear in all copies of the software, derivative works
  10.  *    or modified versions, and any portions thereof, aswell as in all
  11.  *    supporting documentation.
  12.  * 2. All advertising materials mentioning features or use of this software
  13.  *    must display the following acknowledgement:
  14.  *      This product includes software developed by
  15.  *      Inferno Nettverk A/S, Norway.
  16.  * 3. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  *
  19.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  20.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  21.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  22.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  23.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  24.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  28.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  *
  30.  * Inferno Nettverk A/S requests users of this software to return to
  31.  *
  32.  *  Software Distribution Coordinator  or  sdc@inet.no
  33.  *  Inferno Nettverk A/S
  34.  *  Oslo Research Park
  35.  *  Gaustadal閑n 21
  36.  *  N-0349 Oslo
  37.  *  Norway
  38.  *
  39.  * any improvements or extensions that they make and grant Inferno Nettverk A/S
  40.  * the rights to redistribute these changes.
  41.  *
  42.  */
  43. #include "common.h"
  44. static const char rcsid[] =
  45. "$Id: Rgethostbyname.c,v 1.21 1999/07/05 10:32:13 michaels Exp $";
  46. struct hostent *
  47. Rgethostbyname2(name, af)
  48. const char *name;
  49. int af;
  50. {
  51. /* const char *function = "Rgethostbyname2()"; */
  52. static struct hostent hostentmem;
  53. static char **addrlist;
  54. struct in_addr ipindex;
  55. struct hostent *hostent;
  56. /* needs to be done before gethostbyname calls. */
  57. clientinit();
  58. /* slog(LOG_DEBUG, "%s: %s", function, name); */
  59. switch (config.resolveprotocol) {
  60. case RESOLVEPROTOCOL_TCP:
  61. case RESOLVEPROTOCOL_UDP:
  62. #if HAVE_GETHOSTBYNAME2
  63. if ((hostent = gethostbyname2(name, af)) != NULL)
  64. #else
  65. if ((hostent = gethostbyname(name)) != NULL)
  66. #endif /* !HAVE_GETHOSTBYNAME2 */
  67. return hostent;
  68. break;
  69. case RESOLVEPROTOCOL_FAKE:
  70. hostent = NULL;
  71. h_errno = NO_RECOVERY;
  72. break;
  73. default:
  74. SERRX(config.resolveprotocol);
  75. }
  76. if (h_errno != NO_RECOVERY)
  77. return hostent;
  78. hostent = &hostentmem;
  79. /* anything that fails from here is due to resource shortage. */
  80. h_errno = TRY_AGAIN;
  81. free(hostent->h_name);
  82. if ((hostent->h_name = strdup(name)) == NULL)
  83. return NULL;
  84. hostent->h_aliases = NULL;
  85. hostent->h_addrtype = af;
  86. if (addrlist == NULL)
  87. /* * 2; NULL terminated. */
  88. if ((addrlist = (char **)malloc(sizeof(addrlist) * 2)) == NULL)
  89. return NULL;
  90. switch (af) {
  91. case AF_INET: {
  92. static char ipv4[4]; /* XXX */
  93. hostent->h_length = sizeof(ipv4);
  94. *addrlist = ipv4;
  95. break;
  96. }
  97. #ifdef SOCKS_IPV6
  98. case AF_INET6: {
  99. static char ipv6[16]; /* XXX */
  100. hostent->h_length = sizeof(ipv6);
  101. *addrlist = ipv6;
  102. break;
  103. }
  104. #endif  /* SOCKS_IPV6 */
  105. default:
  106. errno = ENOPROTOOPT;
  107. return NULL;
  108. }
  109. if ((ipindex.s_addr = socks_addfakeip(name)) == htonl(INADDR_NONE))
  110. return NULL;
  111. if (inet_pton(af, inet_ntoa(ipindex), *addrlist) != 1)
  112. return NULL;
  113. hostent->h_addr_list = addrlist++;
  114. *addrlist = NULL;
  115. return hostent;
  116. }
  117. struct hostent *
  118. Rgethostbyname(name)
  119. const char *name;
  120. {
  121. return Rgethostbyname2(name, AF_INET);
  122. }