summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhpa <hpa>2001-11-12 23:27:48 +0000
committerhpa <hpa>2001-11-12 23:27:48 +0000
commit9753e234c6f923b9082da29506e24722831fc9c5 (patch)
tree1520c6b58ed9c50cda6594bc562871f2d2f7e68a
parent9570005ba20ae2d4c068cc01b97256b01d5107eb (diff)
downloadtftp-hpa-9753e234c6f923b9082da29506e24722831fc9c5.tar.gz
Add readline support in tftp client; some additional minor cleanups.
-rw-r--r--README2
-rw-r--r--configure.in18
-rw-r--r--tftp/main.c32
-rw-r--r--tftp/tftp.c11
-rw-r--r--tftp/tftpsubs.c2
5 files changed, 46 insertions, 19 deletions
diff --git a/README b/README
index 197a1e8..56f9253 100644
--- a/README
+++ b/README
@@ -40,6 +40,8 @@ Changes in 0.22:
Some source cleanups; change to autoconf 2.52.
+ Add support for readline command-line editing in tftp.
+
Changes in 0.21:
Support running in standalone mode, without inetd.
diff --git a/configure.in b/configure.in
index a31bcc3..f6b88a7 100644
--- a/configure.in
+++ b/configure.in
@@ -101,6 +101,24 @@ PA_WITH_BOOL(remap, 1,
])
],:)
+AH_TEMPLATE([WITH_READLINE],
+[Define if we are compiling with readline command-line editing.])
+
+PA_WITH_BOOL(readline, 1,
+[ --without-readline Disable the use of readline command-line editing],
+[
+ USE_READLINE=true
+ AC_CHECK_HEADER(readline/readline.h, [], [USE_READLINE=false])
+ AC_CHECK_HEADER(readline/history.h, [], [USE_READLINE=false])
+ if $USE_READLINE
+ then
+ AC_SEARCH_LIBS(readline, [readline history],
+ [
+ AC_DEFINE(WITH_READLINE)
+ ])
+ fi
+],:)
+
AH_TEMPLATE([HAVE_SIGSETJMP],
[Define if we have sigsetjmp, siglongjmp and sigjmp_buf.])
PA_SIGSETJMP([AC_DEFINE(HAVE_SIGSETJMP)])
diff --git a/tftp/main.c b/tftp/main.c
index a5fcef8..9b3ad39 100644
--- a/tftp/main.c
+++ b/tftp/main.c
@@ -69,12 +69,12 @@ static const char *rcsid UNUSED =
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
+#ifdef WITH_READLINE
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
#include "extern.h"
-#include "../config.h"
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
#define TIMEOUT 5 /* secs between rexmt's */
#define LBUFLEN 200 /* size of input buffer */
@@ -86,10 +86,14 @@ int trace;
int verbose;
int connected;
char mode[32];
+#ifdef WITH_READLINE
+char *line = NULL;
+#else
char line[LBUFLEN];
+#endif
int margc;
char *margv[20];
-const char *prompt = "tftp";
+const char *prompt = "tftp> ";
sigjmp_buf toplevel;
void intr(int);
struct servent *sp;
@@ -205,6 +209,10 @@ main(int argc, char *argv[])
if (sigsetjmp(toplevel,1) != 0)
(void)putchar('\n');
+#ifdef WITH_READLINE
+ using_history();
+#endif
+
command();
return 0; /* Never reached */
@@ -600,7 +608,14 @@ command(void)
struct cmd *c;
for (;;) {
- printf("%s> ", prompt);
+#ifdef WITH_READLINE
+ if ( line )
+ free(line);
+ line = readline(prompt);
+ if ( !line )
+ exit(0); /* EOF */
+#else
+ fputs(prompt, stdout);
if (fgets(line, LBUFLEN, stdin) == 0) {
if (feof(stdin)) {
exit(0);
@@ -608,11 +623,16 @@ command(void)
continue;
}
}
+#endif
if ((line[0] == 0) || (line[0] == '\n'))
continue;
+#ifdef WITH_READLINE
+ add_history(line);
+#endif
makeargv();
if (margc == 0)
continue;
+
c = getcmd(margv[0]);
if (c == (struct cmd *)-1) {
printf("?Ambiguous command\n");
diff --git a/tftp/tftp.c b/tftp/tftp.c
index eb1a8a5..89297d2 100644
--- a/tftp/tftp.c
+++ b/tftp/tftp.c
@@ -65,19 +65,8 @@ static const char *rcsid UNUSED =
#include <string.h>
#include <unistd.h>
-#include "../config.h"
#include "extern.h"
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-
-#ifndef HAVE_SIGSETJMP
-#define sigsetjmp(x,y) setjmp(x)
-#define siglongjmp(x,y) longjmp(x,y)
-#define sigjmp_buf jmp_buf
-#endif
-
extern struct sockaddr_in peeraddr; /* filled in by main */
extern int f; /* the opened socket */
extern int trace;
diff --git a/tftp/tftpsubs.c b/tftp/tftpsubs.c
index 8b739cf..c358ccd 100644
--- a/tftp/tftpsubs.c
+++ b/tftp/tftpsubs.c
@@ -66,8 +66,6 @@ static const char *rcsid UNUSED =
#include <string.h>
#include <unistd.h>
-#include "../config.h"
-
#define PKTSIZE MAX_SEGSIZE+4 /* should be moved to tftp.h */
int segsize = SEGSIZE; /* Default segsize */