[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Bug#584538: libdebian-installer: problems on Hurd with poll()



On Sun, Aug 01, 2010 at 05:02:47PM +0200, Samuel Thibault wrote:
> Hello,
Hi,

> Jérémie Koenig, le Fri 04 Jun 2010 14:41:34 +0200, a écrit :
> > On Hurd, libdebian-installer gets stuck inside the internal_di_exec()
> > function. This is caused by the way poll() reports end-of-file, which
> > cannot be portably relied on.
> > 
> > The attach patch uses feof() instead of POLLHUP to detect it.
> 
> > Index: packages/libdebian-installer/src/exec.c
> > ===================================================================
> > --- packages/libdebian-installer/src/exec.c	(revision 63370)
> > +++ packages/libdebian-installer/src/exec.c	(working copy)
> > @@ -162,14 +162,12 @@
> >        {
> >          bool exit = false;
> >  
> > +        /* Implementations of poll() deliver various combinations of POLLIN and
> > +           POLLHUP on EOF. fgets() detects it and we check with feof() below.
> > +           References: http://www.greenend.org.uk/rjk/2001/06/poll.html */
> >          for (i = 0; i < pipes; i++)
> >          {
> > -/* References: http://www.greenend.org.uk/rjk/2001/06/poll.html */
> > -#if defined(__FreeBSD_kernel__)
> > -          if ((pollfds[i].revents & POLLIN) && (! (pollfds[i].revents & POLLHUP)))
> > -#else
> > -          if (pollfds[i].revents & POLLIN)
> > -#endif
> > +          if (pollfds[i].revents & (POLLIN | POLLHUP))
> >            {
> >              while (fgets (line, sizeof (line), files[i].file) != NULL)
> >              {
> > @@ -180,8 +178,8 @@
> >                  len--;
> >                }
> >                files[i].handler (line, len, io_user_data);
> > +              exit = true;
> >              }
> > -            exit = true;
> >            }
> >          }
> >  
> > @@ -189,7 +187,7 @@
> >            continue;
> >  
> >          for (i = 0; i < pipes; i++)
> > -          if (pollfds[i].revents & POLLHUP)
> > +          if (feof(files[i].file))
> >              exit = true;
> >  
> >          if (exit)
> 
> This seems simpler to me.  Could BSD people check they do not have bad
> effects?
> 

I have just made a test and this version seems to work perfectly on
GNU/kFreeBSD.

-- 
Aurelien Jarno	                        GPG: 1024D/F1BCDB73
aurelien@aurel32.net                 http://www.aurel32.net


Reply to: