NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_DCLx TTY * buf) { int result = OK; if (buf == 0 || SP_PARM == 0) { result = ERR; } else { TERMINAL *termp = TerminalOf(SP_PARM); if (0 == termp) { result = ERR; } else { #ifdef USE_TERM_DRIVER result = CallDriver_2(SP_PARM, sgmode, FALSE, buf); #else for (;;) { if (GET_TTY(termp->Filedes, buf) != 0) { if (errno == EINTR) continue; result = ERR; } break; } #endif } if (result == ERR) memset(buf, 0, sizeof(*buf)); TR(TRACE_BITS, ("_nc_get_tty_mode(%d): %s", termp ? termp->Filedes : -1, _nc_trace_ttymode(buf))); } return (result); }
_nc_get_tty_mode(TTY * buf) { if (cur_term == 0 || GET_TTY(cur_term->Filedes, buf) != 0) return (ERR); TR(TRACE_BITS, ("_nc_get_tty_mode(%d): %s", cur_term->Filedes, _nc_trace_ttymode(buf))); return (OK); }
void tty_init(void) { /* ATT terminal init */ #if defined(F_GETFL) && defined(O_NDELAY) int flags; flags = fcntl(fileno(stdin), F_GETFL, 0); nodelay_read = flags & O_NDELAY; #else nodelay_read = FALSE; #endif not_a_tty = FALSE; if (GET_TTY(fileno(stdin), &old_modes) == -1) { if (errno == ENOTTY) { tty_frame_size = 20; not_a_tty = TRUE; return; } printf("tcgetattr error: %d\n", errno); exit(1); } /* if TAB3 is set then setterm() wipes out tabs (ht) */ new_modes = old_modes; #ifdef TERMIOS #ifdef TABDLY new_modes.c_oflag &= ~TABDLY; #endif /* TABDLY */ #endif if (PUT_TTY(fileno(stdin), &new_modes) == -1) { printf("tcsetattr error: %d\n", errno); exit(1); } #ifdef sequent /* the sequent ATT emulation is broken soooo. */ old_modes.c_cflag &= ~(CSIZE | CSTOPB); old_modes.c_cflag |= CS7 | PARENB; #endif catchsig(); #ifdef TERMIOS switch (old_modes.c_cflag & CSIZE) { #if defined(CS5) && (CS5 != 0) case CS5: tty_frame_size = 10; break; #endif #if defined(CS6) && (CS6 != 0) case CS6: tty_frame_size = 12; break; #endif #if defined(CS7) && (CS7 != 0) case CS7: tty_frame_size = 14; break; #endif #if defined(CS8) && (CS8 != 0) case CS8: tty_frame_size = 16; break; #endif } tty_frame_size += 2 + ((old_modes.c_cflag & PARENB) ? 2 : 0) + ((old_modes.c_cflag & CSTOPB) ? 4 : 2); #else tty_frame_size = 6 + (old_modes.sg_flags & PASS8) ? 16 : 14; #endif }
int main(int argc, char **argv) { int ch, noinit, noset, quiet, Sflag, sflag, showterm; const char *p; const char *ttype; if (pledge("stdio rpath wpath tty", NULL) == -1) err("pledge: %s", strerror(errno)); obsolete(argv); noinit = noset = quiet = Sflag = sflag = showterm = 0; while ((ch = getopt(argc, argv, "a:cd:e:Ii:k:m:np:qQSrsVw")) != -1) { switch (ch) { case 'c': /* set control-chars */ opt_c = TRUE; break; case 'a': /* OBSOLETE: map identifier to type */ add_mapping("arpanet", optarg); break; case 'd': /* OBSOLETE: map identifier to type */ add_mapping("dialup", optarg); break; case 'e': /* erase character */ terasechar = arg_to_char(); break; case 'I': /* no initialization strings */ noinit = 1; break; case 'i': /* interrupt character */ intrchar = arg_to_char(); break; case 'k': /* kill character */ tkillchar = arg_to_char(); break; case 'm': /* map identifier to type */ add_mapping(0, optarg); break; case 'n': /* OBSOLETE: set new tty driver */ break; case 'p': /* OBSOLETE: map identifier to type */ add_mapping("plugboard", optarg); break; case 'Q': /* don't output control key settings */ quiet = 1; break; case 'q': /* display term only */ noset = 1; break; case 'r': /* display term on stderr */ showterm = 1; break; case 'S': /* OBSOLETE: output TERM & TERMCAP */ Sflag = 1; break; case 's': /* output TERM set command */ sflag = 1; break; case 'V': /* print curses-version */ puts(curses_version()); ExitProgram(EXIT_SUCCESS); case 'w': /* set window-size */ opt_w = TRUE; break; case '?': default: usage(); } } _nc_progname = _nc_rootname(*argv); argc -= optind; argv += optind; if (argc > 1) usage(); if (!opt_c && !opt_w) opt_c = opt_w = TRUE; if (GET_TTY(STDERR_FILENO, &mode) < 0) failed("standard error"); can_restore = TRUE; original = oldmode = mode; #ifdef TERMIOS ospeed = (NCURSES_OSPEED) cfgetospeed(&mode); #else ospeed = (NCURSES_OSPEED) mode.sg_ospeed; #endif if (!strcmp(_nc_progname, PROG_RESET)) { isreset = TRUE; reset_mode(); } ttype = get_termcap_entry(*argv); if (!noset) { tcolumns = columns; tlines = lines; #if HAVE_SIZECHANGE if (opt_w) { struct winsize win; /* Set window size if not set already */ (void) ioctl(STDERR_FILENO, TIOCGWINSZ, &win); if (win.ws_row == 0 && win.ws_col == 0 && tlines > 0 && tcolumns > 0) { win.ws_row = tlines; win.ws_col = tcolumns; (void) ioctl(STDERR_FILENO, TIOCSWINSZ, &win); } } #endif if (opt_c) { set_control_chars(); set_conversions(); if (!noinit) set_init(); /* Set the modes if they've changed. */ if (memcmp(&mode, &oldmode, sizeof(mode))) { SET_TTY(STDERR_FILENO, &mode); } } } /* Get the terminal name from the entry. */ ttype = _nc_first_name(cur_term->type.term_names); if (noset) (void) printf("%s\n", ttype); else { if (showterm) (void) fprintf(stderr, "Terminal type is %s.\n", ttype); /* * If erase, kill and interrupt characters could have been * modified and not -Q, display the changes. */ #ifdef TERMIOS if (!quiet) { report("Erase", VERASE, CERASE); report("Kill", VKILL, CKILL); report("Interrupt", VINTR, CINTR); } #endif } if (Sflag) err("The -S option is not supported under terminfo."); if (sflag) { int len; char *var; char *leaf; /* * Figure out what shell we're using. A hack, we look for an * environmental variable SHELL ending in "csh". */ if ((var = getenv("SHELL")) != 0 && ((len = (int) strlen(leaf = _nc_basename(var))) >= 3) && !strcmp(leaf + len - 3, "csh")) p = "set noglob;\nsetenv TERM %s;\nunset noglob;\n"; else p = "TERM=%s;\n"; (void) printf(p, ttype); } ExitProgram(EXIT_SUCCESS); }
/* * Reset the terminal mode bits to a sensible state. Very useful after * a child program dies in raw mode. */ void reset_tty_settings(int fd, TTY * tty_settings) { GET_TTY(fd, tty_settings); #ifdef TERMIOS #if defined(VDISCARD) && defined(CDISCARD) reset_char(VDISCARD, CDISCARD); #endif reset_char(VEOF, CEOF); reset_char(VERASE, CERASE); #if defined(VFLUSH) && defined(CFLUSH) reset_char(VFLUSH, CFLUSH); #endif reset_char(VINTR, CINTR); reset_char(VKILL, CKILL); #if defined(VLNEXT) && defined(CLNEXT) reset_char(VLNEXT, CLNEXT); #endif reset_char(VQUIT, CQUIT); #if defined(VREPRINT) && defined(CRPRNT) reset_char(VREPRINT, CRPRNT); #endif #if defined(VSTART) && defined(CSTART) reset_char(VSTART, CSTART); #endif #if defined(VSTOP) && defined(CSTOP) reset_char(VSTOP, CSTOP); #endif #if defined(VSUSP) && defined(CSUSP) reset_char(VSUSP, CSUSP); #endif #if defined(VWERASE) && defined(CWERASE) reset_char(VWERASE, CWERASE); #endif tty_settings->c_iflag &= ~((unsigned) (IGNBRK | PARMRK | INPCK | ISTRIP | INLCR | IGNCR #ifdef IUCLC | IUCLC #endif #ifdef IXANY | IXANY #endif | IXOFF)); tty_settings->c_iflag |= (BRKINT | IGNPAR | ICRNL | IXON #ifdef IMAXBEL | IMAXBEL #endif ); tty_settings->c_oflag &= ~((unsigned) (0 #ifdef OLCUC | OLCUC #endif #ifdef OCRNL | OCRNL #endif #ifdef ONOCR | ONOCR #endif #ifdef ONLRET | ONLRET #endif #ifdef OFILL | OFILL #endif #ifdef OFDEL | OFDEL #endif #ifdef NLDLY | NLDLY #endif #ifdef CRDLY | CRDLY #endif #ifdef TABDLY | TABDLY #endif #ifdef BSDLY | BSDLY #endif #ifdef VTDLY | VTDLY #endif #ifdef FFDLY | FFDLY #endif )); tty_settings->c_oflag |= (OPOST #ifdef ONLCR | ONLCR #endif ); tty_settings->c_cflag &= ~((unsigned) (CSIZE | CSTOPB | PARENB | PARODD | CLOCAL)); tty_settings->c_cflag |= (CS8 | CREAD); tty_settings->c_lflag &= ~((unsigned) (ECHONL | NOFLSH #ifdef TOSTOP | TOSTOP #endif #ifdef ECHOPTR | ECHOPRT #endif #ifdef XCASE | XCASE #endif )); tty_settings->c_lflag |= (ISIG | ICANON | ECHO | ECHOE | ECHOK #ifdef ECHOCTL | ECHOCTL #endif #ifdef ECHOKE | ECHOKE #endif ); #endif SET_TTY(fd, tty_settings); }