www.pudn.com > socks5.zip > share.c


/* Copyright (c) 1996 NEC Corporation.  All rights reserved.                 */ 
/*                                                                           */ 
/* The redistribution, use and modification in source or binary forms of     */ 
/* this software is subject to the conditions set forth in the copyright     */ 
/* document ("COPYRIGHT") included with this distribution.                   */ 
#include "socks5p.h" 
#include "buffer.h" 
#include "addr.h" 
#include "protocol.h" 
#include "wrap.h" 
#include "msg.h" 
#include "share.h" 
 
#define BUFLEN 2048 
 
static sig_atomic_t hadsigint = 0; 
 
static RETSIGTYPE HandleINT() { 
    hadsigint = 1; 
} 
 
int DataRelay(S5IOHandle sd, S5IOInfo *cinfo, int ischild) { 
    u_char msgbuf[BUFLEN]; 
    int n, rval = 0; 
 
    Signal(SIGINT,  HandleINT); 
    Signal(SIGQUIT, HandleINT); 
     
    for (;;) { 
	n = S5IORecv(sd, cinfo, msgbuf, BUFLEN, 0, 0, NULL); 
 
	if (n == 0) break; 
 
	if (n < 0 && errno != EINTR) { 
	    if (ischild) kill(ischild, SIGINT); 
	    rval = -1; 
	    break; 
	} 
 
	if (n < 0 && hadsigint) { 
	    rval = -1; 
	    if (ischild) kill(ischild, SIGINT); 
	    else { 
	        msgbuf[0] = '\0'; 
	        if (S5IOSend(sd, cinfo, msgbuf, 1, MSG_OOB, S5_IOFLAGS_RESTART|S5_IOFLAGS_NBYTES, NULL) != 1) break; 
	    } 
 
	    hadsigint = 0; 
	    continue; 
	} else if (n < 0) { 
	    if (ischild) kill(ischild, SIGINT); 
	    rval = -1; 
	    break; 
	} 
 
	if (S5IOSend(STDOUT_FILENO, NULL, msgbuf, n, 0, S5_IOFLAGS_RESTART|S5_IOFLAGS_NBYTES, NULL) < 0) { 
	    if (ischild) kill(ischild, SIGINT); 
	    rval = -1; 
	    break; 
	} 
    } 
 
    Signal(SIGINT,  SIG_DFL); 
    Signal(SIGQUIT, SIG_DFL); 
 
    return rval; 
}