]> git.pond.sub.org Git - empserver/blobdiff - doc/clients-howto
client: Unbreak standalone build
[empserver] / doc / clients-howto
index cb17bfb0f42e4293f2dde6f99939044e86114c8f..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)
@@ -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
@@ -202,7 +208,7 @@ The following ids occur:
 
   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 terminates the session (but see
+  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
@@ -258,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
@@ -273,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
@@ -287,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.
 
@@ -352,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
 ===============