1: /*
2: * Copyright (c) 2010-2012 Todd C. Miller <Todd.Miller@courtesan.com>
3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
16: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17: */
18:
19: #include <config.h>
20:
21: #include <sys/types.h>
22: #include <sys/ioctl.h>
23: #include <stdio.h>
24: #ifdef STDC_HEADERS
25: # include <stdlib.h>
26: # include <stddef.h>
27: #else
28: # ifdef HAVE_STDLIB_H
29: # include <stdlib.h>
30: # endif
31: #endif /* STDC_HEADERS */
32: #ifdef HAVE_UNISTD_H
33: # include <unistd.h>
34: #endif /* HAVE_UNISTD_H */
35: #include <termios.h>
36: #include <limits.h>
37:
38: #include "missing.h"
39: #include "sudo_debug.h"
40: #include "sudo_util.h"
41:
42: /* Compatibility with older tty systems. */
43: #if !defined(TIOCGWINSZ) && defined(TIOCGSIZE)
44: # define TIOCGWINSZ TIOCGSIZE
45: # define winsize ttysize
46: # define ws_col ts_cols
47: # define ws_row ts_lines
48: #endif
49:
50: #ifdef TIOCGWINSZ
51: static int
52: get_ttysize_ioctl(int *rowp, int *colp)
53: {
54: struct winsize wsize;
55: debug_decl(get_ttysize_ioctl, SUDO_DEBUG_EXEC)
56:
57: if (ioctl(STDERR_FILENO, TIOCGWINSZ, &wsize) == 0 &&
58: wsize.ws_row != 0 && wsize.ws_col != 0) {
59: *rowp = wsize.ws_row;
60: *colp = wsize.ws_col;
61: debug_return_int(0);
62: }
63: debug_return_int(-1);
64: }
65: #else
66: static int
67: get_ttysize_ioctl(int *rowp, int *colp)
68: {
69: return -1;
70: }
71: #endif /* TIOCGWINSZ */
72:
73: void
74: get_ttysize(int *rowp, int *colp)
75: {
76: debug_decl(fork_cmnd, SUDO_DEBUG_EXEC)
77:
78: if (get_ttysize_ioctl(rowp, colp) == -1) {
79: char *p;
80:
81: /* Fall back on $LINES and $COLUMNS. */
82: if ((p = getenv("LINES")) == NULL ||
83: (*rowp = strtonum(p, 1, INT_MAX, NULL)) <= 0) {
84: *rowp = 24;
85: }
86: if ((p = getenv("COLUMNS")) == NULL ||
87: (*colp = strtonum(p, 1, INT_MAX, NULL)) <= 0) {
88: *colp = 80;
89: }
90: }
91:
92: debug_return;
93: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>