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>
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
.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
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
.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>
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>
* 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>
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;
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");
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;
extern int eight_bit_clean;
extern FILE *auxfp;
extern int restricted;
-extern char *history_file;
#ifdef HAVE_CURSES_TERMINFO
void getsose(void);
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);
* Known contributors to this file:
* Markus Armbruster, 2007-2017
* Ron Koenderink, 2007-2009
+ * Martin Haukeli, 2015
*/
#include <config.h>
return n;
}
-char *history_file = NULL;
#ifdef HAVE_LIBREADLINE
static char *input_from_rl;
static int has_rl_input;
{
input_from_rl = line;
has_rl_input = 1;
- rl_already_prompted = 1;
#ifdef HAVE_READLINE_HISTORY
if (line && *line)
add_history(line);
/*
* 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
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);
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;
}