]> git.g-eek.se Git - interimap.git/commitdiff
Net::IMAP::InterIMAP: call shutdown(2) on teardown also for type=tunnel.
authorGuilhem Moulin <guilhem@fripost.org>
Tue, 28 May 2019 13:47:10 +0000 (15:47 +0200)
committerGuilhem Moulin <guilhem@fripost.org>
Tue, 28 May 2019 13:47:10 +0000 (15:47 +0200)
Since we now use socketpair(2) for type=tunnel (instead of a pair of
unnamed pipes) we can unify communication endpoints creation and
teardown.

lib/Net/IMAP/InterIMAP.pm

index 1dd54b78344649e37d4c0cb9a7a297b7787f7c2c..111537ca7d69d63726db8c654406a8b7db1615d7 100644 (file)
@@ -26,7 +26,8 @@ use Errno qw/EEXIST EINTR/;
 use Net::SSLeay 1.73 ();
 use List::Util qw/all first/;
 use POSIX ':signal_h';
-use Socket qw/SOCK_STREAM SOCK_RAW IPPROTO_TCP AF_UNIX AF_INET AF_INET6 PF_UNSPEC SOCK_CLOEXEC :addrinfo/;
+use Socket qw/SOCK_STREAM SOCK_RAW SOCK_CLOEXEC IPPROTO_TCP SHUT_RDWR
+              AF_UNIX AF_INET AF_INET6 PF_UNSPEC :addrinfo/;
 
 use Exporter 'import';
 BEGIN {
@@ -506,7 +507,7 @@ sub stats($) {
 }
 
 
-# Log out when the Net::IMAP::InterIMAP object is destroyed.
+# Destroy a Net::IMAP::InterIMAP object.
 sub DESTROY($) {
     my $self = shift;
     $self->{_STATE} = 'LOGOUT';
@@ -514,8 +515,12 @@ sub DESTROY($) {
     Net::SSLeay::free($self->{_SSL}) if defined $self->{_SSL};
     Net::SSLeay::CTX_free($self->{_SSL_CTX}) if defined $self->{_SSL_CTX};
 
-    shutdown($self->{S}, 2) if $self->{type} ne 'tunnel' and defined $self->{S};
-    $self->{S}->close() if defined $self->{S} and $self->{S}->opened();
+    if (defined (my $s = $self->{S})) {
+        # for type=tunnel we assume the child won't linger around once
+        # we close its standard input and output.
+        shutdown($s, SHUT_RDWR);
+        $s->close() if $s->opened();
+    }
     $self->stats() unless $self->{quiet};
 }