[Mew-dist 10960] RPOP/IPv6 patch
Hajimu UMEMOTO ( 梅本 肇 )
ume at example.com
1999年 10月 16日 (土) 23:09:45 JST
梅本@IMASYです。
IPv6 の時代になってもこんなもの使うのかとお叱りを受けそうですが、
RPOP を IPv6 でも使えるようにするパッチです。im-132 からの差分になって
います。
-------------- next part --------------
--- IM/TcpTransaction.pm.orig Sat Oct 16 22:14:08 1999
+++ IM/TcpTransaction.pm Sat Oct 16 22:27:12 1999
@@ -44,7 +44,7 @@
=cut
use vars qw($Cur_server $Session_log $TcpSockName
- $SOCK @Response $Logging @SockPool);
+ $SOCK @Response $Logging @SockPool @Sock6Pool);
BEGIN {
$Cur_server = '';
$Session_log = '';
@@ -192,7 +192,7 @@
foreach $he_addr (@he_addrs) {
if ($root && unixp()) {
- my $name = priv_sock();
+ my $name = priv_sock($family);
if ($name eq '') {
im_err("privilege port pool is empty.\n");
return '';
@@ -411,6 +411,13 @@
sub pool_priv_sock ($) {
my $count = shift;
+
+ pool_priv_sock_af($count, AF_INET);
+ pool_priv_sock_af($count, inet6_family());
+}
+
+sub pool_priv_sock_af ($$) {
+ my ($count, $family) = @_;
my $privport = 1023;
no strict 'refs'; # XXX
@@ -420,14 +427,22 @@
$pe_proto = 6;
}
while ($count--) {
- unless (socket(*{$TcpSockName}, AF_INET, SOCK_STREAM, $pe_proto)) {
+ unless (socket(*{$TcpSockName}, $family, SOCK_STREAM, $pe_proto)) {
im_err("socket creation failed: $!.\n");
return -1;
}
while ($privport > 0) {
- my $ANYADDR = pack('C4', 0, 0, 0, 0);
+ my ($ANYADDR, $psin);
+
im_debug("binding port $privport.\n") if (&debug('tcp'));
- my $psin = pack_sockaddr_in($privport, $ANYADDR);
+ if ($family == AF_INET) {
+ $ANYADDR = pack('C4', 0, 0, 0, 0);
+ $psin = pack_sockaddr_in($privport, $ANYADDR);
+ } else {
+ $ANYADDR = pack('C16', 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0);
+ $psin = inet6_pack_sockaddr_in6($family, $privport, $ANYADDR);
+ }
last if (bind (*{$TcpSockName}, $psin));
im_warn("privileged socket binding failed: $!.\n")
if (&debug('tcp'));
@@ -438,15 +453,27 @@
return -1;
}
im_notice("pool_priv_sock: $TcpSockName got\n");
- push(@SockPool, $TcpSockName);
+ if ($family == AF_INET) {
+ push(@SockPool, $TcpSockName);
+ } else {
+ push(@Sock6Pool, $TcpSockName);
+ }
$TcpSockName++;
}
return 0;
}
-sub priv_sock () {
- return '' if ($#SockPool < 0);
- my $sock_name = shift(@SockPool);
+sub priv_sock ($) {
+ my ($family) = shift;
+ my ($sock_name);
+
+ if ($family == AF_INET) {
+ return '' if ($#SockPool < 0);
+ $sock_name = shift(@SockPool);
+ } else {
+ return '' if ($#Sock6Pool < 0);
+ $sock_name = shift(@Sock6Pool);
+ }
im_notice("priv_sock: $sock_name\n");
return $sock_name;
}
-------------- next part --------------
梅本 肇 @ インターネット互助会横浜
ume at example.com ume at example.com http://www.imasy.org/~ume/
プログラムは書いた人の意図ではなく書かれた通り動く
Mew-dist メーリングリストの案内