Shut down session on receipt of "ctld\n" even when reading arguments:
(player): New member eof. (recvclient): Return -1 without receiving input when it is set. Set it on receipt of "ctld\n". (execute): Clear it after receiving the script.
This commit is contained in:
parent
bd0d5c10b6
commit
79407e68fd
3 changed files with 28 additions and 6 deletions
|
@ -76,7 +76,8 @@ struct player {
|
|||
double dolcost;
|
||||
int broke;
|
||||
time_t curup; /* when last input was received */
|
||||
int aborted;
|
||||
int aborted; /* interrupt cookie received? */
|
||||
int eof; /* EOF (cookie or real) received? */
|
||||
int curid; /* for pr, cur. line's id, -1 none */
|
||||
char *map; /* pointer to in-mem map */
|
||||
char *bmap; /* pointer to in-mem bmap */
|
||||
|
|
|
@ -302,6 +302,7 @@ execute(void)
|
|||
}
|
||||
if (redir == NULL)
|
||||
pr("Execute : %s\n", failed ? "aborted" : "terminated");
|
||||
player->eof = 0;
|
||||
return RET_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
|
||||
/*
|
||||
* Receive a line of input from the current player.
|
||||
* If the player's eof flag is set, return -1 without receiving input.
|
||||
* If the player's aborted flag is set, return -2 without receiving
|
||||
* input.
|
||||
* Else receive one line and store it in CMD[SIZE].
|
||||
|
@ -48,38 +49,57 @@
|
|||
* If the player's connection has the I/O error indicator set, or the
|
||||
* line is "aborted", set the player's aborted flag and return -2.
|
||||
* If the player's connection has the EOF indicator set, or the line
|
||||
* is "ctld", return -1.
|
||||
* is "ctld", set the player's eof flag and return -1.
|
||||
* Else return the length of the line.
|
||||
* Design bug: there is no way to indicate truncation of a long line.
|
||||
* FIXME caller needs to know whether a line was consumed, to prompt correctly
|
||||
*/
|
||||
int
|
||||
recvclient(char *cmd, int size)
|
||||
{
|
||||
int count;
|
||||
|
||||
if (player->eof)
|
||||
return -1;
|
||||
if (player->aborted)
|
||||
return -2;
|
||||
|
||||
count = io_gets(player->iop, cmd, size);
|
||||
while (!player->aborted && count < 0) {
|
||||
|
||||
while (!player->aborted && !player->eof && count < 0) {
|
||||
/* Sleep for input */
|
||||
|
||||
/* Make sure player sees prompt */
|
||||
io_output_all(player->iop);
|
||||
|
||||
/*
|
||||
* If io_output_all() blocked and got unblocked by command
|
||||
* abortion, we must return without blocking in io_input().
|
||||
*/
|
||||
if (player->aborted)
|
||||
return -2;
|
||||
|
||||
io_input(player->iop, IO_WAIT);
|
||||
if (io_error(player->iop))
|
||||
player->aborted++;
|
||||
player->aborted = 1;
|
||||
else if (io_eof(player->iop))
|
||||
return -1;
|
||||
player->eof = 1;
|
||||
else
|
||||
count = io_gets(player->iop, cmd, size);
|
||||
}
|
||||
|
||||
if (count > 0) {
|
||||
if (strcmp(cmd, "ctld") == 0)
|
||||
return -1;
|
||||
player->eof = 1;
|
||||
if (strcmp(cmd, "aborted") == 0)
|
||||
player->aborted = 1;
|
||||
}
|
||||
|
||||
if (player->eof)
|
||||
return -1;
|
||||
if (player->aborted)
|
||||
return -2;
|
||||
|
||||
journal_input(cmd);
|
||||
return count;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue