Fix idle timeout during execute
Timeout during execute gets handled just like an EOF cookie: end the
batch file, resume reading normal commands. That's wrong, we need to
close the connection.
A real EOF is recorded in the player's connection's EOF indicator.
Let's use that for all "connection needs to be closed" conditions, so
they all work the same. Create io_set_eof() to provide access.
Make recvclient() set the player connection's EOF indicator on
timeout. This makes the timeout "stick". Record receipt of an EOF
cookie in new struct player member got_ctld. Also abort the command,
as before. This leaves further interpretation of the EOF cookie to
the command loops.
Make player_main() set the player connection's EOF indicator on
got_ctld. Player connection gets closed on on EOF cookie, as before.
Change execute() to break the batch command loop when got_ctld is set,
then reset it. Ends the batch file on EOF cookie, as before.
Change status() back to checking EOF and error indicators (partial
revert of commit 9c5854c8
, v4.3.16), and drop struct player member
eof.
This commit is contained in:
parent
d78d9cac1d
commit
ca7578f1b8
5 changed files with 38 additions and 20 deletions
|
@ -29,7 +29,7 @@
|
|||
* Known contributors to this file:
|
||||
* Doug Hay, 1998
|
||||
* Steve McClure, 1998
|
||||
* Markus Armbruster, 2004-2010
|
||||
* Markus Armbruster, 2004-2012
|
||||
* Ron Koenderink, 2009
|
||||
*/
|
||||
|
||||
|
@ -131,16 +131,17 @@ io_input(struct iop *iop, int waitforinput)
|
|||
int cc;
|
||||
int res;
|
||||
|
||||
/* Not a read IOP */
|
||||
if ((iop->flags & IO_READ) == 0) {
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
/* IOP is markes as in error. */
|
||||
if (iop->flags & IO_ERROR) {
|
||||
errno = EBADF;
|
||||
return -1;
|
||||
}
|
||||
if (iop->flags & IO_EOF)
|
||||
return 0;
|
||||
|
||||
/* Wait for the file to have input. */
|
||||
if (waitforinput) {
|
||||
res = empth_select(iop->fd, EMPTH_FD_READ, &iop->input_timeout);
|
||||
|
@ -257,7 +258,6 @@ io_output_if_queue_long(struct iop *iop, int wait)
|
|||
return io_output(iop, wait);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
io_peek(struct iop *iop, char *buf, int nbytes)
|
||||
{
|
||||
|
@ -334,6 +334,17 @@ io_eof(struct iop *iop)
|
|||
return iop->flags & IO_EOF;
|
||||
}
|
||||
|
||||
/*
|
||||
* Discard IOP's buffered input and set its EOF flag.
|
||||
* No more input can be read from IOP.
|
||||
*/
|
||||
void
|
||||
io_set_eof(struct iop *iop)
|
||||
{
|
||||
ioq_drain(iop->input);
|
||||
iop->flags |= IO_EOF;
|
||||
}
|
||||
|
||||
int
|
||||
io_fileno(struct iop *iop)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue