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 #include #include +#ifdef WITH_READLINE +#include +#include +#endif #include "extern.h" -#include "../config.h" -#ifdef HAVE_STRINGS_H -#include -#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 #include -#include "../config.h" #include "extern.h" -#ifdef HAVE_STRINGS_H -#include -#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 #include -#include "../config.h" - #define PKTSIZE MAX_SEGSIZE+4 /* should be moved to tftp.h */ int segsize = SEGSIZE; /* Default segsize */