Re: [PATCHv2 5/9] add generic terminal prompt function
peff@peff.net wrote on Sat, 10 Dec 2011 05:41 -0500:
Show 10 quoted lines
> +static struct termios old_term;
> +
> +static void restore_term(void)
> +{
> + if (term_fd < 0)
> + return;
> +
> + tcsetattr(term_fd, TCSAFLUSH, &old_term);
> + term_fd = -1;
> +}Restores from static old_term.
Show 19 quoted lines
> +char *git_terminal_prompt(const char *prompt, int echo)
> +{
> + static struct strbuf buf = STRBUF_INIT;
> + int r;
> + FILE *fh;
> +
> + fh = fopen("/dev/tty", "w+");
> + if (!fh)
> + return NULL;
> +
> + if (!echo) {
> + struct termios t;
> +
> + if (tcgetattr(fileno(fh), &t) < 0) {
> + fclose(fh);
> + return NULL;
> + }
> +
> + old_term = t;Which is only saved if echo is true.
Show 21 quoted lines
> + term_fd = fileno(fh);
> + sigchain_push_common(restore_term_on_signal);
> +
> + t.c_lflag &= ~ECHO;
> + if (tcsetattr(fileno(fh), TCSAFLUSH, &t) < 0) {
> + term_fd = -1;
> + fclose(fh);
> + return NULL;
> + }
> + }
> +
> + fputs(prompt, fh);
> + fflush(fh);
> +
> + r = strbuf_getline(&buf, fh, '\n');
> + if (!echo) {
> + putc('\n', fh);
> + fflush(fh);
> + }
> +
> + restore_term();Perhaps this line should go in !echo.
And why no sigchain_pop() for the signal handler?
-- Pete