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

代理服务器

开发平台:

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: packet.c,v 1.11.4.1 1998/10/09 15:43:13 steve Exp $
  8.  */
  9. #include "socks5p.h"
  10. #include "threads.h"
  11. #include "daemon.h"
  12. #include "packet.h"
  13. #include "log.h"
  14. static const char *Addr2Ascii(const S5NetAddr *na) {
  15.     switch (na->sa.sa_family) {
  16. case AF_S5NAME:
  17.     return na->sn.sn_name;
  18. case AF_INET:
  19.     return inet_ntoa(na->sin.sin_addr);
  20. default:
  21.     return "";
  22.     }
  23. }
  24. static u_short Addr2Port(const S5NetAddr *na) {
  25.     switch (na->sa.sa_family) {
  26. case AF_S5NAME:
  27.     return na->sn.sn_port;
  28. case AF_INET:
  29.     return na->sin.sin_port;
  30. default:
  31.     return (u_short)0;
  32.     }
  33. }
  34. #define AddrAndPort(x)     Addr2Ascii((x)), ntohs(Addr2Port((x)))
  35. static int PacketPrintFilter(S5Packet *inPacket, S5Packet *outPacket, S5LinkInfo *pri, void *option, int *dir, int *action) {
  36.     register u_int i,j;
  37.     register char *sp;
  38.     char buf[1024];
  39.     /* Since we are only worried about what comes in, if this wasn't the     */
  40.     /* result of a read, return -1, indicating we did nothing...             */
  41.     if (*action != S5_ACTION_READ || !option) {
  42. return -1;
  43.     }
  44.     /* Ok the output of this packet, but print it first...                   */
  45.     *outPacket = *inPacket;
  46.     *action    = S5_ACTION_WRITE;
  47.     /* Print out a header showing who sent what...                           */
  48.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_INFO, 0, "PacketPrint: Sender: %s:%d", AddrAndPort((*dir == S5_DIRECTION_OUT)?&pri->srcAddr:&pri->dstAddr));
  49.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_INFO, 0, "PacketPrint: Recver: %s:%d", AddrAndPort((*dir == S5_DIRECTION_OUT)?&pri->dstAddr:&pri->srcAddr));
  50.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_INFO, 0, "PacketPrint: Packet contents (%d chars):", inPacket->off);
  51.     sprintf(buf, "PacketPrint:     ");
  52.     j = strlen("PacketPrint:     ");
  53.     /* Print out the data contained in the packet...                         */
  54.     for (i = 0, sp = inPacket->data; i < inPacket->off; i++, sp++) {
  55. if (isprint(*sp) && *sp != 'n') {
  56.     sprintf(buf+j, "%c", *sp);
  57.     j++;
  58. } else if (j + 3 > 80) {
  59.     i--; sp--;
  60.     j += 3;
  61. } else {
  62.     sprintf(buf+j, "\%02x", (u_char)*sp);
  63.     j += 3;
  64. }
  65. /* Try to break around 80 characters or when there was a newline in  */
  66. /* the string itself...                                              */
  67. if (j > 80 || *sp == 'n') {
  68.     S5LogUpdate(S5LogDefaultHandle, S5_LOG_INFO, 0, "%s", buf);
  69.     sprintf(buf, "PacketPrint:     ");
  70.     j = strlen("PacketPrint:     ");
  71. }
  72.     }
  73.     return 0;
  74. }
  75. int PacketPrintSetup(S5LinkInfo *li, S5FilterInfo *finfo) {
  76.     MUTEX_LOCK(env_mutex);
  77.     finfo->option = getenv("SOCKS5_PRINTPACKET")?(void *)-1:0;
  78.     MUTEX_UNLOCK(env_mutex);
  79.     if (!finfo->option) {
  80. finfo->filter = NULL;
  81. finfo->clean  = NULL;
  82. return -1;
  83.     } else {
  84. finfo->filter = PacketPrintFilter;
  85. finfo->clean  = NULL;
  86. return 0;
  87.     }
  88. }