udp_util.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: udp_util.c,v 1.40 1999/12/14 11:45:39 michaels Exp $";
  46. struct udpheader_t *
  47. sockaddr2udpheader(to, header)
  48. const struct sockaddr *to;
  49. struct udpheader_t *header;
  50. {
  51. SASSERTX(to->sa_family == AF_INET);
  52. bzero(header, sizeof(*header));
  53. fakesockaddr2sockshost(to, &header->host);
  54. return header;
  55. }
  56. char *
  57. udpheader_add(host, msg, len, msgsize)
  58. const struct sockshost_t *host;
  59. char *msg;
  60. size_t *len;
  61. size_t msgsize;
  62. {
  63. /* const char *function = "udpheader_add()"; */
  64. struct udpheader_t header;
  65. char *newmsg, *offset;
  66. bzero(&header, sizeof(header));
  67. header.host = *host;
  68. if (msgsize >= sizeof(*newmsg) * (*len + PACKETSIZE_UDP(&header)))
  69. newmsg = msg;
  70. else
  71. if ((newmsg = (char *)malloc(sizeof(*newmsg)
  72. * (*len + PACKETSIZE_UDP(&header)))) == NULL)
  73. return NULL;
  74. /* offset old contents by size of header we are about to prefix. */
  75. memmove(newmsg + PACKETSIZE_UDP(&header), msg, *len);
  76. offset = newmsg;
  77. memcpy(offset, &header.flag, sizeof(header.flag));
  78. offset += sizeof(header.flag);
  79. memcpy(offset, &header.frag, sizeof(header.frag));
  80. offset += sizeof(header.frag);
  81. offset = sockshost2mem(&header.host, offset, SOCKS_V5);
  82. offset += *len; /* len bytes copied above. */
  83. *len = offset - newmsg;
  84. return newmsg;
  85. }
  86. struct udpheader_t *
  87. string2udpheader(data, len, header)
  88. const char *data;
  89. size_t len;
  90. struct udpheader_t *header;
  91. {
  92. bzero(header, sizeof(*header));
  93. if (len < sizeof(header->flag))
  94. return NULL;
  95. memcpy(&header->flag, data, sizeof(header->flag));
  96. data += sizeof(header->flag);
  97. len -= sizeof(header->flag);
  98. if (len < sizeof(header->frag))
  99. return NULL;
  100. memcpy(&header->frag, data, sizeof(header->frag));
  101. data += sizeof(header->frag);
  102. len -= sizeof(header->frag);
  103. if ((data = mem2sockshost(&header->host, data, len, SOCKS_V5)) == NULL)
  104. return NULL;
  105. return header;
  106. }