Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package perl-IO-Async for openSUSE:Factory 
checked in at 2021-01-22 21:52:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-IO-Async (Old)
 and      /work/SRC/openSUSE:Factory/.perl-IO-Async.new.28504 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-IO-Async"

Fri Jan 22 21:52:43 2021 rev:3 rq:865987 version:0.78

Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-IO-Async/perl-IO-Async.changes      
2020-10-26 16:23:17.895272218 +0100
+++ /work/SRC/openSUSE:Factory/.perl-IO-Async.new.28504/perl-IO-Async.changes   
2021-01-22 21:53:01.569908829 +0100
@@ -1,0 +2,31 @@
+Fri Jan 22 11:01:01 UTC 2021 - Tina M??ller <[email protected]>
+
+- Remove patch 
IO-Async-0.77-Adjust-t-50resolver.t-test-for-an-unavailable-DNS-se.patch
+  (was applied upstream. https://rt.cpan.org/Public/Bug/Display.html?id=131109)
+
+-------------------------------------------------------------------
+Fri Jan 22 03:07:12 UTC 2021 - Tina M??ller <[email protected]>
+
+- updated to 0.78
+   see /usr/share/doc/packages/perl-IO-Async/Changes
+
+  0.78    2021-01-21
+          [CHANGES]
+           * Warn on attempts to ->connect to INADDR(6)_LOOPBACK as some OSes
+             (e.g. OpenBSD) do not allow it
+           * Various fixes for IO::Async::LoopTests to better support
+             IO::Async::Loop::UV:
+              + Insert some ->loop_once(0) calls between timing tests to allow
+                libuv to clear its pending queues
+              + Allow loops to declare that they cannot perform all-child PID
+                watch and skip the relevant tests for it if so
+           * Have $loop->later return a future instance if not passed any code
+             (RT133240)
+
+          [BUGFIXES]
+           * Accept more error codes for failure to resolve missing hostname
+             (RT131109)
+           * Defend against some undef values at global destruction time
+             (RT132677)
+
+-------------------------------------------------------------------

Old:
----
  IO-Async-0.77-Adjust-t-50resolver.t-test-for-an-unavailable-DNS-se.patch
  IO-Async-0.77.tar.gz

New:
----
  IO-Async-0.78.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-IO-Async.spec ++++++
--- /var/tmp/diff_new_pack.bkgCpL/_old  2021-01-22 21:53:02.177909691 +0100
+++ /var/tmp/diff_new_pack.bkgCpL/_new  2021-01-22 21:53:02.181909697 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package perl-IO-Async
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           perl-IO-Async
-Version:        0.77
+Version:        0.78
 Release:        0
 %define cpan_name IO-Async
 Summary:        Asynchronous event-driven programming
@@ -26,7 +26,6 @@
 URL:            https://metacpan.org/release/%{cpan_name}
 Source0:        
https://cpan.metacpan.org/authors/id/P/PE/PEVANS/%{cpan_name}-%{version}.tar.gz
 Source1:        cpanspec.yml
-Patch0:         
https://rt.cpan.org/Ticket/Attachment/1912750/1024503/IO-Async-0.77-Adjust-t-50resolver.t-test-for-an-unavailable-DNS-se.patch
 BuildArch:      noarch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  perl
@@ -61,7 +60,6 @@
 
 %prep
 %setup -q -n %{cpan_name}-%{version}
-%patch0 -p1
 
 %build
 perl Build.PL installdirs=vendor

++++++ IO-Async-0.77.tar.gz -> IO-Async-0.78.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/Changes new/IO-Async-0.78/Changes
--- old/IO-Async-0.77/Changes   2020-05-13 20:13:41.000000000 +0200
+++ new/IO-Async-0.78/Changes   2021-01-22 01:14:18.000000000 +0100
@@ -1,5 +1,24 @@
 Revision history for IO-Async
 
+0.78    2021-01-21
+        [CHANGES]
+         * Warn on attempts to ->connect to INADDR(6)_LOOPBACK as some OSes
+           (e.g. OpenBSD) do not allow it
+         * Various fixes for IO::Async::LoopTests to better support
+           IO::Async::Loop::UV:
+            + Insert some ->loop_once(0) calls between timing tests to allow
+              libuv to clear its pending queues
+            + Allow loops to declare that they cannot perform all-child PID
+              watch and skip the relevant tests for it if so
+         * Have $loop->later return a future instance if not passed any code
+           (RT133240)
+
+        [BUGFIXES]
+         * Accept more error codes for failure to resolve missing hostname
+           (RT131109)
+         * Defend against some undef values at global destruction time
+           (RT132677)
+
 0.77    2020-05-13
         [CHANGES]
          * Updated for Metrics::Any 0.05
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/LICENSE new/IO-Async-0.78/LICENSE
--- old/IO-Async-0.77/LICENSE   2020-05-13 20:13:41.000000000 +0200
+++ new/IO-Async-0.78/LICENSE   2021-01-22 01:14:18.000000000 +0100
@@ -1,4 +1,4 @@
-This software is copyright (c) 2020 by Paul Evans <[email protected]>.
+This software is copyright (c) 2021 by Paul Evans <[email protected]>.
 
 This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
@@ -12,7 +12,7 @@
 
 --- The GNU General Public License, Version 1, February 1989 ---
 
-This software is Copyright (c) 2020 by Paul Evans <[email protected]>.
+This software is Copyright (c) 2021 by Paul Evans <[email protected]>.
 
 This is free software, licensed under:
 
@@ -272,7 +272,7 @@
 
 --- The Artistic License 1.0 ---
 
-This software is Copyright (c) 2020 by Paul Evans <[email protected]>.
+This software is Copyright (c) 2021 by Paul Evans <[email protected]>.
 
 This is free software, licensed under:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/META.json new/IO-Async-0.78/META.json
--- old/IO-Async-0.77/META.json 2020-05-13 20:13:41.000000000 +0200
+++ new/IO-Async-0.78/META.json 2021-01-22 01:14:18.000000000 +0100
@@ -4,7 +4,7 @@
       "Paul Evans <[email protected]>"
    ],
    "dynamic_config" : 1,
-   "generated_by" : "Module::Build version 0.4224",
+   "generated_by" : "Module::Build version 0.4231",
    "license" : [
       "perl_5"
    ],
@@ -54,142 +54,142 @@
       },
       "IO::Async" : {
          "file" : "lib/IO/Async.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Channel" : {
          "file" : "lib/IO/Async/Channel.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Debug" : {
          "file" : "lib/IO/Async/Debug.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::File" : {
          "file" : "lib/IO/Async/File.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::FileStream" : {
          "file" : "lib/IO/Async/FileStream.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Function" : {
          "file" : "lib/IO/Async/Function.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Future" : {
          "file" : "lib/IO/Async/Future.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Handle" : {
          "file" : "lib/IO/Async/Handle.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Internals::ChildManager" : {
          "file" : "lib/IO/Async/Internals/ChildManager.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Listener" : {
          "file" : "lib/IO/Async/Listener.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Loop" : {
          "file" : "lib/IO/Async/Loop.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Loop::Poll" : {
          "file" : "lib/IO/Async/Loop/Poll.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Loop::Select" : {
          "file" : "lib/IO/Async/Loop/Select.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::LoopTests" : {
          "file" : "lib/IO/Async/LoopTests.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Metrics" : {
          "file" : "lib/IO/Async/Metrics.pm"
       },
       "IO::Async::Notifier" : {
          "file" : "lib/IO/Async/Notifier.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::OS" : {
          "file" : "lib/IO/Async/OS.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::OS::MSWin32" : {
          "file" : "lib/IO/Async/OS/MSWin32.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::OS::cygwin" : {
          "file" : "lib/IO/Async/OS/cygwin.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::OS::linux" : {
          "file" : "lib/IO/Async/OS/linux.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::PID" : {
          "file" : "lib/IO/Async/PID.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Process" : {
          "file" : "lib/IO/Async/Process.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Protocol" : {
          "file" : "lib/IO/Async/Protocol.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Protocol::LineStream" : {
          "file" : "lib/IO/Async/Protocol/LineStream.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Protocol::Stream" : {
          "file" : "lib/IO/Async/Protocol/Stream.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Resolver" : {
          "file" : "lib/IO/Async/Resolver.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Routine" : {
          "file" : "lib/IO/Async/Routine.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Signal" : {
          "file" : "lib/IO/Async/Signal.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Socket" : {
          "file" : "lib/IO/Async/Socket.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Stream" : {
          "file" : "lib/IO/Async/Stream.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Test" : {
          "file" : "lib/IO/Async/Test.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Timer" : {
          "file" : "lib/IO/Async/Timer.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Timer::Absolute" : {
          "file" : "lib/IO/Async/Timer/Absolute.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Timer::Countdown" : {
          "file" : "lib/IO/Async/Timer/Countdown.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       },
       "IO::Async::Timer::Periodic" : {
          "file" : "lib/IO/Async/Timer/Periodic.pm",
-         "version" : "0.77"
+         "version" : "0.78"
       }
    },
    "release_status" : "stable",
@@ -199,6 +199,6 @@
       ],
       "x_IRC" : "irc://irc.perl.org/#io-async"
    },
-   "version" : "0.77",
-   "x_serialization_backend" : "JSON::PP version 4.04"
+   "version" : "0.78",
+   "x_serialization_backend" : "JSON::PP version 4.05"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/META.yml new/IO-Async-0.78/META.yml
--- old/IO-Async-0.77/META.yml  2020-05-13 20:13:41.000000000 +0200
+++ new/IO-Async-0.78/META.yml  2021-01-22 01:14:18.000000000 +0100
@@ -12,7 +12,7 @@
 configure_requires:
   Module::Build: '0.4004'
 dynamic_config: 1
-generated_by: 'Module::Build version 0.4224, CPAN::Meta::Converter version 
2.150010'
+generated_by: 'Module::Build version 0.4231, CPAN::Meta::Converter version 
2.150010'
 license: perl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -23,108 +23,108 @@
     file: lib/Future/IO/Impl/IOAsync.pm
   IO::Async:
     file: lib/IO/Async.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Channel:
     file: lib/IO/Async/Channel.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Debug:
     file: lib/IO/Async/Debug.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::File:
     file: lib/IO/Async/File.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::FileStream:
     file: lib/IO/Async/FileStream.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Function:
     file: lib/IO/Async/Function.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Future:
     file: lib/IO/Async/Future.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Handle:
     file: lib/IO/Async/Handle.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Internals::ChildManager:
     file: lib/IO/Async/Internals/ChildManager.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Listener:
     file: lib/IO/Async/Listener.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Loop:
     file: lib/IO/Async/Loop.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Loop::Poll:
     file: lib/IO/Async/Loop/Poll.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Loop::Select:
     file: lib/IO/Async/Loop/Select.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::LoopTests:
     file: lib/IO/Async/LoopTests.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Metrics:
     file: lib/IO/Async/Metrics.pm
   IO::Async::Notifier:
     file: lib/IO/Async/Notifier.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::OS:
     file: lib/IO/Async/OS.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::OS::MSWin32:
     file: lib/IO/Async/OS/MSWin32.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::OS::cygwin:
     file: lib/IO/Async/OS/cygwin.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::OS::linux:
     file: lib/IO/Async/OS/linux.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::PID:
     file: lib/IO/Async/PID.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Process:
     file: lib/IO/Async/Process.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Protocol:
     file: lib/IO/Async/Protocol.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Protocol::LineStream:
     file: lib/IO/Async/Protocol/LineStream.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Protocol::Stream:
     file: lib/IO/Async/Protocol/Stream.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Resolver:
     file: lib/IO/Async/Resolver.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Routine:
     file: lib/IO/Async/Routine.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Signal:
     file: lib/IO/Async/Signal.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Socket:
     file: lib/IO/Async/Socket.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Stream:
     file: lib/IO/Async/Stream.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Test:
     file: lib/IO/Async/Test.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Timer:
     file: lib/IO/Async/Timer.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Timer::Absolute:
     file: lib/IO/Async/Timer/Absolute.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Timer::Countdown:
     file: lib/IO/Async/Timer/Countdown.pm
-    version: '0.77'
+    version: '0.78'
   IO::Async::Timer::Periodic:
     file: lib/IO/Async/Timer/Periodic.pm
-    version: '0.77'
+    version: '0.78'
 recommends:
   IO::Socket::IP: '0'
 requires:
@@ -142,5 +142,5 @@
 resources:
   IRC: irc://irc.perl.org/#io-async
   license: http://dev.perl.org/licenses/
-version: '0.77'
+version: '0.78'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Channel.pm 
new/IO-Async-0.78/lib/IO/Async/Channel.pm
--- old/IO-Async-0.77/lib/IO/Async/Channel.pm   2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Channel.pm   2021-01-22 01:14:18.000000000 
+0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Notifier );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Debug.pm 
new/IO-Async-0.78/lib/IO/Async/Debug.pm
--- old/IO-Async-0.77/lib/IO/Async/Debug.pm     2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Debug.pm     2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 our $DEBUG = $ENV{IO_ASYNC_DEBUG} || 0;
 our $DEBUG_FD   = $ENV{IO_ASYNC_DEBUG_FD};
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/File.pm 
new/IO-Async-0.78/lib/IO/Async/File.pm
--- old/IO-Async-0.77/lib/IO/Async/File.pm      2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/File.pm      2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Timer::Periodic );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/FileStream.pm 
new/IO-Async-0.78/lib/IO/Async/FileStream.pm
--- old/IO-Async-0.77/lib/IO/Async/FileStream.pm        2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/FileStream.pm        2021-01-22 
01:14:18.000000000 +0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Stream );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Function.pm 
new/IO-Async-0.78/lib/IO/Async/Function.pm
--- old/IO-Async-0.77/lib/IO/Async/Function.pm  2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Function.pm  2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Notifier );
 use IO::Async::Timer::Countdown;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Future.pm 
new/IO-Async-0.78/lib/IO/Async/Future.pm
--- old/IO-Async-0.77/lib/IO/Async/Future.pm    2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Future.pm    2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( Future );
 Future->VERSION( '0.05' ); # to respect subclassing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Handle.pm 
new/IO-Async-0.78/lib/IO/Async/Handle.pm
--- old/IO-Async-0.77/lib/IO/Async/Handle.pm    2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Handle.pm    2021-01-22 01:14:18.000000000 
+0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Notifier );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
@@ -497,7 +497,7 @@
          my $self = shift or return;
          my $future = shift;
 
-         @{ $self->{close_futures} } = grep { $_ != $future } @{ 
$self->{close_futures} };
+         @{ $self->{close_futures} } = grep { $_ and $_ != $future } @{ 
$self->{close_futures} };
       })
    );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Internals/ChildManager.pm 
new/IO-Async-0.78/lib/IO/Async/Internals/ChildManager.pm
--- old/IO-Async-0.77/lib/IO/Async/Internals/ChildManager.pm    2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/Internals/ChildManager.pm    2021-01-22 
01:14:18.000000000 +0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 # Not a notifier
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Internals/Connector.pm 
new/IO-Async-0.78/lib/IO/Async/Internals/Connector.pm
--- old/IO-Async-0.77/lib/IO/Async/Internals/Connector.pm       2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/Internals/Connector.pm       2021-01-22 
01:14:18.000000000 +0100
@@ -9,9 +9,9 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
-use Scalar::Util qw( weaken );
+use Scalar::Util qw( weaken blessed );
 
 use POSIX qw( EINPROGRESS );
 use Socket qw( SOL_SOCKET SO_ERROR );
@@ -23,7 +23,10 @@
 
 use Carp;
 
-use constant CONNECT_EWOULDLBOCK => IO::Async::OS->HAVE_CONNECT_EWOULDBLOCK;
+use constant {
+   CONNECT_EWOULDLBOCK => IO::Async::OS->HAVE_CONNECT_EWOULDBLOCK,
+   HAVE_SOCKADDR_IN6   => IO::Async::OS->HAVE_SOCKADDR_IN6,
+};
 
 # Internal constructor
 sub new
@@ -186,7 +189,36 @@
       );
    }
    elsif( exists $params{addrs} or exists $params{addr} ) {
-      $peeraddrfuture = $loop->new_future->done( exists $params{addrs} ? @{ 
$params{addrs} } : ( $params{addr} ) );
+      my @addrs = exists $params{addrs} ? @{ $params{addrs} } : ( 
$params{addr} );
+
+      # Warn about some common mistakes
+      foreach my $peer ( @addrs ) {
+         my ( $p_family, undef, undef, $p_addr ) = 
IO::Async::OS->extract_addrinfo( $peer );
+
+         local our @CARP_NOT = qw( IO::Async::Loop IO::Async::Handle );
+
+         if( $p_family == Socket::AF_INET ) {
+            carp "Connecting to 0.0.0.0 is non-portable and ill-advised"
+               if ( Socket::unpack_sockaddr_in  $p_addr )[1] eq 
Socket::INADDR_ANY;
+         }
+         elsif( HAVE_SOCKADDR_IN6 and $p_family == Socket::AF_INET6 ) {
+            carp "Connecting to :: is non-portable and ill-advised"
+               if ( Socket::unpack_sockaddr_in6 $p_addr )[1] eq 
Socket::IN6ADDR_ANY;
+         }
+      }
+
+      $peeraddrfuture = $loop->new_future->done( @addrs );
+   }
+   elsif( exists $params{peer} ) {
+      my $peer = delete $params{peer};
+      croak "Expected 'peer' to be an IO::Socket or subclass"
+         unless blessed $peer and $peer->isa( "IO::Socket" );
+
+      my $p_family = $peer->sockdomain;
+
+      $peeraddrfuture = $loop->new_future->done(
+         [ $p_family, $peer->socktype, $peer->protocol, 
IO::Async::OS->make_addr_for_peer( $p_family, $peer->sockname ) ]
+      );
    }
    else {
       croak "Expected 'host' and 'service' or 'addrs' or 'addr' arguments";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Listener.pm 
new/IO-Async-0.78/lib/IO/Async/Listener.pm
--- old/IO-Async-0.77/lib/IO/Async/Listener.pm  2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Listener.pm  2021-01-22 01:14:18.000000000 
+0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Handle );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use IO::Async::Handle;
 use IO::Async::OS;
@@ -412,7 +412,7 @@
 
 =head2 listen
 
-   $listener->listen( %params )
+   $listener->listen( %params )->get
 
 This method sets up a listening socket and arranges for the acceptor callback
 to be invoked each time a new connection is accepted on the socket.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Loop/Poll.pm 
new/IO-Async-0.78/lib/IO/Async/Loop/Poll.pm
--- old/IO-Async-0.77/lib/IO/Async/Loop/Poll.pm 2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Loop/Poll.pm 2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 use constant API_VERSION => '0.49';
 
 use base qw( IO::Async::Loop );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Loop/Select.pm 
new/IO-Async-0.78/lib/IO/Async/Loop/Select.pm
--- old/IO-Async-0.77/lib/IO/Async/Loop/Select.pm       2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/Loop/Select.pm       2021-01-22 
01:14:18.000000000 +0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 use constant API_VERSION => '0.49';
 
 use base qw( IO::Async::Loop );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Loop.pm 
new/IO-Async-0.78/lib/IO/Async/Loop.pm
--- old/IO-Async-0.77/lib/IO/Async/Loop.pm      2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Loop.pm      2021-01-22 01:14:18.000000000 
+0100
@@ -1,14 +1,14 @@
 #  You may distribute under the terms of either the GNU General Public License
 #  or the Artistic License (the same terms as Perl itself)
 #
-#  (C) Paul Evans, 2007-2020 -- [email protected]
+#  (C) Paul Evans, 2007-2021 -- [email protected]
 
 package IO::Async::Loop;
 
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 # When editing this value don't forget to update the docs below
 use constant NEED_API_VERSION => '0.33';
@@ -23,6 +23,9 @@
 # Does the loop implementation support IO_ASYNC_WATCHDOG?
 use constant _CAN_WATCHDOG => 0;
 
+# Does the loop support ->watch_process on PID 0 to observe all exits?
+use constant _CAN_WATCH_ALL_PIDS => 1;
+
 # Watchdog configuration constants
 use constant WATCHDOG_ENABLE   => $ENV{IO_ASYNC_WATCHDOG};
 use constant WATCHDOG_INTERVAL => $ENV{IO_ASYNC_WATCHDOG_INTERVAL} || 10;
@@ -873,6 +876,8 @@
 
    $loop->later( $code )
 
+   $f = $loop->later
+
 Schedules a code reference to be invoked as soon as the current round of IO
 operations is complete.
 
@@ -886,6 +891,11 @@
 parameter set to C<later>. It will return an ID value that can be passed to
 C<unwatch_idle> if required.
 
+I<Since version 0.78>: If no C<$code> value is passed, a L<Future> will be
+returned instead. This allows for constructs such as:
+
+   await $loop->later;
+
 =cut
 
 sub later
@@ -893,7 +903,17 @@
    my $self = shift;
    my ( $code ) = @_;
 
-   return $self->watch_idle( when => 'later', code => $code );
+   return $self->watch_idle( when => 'later', code => $code )
+      if $code;
+
+   my $f = $self->new_future;
+   my $id = $self->watch_idle( when => 'later', code => sub {
+      $f->done unless $f->is_ready;
+   } );
+   $f->on_cancel( sub {
+      $self->unwatch_idle( $id );
+   } );
+   return $f;
 }
 
 =head2 spawn_child
@@ -1519,6 +1539,13 @@
     ...
  );
 
+=item peer => IO
+
+Shortcut for constructing an address to connect to the given IO handle, which
+must be a L<IO::Socket> or subclass, and is presumed to be a local listening
+socket (perhaps on C<PF_UNIX> or C<PF_INET>). This is convenient for
+connecting to a local filehandle, for example during a unit test or similar.
+
 =item local_addrs => ARRAY
 
 =item local_addr => HASH or ARRAY
@@ -2939,6 +2966,13 @@
 If both a PID-specific and an all-process watch are installed, there is no
 ordering guarantee as to which will be called first.
 
+B<NOTE> that not all loop classes may be able to support the all-child watch.
+The basic Select and Poll-based classes provided by this distribution do, and
+those built on top of similar OS-specific mechanisms such as Linux's Epoll
+probably will, but typically those built on top of other event systems such
+as F<glib> or F<libuv> may not be able, as the underlying event system may not
+provide the necessary hooks to support it.
+
 =cut
 
 sub watch_process
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/LoopTests.pm 
new/IO-Async-0.78/lib/IO/Async/LoopTests.pm
--- old/IO-Async-0.77/lib/IO/Async/LoopTests.pm 2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/LoopTests.pm 2021-01-22 01:14:18.000000000 
+0100
@@ -1,7 +1,7 @@
 #  You may distribute under the terms of either the GNU General Public License
 #  or the Artistic License (the same terms as Perl itself)
 #
-#  (C) Paul Evans, 2009-2020 -- [email protected]
+#  (C) Paul Evans, 2009-2021 -- [email protected]
 
 package IO::Async::LoopTests;
 
@@ -28,7 +28,7 @@
 use Socket qw( sockaddr_family AF_UNIX );
 use Time::HiRes qw( time );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 # Abstract Units of Time
 use constant AUT => $ENV{TEST_QUICK_TIMERS} ? 0.1 : 1;
@@ -428,58 +428,71 @@
 
 sub run_tests_timer
 {
-   my $done = 0;
    # New watch/unwatch API
 
    cmp_ok( abs( $loop->time - time ), "<", 0.1, '$loop->time gives the current 
time' );
 
-   $loop->watch_time( after => 2 * AUT, code => sub { $done = 1; } );
+   # ->watch_time after
+   {
+      my $done;
+      $loop->watch_time( after => 2 * AUT, code => sub { $done = 1; } );
 
-   is_oneref( $loop, '$loop has refcount 1 after watch_time' );
+      is_oneref( $loop, '$loop has refcount 1 after watch_time' );
 
-   time_between {
-      my $now = time;
-      $loop->loop_once( 5 * AUT );
-
-      # poll might have returned just a little early, such that the TimerQueue
-      # doesn't think anything is ready yet. We need to handle that case.
-      while( !$done ) {
-         die "It should have been ready by now" if( time - $now > 5 * AUT );
-         $loop->loop_once( 0.1 * AUT );
-      }
-   } 1.5, 2.5, 'loop_once(5) while waiting for watch_time after';
+      time_between {
+         my $now = time;
+         $loop->loop_once( 5 * AUT );
 
-   $loop->watch_time( at => time + 2 * AUT, code => sub { $done = 2; } );
+         # poll might have returned just a little early, such that the 
TimerQueue
+         # doesn't think anything is ready yet. We need to handle that case.
+         while( !$done ) {
+            die "It should have been ready by now" if( time - $now > 5 * AUT );
+            $loop->loop_once( 0.1 * AUT );
+         }
+      } 1.5, 2.5, 'loop_once(5) while waiting for watch_time after';
+   }
 
-   time_between {
-      my $now = time;
-      $loop->loop_once( 5 * AUT );
-
-      # poll might have returned just a little early, such that the TimerQueue
-      # doesn't think anything is ready yet. We need to handle that case.
-      while( !$done ) {
-         die "It should have been ready by now" if( time - $now > 5 * AUT );
-         $loop->loop_once( 0.1 * AUT );
-      }
-   } 1.5, 2.5, 'loop_once(5) while waiting for watch_time at';
+   # ->watch_time at
+   {
+      my $done;
+      $loop->watch_time( at => time + 2 * AUT, code => sub { $done = 1; } );
 
-   my $cancelled_fired = 0;
-   my $id = $loop->watch_time( after => 1 * AUT, code => sub { 
$cancelled_fired = 1 } );
-   $loop->unwatch_time( $id );
-   undef $id;
+      time_between {
+         my $now = time;
+         $loop->loop_once( 5 * AUT );
 
-   $loop->loop_once( 2 * AUT );
+         # poll might have returned just a little early, such that the 
TimerQueue
+         # doesn't think anything is ready yet. We need to handle that case.
+         while( !$done ) {
+            die "It should have been ready by now" if( time - $now > 5 * AUT );
+            $loop->loop_once( 0.1 * AUT );
+         }
+      } 1.5, 2.5, 'loop_once(5) while waiting for watch_time at';
+   }
 
-   ok( !$cancelled_fired, 'unwatched watch_time does not fire' );
+   # cancelled timer
+   {
+      my $cancelled_fired = 0;
+      my $id = $loop->watch_time( after => 1 * AUT, code => sub { 
$cancelled_fired = 1 } );
+      $loop->unwatch_time( $id );
+      undef $id;
 
-   $loop->watch_time( after => -1, code => sub { $done = 1 } );
+      $loop->loop_once( 2 * AUT );
 
-   $done = 0;
+      ok( !$cancelled_fired, 'unwatched watch_time does not fire' );
+   }
 
-   time_between {
-      $loop->loop_once while !$done;
-   } 0, 0.1, 'loop_once while waiting for negative interval timer';
+   # ->watch_after negative time
+   {
+      my $done;
+      $loop->watch_time( after => -1, code => sub { $done = 1 } );
+
+      time_between {
+         $loop->loop_once while !$done;
+      } 0, 0.1, 'loop_once while waiting for negative interval timer';
+   }
 
+   # self-cancellation
    {
       my $done;
 
@@ -497,25 +510,6 @@
       is( $done, 1, 'Other timers still fire after self-cancelling one' );
    }
 
-   # Legacy enqueue/requeue/cancel API
-   $done = 0;
-
-   $loop->enqueue_timer( delay => 2 * AUT, code => sub { $done = 1; } );
-
-   is_oneref( $loop, '$loop has refcount 1 after enqueue_timer' );
-
-   time_between {
-      my $now = time;
-      $loop->loop_once( 5 * AUT );
-
-      # poll might have returned just a little early, such that the TimerQueue
-      # doesn't think anything is ready yet. We need to handle that case.
-      while( !$done ) {
-         die "It should have been ready by now" if( time - $now > 5 * AUT );
-         $loop->loop_once( 0.1 * AUT );
-      }
-   } 1.5, 2.5, 'loop_once(5) while waiting for timer';
-
    SKIP: {
       skip "Unable to handle sub-second timers accurately", 3 unless 
$loop->_CAN_SUBSECOND_ACCURATELY;
 
@@ -525,7 +519,7 @@
          my $count = 0;
          my $start = time;
 
-         $loop->enqueue_timer( delay => $delay, code => sub { $done++ } );
+         $loop->watch_timer( delay => $delay, code => sub { $done++ } );
 
          while( !$done ) {
             $loop->loop_once( 1 );
@@ -536,38 +530,6 @@
          is( $count, 1, "One ->loop_once(1) sufficient for a single $delay 
second timer" );
       }
    }
-
-   $cancelled_fired = 0;
-   $id = $loop->enqueue_timer( delay => 1 * AUT, code => sub { 
$cancelled_fired = 1 } );
-   $loop->cancel_timer( $id );
-   undef $id;
-
-   $loop->loop_once( 2 * AUT );
-
-   ok( !$cancelled_fired, 'cancelled timer does not fire' );
-
-   $id = $loop->enqueue_timer( delay => 1 * AUT, code => sub { $done = 2; } );
-   $id = $loop->requeue_timer( $id, delay => 2 * AUT );
-
-   $done = 0;
-
-   time_between {
-      $loop->loop_once( 1 * AUT );
-
-      is( $done, 0, '$done still 0 so far' );
-
-      my $now = time;
-      $loop->loop_once( 5 * AUT );
-
-      # poll might have returned just a little early, such that the TimerQueue
-      # doesn't think anything is ready yet. We need to handle that case.
-      while( !$done ) {
-         die "It should have been ready by now" if( time - $now > 5 * AUT );
-         $loop->loop_once( 0.1 * AUT );
-      }
-   } 1.5, 2.5, 'requeued timer of delay 2';
-
-   is( $done, 2, '$done is 2 after requeued timer' );
 }
 
 =head2 signal
@@ -696,6 +658,10 @@
 
    $loop->unwatch_idle( $id );
 
+   # Some loop types (e.g. UV) need to clear a pending queue first and thus the
+   # first loop_once will take zero time
+   $loop->loop_once( 0 );
+
    time_between { $loop->loop_once( 1 * AUT ) } 0.5, 1.5, 'loop_once(1) with 
unwatched deferral';
 
    is( $called, 2, 'unwatched deferral not called' );
@@ -777,16 +743,20 @@
       is( ($exitcode & 0x7f), SIGTERM, 'WTERMSIG($exitcode) after SIGTERM' );
    }
 
-   my %kids;
+   SKIP: {
+      my %kids;
+
+      $loop->_CAN_WATCH_ALL_PIDS or skip "Loop cannot watch_process for all 
PIDs", 2;
 
-   $loop->watch_process( 0 => sub { my ( $kid ) = @_; delete $kids{$kid} } );
+      $loop->watch_process( 0 => sub { my ( $kid ) = @_; delete $kids{$kid} } 
);
 
-   %kids = map { run_in_child { exit 0 } => 1 } 1 .. 3;
+      %kids = map { run_in_child { exit 0 } => 1 } 1 .. 3;
 
-   is( scalar keys %kids, 3, 'Waiting for 3 child processes' );
+      is( scalar keys %kids, 3, 'Waiting for 3 child processes' );
 
-   wait_for { !keys %kids };
-   ok( !keys %kids, 'All child processes reclaimed' );
+      wait_for { !keys %kids };
+      ok( !keys %kids, 'All child processes reclaimed' );
+   }
 
    # Legacy API name
    $kid = run_in_child { exit 2 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Notifier.pm 
new/IO-Async-0.78/lib/IO/Async/Notifier.pm
--- old/IO-Async-0.77/lib/IO/Async/Notifier.pm  2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Notifier.pm  2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 use Scalar::Util qw( weaken );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/OS/MSWin32.pm 
new/IO-Async-0.78/lib/IO/Async/OS/MSWin32.pm
--- old/IO-Async-0.77/lib/IO/Async/OS/MSWin32.pm        2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/OS/MSWin32.pm        2021-01-22 
01:14:18.000000000 +0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 our @ISA = qw( IO::Async::OS::_Base );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/OS/cygwin.pm 
new/IO-Async-0.78/lib/IO/Async/OS/cygwin.pm
--- old/IO-Async-0.77/lib/IO/Async/OS/cygwin.pm 2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/OS/cygwin.pm 2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 our @ISA = qw( IO::Async::OS::_Base );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/OS/linux.pm 
new/IO-Async-0.78/lib/IO/Async/OS/linux.pm
--- old/IO-Async-0.77/lib/IO/Async/OS/linux.pm  2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/OS/linux.pm  2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 our @ISA = qw( IO::Async::OS::_Base );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/OS.pm 
new/IO-Async-0.78/lib/IO/Async/OS.pm
--- old/IO-Async-0.77/lib/IO/Async/OS.pm        2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/OS.pm        2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 our @ISA = qw( IO::Async::OS::_Base );
 
@@ -527,6 +527,43 @@
 
 =cut
 
+=head2 make_addr_for_peer
+
+   $connectaddr = IO::Async::OS->make_addr_for_peer( $family, $listenaddr )
+
+Given the C<sockdomain> and C<sockname> of a listening socket. creates an
+address suitable to C<connect()> to it.
+
+This method will handle specially any C<AF_INET> address bound to
+C<INADDR_ANY> or any C<AF_INET6> address bound to C<IN6ADDR_ANY>, as some OSes
+do not allow C<connect(2)>ing to those and would instead insist on receiving
+C<INADDR_LOOPBACK> or C<IN6ADDR_LOOPBACK> respectively.
+
+This method is used by the C<< ->connect( peer => $sock ) >> parameter of
+handle and loop connect methods.
+
+=cut
+
+sub make_addr_for_peer
+{
+   shift;
+   my ( $p_family, $p_addr ) = @_;
+
+   if( $p_family == Socket::AF_INET ) {
+      my @params = Socket::unpack_sockaddr_in $p_addr;
+      $params[1] = Socket::INADDR_LOOPBACK if $params[1] eq Socket::INADDR_ANY;
+      return Socket::pack_sockaddr_in @params;
+   }
+   if( HAVE_SOCKADDR_IN6 and $p_family == Socket::AF_INET6 ) {
+      my @params = Socket::unpack_sockaddr_in6 $p_addr;
+      $params[1] = Socket::IN6ADDR_LOOPBACK if $params[1] eq 
Socket::IN6ADDR_ANY;
+      return Socket::pack_sockaddr_in6 @params;
+   }
+
+   # Most other cases should be fine
+   return $p_addr;
+}
+
 =head1 LOOP IMPLEMENTATION METHODS
 
 The following methods are provided on C<IO::Async::OS> because they are likely
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/PID.pm 
new/IO-Async-0.78/lib/IO/Async/PID.pm
--- old/IO-Async-0.77/lib/IO/Async/PID.pm       2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/PID.pm       2021-01-22 01:14:18.000000000 
+0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Notifier );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Process.pm 
new/IO-Async-0.78/lib/IO/Async/Process.pm
--- old/IO-Async-0.77/lib/IO/Async/Process.pm   2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Process.pm   2021-01-22 01:14:18.000000000 
+0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Notifier );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Protocol/LineStream.pm 
new/IO-Async-0.78/lib/IO/Async/Protocol/LineStream.pm
--- old/IO-Async-0.77/lib/IO/Async/Protocol/LineStream.pm       2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/Protocol/LineStream.pm       2021-01-22 
01:14:18.000000000 +0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Protocol::Stream );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Protocol/Stream.pm 
new/IO-Async-0.78/lib/IO/Async/Protocol/Stream.pm
--- old/IO-Async-0.77/lib/IO/Async/Protocol/Stream.pm   2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/Protocol/Stream.pm   2021-01-22 
01:14:18.000000000 +0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Protocol );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Protocol.pm 
new/IO-Async-0.78/lib/IO/Async/Protocol.pm
--- old/IO-Async-0.77/lib/IO/Async/Protocol.pm  2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Protocol.pm  2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Notifier );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Resolver.pm 
new/IO-Async-0.78/lib/IO/Async/Resolver.pm
--- old/IO-Async-0.77/lib/IO/Async/Resolver.pm  2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Resolver.pm  2021-01-22 01:14:18.000000000 
+0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Function );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 # Socket 2.006 fails to getaddrinfo() AI_NUMERICHOST properly on MSWin32
 use Socket 2.007 qw(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Routine.pm 
new/IO-Async-0.78/lib/IO/Async/Routine.pm
--- old/IO-Async-0.77/lib/IO/Async/Routine.pm   2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Routine.pm   2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Notifier );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Signal.pm 
new/IO-Async-0.78/lib/IO/Async/Signal.pm
--- old/IO-Async-0.77/lib/IO/Async/Signal.pm    2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Signal.pm    2021-01-22 01:14:18.000000000 
+0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Notifier );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Socket.pm 
new/IO-Async-0.78/lib/IO/Async/Socket.pm
--- old/IO-Async-0.77/lib/IO/Async/Socket.pm    2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Socket.pm    2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Handle );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Stream.pm 
new/IO-Async-0.78/lib/IO/Async/Stream.pm
--- old/IO-Async-0.77/lib/IO/Async/Stream.pm    2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Stream.pm    2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use base qw( IO::Async::Handle );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Test.pm 
new/IO-Async-0.78/lib/IO/Async/Test.pm
--- old/IO-Async-0.77/lib/IO/Async/Test.pm      2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Test.pm      2021-01-22 01:14:18.000000000 
+0100
@@ -8,7 +8,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Exporter 'import';
 our @EXPORT = qw(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Timer/Absolute.pm 
new/IO-Async-0.78/lib/IO/Async/Timer/Absolute.pm
--- old/IO-Async-0.77/lib/IO/Async/Timer/Absolute.pm    2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/Timer/Absolute.pm    2021-01-22 
01:14:18.000000000 +0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Timer );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Timer/Countdown.pm 
new/IO-Async-0.78/lib/IO/Async/Timer/Countdown.pm
--- old/IO-Async-0.77/lib/IO/Async/Timer/Countdown.pm   2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/Timer/Countdown.pm   2021-01-22 
01:14:18.000000000 +0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Timer );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Timer/Periodic.pm 
new/IO-Async-0.78/lib/IO/Async/Timer/Periodic.pm
--- old/IO-Async-0.77/lib/IO/Async/Timer/Periodic.pm    2020-05-13 
20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async/Timer/Periodic.pm    2021-01-22 
01:14:18.000000000 +0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Timer );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async/Timer.pm 
new/IO-Async-0.78/lib/IO/Async/Timer.pm
--- old/IO-Async-0.77/lib/IO/Async/Timer.pm     2020-05-13 20:13:41.000000000 
+0200
+++ new/IO-Async-0.78/lib/IO/Async/Timer.pm     2021-01-22 01:14:18.000000000 
+0100
@@ -9,7 +9,7 @@
 use warnings;
 use base qw( IO::Async::Notifier );
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 use Carp;
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/lib/IO/Async.pm 
new/IO-Async-0.78/lib/IO/Async.pm
--- old/IO-Async-0.77/lib/IO/Async.pm   2020-05-13 20:13:41.000000000 +0200
+++ new/IO-Async-0.78/lib/IO/Async.pm   2021-01-22 01:14:18.000000000 +0100
@@ -12,7 +12,7 @@
 # It is provided simply to keep CPAN happy:
 #   cpan -i IO::Async
 
-our $VERSION = '0.77';
+our $VERSION = '0.78';
 
 =head1 NAME
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/t/02os.t new/IO-Async-0.78/t/02os.t
--- old/IO-Async-0.77/t/02os.t  2020-05-13 20:13:41.000000000 +0200
+++ new/IO-Async-0.78/t/02os.t  2021-01-22 01:14:18.000000000 +0100
@@ -9,8 +9,11 @@
 use IO::Async::OS;
 
 use Socket qw(
-   AF_INET AF_INET6 AF_UNIX SOCK_STREAM SOCK_DGRAM SO_TYPE
-   pack_sockaddr_in pack_sockaddr_in6 pack_sockaddr_un inet_aton inet_pton
+   SOCK_STREAM SOCK_DGRAM SO_TYPE
+   AF_INET  pack_sockaddr_in  unpack_sockaddr_in
+   AF_INET6 pack_sockaddr_in6 unpack_sockaddr_in6
+   AF_UNIX  pack_sockaddr_un  unpack_sockaddr_un
+   inet_aton inet_pton inet_ntoa inet_ntop
    INADDR_ANY
 );
 
@@ -135,6 +138,18 @@
                      family  => "inet",
                      host    => "foobar.com",
                    } ) }, 'extract_addrinfo for inet complains about 
unrecognised key' );
+
+   # ->make_addr_for_peer should rewrite 0.0.0.0 to 127.0.0.1
+   my ( $port, $host ) = unpack_sockaddr_in(
+      IO::Async::OS->make_addr_for_peer( AF_INET, pack_sockaddr_in( 567, 
inet_aton( "0.0.0.0" ) ) )
+   );
+   is( $port,              567,         'make_addr_for_peer preserves AF_INET 
port' );
+   is( inet_ntoa( $host ), "127.0.0.1", 'make_addr_for_peer rewrites 
INADDR_ANY to _LOCALHOST' );
+
+   ( undef, $host ) = unpack_sockaddr_in(
+      IO::Async::OS->make_addr_for_peer( AF_INET, pack_sockaddr_in( 567, 
inet_aton( "1.2.3.4" ) ) )
+   );
+   is( inet_ntoa( $host ), "1.2.3.4",   'make_addr_for_peer preserves AF_INET 
other host' );
 }
 
 SKIP: {
@@ -149,6 +164,18 @@
                 } ) ],
               [ AF_INET6, SOCK_STREAM, 0, $sin6addr ],
               'extract_addrinfo( HASH ) with inet6, ip+port' );
+
+   # ->make_addr_for_peer should rewrite :: to ::1
+   my ( $port, $host ) = unpack_sockaddr_in6(
+      IO::Async::OS->make_addr_for_peer( AF_INET6, pack_sockaddr_in6( 567, 
inet_pton( AF_INET6, "::" ) ) )
+   );
+   is( $port,                        567,   'make_addr_for_peer preserves 
AF_INET6 port' );
+   is( inet_ntop( AF_INET6, $host ), "::1", 'make_addr_for_peer rewrites 
IN6ADDR_ANY to _LOCALHOST' );
+
+   ( undef, $host ) = unpack_sockaddr_in6(
+      IO::Async::OS->make_addr_for_peer( AF_INET6, pack_sockaddr_in6( 567, 
inet_pton( AF_INET6, "fe80::1234" ) ) )
+   );
+   is( inet_ntop( AF_INET6, $host ), "fe80::1234",   'make_addr_for_peer 
preserves AF_INET6 other host' );
 }
 
 SKIP: {
@@ -162,6 +189,12 @@
                 } ) ],
               [ AF_UNIX, SOCK_STREAM, 0, $sunaddr ],
               'extract_addrinfo( HASH ) with unix, path' );
+
+   # ->make_addr_for_peer should leave address undisturbed
+   my ( $path ) = unpack_sockaddr_un(
+      IO::Async::OS->make_addr_for_peer( AF_UNIX, pack_sockaddr_un( 
"/tmp/mysock" ) )
+   );
+   is( $path, "/tmp/mysock", 'make_addr_for_peer preserves AF_UNIX path' );
 }
 
 ok( exception { IO::Async::OS->extract_addrinfo( { family => "hohum" } ) },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/t/19loop-future.t 
new/IO-Async-0.78/t/19loop-future.t
--- old/IO-Async-0.77/t/19loop-future.t 2020-05-13 20:13:41.000000000 +0200
+++ new/IO-Async-0.78/t/19loop-future.t 2021-01-22 01:14:18.000000000 +0100
@@ -30,6 +30,20 @@
 }
 
 {
+   my $future = $loop->later;
+   my $cancellable_future = $loop->later;
+
+   ok( !$future->is_ready, '$loop->later returns a pending Future' );
+   ok( !$cancellable_future->is_ready, 'another $loop->later also returns a 
pending Future' );
+
+   $cancellable_future->cancel;
+   $loop->loop_once;
+
+   ok( $future->is_done, '$loop->later Future is resolved after one loop 
iteration' );
+   ok( $cancellable_future->is_cancelled, '$loop->later Future cancels 
cleanly' );
+}
+
+{
    my @futures = map { Future->new } 0 .. 2;
 
    do { my $id = $_; $loop->later( sub { $futures[$id]->done } ) } for 0 .. 2;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/IO-Async-0.77/t/50resolver.t 
new/IO-Async-0.78/t/50resolver.t
--- old/IO-Async-0.77/t/50resolver.t    2020-05-13 20:13:41.000000000 +0200
+++ new/IO-Async-0.78/t/50resolver.t    2021-01-22 01:14:18.000000000 +0100
@@ -339,7 +339,9 @@
     is( ( $future->failure )[2], "getaddrinfo", '->failure [2] gives 
getaddrinfo' );
 
     my $errno = ( $future->failure )[3];
-    ok( $errno == Socket::EAI_NONAME || $errno == Socket::EAI_NODATA, 
'->failure [3] gives EAI_NONAME or EAI_NODATA' ) or
+    ok( $errno == Socket::EAI_FAIL || $errno == Socket::EAI_AGAIN || # no 
server available
+        $errno == Socket::EAI_NONAME || $errno == Socket::EAI_NODATA, # server 
confirmed no DNS entry
+        '->failure [3] gives EAI_FAIL or EAI_AGAIN or EAI_NONAME or 
EAI_NODATA' ) or
       diag( '$errno is ' . $errno );
 }
 

++++++ cpanspec.yml ++++++
--- /var/tmp/diff_new_pack.bkgCpL/_old  2021-01-22 21:53:02.297909861 +0100
+++ /var/tmp/diff_new_pack.bkgCpL/_new  2021-01-22 21:53:02.301909867 +0100
@@ -5,8 +5,8 @@
 #  - source1
 #  - source2
 patches:
-  # PATCH-FIX-UPSTREAM https://rt.cpan.org/Public/Bug/Display.html?id=131109
-  
https://rt.cpan.org/Ticket/Attachment/1912750/1024503/IO-Async-0.77-Adjust-t-50resolver.t-test-for-an-unavailable-DNS-se.patch:
 -p1
+#  # PATCH-FIX-UPSTREAM https://rt.cpan.org/Public/Bug/Display.html?id=131109
+#  
https://rt.cpan.org/Ticket/Attachment/1912750/1024503/IO-Async-0.77-Adjust-t-50resolver.t-test-for-an-unavailable-DNS-se.patch:
 -p1
 #  bar.patch:
 preamble: |-
  BuildRequires:  netcfg

Reply via email to