On Wed, Jul 31, 2019 at 2:00 PM Zac Medico <zmed...@gentoo.org> wrote: > > On 7/31/19 9:06 AM, Mike Gilbert wrote: > > This works around some strange behavior in glibc's getaddrinfo() > > implementation when the AI_ADDRCONFIG flag is set. > > > > For example: > > > > struct addrinfo *res, hints = { .ai_family = AF_INET, .ai_flags = > > AI_ADDRCONFIG }; > > getaddrinfo("localhost", NULL, &hints, &res); > > > > This returns no results if there is no non-loopback interface configured > > with an > > IPv4 address. > > > > Bug: https://bugs.gentoo.org/690758 > > Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=12377#c13 > > Signed-off-by: Mike Gilbert <flop...@gentoo.org> > > --- > > lib/portage/process.py | 24 ++++++++++++++++++++++++ > > 1 file changed, 24 insertions(+) > > > > diff --git a/lib/portage/process.py b/lib/portage/process.py > > index dfbda75de..c284c04f3 100644 > > --- a/lib/portage/process.py > > +++ b/lib/portage/process.py > > @@ -446,6 +446,29 @@ def spawn(mycommand, env=None, opt_name=None, > > fd_pipes=None, returnpid=False, > > # Everything succeeded > > return 0 > > > > +def _configure_dummy_interface(): > > + """ > > + Configure a dummy interface to work around odd behavior in glibc's > > + getaddrinfo() implementation when the AI_ADDRCONFIG flag is set. > > + > > + For example: > > + > > + struct addrinfo *res, hints = { .ai_family = AF_INET, .ai_flags = > > AI_ADDRCONFIG }; > > + getaddrinfo("localhost", NULL, &hints, &res); > > + > > + This returns no results if there is no non-loopback interface > > configured with an > > + IPv4 address. > > + > > + Bug: https://bugs.gentoo.org/690758 > > + Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=12377#c13 > > + """ > > + try: > > + > > subprocess.check_call(['ip','link','add','dummy','type','dummy']) > > + subprocess.check_call(['ip','link','set','dummy','up']) > > + > > subprocess.check_call(['ip','address','add','10.0.0.1/8','dev','dummy']) > > + except subprocess.CalledProcessError: > > + writemsg("Unable to configure dummy network interface\n") > > + > > def _exec(binary, mycommand, opt_name, fd_pipes, > > env, gid, groups, uid, umask, cwd, > > pre_exec, close_fds, unshare_net, unshare_ipc, unshare_mount, > > unshare_pid, > > @@ -637,6 +660,7 @@ def _exec(binary, mycommand, opt_name, fd_pipes, > > > > errno.errorcode.get(e.errno, '?')), > > > > noiselevel=-1) > > sock.close() > > + > > _configure_dummy_interface() > > except AttributeError: > > # unshare() not supported by libc > > pass > > > > Maybe it will suffice to add the address to the loopback interface?
I wasn't expecting that to work, but it actually does! That makes this a bit simpler indeed. I'll send a new patch in a bit.