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
|
@ -28,7 +28,7 @@
|
|||
*
|
||||
* Known contributors to this file:
|
||||
* Steve McClure, 2000
|
||||
* Markus Armbruster, 2004-2011
|
||||
* Markus Armbruster, 2004-2012
|
||||
* Ron Koenderink, 2004-2009
|
||||
*/
|
||||
|
||||
|
@ -99,7 +99,9 @@ player_main(struct player *p)
|
|||
}
|
||||
|
||||
while (status() && command()) {
|
||||
player->aborted = player->eof;
|
||||
if (player->got_ctld)
|
||||
io_set_eof(player->iop);
|
||||
player->aborted = 0;
|
||||
empth_yield();
|
||||
}
|
||||
/* #*# I put the following line in to prevent server crash -KHS */
|
||||
|
@ -171,7 +173,8 @@ status(void)
|
|||
|
||||
time(&player->curup);
|
||||
update_timeused(player->curup);
|
||||
if (player->eof || player->state == PS_SHUTDOWN
|
||||
if (io_error(player->iop) || io_eof(player->iop)
|
||||
|| player->state == PS_SHUTDOWN
|
||||
|| !may_play_now(natp, player->curup))
|
||||
return 0;
|
||||
|
||||
|
@ -243,7 +246,7 @@ execute(void)
|
|||
return RET_SYN;
|
||||
prexec(p);
|
||||
|
||||
while (!failed && status()) {
|
||||
while (!failed && status() && !player->got_ctld) {
|
||||
player->nstat &= ~EXEC;
|
||||
if (getcommand(player->combuf) < 0)
|
||||
break;
|
||||
|
@ -267,7 +270,7 @@ execute(void)
|
|||
}
|
||||
|
||||
pr("Execute : %s\n", failed ? "aborted" : "terminated");
|
||||
player->eof = 0;
|
||||
player->got_ctld = 0;
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue