lib_protocol.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: protocol.c,v 1.48 1999/05/25 17:22:34 michaels Exp $";
  46. char *
  47. sockshost2mem(host, mem, version)
  48. const struct sockshost_t *host;
  49. char *mem;
  50. int version;
  51. {
  52. switch (version) {
  53. case SOCKS_V4:
  54. case SOCKS_V4REPLY_VERSION:
  55. SASSERTX(host->atype == SOCKS_ADDR_IPV4);
  56. /* DSTPORT */
  57. memcpy(mem, &host->port, sizeof(host->port));
  58. mem += sizeof(host->port);
  59. /* DSTIP */
  60. memcpy(mem, &host->addr.ipv4, sizeof(host->addr.ipv4));
  61. mem += sizeof(host->addr.ipv4);
  62. break;
  63. case SOCKS_V5:
  64. /* ATYP */
  65. memcpy(mem, &host->atype, sizeof(host->atype));
  66. mem += sizeof(host->atype);
  67. switch (host->atype) {
  68. case SOCKS_ADDR_IPV4:
  69. memcpy(mem, &host->addr.ipv4.s_addr,
  70. sizeof(host->addr.ipv4.s_addr));
  71. mem += sizeof(host->addr.ipv4.s_addr);
  72. break;
  73. case SOCKS_ADDR_IPV6:
  74. memcpy(mem, &host->addr.ipv6, sizeof(host->addr.ipv6));
  75. mem += sizeof(host->addr.ipv6);
  76. break;
  77. case SOCKS_ADDR_DOMAIN:
  78. /* first byte gives length of rest. */
  79. *mem = (char)strlen(host->addr.domain);
  80. memcpy(mem + 1, host->addr.domain, (size_t)*mem);
  81. mem += *mem + 1;
  82. break;
  83. default:
  84. SERRX(host->atype);
  85. }
  86. /* DST.PORT */
  87. memcpy(mem, &host->port, sizeof(host->port));
  88. mem += sizeof(host->port);
  89. break;
  90. default:
  91. SERRX(version);
  92. }
  93. return mem;
  94. }
  95. const char *
  96. mem2sockshost(host, mem, len, version)
  97. struct sockshost_t *host;
  98. const char *mem;
  99. size_t len;
  100. int version;
  101. {
  102. const char *function = "mem2sockshost()";
  103. switch (version) {
  104. case SOCKS_V5:
  105. if (len < sizeof(host->atype))
  106. return NULL;
  107. memcpy(&host->atype, mem, sizeof(host->atype));
  108. mem += sizeof(host->atype);
  109. len -= sizeof(host->atype);
  110. switch (host->atype) {
  111. case SOCKS_ADDR_IPV4:
  112. if (len < sizeof(host->addr.ipv4))
  113. return NULL;
  114. memcpy(&host->addr.ipv4, mem, sizeof(host->addr.ipv4));
  115. mem += sizeof(host->addr.ipv4);
  116. len -= sizeof(host->addr.ipv4);
  117. break;
  118. case SOCKS_ADDR_DOMAIN: {
  119. size_t domainlen = (size_t)*mem;
  120. mem += sizeof(*mem);
  121. OCTETIFY(domainlen);
  122. if (len < domainlen + 1) /* +1 for NUL to be added. */
  123. return NULL;
  124. SASSERTX(domainlen < sizeof(host->addr.domain));
  125. memcpy(host->addr.domain, mem, domainlen);
  126. host->addr.domain[domainlen] = NUL;
  127. mem += domainlen;
  128. len -= domainlen + 1; /* +1 for added NUL. */
  129. break;
  130. }
  131. case SOCKS_ADDR_IPV6:
  132. slog(LOG_INFO, "%s: ipv6 not supported", function);
  133. return NULL;
  134. default:
  135. slog(LOG_INFO, "%s: unknown atype field: %d",
  136. function, host->atype);
  137. return NULL;
  138. }
  139. if (len < sizeof(host->port))
  140. return NULL;
  141. memcpy(&host->port, mem, sizeof(host->port));
  142. mem += sizeof(host->port);
  143. len -= sizeof(host->port);
  144. break;
  145. default:
  146. SERRX(version);
  147. }
  148. return mem;
  149. }