diff --git a/src/term.c b/src/term.c index c399c3e4..e4966cc4 100644 --- a/src/term.c +++ b/src/term.c @@ -1357,7 +1357,7 @@ void term_gotline(char *cmdstr) { } -int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { +int terminal_mode_interactive(PROGRAMMER *pgm, struct avrpart *p) { term_pgm = pgm; // For callback routine term_p = p; @@ -1379,10 +1379,10 @@ int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { return pgm->flush_cache(pgm, p); } -#else +#endif -int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { +int terminal_mode_noninteractive(PROGRAMMER *pgm, struct avrpart *p) { char *cmdbuf; int rc = 0; @@ -1398,7 +1398,17 @@ int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { return pgm->flush_cache(pgm, p); } +int terminal_mode(PROGRAMMER *pgm, struct avrpart *p) { +#if defined(HAVE_LIBREADLINE) + // GNU libreadline can also work if input is a pipe. + // EditLine (NetBSD, MacOS) has issues with that, so only use it when + // running interactively. + // EditLine uses version 4.2 (0x0402). + if (isatty(fileno(stdin)) || (rl_readline_version >= 0x0500)) + return terminal_mode_interactive(pgm, p); #endif + return terminal_mode_noninteractive(pgm, p); +} static void update_progress_tty(int percent, double etime, const char *hdr, int finish) { static char *header;