undef $wpid;
rdx($WR);
}
close($SO);
if(!$part){for(1..$#LIM){ex($_) if(CNT($_,1)&&!$pid)}}
(socket($SO,PF_INET,SOCK_STREAM,PROTO_TCP)&&
timeouts($SO,$timeout[0],$timeout[0])&&
setsockopt($SO,SOL_SOCKET,SO_REUSEADDR,pack("l",1))) ||ex($#LIM);
select(undef,undef,undef,3) until(connect($SO,defined($ad[4])?$ad[4]:sockaddr_in($ad[2],inet_aton($ad[1]))));
select($SO);$|=1;select(STDOUT);
if($prox[0] eq "socks4a"){
binmode($SO);
(print($SO pack("CCnCCCCZ*Z*",4,1,$h[2],0,0,0,1,"T$pid","$h[1]"))&&
read($SO,$s,8)&&
substr($s,1,1) eq chr(0x5a))||goto CONN1
}
timeouts($SO,$timeout[1],$timeout[1]);
$part||CNT(1,-1);
if($part||!($duplex && ($wpid=fork))){
print($SO "POST $h[3]?$serve=$part$pid HTTP/1.1\nHost: $h[1]:$h[2]\nUser-Agent: tonnel.cgi\nContent-Length: ".(length($header)+length($content)+$len)."\nAccept: $dtype\nConnection: close$hprox\n\n$header$content")||goto EX1;
if(defined($len)){
fcopy($len,$IN,$SO)||goto EX1;
close($IN);
}
if(defined($wpid)){
EX1:
defined($wpid)||goto CONN1;
close($SO);
print $WW wrx($$) if(defined($WW));
exit;
}
}
undef $header;
undef $content;
my %E1=();
$s=<$SO>.'x';
$s=~s/^HTTP\/\d+\.\d+\s+(\d+)\s+.*$/$1/s;
undef $s if($s ne '200');
CONN2:if(!defined($s)){$part||CNT(2,-1);goto CONN1}
timeouts($SO,$timeout[2],$timeout[3]);
while(!eof($SO) && $s ne ''){
defined($s=<$SO>)||goto CONN2;
$s=~s/[\r\n]//gs;
$s=~s/^(.*?)\: (.*)$/$E1{uc($1)}=$2;'-'/se;
}
goto PART if($part);
CNT(2,-1);
$s=1;
$pid=rdx($SO);
my $n=$ndx;
%ENV=();
while(!eof($SO) && $s ne ''){
defined($s=<$SO>)||goto CONN1;
$n+=length($s);
$s=~s/[\r\n]//gs;
$s=~s/^(.*?)\: (.*)$/$ENV{$1}=$2;'-'/se;
}
$part||CNT(3,-1);
close($IN);
pipe($IN,my $OUT);
if(!fork){
*STDIN=$SO;
select(*STDOUT=$OUT);
$|=1;
close($IN);
$0=$ENV{SCRIPT_NAME};
#${^TAINT}=1;
&cgi_proxy;
close($SO);
close($OUT);
exit;
}
close($OUT);
close($REQ);
undef $len;
undef $part;
$s=1;
while(!eof($IN) && $s ne ''){
defined($s=<$IN>)||goto PART;
$header.=$s;
$s=~s/[\r\n]//gs;
$s=~s/^content-length\: (.*)$/$len=$1/sei;
}
goto CONN1 if(defined($len));
binmode($IN);
PART:
if(!defined(read($IN,$content,$split))||eof($IN)){
close($IN);
undef $part;
}else{
$part='-';
}
goto CONN1;
}
### /daemon
O_split:
print splitme(@ARGV);
=4= |