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
---
>