]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - progs/reset_cmd.c
ncurses 6.1 - patch 20190323
[ncurses.git] / progs / reset_cmd.c
index 09dba5e5bb8bad1a4699c460e94b0c45c408450f..058ebf9c5a0ddca1df1c09c0bebc140e779e3baa 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
 /****************************************************************************
- * Copyright (c) 2016 Free Software Foundation, Inc.                        *
+ * Copyright (c) 2016-2017,2019 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -31,6 +31,7 @@
  ****************************************************************************/
 
 #include <reset_cmd.h>
  ****************************************************************************/
 
 #include <reset_cmd.h>
+#include <tty_settings.h>
 
 #include <errno.h>
 #include <stdio.h>
 
 #include <errno.h>
 #include <stdio.h>
@@ -51,7 +52,7 @@
 #include <sys/ptem.h>
 #endif
 
 #include <sys/ptem.h>
 #endif
 
-MODULE_ID("$Id: reset_cmd.c,v 1.7 2016/09/10 20:49:10 tom Exp $")
+MODULE_ID("$Id: reset_cmd.c,v 1.14 2019/02/23 18:33:19 tom Exp $")
 
 /*
  * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
 
 /*
  * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
@@ -73,48 +74,24 @@ MODULE_ID("$Id: reset_cmd.c,v 1.7 2016/09/10 20:49:10 tom Exp $")
 # endif
 #endif
 
 # endif
 #endif
 
-static int my_fd;
 static FILE *my_file;
 static FILE *my_file;
-static TTY original_settings;
 
 
-static bool can_restore = FALSE;
 static bool use_reset = FALSE; /* invoked as reset */
 static bool use_init = FALSE;  /* invoked as init */
 
 static void
 static bool use_reset = FALSE; /* invoked as reset */
 static bool use_init = FALSE;  /* invoked as init */
 
 static void
-exit_error(void)
+failed(const char *msg)
 {
 {
+    int code = errno;
+
+    (void) fprintf(stderr, "%s: %s: %s\n", _nc_progname, msg, strerror(code));
     restore_tty_settings();
     (void) fprintf(my_file, "\n");
     fflush(my_file);
     restore_tty_settings();
     (void) fprintf(my_file, "\n");
     fflush(my_file);
-    ExitProgram(EXIT_FAILURE);
-    /* NOTREACHED */
-}
-
-static void
-failed(const char *msg)
-{
-    char temp[BUFSIZ];
-
-    _nc_STRCPY(temp, _nc_progname, sizeof(temp));
-    _nc_STRCAT(temp, ": ", sizeof(temp));
-    _nc_STRNCAT(temp, msg, sizeof(temp), sizeof(temp) - strlen(temp) - 2);
-    perror(temp);
-    exit_error();
+    ExitProgram(ErrSystem(code));
     /* NOTREACHED */
 }
 
     /* NOTREACHED */
 }
 
-static bool
-get_tty_settings(int fd, TTY * tty_settings)
-{
-    bool success = TRUE;
-    my_fd = fd;
-    if (fd < 0 || GET_TTY(my_fd, tty_settings) < 0) {
-       success = FALSE;
-    }
-    return success;
-}
-
 static bool
 cat_file(char *file)
 {
 static bool
 cat_file(char *file)
 {
@@ -215,13 +192,9 @@ out_char(int c)
  * a child program dies in raw mode.
  */
 void
  * a child program dies in raw mode.
  */
 void
-reset_tty_settings(TTY * tty_settings)
+reset_tty_settings(int fd, TTY * tty_settings)
 {
 {
-#ifdef TERMIOS
-    tcgetattr(my_fd, tty_settings);
-#else
-    stty(my_fd, tty_settings);
-#endif
+    GET_TTY(fd, tty_settings);
 
 #ifdef TERMIOS
 #if defined(VDISCARD) && defined(CDISCARD)
 
 #ifdef TERMIOS
 #if defined(VDISCARD) && defined(CDISCARD)
@@ -355,7 +328,7 @@ reset_tty_settings(TTY * tty_settings)
        );
 #endif
 
        );
 #endif
 
-    SET_TTY(my_fd, tty_settings);
+    SET_TTY(fd, tty_settings);
 }
 
 /*
 }
 
 /*
@@ -368,7 +341,7 @@ default_erase(void)
     int result;
 
     if (over_strike
     int result;
 
     if (over_strike
-       && key_backspace != 0
+       && VALID_STRING(key_backspace)
        && strlen(key_backspace) == 1) {
        result = key_backspace[0];
     } else {
        && strlen(key_backspace) == 1) {
        result = key_backspace[0];
     } else {
@@ -425,7 +398,7 @@ set_conversions(TTY * tty_settings)
 #endif /* OXTABS */
 
     /* test used to be tgetflag("NL") */
 #endif /* OXTABS */
 
     /* test used to be tgetflag("NL") */
-    if (newline != (char *) 0 && newline[0] == '\n' && !newline[1]) {
+    if (VALID_STRING(newline) && newline[0] == '\n' && !newline[1]) {
        /* Newline, not linefeed. */
 #ifdef ONLCR
        tty_settings->c_oflag &= ~((unsigned) ONLCR);
        /* Newline, not linefeed. */
 #ifdef ONLCR
        tty_settings->c_oflag &= ~((unsigned) ONLCR);
@@ -434,7 +407,7 @@ set_conversions(TTY * tty_settings)
     }
 #ifdef OXTABS
     /* test used to be tgetflag("pt") */
     }
 #ifdef OXTABS
     /* test used to be tgetflag("pt") */
-    if (has_hardware_tabs)     /* Print tabs. */
+    if (VALID_STRING(set_tab) && VALID_STRING(clear_all_tabs))
        tty_settings->c_oflag &= ~OXTABS;
 #endif /* OXTABS */
     tty_settings->c_lflag |= (ECHOE | ECHOK);
        tty_settings->c_oflag &= ~OXTABS;
 #endif /* OXTABS */
     tty_settings->c_lflag |= (ECHOE | ECHOK);
@@ -450,7 +423,7 @@ set_conversions(TTY * tty_settings)
 static bool
 reset_tabstops(int wide)
 {
 static bool
 reset_tabstops(int wide)
 {
-    if ((init_tabs != 8) && (set_tab && clear_all_tabs)) {
+    if ((init_tabs != 8) && (VALID_STRING(set_tab) && VALID_STRING(clear_all_tabs))) {
        int c;
 
        (void) putc('\r', my_file);     /* Force to left margin. */
        int c;
 
        (void) putc('\r', my_file);     /* Force to left margin. */
@@ -476,7 +449,7 @@ static bool
 sent_string(const char *s)
 {
     bool sent = FALSE;
 sent_string(const char *s)
 {
     bool sent = FALSE;
-    if (s != 0) {
+    if (VALID_STRING(s)) {
        tputs(s, 0, out_char);
        sent = TRUE;
     }
        tputs(s, 0, out_char);
        sent = TRUE;
     }
@@ -487,7 +460,7 @@ sent_string(const char *s)
 
 /* Output startup string. */
 bool
 
 /* Output startup string. */
 bool
-send_init_strings(TTY * old_settings)
+send_init_strings(int fd GCC_UNUSED, TTY * old_settings)
 {
     int i;
     bool need_flush = FALSE;
 {
     int i;
     bool need_flush = FALSE;
@@ -497,11 +470,11 @@ send_init_strings(TTY * old_settings)
     if (old_settings != 0 &&
        old_settings->c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) {
        old_settings->c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET);
     if (old_settings != 0 &&
        old_settings->c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) {
        old_settings->c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET);
-       SET_TTY(my_fd, old_settings);
+       SET_TTY(fd, old_settings);
     }
 #endif
     if (use_reset || use_init) {
     }
 #endif
     if (use_reset || use_init) {
-       if (init_prog != 0) {
+       if (VALID_STRING(init_prog)) {
            IGNORE_RC(system(init_prog));
        }
 
            IGNORE_RC(system(init_prog));
        }
 
@@ -513,17 +486,23 @@ send_init_strings(TTY * old_settings)
                                  ? reset_2string
                                  : init_2string);
 
                                  ? reset_2string
                                  : init_2string);
 
-       if (set_lr_margin != 0) {
+#if defined(set_lr_margin)
+       if (VALID_STRING(set_lr_margin)) {
            need_flush |= sent_string(TPARM_2(set_lr_margin, 0,
                                              columns - 1));
            need_flush |= sent_string(TPARM_2(set_lr_margin, 0,
                                              columns - 1));
-       } else if (set_left_margin_parm != 0
-                  && set_right_margin_parm != 0) {
+       } else
+#endif
+#if defined(set_left_margin_parm) && defined(set_right_margin_parm)
+           if (VALID_STRING(set_left_margin_parm)
+               && VALID_STRING(set_right_margin_parm)) {
            need_flush |= sent_string(TPARM_1(set_left_margin_parm, 0));
            need_flush |= sent_string(TPARM_1(set_right_margin_parm,
                                              columns - 1));
            need_flush |= sent_string(TPARM_1(set_left_margin_parm, 0));
            need_flush |= sent_string(TPARM_1(set_right_margin_parm,
                                              columns - 1));
-       } else if (clear_margins != 0
-                  && set_left_margin != 0
-                  && set_right_margin != 0) {
+       } else
+#endif
+           if (VALID_STRING(clear_margins)
+               && VALID_STRING(set_left_margin)
+               && VALID_STRING(set_right_margin)) {
            need_flush |= sent_string(clear_margins);
            if (carriage_return != 0) {
                need_flush |= sent_string(carriage_return);
            need_flush |= sent_string(clear_margins);
            if (carriage_return != 0) {
                need_flush |= sent_string(carriage_return);
@@ -531,7 +510,7 @@ send_init_strings(TTY * old_settings)
                PUTCHAR('\r');
            }
            need_flush |= sent_string(set_left_margin);
                PUTCHAR('\r');
            }
            need_flush |= sent_string(set_left_margin);
-           if (parm_right_cursor) {
+           if (VALID_STRING(parm_right_cursor)) {
                need_flush |= sent_string(TPARM_1(parm_right_cursor,
                                                  columns - 1));
            } else {
                need_flush |= sent_string(TPARM_1(parm_right_cursor,
                                                  columns - 1));
            } else {
@@ -540,7 +519,7 @@ send_init_strings(TTY * old_settings)
                }
            }
            need_flush |= sent_string(set_right_margin);
                }
            }
            need_flush |= sent_string(set_right_margin);
-           if (carriage_return != 0) {
+           if (VALID_STRING(carriage_return)) {
                need_flush |= sent_string(carriage_return);
            } else {
                PUTCHAR('\r');
                need_flush |= sent_string(carriage_return);
            } else {
                PUTCHAR('\r');
@@ -626,53 +605,27 @@ print_tty_chars(TTY * old_settings, TTY * new_settings)
     show_tty_change(old_settings, new_settings, "Interrupt", VINTR, CINTR);
 }
 
     show_tty_change(old_settings, new_settings, "Interrupt", VINTR, CINTR);
 }
 
+#if HAVE_SIZECHANGE
 /*
 /*
- * Open a file descriptor on the current terminal, to obtain its settings.
- * stderr is less likely to be redirected than stdout; try that first.
+ * Set window size if not set already, but update our copy of the values if the
+ * size was set.
  */
  */
-int
-save_tty_settings(TTY * tty_settings)
-{
-    if (!get_tty_settings(STDERR_FILENO, tty_settings) &&
-       !get_tty_settings(STDOUT_FILENO, tty_settings) &&
-       !get_tty_settings(STDIN_FILENO, tty_settings) &&
-       !get_tty_settings(open("/dev/tty", O_RDWR), tty_settings)) {
-       failed("terminal attributes");
-    }
-    can_restore = TRUE;
-    original_settings = *tty_settings;
-    return my_fd;
-}
-
-void
-restore_tty_settings(void)
-{
-    if (can_restore)
-       SET_TTY(my_fd, &original_settings);
-}
-
-/* Set the modes if they've changed. */
 void
 void
-update_tty_settings(TTY * old_settings, TTY * new_settings)
-{
-    if (memcmp(new_settings, old_settings, sizeof(TTY))) {
-       SET_TTY(my_fd, new_settings);
-    }
-}
-
-#if HAVE_SIZECHANGE
-/* Set window size if not set already */
-void
-set_window_size(int fd, int high, int wide)
+set_window_size(int fd, short *high, short *wide)
 {
     STRUCT_WINSIZE win;
     (void) ioctl(fd, IOCTL_GET_WINSIZE, &win);
     if (WINSIZE_ROWS(win) == 0 &&
 {
     STRUCT_WINSIZE win;
     (void) ioctl(fd, IOCTL_GET_WINSIZE, &win);
     if (WINSIZE_ROWS(win) == 0 &&
-       WINSIZE_COLS(win) == 0 &&
-       high > 0 && wide > 0) {
-       WINSIZE_ROWS(win) = (unsigned short) high;
-       WINSIZE_COLS(win) = (unsigned short) wide;
-       (void) ioctl(fd, IOCTL_SET_WINSIZE, &win);
+       WINSIZE_COLS(win) == 0) {
+       if (*high > 0 && *wide > 0) {
+           WINSIZE_ROWS(win) = (unsigned short) *high;
+           WINSIZE_COLS(win) = (unsigned short) *wide;
+           (void) ioctl(fd, IOCTL_SET_WINSIZE, &win);
+       }
+    } else if (WINSIZE_ROWS(win) > 0 &&
+              WINSIZE_COLS(win) > 0) {
+       *high = (short) WINSIZE_ROWS(win);
+       *wide = (short) WINSIZE_COLS(win);
     }
 }
 #endif
     }
 }
 #endif