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

代理服务器

开发平台:

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: client.c,v 1.43 1999/12/22 09:29:22 karls Exp $";
  46. #if !HAVE_PROGNAME
  47. char *__progname = "danteclient";
  48. #endif
  49. int
  50. SOCKSinit(progname)
  51. char *progname;
  52. {
  53. __progname = progname;
  54. return 0;
  55. }
  56. void
  57. clientinit(void)
  58. {
  59. /* const char *function = "clientinit()"; */
  60. if (config.state.init)
  61. return;
  62. config.state.pid = getpid();
  63. if (issetugid())
  64. config.option.configfile = SOCKS_CONFIGFILE;
  65. else
  66. if ((config.option.configfile = getenv("SOCKS_CONF")) == NULL)
  67. config.option.configfile = SOCKS_CONFIGFILE;
  68. /*
  69.  * initialize misc options to sensible default.
  70.  */
  71. config.resolveprotocol = RESOLVEPROTOCOL_UDP;
  72. config.option.lbuf = 1;
  73. genericinit();
  74. slog(LOG_INFO, "%s/client v%s running", PACKAGE, VERSION);
  75. }
  76. int
  77. serverreplyisok(version, reply, route)
  78. int version;
  79. int reply;
  80. struct route_t *route;
  81. {
  82. const char *function = "serverreplyisok()";
  83. switch (version) {
  84. case SOCKS_V4:
  85. switch (reply) {
  86. case SOCKSV4_SUCCESS:
  87. return 1;
  88. case SOCKSV4_FAIL:
  89. errno = ECONNREFUSED;
  90. break;
  91. case SOCKSV4_NO_IDENTD:
  92. swarnx("%s: proxyserver failed to get your identd response",
  93. function);
  94. errno = ECONNREFUSED;
  95. return 0;
  96. case SOCKSV4_BAD_ID:
  97. swarnx("%s: proxyserver claims username/ident mismatch",
  98. function);
  99. errno = ECONNREFUSED;
  100. return 0;
  101. default:
  102. swarnx("%s: unknown v%d reply from proxyserver: %d",
  103. function, version, reply);
  104. errno = ECONNREFUSED;
  105. break;
  106. }
  107. break;
  108. case SOCKS_V5:
  109. switch (reply) {
  110. case SOCKS_SUCCESS:
  111. return 1;
  112. case SOCKS_FAILURE:
  113. swarnx("%s: unknown proxyserver failure", function);
  114. errno = ECONNREFUSED;
  115. break;
  116. case SOCKS_NOTALLOWED:
  117. swarnx("%s: connection denied by proxyserver", function);
  118. errno = ECONNREFUSED;
  119. return 0;
  120. case SOCKS_NETUNREACH:
  121. errno = ENETUNREACH;
  122. return 0;
  123. case SOCKS_HOSTUNREACH:
  124. errno = EHOSTUNREACH;
  125. return 0;
  126. case SOCKS_CONNREFUSED:
  127. errno = ECONNREFUSED;
  128. return 0;
  129. case SOCKS_TTLEXPIRED:
  130. errno = ETIMEDOUT;
  131. return 0;
  132. case SOCKS_CMD_UNSUPP:
  133. swarnx("%s: command not supported by proxyserver", function);
  134. errno = ECONNREFUSED;
  135. break;
  136. case SOCKS_ADDR_UNSUPP:
  137. swarnx("%s: address type not supported by proxyserver",
  138. function);
  139. errno = ECONNREFUSED;
  140. break;
  141. default:
  142. swarnx("%s: unknown v%d reply from proxyserver: %d",
  143. function, version, reply);
  144. errno = ECONNREFUSED;
  145. break;
  146. }
  147. break;
  148. case MSPROXY_V2:
  149. switch (reply) {
  150. case MSPROXY_SUCCESS:
  151. return 1;
  152. case MSPROXY_FAILURE:
  153. case MSPROXY_CONNREFUSED:
  154. errno = ECONNREFUSED;
  155. return 0;
  156. case MSPROXY_NOTALLOWED:
  157. swarnx("%s: connection denied by proxyserver: authenticated?",
  158. function);
  159. errno = ECONNREFUSED;
  160. return 0;
  161. default:
  162. swarnx("%s: unknown v%d reply from proxyserver: %d",
  163. function, version, reply);
  164. errno = ECONNREFUSED;
  165. return 0;
  166. }
  167. default:
  168. SERRX(version);
  169. }
  170. if (route != NULL)
  171. socks_badroute(route);
  172. return 0;
  173. }