1
0
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:
Roland McGrath
1995-08-31 00:02:32 +00:00
parent 18926cf415
commit a993273c0d
5 changed files with 73 additions and 13 deletions

View File

@@ -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]);