- peruse get_terminal_width_height and remove legacy code for ancient
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 17 Jan 2007 19:45:36 +0000 (19:45 -0000)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 17 Jan 2007 19:45:36 +0000 (19:45 -0000)
  slowaris versions.

coreutils/stty.c

index a78e15c07a929470997e5ae4f0fdc3aa3dc43432..05d91d8c149c1247ae75ac68fb09973361e33a63 100644 (file)
@@ -484,21 +484,13 @@ static void wrapf(const char *message, ...)
                current_col = 0;
 }
 
-#ifdef TIOCGWINSZ
-
-static int get_win_size(int fd, struct winsize *win)
-{
-       return ioctl(fd, TIOCGWINSZ, (char *) win);
-}
-
-static void set_window_size(int rows, int cols)
+static void set_window_size(const int rows, const int cols)
 {
-       struct winsize win;
+       struct winsize win = { 0, 0, 0, 0};
 
-       if (get_win_size(STDIN_FILENO, &win)) {
+       if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win)) {
                if (errno != EINVAL) {
-                       perror_on_device("%s");
-                       return;
+                       goto bail;
                }
                memset(&win, 0, sizeof(win));
        }
@@ -508,77 +500,26 @@ static void set_window_size(int rows, int cols)
        if (cols >= 0)
                win.ws_col = cols;
 
-# ifdef TIOCSSIZE
-       /* Alexander Dupuy <dupuy@cs.columbia.edu> wrote:
-          The following code deals with a bug in the SunOS 4.x (and 3.x?) kernel.
-          This comment from sys/ttold.h describes Sun's twisted logic - a better
-          test would have been (ts_lines > 64k || ts_cols > 64k || ts_cols == 0).
-          At any rate, the problem is gone in Solaris 2.x */
-
-       if (win.ws_row == 0 || win.ws_col == 0) {
-               struct ttysize ttysz;
-
-               ttysz.ts_lines = win.ws_row;
-               ttysz.ts_cols = win.ws_col;
-
-               win.ws_row = win.ws_col = 1;
-
-               if ((ioctl(STDIN_FILENO, TIOCSWINSZ, (char *) &win) != 0)
-               || (ioctl(STDIN_FILENO, TIOCSSIZE, (char *) &ttysz) != 0)) {
-                       perror_on_device("%s");
-               }
-               return;
-       }
-# endif
-
        if (ioctl(STDIN_FILENO, TIOCSWINSZ, (char *) &win))
+bail:
                perror_on_device("%s");
 }
 
-static void display_window_size(int fancy)
+static void display_window_size(const int fancy)
 {
        const char *fmt_str = "%s\0%s: no size information for this device";
-       struct winsize win;
+       unsigned width, height;
 
-       if (get_win_size(STDIN_FILENO, &win)) {
+       if (get_terminal_width_height(STDIN_FILENO, &width, &height)) {
                if ((errno != EINVAL) || ((fmt_str += 2), !fancy)) {
                        perror_on_device(fmt_str);
                }
        } else {
                wrapf(fancy ? "rows %d; columns %d;" : "%d %d\n",
-                               win.ws_row, win.ws_col);
+                               height, width);
        }
 }
 
-#else /* !TIOCGWINSZ */
-
-static inline void display_window_size(int fancy) {}
-
-#endif /* !TIOCGWINSZ */
-
-static int screen_columns_or_die(void)
-{
-       const char *s;
-
-#ifdef TIOCGWINSZ
-       struct winsize win;
-
-       /* With Solaris 2.[123], this ioctl fails and errno is set to
-          EINVAL for telnet (but not rlogin) sessions.
-          On ISC 3.0, it fails for the console and the serial port
-          (but it works for ptys).
-          It can also fail on any system when stdout isn't a tty.
-          In case of any failure, just use the default */
-       if (get_win_size(STDOUT_FILENO, &win) == 0 && win.ws_col > 0)
-               return win.ws_col;
-#endif
-
-       s = getenv("COLUMNS");
-       if (s)
-               return xatoi_u(s);
-       return 80;
-}
-
 static const struct suffix_mult stty_suffixes[] = {
        {"b",  512 },
        {"k",  1024},
@@ -1183,7 +1124,7 @@ invalid_argument:
                perror_on_device_and_die("%s");
 
        if (option_mask32 & (STTY_verbose_output | STTY_recoverable_output | STTY_noargs)) {
-               max_col = screen_columns_or_die();
+               get_terminal_width_height(STDOUT_FILENO, &max_col, NULL);
                output_func(&mode);
                return EXIT_SUCCESS;
        }