addr.c
上传用户:sddyfurun
上传日期:2007-01-04
资源大小:525k
文件大小:6k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /* Copyright (c) 1995,1996,1997 NEC Corporation.  All rights reserved.       */
  2. /*                                                                           */
  3. /* The redistribution, use and modification in source or binary forms of     */
  4. /* this software is subject to the conditions set forth in the copyright     */
  5. /* document ("Copyright") included with this distribution.                   */
  6. /*
  7.  * $Id: addr.c,v 1.21 1997/06/16 15:29:35 steve Exp $
  8.  */
  9. #include "socks5p.h"
  10. #include "threads.h"
  11. #include "addr.h"
  12. #include "log.h"
  13. IFTHREADED(extern MUTEX_T gh_mutex;)
  14. IFTHREADED(extern MUTEX_T gs_mutex;)
  15. /* Given a name return the network ordered address associated with that      */
  16. /* name or INVALIDADDR (-1) on an error.                                     */
  17. int lsName2Addr(const char *name, S5NetAddr *na) {
  18.     struct hostent *hp;
  19.     if (!name || *name == '' || !strcmp(name, "-")) {
  20. return -1;
  21.     }
  22.     /* XXX needs IPv6 support eventually                                     */
  23.     memset(&na->sin, 0, sizeof(ssi));
  24.     na->sin.sin_family      = AF_INET;
  25.     na->sin.sin_addr.s_addr = INVALIDADDR;
  26.     if ((na->sin.sin_addr.s_addr = inet_addr((char *)name)) != INVALIDADDR) {
  27. return 0;
  28.     }
  29.     
  30.     MUTEX_LOCK(gh_mutex);
  31.     if ((hp = REAL(gethostbyname)(name))) memcpy(&na->sin.sin_addr.s_addr, hp->h_addr_list[0], hp->h_length);
  32.     MUTEX_UNLOCK(gh_mutex);
  33.     return hp?0:-1;
  34. }
  35. /* Given a name return the network ordered port associated with that name,   */
  36. /* or INVALIDPORT (-1) on an error.                                          */
  37. int lsName2Port(const char *name, const char *proto, u_short *port) {
  38.     struct servent *sp;
  39.     if (isdigit(*name)) {
  40. *port = (u_short)atoi(name);
  41. *port = htons(*port);
  42. return 0;
  43.     }
  44.     MUTEX_LOCK(gs_mutex);
  45.     if ((sp = getservbyname((char *)name, proto))) *port = sp->s_port;
  46.     MUTEX_UNLOCK(gs_mutex);
  47.     if (sp) return 0;
  48.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_WARNING, 0, "Unresolvable service name: %s", name);
  49.     *port = INVALIDPORT;
  50.     return -1;
  51. }
  52. /* Return 0 if the address is NULL                                            */
  53. int lsAddrIsNull(const S5NetAddr *addr) {
  54.     int rval = 0;
  55.     switch (addr->sa.sa_family) {
  56. case AF_S5NAME:
  57.     if (*addr->sn.sn_name != '') rval = -1;
  58.     break;
  59. case AF_INET:
  60.     if (addr->sin.sin_addr.s_addr != INADDR_ANY && addr->sin.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) rval = -1;
  61.     break;
  62. #ifdef HAVE_NETINET6_IN6_H
  63. case AF_INET6:
  64.     if (addr->sin6.sin6_addr != INADDR_ANY && addr->sin6.sin6_addr != htonl(INADDR_LOOPBACK)) rval = -1;
  65.     break;
  66. #endif
  67. default:
  68.     break;
  69.     }
  70.     return rval;
  71. }
  72. int lsAddrComp(const S5NetAddr *a1, const S5NetAddr *a2) {
  73.     if (a1->sa.sa_family != a2->sa.sa_family) return -1;
  74.     switch (a1->sa.sa_family) {
  75. case AF_S5NAME:
  76.     if (a1->sn.sn_port != a2->sn.sn_port) return -1;
  77.     return strcmp(a1->sn.sn_name, a2->sn.sn_name);
  78. case AF_INET:
  79.     if (a1->sin.sin_port != a2->sin.sin_port) return -1;
  80.     return memcmp(&a1->sin.sin_addr, &a2->sin.sin_addr, sizeof(struct in_addr));
  81. #ifdef HAVE_NETINET6_IN6_H
  82. case AF_INET6:
  83.     if (a1->sin6.sin6_port != a2->sin6.sin6_port) return -1;
  84.     return memcmp(&a1->sin6.sin6_addr, &a2->sin6.sin6_addr, sizeof(struct in_addr6));
  85. #endif
  86. default:
  87.     return -1;
  88.     }
  89. }
  90. int lsAddrAddrComp(const S5NetAddr *a1, const S5NetAddr *a2) {
  91.     if (a1->sa.sa_family != a2->sa.sa_family) return -1;
  92.     switch (a1->sa.sa_family) {
  93. case AF_S5NAME:
  94.     return strcmp(a1->sn.sn_name, a2->sn.sn_name);
  95. case AF_INET:
  96.     return memcmp(&a1->sin.sin_addr, &a2->sin.sin_addr, sizeof(struct in_addr));
  97. #ifdef HAVE_NETINET6_IN6_H
  98. case AF_INET6:
  99.     return memcmp(&a1->sin6.sin6_addr, &a2->sin6.sin6_addr, sizeof(struct in_addr6));
  100. #endif
  101. default:
  102.     return -1;
  103.     }
  104. }
  105. void lsAddrCopy(S5NetAddr *dest, const S5NetAddr *src, int len) {
  106.     memcpy(dest, src, MIN(len, lsAddrSize(src)));
  107. }
  108. const char *lsAddr2Ascii(const S5NetAddr *na) {
  109.     switch (na->sa.sa_family) {
  110. case AF_S5NAME:
  111.     return na->sn.sn_name;
  112. case AF_INET:
  113.     return inet_ntoa(na->sin.sin_addr);
  114. #ifdef HAVE_NETINET6_IN6_H
  115. case AF_INET6:
  116.     return addr2ascii(AF_INET6, (char *)&na->sin6.sin6_addr, sizeof(struct in_addr6), NULL);
  117. #endif
  118. default:
  119.     return "";
  120.     }
  121. }
  122. u_short lsAddr2Port(const S5NetAddr *na) {
  123.     switch (na->sa.sa_family) {
  124. case AF_S5NAME:
  125.     return na->sn.sn_port;
  126. case AF_INET:
  127.     return na->sin.sin_port;
  128. #ifdef HAVE_NETINET6_IN6_H
  129. case AF_INET6:
  130.     return na->sin6.sin6_port;
  131. #endif
  132. default:
  133.     return (u_short)0;
  134.     }
  135. }
  136. void lsAddrSetPort(S5NetAddr *na, u_short port) {
  137.     switch (na->sa.sa_family) {
  138. case AF_S5NAME:
  139.     na->sn.sn_port = port;
  140. case AF_INET:
  141.     na->sin.sin_port = port;
  142. #ifdef HAVE_NETINET6_IN6_H
  143. case AF_INET6:
  144.     na->sin6.sin6_port = port;
  145. #endif
  146.     }
  147. }
  148. const char *lsAddr2Ptr(const S5NetAddr *na) {
  149.     switch (na->sa.sa_family) {
  150. case AF_S5NAME:
  151.     return na->sn.sn_name;
  152. case AF_INET:
  153.     return (char *)&na->sin.sin_addr;
  154. #ifdef HAVE_NETINET6_IN6_H
  155. case AF_INET6:
  156.     return (char *)&na->sin6.sin6_addr;
  157. #endif
  158. default:
  159.     return (char *)&na->sa.sa_data;
  160.     }
  161. }
  162.     
  163. int lsAddrAddrSize(const S5NetAddr *na) {
  164.     switch (na->sa.sa_family) {
  165. case AF_S5NAME:
  166.     return strlen(na->sn.sn_name);
  167. case AF_INET:
  168.     return sizeof(struct in_addr);
  169. #ifdef HAVE_NETINET6_IN6_H
  170. case AF_INET6:
  171.     return sizeof(struct in_addr6);
  172. #endif
  173. default:
  174.     return 0;
  175.     }
  176. }
  177. int lsAddrSize(const S5NetAddr *na) {
  178.     switch (na->sa.sa_family) {
  179. case AF_S5NAME:
  180.     return sizeof(ssn);
  181. case AF_INET:
  182.     return sizeof(ssi);
  183. #ifdef HAVE_NETINET6_IN6_H
  184. case AF_INET6:
  185.     return sizeof(ssi6);
  186. #endif
  187. default:
  188.     return 0;
  189.     }
  190. }