]> git.pond.sub.org Git - empserver/commitdiff
client: Tie up a few lose readline ends
authorMarkus Armbruster <armbru@pond.sub.org>
Sun, 13 Dec 2015 08:10:08 +0000 (09:10 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Sun, 6 Aug 2017 09:22:29 +0000 (11:22 +0200)
Document readline in more detail in man/empire.6.

Make @history_file local to main().

main() silently truncates the home directory name to 1000 characters
when constructing the history file name; mark FIXME.

Set @rl_already_prompted just once.

Write history file on unsuccessful exit, too.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
man/empire.6
src/client/main.c
src/client/misc.h
src/client/play.c

index 66460faa0db4257e82fcfd5494f6d5fd7c398912..5db053d726b04f4a47a58af664c251e43900aaa0 100644 (file)
@@ -3,7 +3,7 @@
 empire \- Empire client
 .SH SYNOPSIS
 .B empire
-[\fB\-hkruv\fP]
+[\fB\-hHkruv\fP]
 [\fB\-2\fP \fIoutfile\fP]
 [\fB\-s\fP \fI[host:]port\fP]
 [\fIcountry\fP
@@ -24,6 +24,11 @@ the thin veneer of civilization that hides the maniac within.
 .B \-h
 Help.  Print brief usage information and exit.
 .TP
+.B \-H
+Save readline command history to file.
+.IP
+Only available when compiled the GNU \fBreadline\fP library.
+.TP
 .B \-k
 If someone else is connected to your country, kill their connection.
 .TP
@@ -39,11 +44,6 @@ Use UTF-8 rather than ASCII character set.
 This requires server version 4.2.21 or later, and a terminal that
 understands UTF-8.
 .TP
-.B \-H
-Save readline command history to file.
-.IP
-Only available when compiled with readline and history support.
-.TP
 .B \-v
 Print version information and exit.
 .TP
@@ -79,8 +79,20 @@ representative.
 .TP
 .I LOGNAME
 Your user name.
+.TP
+.I INPUTRC
+The filename for the \fBreadline\fP startup file, overriding the
+default of \fI~/.inputrc\fP (see \fBREADLINE\fP below).
+.SH READLINE
+When compiled with the GNU \fBreadline\fP library, the client supports
+fancy line editing and, with option \fB-H\fP, persistent history.  See
+the readline documentation for details.
 .SH "SEE ALSO"
-\fIemp_server\fR(6).
+\fIemp_server\fR(6), \fIreadline\fR(3).
+.SH FILES
+.TP
+.I ~/.inputrc
+Individual \fBreadline\fP initialization file
 .SH AUTHORS
 .nf
 Primary Author is Dave Pare <mr-frog@scam.berkeley.edu>
@@ -90,6 +102,7 @@ Jeff Anton <anton@postgres.berkeley.edu>
 Markus Armbruster <armbru@pond.sub.org>
 Phill Everson <everson@compsci.bristol.ac.uk>
 Steven Grimm <koreth@ucscb.UCSC.EDU>
+Martin Haukeli <martin.haukeli@gmail.com>
 Lewis R. Jansen <lrj@helios.tn.cornell.edu>
 Mike St. Johns <stjohns@edn-vax.arpa>
 Ron Koenderink <rkoenderink@yahoo.ca>
index bfd5a0e2e3541ea437f0ab8fd350dd8e634c1c2f..cb81f1b0b6fd250ac4f79427c0bb881b6a803864 100644 (file)
@@ -30,8 +30,9 @@
  *     Dave Pare, 1986
  *     Steve McClure, 1998
  *     Ron Koenderink, 2004-2007
- *     Markus Armbruster, 2005-2010
+ *     Markus Armbruster, 2005-2015
  *     Tom Dickson-Hunt, 2010
+ *     Martin Haukeli, 2015
  */
 
 #include <config.h>
@@ -99,8 +100,9 @@ main(int argc, char **argv)
     char *udir;
     char *colon;
     int sock;
+    char *history_file;
 
-    while ((opt = getopt(argc, argv, "2:krs:uHhv")) != EOF) {
+    while ((opt = getopt(argc, argv, "2:Hkrs:uhv")) != EOF) {
        switch (opt) {
        case '2':
            auxfname = optarg;
@@ -189,6 +191,7 @@ main(int argc, char **argv)
     sock = tcp_connect(host, port);
 
     if (use_history_file) {
+       /* FIXME don't truncate udir */
        history_file = malloc(1024);
        strncpy(history_file, udir, 1000);
        strcat(history_file, "/.empire.history");
@@ -197,7 +200,7 @@ main(int argc, char **argv)
     if (!login(sock, uname, country, passwd, send_kill, utf8))
        exit(1);
 
-    if (play(sock) < 0)
+    if (play(sock, history_file) < 0)
        exit(1);
 
     return 0;
index 0a09be76e29ca71934e77d8109a73adf88d674e1..ffdc2dfa548b6b021eace28c8f6e0b31a7fd081b 100644 (file)
@@ -44,7 +44,6 @@ extern char empireport[];
 extern int eight_bit_clean;
 extern FILE *auxfp;
 extern int restricted;
-extern char *history_file;
 
 #ifdef HAVE_CURSES_TERMINFO
 void getsose(void);
@@ -61,7 +60,7 @@ int parseid(char *);
 int expect(int s, int match, char *buf);
 int tcp_connect(char *, char *);
 int login(int s, char *uname, char *cname, char *cpass, int kill_proc, int);
-int play(int);
+int play(int, char *);
 void sendcmd(int s, char *cmd, char *arg);
 int servercmd(int, char *, int);
 void outch(char);
index ad7028c78c51dc01517c30d7122a1754049172c5..f02399bab8439c106abedf9b2179f259735ddf03 100644 (file)
@@ -29,6 +29,7 @@
  *  Known contributors to this file:
  *     Markus Armbruster, 2007-2017
  *     Ron Koenderink, 2007-2009
+ *     Martin Haukeli, 2015
  */
 
 #include <config.h>
@@ -436,7 +437,6 @@ recv_output(int sock)
     return n;
 }
 
-char *history_file = NULL;
 #ifdef HAVE_LIBREADLINE
 static char *input_from_rl;
 static int has_rl_input;
@@ -446,7 +446,6 @@ input_handler(char *line)
 {
     input_from_rl = line;
     has_rl_input = 1;
-    rl_already_prompted = 1;
 #ifdef HAVE_READLINE_HISTORY
     if (line && *line)
        add_history(line);
@@ -536,11 +535,12 @@ intr(int sig)
 
 /*
  * Play on @sock.
+ * @history_file is the name of the history file, or null.
  * The session must be in the playing phase.
  * Return 0 when the session ended, -1 on error.
  */
 int
-play(int sock)
+play(int sock, char *history_file)
 {
     /*
      * Player input flows from INPUT_FD through recv_input() into ring
@@ -564,6 +564,7 @@ play(int sock)
     sa.sa_handler = SIG_IGN;
     sigaction(SIGPIPE, &sa, NULL);
 #ifdef HAVE_LIBREADLINE
+    rl_already_prompted = 1;
 #ifdef HAVE_READLINE_HISTORY
     if (history_file)
        read_history(history_file);
@@ -665,19 +666,18 @@ play(int sock)
                break;
            }
            if (n == 0) {
-#ifdef HAVE_LIBREADLINE
-#ifdef HAVE_READLINE_HISTORY
-               if (history_file)
-                   write_history(history_file);
-#endif /* HAVE_READLINE_HISTORY */
-#endif /* HAVE_LIBREADLINE */
                ret = 0;
                break;
            }
        }
     }
+
 #ifdef HAVE_LIBREADLINE
     rl_callback_handler_remove();
+#ifdef HAVE_READLINE_HISTORY
+    if (history_file)
+       write_history(history_file);
+#endif /* HAVE_READLINE_HISTORY */
 #endif
     return ret;
 }