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

代理服务器

开发平台:

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: info.c,v 1.42.4.3 1998/07/19 22:47:08 wlu Exp $
  8.  */
  9. /* This file has the code for dealing with the global protocol variables.    */
  10. #include "socks5p.h"
  11. #include "threads.h"
  12. #include "daemon.h"
  13. #include "validate.h"
  14. #include "info.h"
  15. #include "log.h"
  16. /* Return a malloc'd string representing the closest thing you can get to a  */
  17. /* Hostname for ia...                                                        */
  18. /*                                                                           */
  19. /* Arguments: ia, the address whose name we are looking up...                */
  20. void GetName(char *name, S5NetAddr *addr) {
  21.     const char *res = NULL, *eres;
  22.     const struct hostent *hp = NULL;
  23.     memset(name, 0, S5_HOSTNAME_SIZE);
  24.     if (addr->sa.sa_family == AF_S5NAME) {
  25.      strncpy(name, addr->sn.sn_name, MIN(strlen(addr->sn.sn_name)+1, S5_HOSTNAME_SIZE));
  26.      if (strlen(addr->sn.sn_name)+1 > S5_HOSTNAME_SIZE) name[S5_HOSTNAME_SIZE-1] = '';
  27. return;
  28.     }
  29.     MUTEX_LOCK(env_mutex);
  30.     eres = getenv("SOCKS5_REVERSEMAP");
  31.     MUTEX_UNLOCK(env_mutex);
  32.     if (eres) {
  33. MUTEX_LOCK(gh_mutex);
  34. hp = gethostbyaddr((char *)&addr->sin.sin_addr, sizeof(struct in_addr), AF_INET);
  35. if (!hp) { MUTEX_UNLOCK(gh_mutex); }
  36. else res = hp->h_name;
  37.     }
  38.     if (res != NULL || (res = lsAddr2Ascii(addr)) != NULL) {
  39.      strncpy(name, res, MIN(strlen(res)+1, S5_HOSTNAME_SIZE));
  40.      if (strlen(res)+1 > S5_HOSTNAME_SIZE) name[S5_HOSTNAME_SIZE-1] = '';
  41.     }
  42.     if (!hp) return;
  43.     MUTEX_UNLOCK(gh_mutex);
  44. }
  45. /* Returns a malloc'd string representing the closest then you can get to a  */
  46. /* Service name for port.                                                    */
  47. /*                                                                           */
  48. /* Arguments: port, the port whose service name we are looking up...         */
  49. void GetServ(char *name, u_short port, char *proto) {
  50.     struct servent *srv;
  51.     char *tmp;
  52.     memset(name, 0, S5_APPNAME_SIZE);
  53.     MUTEX_LOCK(env_mutex);
  54.     tmp = getenv("SOCKS5_SERVICENAME");
  55.     MUTEX_UNLOCK(env_mutex);
  56.     MUTEX_LOCK(gs_mutex);
  57.     if (tmp && (srv = getservbyport(port, proto))) {
  58. strncpy(name, srv->s_name, MIN(strlen(srv->s_name)+1, S5_APPNAME_SIZE));
  59. if (strlen(srv->s_name)+1 > S5_APPNAME_SIZE) name[S5_APPNAME_SIZE-1] = '';
  60.     } else {
  61. sprintf(name, "%d", (int)ntohs(port));
  62.     }
  63.     MUTEX_UNLOCK(gs_mutex);
  64. }
  65. /* Resolves any hosts/services which were passed by name instead of by       */
  66. /* address, if there are any...Also it finds out which socks server to use   */
  67. /* and logs an error if it cannot pass the name to the next one (i.e. the    */
  68. /* next one is not a socks5 serve).                                          */
  69. /*                                                                           */
  70. /* Globals Used/Affected: dstsin -- filled in with destination address...    */
  71. /*                        scksin -- filled in with server address...         */
  72. int ResolveNames(S5LinkInfo *pri) {
  73.     S5NetAddr tmp;
  74.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: Starting");
  75.     pri->retName[0] = '';
  76.     memset((char *)&pri->retAddr, 0, sizeof(pri->retAddr));
  77.     pri->retAddr.sa.sa_family = AF_INET;
  78.     pri->retAddr.sin.sin_addr.s_addr = INVALIDADDR;
  79.     
  80.     /* If the destination address is of type S5NAME, copy the name to        */
  81.     /* pri->retAddr, resolve the name and copy the reslved address to both   */
  82.     /* pri->dstAddr and pri->retAddr...                                      */
  83.     /*                                                                       */
  84.     /* If the destination address is of type INET, copy the address to       */
  85.     /* pri->retAddr, reverse map the name and copy the mapped name to        */
  86.     /* pri->retName...                                                       */
  87.     if (pri->dstAddr.sa.sa_family == AF_S5NAME) {
  88. S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve names: Unresolved host name: %s", pri->dstAddr.sn.sn_name);
  89.   strncpy(pri->retName, pri->dstAddr.sn.sn_name, MIN(strlen(pri->dstAddr.sn.sn_name) + 1, S5_HOSTNAME_SIZE));
  90. if (strlen(pri->dstAddr.sn.sn_name) + 1 > S5_HOSTNAME_SIZE) pri->retName[S5_HOSTNAME_SIZE-1] = '';
  91. if (!lsName2Addr(pri->dstAddr.sn.sn_name, &tmp)) {
  92.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: host name: %s is %s", pri->dstAddr.sn.sn_name, lsAddr2Ascii(&tmp));
  93.     lsAddrSetPort(&tmp, lsAddr2Port(&pri->dstAddr));
  94.     lsAddrCopy(&pri->dstAddr, &tmp, lsAddrSize(&tmp));
  95.          lsAddrCopy(&pri->retAddr, &pri->dstAddr, lsAddrSize(&pri->dstAddr));
  96. } else {
  97.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: Unresolved host name: %s still unresolved", pri->dstAddr.sn.sn_name);
  98.     lsAddrSetPort(&pri->retAddr, lsAddr2Port(&pri->dstAddr));
  99. }
  100.         GetName(pri->dstName, &pri->dstAddr);
  101.     } else {
  102. if (pri->dstAddr.sin.sin_addr.s_addr != INADDR_ANY &&
  103. !(pri->dstAddr.sin.sin_addr.s_addr & inet_addr("255.255.255.0"))) {
  104.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: Wrong host: %s", lsAddr2Ascii(&pri->dstAddr));
  105.     return -1;
  106. }
  107.      lsAddrCopy(&pri->retAddr, &pri->dstAddr, lsAddrSize(&pri->dstAddr));
  108.         GetName(pri->dstName, &pri->dstAddr);
  109. if (inet_addr(pri->dstName) == INVALIDADDR) strcpy(pri->retName, pri->dstName);
  110.     }
  111.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: Looking up service name");
  112.     GetServ(pri->dstServ, lsAddr2Port(&pri->dstAddr), (pri->peerCommand == SOCKS_UDP)?"udp":"tcp");
  113.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: Looking up next proxy");
  114.     GetProxy(&pri->dstAddr, pri->dstName, (pri->peerCommand == SOCKS_UDP)?"udp":"tcp", pri->altSckAddrs, &pri->nAltSckAddrs, &pri->nextVersion);
  115.     if (pri->nextVersion) {
  116. lsAddrCopy(&pri->sckAddr, &pri->altSckAddrs[0], lsAddrSize(&pri->altSckAddrs[0]));
  117.      S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: Looking up next proxy's name");
  118.      GetName(pri->sckName, &pri->sckAddr);
  119. S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: Next Proxy: (%s:%d)", ADDRANDPORT(&pri->sckAddr));
  120.     } else {
  121. memset(&pri->sckAddr, 0, sizeof(pri->sckAddr));
  122. S5LogUpdate(S5LogDefaultHandle, S5_LOG_DEBUG(10), 0, "Resolve Names: No Next Proxy");
  123.     }
  124.     
  125.     return 0;
  126. }