From 0cb66906009297f0beb9f3b71648635bb190d260 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 13 Dec 2015 09:10:08 +0100 Subject: [PATCH] client: Tie up a few lose readline ends 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 --- man/empire.6 | 27 ++++++++++++++++++++------- src/client/main.c | 9 ++++++--- src/client/misc.h | 3 +-- src/client/play.c | 18 +++++++++--------- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/man/empire.6 b/man/empire.6 index 66460faa0..5db053d72 100644 --- a/man/empire.6 +++ b/man/empire.6 @@ -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 @@ -90,6 +102,7 @@ Jeff Anton Markus Armbruster Phill Everson Steven Grimm +Martin Haukeli Lewis R. Jansen Mike St. Johns Ron Koenderink diff --git a/src/client/main.c b/src/client/main.c index bfd5a0e2e..cb81f1b0b 100644 --- a/src/client/main.c +++ b/src/client/main.c @@ -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 @@ -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; diff --git a/src/client/misc.h b/src/client/misc.h index 0a09be76e..ffdc2dfa5 100644 --- a/src/client/misc.h +++ b/src/client/misc.h @@ -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); diff --git a/src/client/play.c b/src/client/play.c index ad7028c78..f02399bab 100644 --- a/src/client/play.c +++ b/src/client/play.c @@ -29,6 +29,7 @@ * Known contributors to this file: * Markus Armbruster, 2007-2017 * Ron Koenderink, 2007-2009 + * Martin Haukeli, 2015 */ #include @@ -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; } -- 2.43.0