I think my earlier patch for CPAN's #61577 and debian #659075 only
addressed the accept() case.  This is a replacement.

The attached patch should cover IO::Socket objects created via accept(),
new_from_fd(), new(), and anywhere else whose details haven't been
properly cached.

No new code should be executed on IO::Socket objects whose details are
already cached and present.

If there are problems that would prevent this change from being accepted
(either upstream or in debian), please let me know and i'll try to
address them.

Regards,

        --dkg

--- a/dist/IO/lib/IO/Socket.pm	2012-02-07 21:12:42.000000000 -0500
+++ b/dist/IO/lib/IO/Socket.pm	2012-02-09 00:54:14.000000000 -0500
@@ -336,18 +336,34 @@
 sub sockdomain {
     @_ == 1 or croak 'usage: $sock->sockdomain()';
     my $sock = shift;
+# FIXME: SO_DOMAIN should probably ultimately be included in Socket.pm
+# and the associated XS, but it isn't necessarily portable.  see:
+# https://mail.gnome.org/archives/commits-list/2011-September/msg00944.html
+    my $so_domain = 39; 
+    if (!defined(${*$sock}{'io_socket_domain'})) {
+	my $addr = $sock->getsockname();
+	if (defined($addr)) {
+	    ${*$sock}{'io_socket_domain'} = sockaddr_family($addr);
+	} else {
+	    ${*$sock}{'io_socket_domain'} = $sock->sockopt($so_domain)
+	}
+    }
     ${*$sock}{'io_socket_domain'};
 }
 
 sub socktype {
     @_ == 1 or croak 'usage: $sock->socktype()';
     my $sock = shift;
+    ${*$sock}{'io_socket_type'} = $sock->sockopt(SO_TYPE)
+	unless defined(${*$sock}{'io_socket_type'});
     ${*$sock}{'io_socket_type'}
 }
 
 sub protocol {
     @_ == 1 or croak 'usage: $sock->protocol()';
     my($sock) = @_;
+    ${*$sock}{'io_socket_proto'} = $sock->sockopt(SO_PROTOCOL)
+	unless defined(${*$sock}{'io_socket_proto'});
     ${*$sock}{'io_socket_proto'};
 }
 

Reply via email to