/* * This routine returns true if fd refers to a terminal * This should be equivalent to isatty */ int tty_check(int fd) { register Edit_t *ep = (Edit_t*)(shgd->ed_context); struct termios tty; ep->e_savefd = -1; return(tty_get(fd,&tty)==0); }
int tty_getc_timed(int *timeout) { int rc; if(in_bufpos<in_bufmax)return in_buffer[in_bufpos++]; if((rc=tty_get(in_buffer,IN_MAXBUF,timeout))<0)return rc; in_bufpos=0;in_bufmax=rc; return in_buffer[in_bufpos++]; }
int tty_get_answer_is_yes( const char *prompt ) { int yes; char *p = tty_get( prompt ); tty_kill_prompt(); yes = answer_is_yes(p); xfree(p); return yes; }
char * cpr_get_no_help( const char *keyword, const char *prompt ) { char *p; if( opt.command_fd != -1 ) return do_get_from_fd ( keyword, 0, 0 ); for(;;) { p = tty_get( prompt ); return p; } }
static char *editinput(void) { int c; Repeat = NO_ARG; old_point = rl_point = rl_mark = rl_end = 0; rl_line_buffer[0] = '\0'; el_intr_pending = -1; while ((c = tty_get()) != EOF) { switch (tty_special(c)) { case CSdone: return rl_line_buffer; case CSeof: return NULL; case CSsignal: return (char *)""; case CSmove: reposition(); break; case CSdispatch: switch (emacs(c)) { case CSdone: return rl_line_buffer; case CSeof: return NULL; case CSsignal: return (char *)""; case CSmove: reposition(); break; case CSdispatch: case CSstay: break; } break; case CSstay: break; } } return NULL; }
static el_status_t exchange(void) { int c; if ((c = tty_get()) != CTL('X')) return c == EOF ? CSeof : el_ring_bell(); if ((c = rl_mark) <= rl_end) { rl_mark = rl_point; rl_point = c; return CSmove; } return CSstay; }
/* Variable argument version of tty_get. The prompt is is actually a format string with arguments. */ char * tty_getf (const char *promptfmt, ... ) { va_list arg_ptr; char *prompt; char *answer; va_start (arg_ptr, promptfmt); if (gpgrt_vasprintf (&prompt, promptfmt, arg_ptr) < 0) log_fatal ("estream_vasprintf failed: %s\n", strerror (errno)); va_end (arg_ptr); answer = tty_get (prompt); xfree (prompt); return answer; }
static el_status_t move_to_char(void) { int c; int i; char *p; if ((c = tty_get()) == EOF) return CSeof; for (i = rl_point + 1, p = &rl_line_buffer[i]; i < rl_end; i++, p++) if (*p == c) { rl_point = i; return CSmove; } return CSstay; }
char * cpr_get( const char *keyword, const char *prompt ) { char *p; if( opt.command_fd != -1 ) return do_get_from_fd ( keyword, 0, 0 ); for(;;) { p = tty_get( prompt ); if( *p=='?' && !p[1] && !(keyword && !*keyword)) { xfree(p); display_online_help( keyword ); } else return p; } }
static el_status_t meta(void) { int c; el_keymap_t *kp; if ((c = tty_get()) == EOF) return CSeof; #ifdef CONFIG_ANSI_ARROWS /* Also include VT-100 arrows. */ if (c == '[' || c == 'O') { switch (tty_get()) { case EOF: return CSeof; case '2': tty_get(); return CSstay; /* Insert */ case '3': tty_get(); return del_char(); /* Delete */ case '5': tty_get(); return CSstay; /* PgUp */ case '6': tty_get(); return CSstay; /* PgDn */ case 'A': return h_prev(); /* Up */ case 'B': return h_next(); /* Down */ case 'C': return fd_char(); /* Left */ case 'D': return bk_char(); /* Right */ case 'F': return end_line(); /* End */ case 'H': return beg_line(); /* Home */ default: /* Fall through */ break; } return el_ring_bell(); } #endif /* CONFIG_ANSI_ARROWS */ if (isdigit(c)) { for (Repeat = c - '0'; (c = tty_get()) != EOF && isdigit(c); ) Repeat = Repeat * 10 + c - '0'; tty_push(c); return CSstay; } if (isupper(c)) return do_macro(c); for (kp = MetaMap; kp->Function; kp++) { if (kp->Key == c) return kp->Function(); } return el_ring_bell(); }
int tty_alt(register int fd) { register Edit_t *ep = (Edit_t*)(shgd->ed_context); int mask; struct tchars ttychars; switch(ep->e_raw) { case ECHOMODE: return(-1); case ALTMODE: return(0); case RAWMODE: tty_cooked(fd); } l_changed = 0; if( ep->e_ttyspeed == 0) { if((tty_get(fd,&ttyparm) != SYSERR)) ep->e_ttyspeed = (ttyparm.sg_ospeed>=B1200?FAST:SLOW); ep->e_raw = ALTMODE; } if(ioctl(fd,TIOCGETC,&l_ttychars) == SYSERR) return(-1); if(ioctl(fd,TIOCLGET,&l_mask)==SYSERR) return(-1); ttychars = l_ttychars; mask = LCRTBS|LCRTERA|LCTLECH|LPENDIN|LCRTKIL; if((l_mask|mask) != l_mask) l_changed = L_MASK; if(ioctl(fd,TIOCLBIS,&mask)==SYSERR) return(-1); if(ttychars.t_brkc!=ESC) { ttychars.t_brkc = ESC; l_changed |= T_CHARS; if(ioctl(fd,TIOCSETC,&ttychars) == SYSERR) return(-1); } return(0); }
static void do_get_string( int mode, const char *keyword, byte *area, size_t areasize ) { size_t n, len; char *p=NULL; int yes=0; n = area[0] << 8 | area[1]; /* fixme: do some sanity checks here */ if( mode == 1 ) p = tty_get( keyword ); else if( mode == 3 ) p = tty_get_hidden( keyword ); else yes = tty_get_answer_is_yes( keyword ); if( p ) { len = strlen(p); memcpy( area+n+2, p, len ); area[n] = len >> 8; area[n+1] = len; xfree(p); } else { /* bool */
int cpr_get_answer_yes_no_quit( const char *keyword, const char *prompt ) { int yes; char *p; if( opt.command_fd != -1 ) return !!do_get_from_fd ( keyword, 0, 1 ); for(;;) { p = tty_get( prompt ); trim_spaces(p); /* it is okay to do this here */ if( *p == '?' && !p[1] ) { xfree(p); display_online_help( keyword ); } else { tty_kill_prompt(); yes = answer_is_yes_no_quit(p); xfree(p); return yes; } } }
int cpr_get_answer_okay_cancel (const char *keyword, const char *prompt, int def_answer) { int yes; char *answer = NULL; char *p; if( opt.command_fd != -1 ) answer = do_get_from_fd ( keyword, 0, 0 ); if (answer) { yes = answer_is_okay_cancel (answer, def_answer); xfree (answer); return yes; } for(;;) { p = tty_get( prompt ); trim_spaces(p); /* it is okay to do this here */ if (*p == '?' && !p[1]) { xfree(p); display_online_help (keyword); } else { tty_kill_prompt(); yes = answer_is_okay_cancel (p, def_answer); xfree(p); return yes; } } }
/* Query the card, show a list of already stored keys and ask the user where to store the key. Returns the key number or 0 for cancel operation. */ static int query_card (APP app) { int keyno = 0; char *serialno, *disp_name, *pubkey_url; unsigned char *fpr1, *fpr2, *fpr3; if (app_openpgp_cardinfo (app, &serialno, &disp_name, &pubkey_url, &fpr1, &fpr2, &fpr3)) return 0; for (;;) { char *answer; tty_printf ("\n"); tty_printf ("Serial number ....: %s\n", serialno? serialno : "[none]"); tty_printf ("Name of cardholder: %s\n", disp_name && *disp_name? disp_name : "[not set]"); tty_printf ("URL of public key : %s\n", pubkey_url && *pubkey_url? pubkey_url : "[not set]"); tty_printf ("Signature key ....:"); show_sha1_fpr (fpr1); tty_printf ("Encryption key....:"); show_sha1_fpr (fpr2); tty_printf ("Authentication key:"); show_sha1_fpr (fpr3); tty_printf ("\n" "1 - store as signature key and reset usage counter\n" "2 - store as encryption key\n" "3 - store as authentication key\n" "Q - quit\n" "\n"); answer = tty_get("Your selection? "); tty_kill_prompt(); if (strlen (answer) != 1) ; else if ( *answer == '1' ) { if ( (fpr1 && !fpr_is_zero (fpr1)) ) { tty_printf ("\n"); log_error ("WARNING: signature key does already exists!\n"); tty_printf ("\n"); if ( tty_get_answer_is_yes ("Replace existing key? ") ) { keyno = 1; break; } } else { keyno = 1; break; } } else if ( *answer == '2' ) { if ( (fpr2 && !fpr_is_zero (fpr2)) ) { tty_printf ("\n"); log_error ("WARNING: encryption key does already exists!\n"); tty_printf ("\n"); if ( tty_get_answer_is_yes ("Replace existing key? ") ) { keyno = 2; break; } } else { keyno = 2; break; } } else if ( *answer == '3' ) { if ( (fpr3 && !fpr_is_zero (fpr3)) ) { tty_printf ("\n"); log_error ("WARNING: authentication key does already exists!\n"); tty_printf ("\n"); if ( tty_get_answer_is_yes ("Replace existing key? ") ) { keyno = 3; break; } } else { keyno = 3; break; } } else if ( *answer == 'q' || *answer == 'Q') { keyno = 0; break; } } xfree (serialno); xfree (disp_name); xfree (pubkey_url); xfree (fpr1); xfree (fpr2); xfree (fpr3); return keyno; }
int tty_alt(register int fd) { register Edit_t *ep = (Edit_t*)(shgd->ed_context); switch(ep->e_raw) { case ECHOMODE: return(-1); case ALTMODE: return(0); case RAWMODE: tty_cooked(fd); } if((tty_get(fd, &ttyparm)==SYSERR) || (!(ttyparm.c_lflag&ECHO))) return(-1); # ifdef FLUSHO ttyparm.c_lflag &= ~FLUSHO; # endif /* FLUSHO */ nttyparm = ttyparm; ep->e_eof = ttyparm.c_cc[VEOF]; # ifdef ECHOCTL /* escape character echos as ^[ */ nttyparm.c_lflag |= (ECHOE|ECHOK|ECHOCTL|PENDIN|IEXTEN); nttyparm.c_cc[VEOL] = ESC; # else /* switch VEOL2 and EOF, since EOF isn't echo'd by driver */ nttyparm.c_lflag |= (ECHOE|ECHOK); nttyparm.c_cc[VEOF] = ESC; /* make ESC the eof char */ # ifdef VEOL2 nttyparm.c_iflag &= ~(IGNCR|ICRNL); nttyparm.c_iflag |= INLCR; nttyparm.c_cc[VEOL] = '\r'; /* make CR an eol char */ nttyparm.c_cc[VEOL2] = ep->e_eof; /* make EOF an eol char */ # else nttyparm.c_cc[VEOL] = ep->e_eof; /* make EOF an eol char */ # endif /* VEOL2 */ # endif /* ECHOCTL */ # ifdef VREPRINT nttyparm.c_cc[VREPRINT] = _POSIX_DISABLE; # endif /* VREPRINT */ # ifdef VDISCARD nttyparm.c_cc[VDISCARD] = _POSIX_DISABLE; # endif /* VDISCARD */ # ifdef VWERASE if(ttyparm.c_cc[VWERASE] == _POSIX_DISABLE) nttyparm.c_cc[VWERASE] = cntl('W'); ep->e_werase = nttyparm.c_cc[VWERASE]; # else ep->e_werase = cntl('W'); # endif /* VWERASE */ # ifdef VLNEXT if(ttyparm.c_cc[VLNEXT] == _POSIX_DISABLE ) nttyparm.c_cc[VLNEXT] = cntl('V'); ep->e_lnext = nttyparm.c_cc[VLNEXT]; # else ep->e_lnext = cntl('V'); # endif /* VLNEXT */ ep->e_erase = ttyparm.c_cc[VERASE]; ep->e_kill = ttyparm.c_cc[VKILL]; if( tty_set(fd, TCSADRAIN, &nttyparm) == SYSERR ) return(-1); ep->e_ttyspeed = (cfgetospeed(&ttyparm)>=B1200?FAST:SLOW); ep->e_raw = ALTMODE; return(0); }
static el_status_t quote(void) { int c; return (c = tty_get()) == EOF ? CSeof : insert_char((int)c); }
int tty_raw(register int fd, int echomode) { int echo = echomode; #ifdef L_MASK struct ltchars lchars; #endif /* L_MASK */ register Edit_t *ep = (Edit_t*)(shgd->ed_context); if(ep->e_raw==RAWMODE) return(echo?-1:0); else if(ep->e_raw==ECHOMODE) return(echo?0:-1); #if !SHOPT_RAWONLY if(ep->e_raw != ALTMODE) #endif /* SHOPT_RAWONLY */ { if(tty_get(fd,&ttyparm) == SYSERR) return(-1); } #if L_MASK || VENIX if(ttyparm.sg_flags&LCASE) return(-1); if(!(ttyparm.sg_flags&ECHO)) { if(!echomode) return(-1); echo = 0; } nttyparm = ttyparm; if(!echo) nttyparm.sg_flags &= ~(ECHO | TBDELAY); # ifdef CBREAK nttyparm.sg_flags |= CBREAK; # else nttyparm.sg_flags |= RAW; # endif /* CBREAK */ ep->e_erase = ttyparm.sg_erase; ep->e_kill = ttyparm.sg_kill; ep->e_eof = cntl('D'); ep->e_werase = cntl('W'); ep->e_lnext = cntl('V'); if( tty_set(fd, TCSADRAIN, &nttyparm) == SYSERR ) return(-1); ep->e_ttyspeed = (ttyparm.sg_ospeed>=B1200?FAST:SLOW); # ifdef TIOCGLTC /* try to remove effect of ^V and ^Y and ^O */ if(ioctl(fd,TIOCGLTC,&l_chars) != SYSERR) { lchars = l_chars; lchars.t_lnextc = -1; lchars.t_flushc = -1; lchars.t_dsuspc = -1; /* no delayed stop process signal */ if(ioctl(fd,TIOCSLTC,&lchars) != SYSERR) l_changed |= L_CHARS; } # endif /* TIOCGLTC */ #else if (!(ttyparm.c_lflag & ECHO )) { if(!echomode) return(-1); echo = 0; } # ifdef FLUSHO ttyparm.c_lflag &= ~FLUSHO; # endif /* FLUSHO */ nttyparm = ttyparm; # ifndef u370 nttyparm.c_iflag &= ~(IGNPAR|PARMRK|INLCR|IGNCR|ICRNL); nttyparm.c_iflag |= BRKINT; # else nttyparm.c_iflag &= ~(IGNBRK|PARMRK|INLCR|IGNCR|ICRNL|INPCK); nttyparm.c_iflag |= (BRKINT|IGNPAR); # endif /* u370 */ if(echo) nttyparm.c_lflag &= ~(ICANON); else nttyparm.c_lflag &= ~(ICANON|ISIG|ECHO|ECHOK); nttyparm.c_cc[VTIME] = 0; nttyparm.c_cc[VMIN] = 1; # ifdef VREPRINT nttyparm.c_cc[VREPRINT] = _POSIX_DISABLE; # endif /* VREPRINT */ # ifdef VDISCARD nttyparm.c_cc[VDISCARD] = _POSIX_DISABLE; # endif /* VDISCARD */ # ifdef VDSUSP nttyparm.c_cc[VDSUSP] = _POSIX_DISABLE; # endif /* VDSUSP */ # ifdef VWERASE if(ttyparm.c_cc[VWERASE] == _POSIX_DISABLE) ep->e_werase = cntl('W'); else ep->e_werase = nttyparm.c_cc[VWERASE]; nttyparm.c_cc[VWERASE] = _POSIX_DISABLE; # else ep->e_werase = cntl('W'); # endif /* VWERASE */ # ifdef VLNEXT if(ttyparm.c_cc[VLNEXT] == _POSIX_DISABLE ) ep->e_lnext = cntl('V'); else ep->e_lnext = nttyparm.c_cc[VLNEXT]; nttyparm.c_cc[VLNEXT] = _POSIX_DISABLE; # else ep->e_lnext = cntl('V'); # endif /* VLNEXT */ ep->e_intr = ttyparm.c_cc[VINTR]; ep->e_eof = ttyparm.c_cc[VEOF]; ep->e_erase = ttyparm.c_cc[VERASE]; ep->e_kill = ttyparm.c_cc[VKILL]; if( tty_set(fd, TCSADRAIN, &nttyparm) == SYSERR ) return(-1); ep->e_ttyspeed = (cfgetospeed(&ttyparm)>=B1200?FAST:SLOW); #endif ep->e_raw = (echomode?ECHOMODE:RAWMODE); return(0); }