1/* 2 * Copyright (c) 2010 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 37#include "missing.h" 38 39/* Compatibility with older tty systems. */ 40#if !defined(TIOCGWINSZ) && defined(TIOCGSIZE) 41# define TIOCGWINSZ TIOCGSIZE 42# define winsize ttysize 43# define ws_col ts_cols 44# define ws_row ts_lines 45#endif 46 47#ifdef TIOCGWINSZ 48static int 49get_ttysize_ioctl(rowp, colp) 50 int *rowp; 51 int *colp; 52{ 53 struct winsize wsize; 54 55 if (ioctl(STDERR_FILENO, TIOCGWINSZ, &wsize) == 0 && 56 wsize.ws_row != 0 && wsize.ws_col != 0) { 57 *rowp = wsize.ws_row; 58 *colp = wsize.ws_col; 59 return 0; 60 } 61 return -1; 62} 63#else 64static int 65get_ttysize_ioctl(rowp, colp) 66 int *rowp; 67 int *colp; 68{ 69 return -1; 70} 71#endif /* TIOCGWINSZ */ 72 73void 74get_ttysize(rowp, colp) 75 int *rowp; 76 int *colp; 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 || (*rowp = atoi(p)) <= 0) 83 *rowp = 24; 84 if ((p = getenv("COLUMNS")) == NULL || (*colp = atoi(p)) <= 0) 85 *colp = 80; 86 } 87 88 return; 89} 90