]> git.pond.sub.org Git - empserver/blobdiff - doc/clients-howto
client: Unbreak standalone build
[empserver] / doc / clients-howto
index 1dee5e7123cafe3078a5bd2f293dc76534102584..ad4767473093334ca69cc8aeec244c0eb15cf74e 100644 (file)
@@ -17,13 +17,13 @@ The server sends lines of output.  Each output line starts with an
 identification string, followed by a space, then arbitrary text, then
 a line feed.
 
-Identification strings encode small integers called output ids as base
+Identification strings encode small integers called output IDs as base
 36 numbers.  Characters '0' to '9' represent digits 0 to 9, and 'a' to
-'z' represent 10..35, as do 'A' to 'Z'.  Symbolic names for ids are
+'z' represent 10..35, as do 'A' to 'Z'.  Symbolic names for IDs are
 defined in proto.h.
 
-empire-client versions before version 4.3.11 parse large output ids
-incorrectly.  Such ids do not currently occur.
+empire-client versions before version 4.3.11 parse large output IDs
+incorrectly.  Such IDs do not currently occur.
 
 Clients shall be able to safely handle output lines of arbitrary
 length.  Naturally, a client may not be able to handle a sufficiently
@@ -36,6 +36,7 @@ The following control characters have a defined meaning:
 
   ASCII name        decimal  meaning
   ----------------------------------------------------
+  bell                  7    ring the bell
   horizontal tab        9    move to next tab stop(1)
   line feed            10    end of line
   shift out            14    begin highlighting(2)
@@ -49,7 +50,7 @@ clients.  Likewise, overlong or malformed UTF-8 sequences should not
 occur and may be ignored.
 
 The server prompts for input.  Each prompt `consumes' one line of
-input (except for C_EXECUTE, and when the update aborts a command, as
+input (except for C_EXECUTE, and when a command is aborted, as
 described below).  Input lines are arbitrary text, terminated by line
 feed, which is optionally preceded by carriage return (decimal 13).
 Lines should not contain ASCII control characters other than
@@ -65,9 +66,10 @@ output until the server reads more input.  That may never happen,
 because the server may well block on output, which then deadlocks the
 session.
 
-An Empire session consists of two phases: login and playing.
-empire-client is synchronous during the former and asynchronous during
-the latter.  Versions before 4.3.11 could deadlock as described above.
+An Empire session consists of three phases: login, playing, and
+shutdown.  empire-client is synchronous in the login phase, and
+asynchronous afterwards.  Versions before 4.3.11 could deadlock as
+described above.
 
 Login phase
 -----------
@@ -76,7 +78,7 @@ In the login phase, the server prompts for login commands.
 
 The server starts with a C_INIT prompt.  The login phase ends when the
 server sends another C_INIT prompt, which starts the playing phase, or
-when it closes the connection.
+when it enters the shutdown phase, as described below
 
 The server replies to a login command with another prompt.  Except as
 noted below, the server replies C_BADCMD for syntax errors, C_CMDERR
@@ -96,8 +98,9 @@ Login commands are:
 
 * kill
 
-  If another connection is open for this country, forcibly close it,
-  else do nothing.  Country must be authenticated.
+  If another connection for this country is in the playing phase,
+  force it into the shutdown phase, else do nothing.  Country must be
+  authenticated.
 
   Reply is C_EXIT regardless of success.
 
@@ -151,8 +154,8 @@ Login commands are:
 
 * quit
 
-  Terminate the session.  The server replies with C_EXIT and closes
-  the connection.
+  Terminate the session.  The server replies with C_EXIT and enters
+  the shutdown phase.
 
 * sanc
 
@@ -165,6 +168,9 @@ Login commands are:
 
   Set the user name.  This is optional and defaults to "".
 
+If the login phase takes more than login_grace_time (default 120s),
+the server enters the shutdown phase.
+
 Playing phase
 -------------
 
@@ -179,13 +185,13 @@ empire-client signals `EOF' when it encounters an end-of-file
 condition while reading player input.  It signals `interrupt' when it
 catches SIGINT, which is normally triggered by Ctrl-C.
 
-The following ids occur:
+The following IDs occur:
 
 * Command prompt C_PROMPT
 
-  The server consumes a line of input.  On EOF, the server terminates
-  the session.  Interrupt is ignored.  Anything else is interpreted as
-  Empire command.
+  The server consumes a line of input.  On EOF, the server enters the
+  shutdown phase.  Interrupt is ignored.  Anything else is interpreted
+  as Empire command.
 
   Text is minutes used, space, BTUs left.  Both numbers are in
   decimal.  Clients shall ignore additional text separated by another
@@ -198,8 +204,12 @@ The following ids occur:
 * Argument prompt C_FLUSH
 
   The server consumes a line of input and passes it to the currently
-  executing command.  Commands usually fail on interrupt.  The server
-  terminates the session on EOF (but see C_EXECUTE for an exception).
+  executing command.
+
+  The server aborts the command on interrupt and EOF.  Any argument
+  prompts it may send before the next command prompt do not consume
+  input.  On EOF, the server then enters the shutdown phase (but see
+  C_EXECUTE for an exception).
 
   If an update runs while the server waits for the line of input to
   arrive, the current command is aborted.  Whether the server consumes
@@ -254,7 +264,7 @@ The following ids occur:
   rejects redirections in batch files.
 
   Certain bad failures make the server ignore the rest of the batch
-  file file.  This feature is too hard to predict to be really useful.
+  file.  This feature is too hard to predict to be really useful.
 
   Protocol flaw: strictly asynchronous clients cannot support
   C_EXECUTE correctly.  By the time C_EXECUTE arrives, the client may
@@ -269,13 +279,6 @@ The following ids occur:
   Clients are not required to support C_EXECUTE.  Clients are
   encouraged to offer alternative means for scripting.
 
-* Control C_EXIT
-
-  End of session.  The server is about to close the connection.  Text
-  is a human-readable farewell.
-
-  empire-client prints this text prepended with "Exit: ".
-
 * Control C_FLASH
 
   Asynchronous message.  The client should display the text
@@ -283,7 +286,7 @@ The following ids occur:
 
   empire-client prints the text verbatim, prepended by a line feed.
   This is clearly sub-optimal, because it can be inserted in the
-  middle of user input.  Clients wishing to to display asynchronous
+  middle of user input.  Clients wishing to display asynchronous
   messages together with normal I/O should insert them before the
   current prompt.
 
@@ -348,15 +351,40 @@ The following ids occur:
 
   The security considerations on C_PIPE apply to C_REDIR as well.
 
-* Other ids
+* Other IDs
 
-  Other ids do not occur currently.  Clients shall deal gracefully
-  with ids they don't know.
+  Other IDs do not occur currently.  Clients shall deal gracefully
+  with IDs they don't know.
 
-  empire-client treats unknown ids like C_DATA.  Versions before
+  empire-client treats unknown IDs like C_DATA.  Versions before
   4.3.11 prepend "Aborted\n" to C_ABORT lines, and "Error; " to
   C_CMDERR and C_BADCMD lines for historical reasons.
 
+Shutdown phase
+--------------
+
+In the shutdown phase, the server first sends a C_EXIT message.  Its
+text is a human-readable farewell.
+
+empire-client prints this text prepended with "Exit: ".
+
+The server then waits for the output queue to drain, then shuts down
+the output direction of the connection.  This makes the client detect
+an end-of-file condition after it received all output.  The client
+should then close its end of the connection.  The server continues to
+read and ignore input until it detects an end-of-file condition.  It
+then closes its end of the connection, and the session terminates.
+
+If the server closed its end of the connection without waiting for the
+client to close the other end first, asynchronous clients could lose
+output: an attempt to send input after the server closed its end would
+fail with a connection reset error even when some output is still in
+flight.  Versions before 4.3.30 could misbehave like that in certain
+circumstances.
+
+If the shutdown phase doesn't complete within login_grace_time
+(default 120s), the server closes the connection immediately.  Output
+may be lost.
 
 Session Options
 ===============