From 79407e68fd1d938bb19f6e71b77bb4221315bbf5 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Thu, 15 Nov 2007 19:10:04 +0000 Subject: [PATCH] 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. --- include/player.h | 3 ++- src/lib/player/player.c | 1 + src/lib/player/recvclient.c | 30 +++++++++++++++++++++++++----- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/include/player.h b/include/player.h index e9f50267..78b1a61c 100644 --- a/include/player.h +++ b/include/player.h @@ -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 */ diff --git a/src/lib/player/player.c b/src/lib/player/player.c index 3b9e789e..4f925342 100644 --- a/src/lib/player/player.c +++ b/src/lib/player/player.c @@ -302,6 +302,7 @@ execute(void) } if (redir == NULL) pr("Execute : %s\n", failed ? "aborted" : "terminated"); + player->eof = 0; return RET_OK; } diff --git a/src/lib/player/recvclient.c b/src/lib/player/recvclient.c index f1b1480a..1003f485 100644 --- a/src/lib/player/recvclient.c +++ b/src/lib/player/recvclient.c @@ -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; }