mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-24 17:51:17 +03:00
Wed Aug 30 16:44:55 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* sysdeps/mach/hurd/select.c: Deal with out of order replies during io_select request loop. Handle MACH_RCV_TIMED_OUT error from requests. * hurd/intr-msg.c: If the user passed the MACH_RCV_TIMEOUT option, distinguish MACH_RCV_TIMED_OUT from EINTR. * posix/glob.c (glob): Use realloc to extend strings for GLOB_MARK slash. (glob_in_dir): Don't allocate extra byte here. * sysdeps/i386/dl-machine.h (ELF_MACHINE_BEFORE_RTLD_RELOC): Decrement the DT_RELSZ value for the skipped reloc.
This commit is contained in:
@@ -121,16 +121,39 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
|
||||
if (!err)
|
||||
{
|
||||
int tag = i;
|
||||
int type = types[i];
|
||||
err = __io_select (ports[i], port,
|
||||
/* Poll for each but the last. */
|
||||
(i == lastfd && got == 0) ? to : 0,
|
||||
&types[i], &tag);
|
||||
if (!err)
|
||||
&type, &tag);
|
||||
switch (err)
|
||||
{
|
||||
if (tag != i)
|
||||
case MACH_RCV_TIMED_OUT:
|
||||
/* No immediate response. This is normal. */
|
||||
err = 0;
|
||||
break;
|
||||
|
||||
case 0:
|
||||
/* We got an answer. This is not necessarily the answer to
|
||||
the query we sent just now. It may correspond to any
|
||||
prior query which timed out before its answer arrived. */
|
||||
if (tag < 0 || tag > i ||
|
||||
(type & (SELECT_READ|SELECT_URG|SELECT_WRITE)) == 0)
|
||||
/* This is not a proper answer to any query we have yet
|
||||
made. */
|
||||
err = EGRATUITOUS;
|
||||
else if (types[i] & (SELECT_READ|SELECT_URG|SELECT_WRITE))
|
||||
++got;
|
||||
else
|
||||
{
|
||||
/* Some port is ready. TAG tells us which. */
|
||||
types[tag] &= type;
|
||||
++got;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Any other error kills us.
|
||||
But we must continue to loop to free the ports. */
|
||||
break;
|
||||
}
|
||||
}
|
||||
_hurd_port_free (&cells[i]->port, &ulink[i], ports[i]);
|
||||
|
||||
Reference in New Issue
Block a user