ctcp/dcc/gate.plm
diff NAT対応版 まえ版の設定ファイルと互換性ナッシング
4,6d3 < # < # ver date by note < # 2.39.1 05.10.25 Magical.H Resume 対応途中 14,16d10 < # Resume 要求用途のローカルデータベース < local( @lname, @lhost, @lport ); < 207,208d200 < < # 送信先($user)が取得できていない場合は適当にひろう 221,222d212 < < # 許可ユーザかどうかの判定 224c214 < @msg = &client_gate($clientno, $user, $params[0], split(/\s+/, $params[1])); --- > @msg = &client_gate($clientno, $user, split(/\s+/, $params[1])); 227,228d216 < # DCCしたことを全クライアントへ案内する < &infomation("*** DCC Gate ($params[1]) to $params[0]"); 285,286c273 < # ACCEPTによるポート変更に対応 < if ($sno = &'connect($lhost[$listenno], $lport[$listenno])) { --- > if ($sno = &'connect($params[2], $params[3])) { 303,305c290,291 < # (特殊対応) 相手からの SENDを受け取るのは get.plmを使用する < if ("\L$params[0]\E" eq 'chat') { < $lno = &listen_hoge() || return @params; --- > if ("\L$params[0]\E" eq 'send' || "\L$params[0]\E" eq 'chat') { > $lno = &'listen(0, 1) || return @params; 314,324c300 < # &'c_print($cno, $prefix, 'PRIVMSG', $'nick[$cno], "\cA" . join(' ', 'DCC', @params) . "\cA"); < return @params; < } < } elsif ("\L$params[0]\E" eq 'resume') { < # RESUME name port size < foreach $lno (&'array($dcclistenlist)) { < $port = (&'sockname($lno))[0]; < next unless $port == $params[2]; < &infomation("*** DCC Gate \L$params[0]\E WAN $params[2] <-> LAN $lport[$lno] $lname[$lno]"); < $params[2] = $lport[$lno]; < return @params; --- > &'c_print($cno, $prefix, 'PRIVMSG', $'nick[$cno], "\cA" . join(' ', 'DCC', @params) . "\cA"); 325a302 > return (); 327d303 < # CANCEL name ip port 344,345c320,321 < local($clientno, $prefix, $target, @params) = @_; < local($lno, $host, $port, $sno, $cno); --- > local($clientno, $prefix, @params) = @_; > local($lno, $host, $port, $sno); 347,358c323,324 < if ("\L$params[0]\E" eq 'chat') { < $lno = &listen_hoge() || return @params; < $userno[$lno] = $'userno[$clientno]; < $request[$lno] = &'list(@params); < $lport[$lno] = $params[3]; < $dcclistenlist = &'add($dcclistenlist, $lno); < $params[2] = &get_plumaddr($clientno); < $params[3] = (&'sockname($lno))[0]; < < } elsif ("\L$params[0]\E" eq 'send') { < # ファイル送信要求 < $lno = &listen_hoge() || return @params; --- > if ("\L$params[0]\E" eq 'send' || "\L$params[0]\E" eq 'chat') { > $lno = &'listen(0, 1) || return @params; 361,369d326 < < # ListenNoとClientSocketを関連づける < $lname[$lno] = $params[1]; < $lhost[$lno] = $params[2]; < $lport[$lno] = $params[3]; < < $lhostname[$lno] = (&'peername($clientno))[2]; < < # 既送信ユーザリストに追加 Resume のタメ 371,372c328 < < $params[2] = &get_plumaddr($clientno); --- > $params[2] = (&'sockname($sno))[1]; 374,391d329 < < # 全ローカルクライアントに向けて 送信メッセージ受信の旨つたえる < &infomation("*** DCC Gate \L$params[0]\E $params[1] -> $target"); < < } elsif ("\L$params[0]\E" eq 'accept') { < < # 続きこっからくれー(RESUME要求)に対する よいにょ(ACCEPT応答) < local( $ollno , $nwlno ); < < # 認知済クライアントリストよりポートが同一の物であれば、ACCEPT応答をバイパス < foreach $ollno (&'array($dcclistenlist)) { < next unless $lport[$ollno] == $params[2]; < $params[2] = (&'sockname($ollno))[0]; < &infomation("*** DCC Gate \L$params[0]\E (@params) -> $target"); < return @params; < } < return (); # 認知済リストより一致する物が無ければキャンセル < 411,454d348 < sub infomation { < local($message) = @_; < local($cno); < < foreach $cno (&'array($'clientlist)) { < next unless $'avail[$cno]; < &'c_print($cno, '', 'NOTICE', $'nick[$cno], $message ); < } < } < < sub parse_ip { < local($ip) = @_; < local(@addr); < if ($ip =~ /^\d+$/) { < return $ip; < } elsif ($ip =~ /^[\d\.]+$/) { < @addr = split(/\./, $ip); < return unpack('N', pack('C4', @addr, 0, 0, 0)); < } else { < return unpack('N', (gethostbyname($ip))[4] || "\0\0\0\0"); < } < return 0 unless $ip; < } < < sub listen_hoge { < $swap = &'property($userno, 'swap'); < ($addr, $list) = split(/\:/, $swap); < @port = split(/\,/, $list || ''); < return &'listen($port[rand(@port)] || 0, 1 ); < } < < sub get_plumaddr { < local($clientno) = @_; < < local($addr, $sno ); < $sno = $'server[$clientno]; < < $addr = &'property($userno, 'swap'); < ($addr, $list) = split(/\:/, $swap); < return &parse_ip($addr) if($addr); < < return (&'sockname($sno))[1]; < } < 518,522d411 < <DT> ctcp.dcc.gate.swap グローバルアドレス < </DT> < <DD> 静的NATでプライベートアドレスのサーバの場合、 < swapに記述されたグローバルアドレスに置換することができます。 < </DD> 534d422 < ctcp.dcc.gate.swap: nanoha.com:26660,26661,26662,26663,26664,26665 544c432 < 送りもとアドレスはnanoha.com < ぽーとは 26660 〓 26665 --- >