Annotation of src/usr.bin/tic/tty_settings.c, Revision 1.1
1.1 ! nicm 1: /****************************************************************************
! 2: * Copyright 2020,2021 Thomas E. Dickey *
! 3: * Copyright 2016,2017 Free Software Foundation, Inc. *
! 4: * *
! 5: * Permission is hereby granted, free of charge, to any person obtaining a *
! 6: * copy of this software and associated documentation files (the *
! 7: * "Software"), to deal in the Software without restriction, including *
! 8: * without limitation the rights to use, copy, modify, merge, publish, *
! 9: * distribute, distribute with modifications, sublicense, and/or sell *
! 10: * copies of the Software, and to permit persons to whom the Software is *
! 11: * furnished to do so, subject to the following conditions: *
! 12: * *
! 13: * The above copyright notice and this permission notice shall be included *
! 14: * in all copies or substantial portions of the Software. *
! 15: * *
! 16: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
! 17: * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
! 18: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
! 19: * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
! 20: * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
! 21: * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
! 22: * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
! 23: * *
! 24: * Except as contained in this notice, the name(s) of the above copyright *
! 25: * holders shall not be used in advertising or otherwise to promote the *
! 26: * sale, use or other dealings in this Software without prior written *
! 27: * authorization. *
! 28: ****************************************************************************/
! 29:
! 30: /****************************************************************************
! 31: * Author: Thomas E. Dickey *
! 32: ****************************************************************************/
! 33:
! 34: #define USE_LIBTINFO
! 35: #include <tty_settings.h>
! 36:
! 37: #include <fcntl.h>
! 38:
! 39: MODULE_ID("$Id: tty_settings.c,v 1.7 2021/10/08 23:53:32 tom Exp $")
! 40:
! 41: static int my_fd;
! 42: static TTY original_settings;
! 43: static bool can_restore = FALSE;
! 44:
! 45: static void
! 46: failed(const char *msg)
! 47: {
! 48: int code = errno;
! 49:
! 50: (void) fprintf(stderr, "%s: %s: %s\n", _nc_progname, msg, strerror(code));
! 51: restore_tty_settings();
! 52: (void) fprintf(stderr, "\n");
! 53: ExitProgram(ErrSystem(code));
! 54: /* NOTREACHED */
! 55: }
! 56:
! 57: static bool
! 58: get_tty_settings(int fd, TTY * tty_settings)
! 59: {
! 60: bool success = TRUE;
! 61: my_fd = fd;
! 62: if (fd < 0 || GET_TTY(my_fd, tty_settings) < 0) {
! 63: success = FALSE;
! 64: }
! 65: return success;
! 66: }
! 67:
! 68: /*
! 69: * Open a file descriptor on the current terminal, to obtain its settings.
! 70: * stderr is less likely to be redirected than stdout; try that first.
! 71: */
! 72: int
! 73: save_tty_settings(TTY * tty_settings, bool need_tty)
! 74: {
! 75: if (!get_tty_settings(STDERR_FILENO, tty_settings) &&
! 76: !get_tty_settings(STDOUT_FILENO, tty_settings) &&
! 77: !get_tty_settings(STDIN_FILENO, tty_settings)) {
! 78: if (need_tty) {
! 79: int fd = open("/dev/tty", O_RDWR);
! 80: if (!get_tty_settings(fd, tty_settings)) {
! 81: failed("terminal attributes");
! 82: }
! 83: } else {
! 84: my_fd = fileno(stdout);
! 85: }
! 86: } else {
! 87: can_restore = TRUE;
! 88: original_settings = *tty_settings;
! 89: }
! 90: return my_fd;
! 91: }
! 92:
! 93: void
! 94: restore_tty_settings(void)
! 95: {
! 96: if (can_restore)
! 97: SET_TTY(my_fd, &original_settings);
! 98: }
! 99:
! 100: /* Set the modes if they've changed. */
! 101: void
! 102: update_tty_settings(TTY * old_settings, TTY * new_settings)
! 103: {
! 104: if (memcmp(new_settings, old_settings, sizeof(TTY))) {
! 105: SET_TTY(my_fd, new_settings);
! 106: }
! 107: }