]> git.pond.sub.org Git - empserver/commitdiff
Shut down session on receipt of "ctld\n" even when reading arguments:
authorMarkus Armbruster <armbru@pond.sub.org>
Thu, 15 Nov 2007 19:10:04 +0000 (19:10 +0000)
committerMarkus Armbruster <armbru@pond.sub.org>
Thu, 15 Nov 2007 19:10:04 +0000 (19:10 +0000)
(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
src/lib/player/player.c
src/lib/player/recvclient.c

index e9f50267d68907df3143cc441e5c94072c684b57..78b1a61c05b856879733b0a58e1d52e4c97dccb9 100644 (file)
@@ -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 */
index 3b9e789ed44fbb9f7422a06cc811b622f50db7ab..4f925342f30d82e7ec957ac26bbe4c9a7c95bee8 100644 (file)
@@ -302,6 +302,7 @@ execute(void)
     }
     if (redir == NULL)
        pr("Execute : %s\n", failed ? "aborted" : "terminated");
+    player->eof = 0;
     return RET_OK;
 }
 
index f1b1480ae3556ff086c90c162c781c647b8f9f2c..1003f485b00a90c307e7fddf982f90552f4949f9 100644 (file)
@@ -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].
  * 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;
 }