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

代理服务器

开发平台:

Unix_Linux

  1. /* Copyright (c) 1996 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. #include "socks5p.h"
  7. #include "buffer.h"
  8. #include "addr.h"
  9. #include "protocol.h"
  10. #include "wrap.h"
  11. #include "msg.h"
  12. #include "share.h"
  13. #define BUFLEN 2048
  14. static sig_atomic_t hadsigint = 0;
  15. static RETSIGTYPE HandleINT() {
  16.     hadsigint = 1;
  17. }
  18. int DataRelay(S5IOHandle sd, S5IOInfo *cinfo, int ischild) {
  19.     u_char msgbuf[BUFLEN];
  20.     int n, rval = 0;
  21.     Signal(SIGINT,  HandleINT);
  22.     Signal(SIGQUIT, HandleINT);
  23.     
  24.     for (;;) {
  25. n = S5IORecv(sd, cinfo, msgbuf, BUFLEN, 0, 0, NULL);
  26. if (n == 0) break;
  27. if (n < 0 && errno != EINTR) {
  28.     if (ischild) kill(ischild, SIGINT);
  29.     rval = -1;
  30.     break;
  31. }
  32. if (n < 0 && hadsigint) {
  33.     rval = -1;
  34.     if (ischild) kill(ischild, SIGINT);
  35.     else {
  36.         msgbuf[0] = '';
  37.         if (S5IOSend(sd, cinfo, msgbuf, 1, MSG_OOB, S5_IOFLAGS_RESTART|S5_IOFLAGS_NBYTES, NULL) != 1) break;
  38.     }
  39.     hadsigint = 0;
  40.     continue;
  41. } else if (n < 0) {
  42.     if (ischild) kill(ischild, SIGINT);
  43.     rval = -1;
  44.     break;
  45. }
  46. if (S5IOSend(STDOUT_FILENO, NULL, msgbuf, n, 0, S5_IOFLAGS_RESTART|S5_IOFLAGS_NBYTES, NULL) < 0) {
  47.     if (ischild) kill(ischild, SIGINT);
  48.     rval = -1;
  49.     break;
  50. }
  51.     }
  52.     Signal(SIGINT,  SIG_DFL);
  53.     Signal(SIGQUIT, SIG_DFL);
  54.     return rval;
  55. }