[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 メーリングリストの案内