1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2012 AT&T Intellectual Property * 5* and is licensed under the * 6* Eclipse Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.eclipse.org/org/documents/epl-v10.html * 11* (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22#pragma prototyped 23 24/* 25 * AT&T Research 26 * return terminal rows and cols 27 */ 28 29#include <ast.h> 30#include <ast_tty.h> 31 32#if defined(__STDPP__directive) && defined(__STDPP__hide) 33__STDPP__directive pragma pp:hide ioctl sleep 34#else 35#define ioctl ______ioctl 36#define sleep ______sleep 37#endif 38 39#if _sys_ioctl 40#include <sys/ioctl.h> 41#endif 42 43#if defined(TIOCGWINSZ) 44#if _sys_stream && _sys_ptem 45#include <sys/stream.h> 46#include <sys/ptem.h> 47#endif 48#else 49#if !defined(TIOCGSIZE) && !defined(TIOCGWINSZ) 50#if _hdr_jioctl 51#define jwinsize winsize 52#include <jioctl.h> 53#else 54#if _sys_jioctl 55#define jwinsize winsize 56#include <sys/jioctl.h> 57#endif 58#endif 59#endif 60#endif 61 62#if defined(__STDPP__directive) && defined(__STDPP__hide) 63__STDPP__directive pragma pp:nohide ioctl sleep 64#else 65#undef ioctl 66#undef sleep 67#endif 68 69static int ttctl(int, int, void*); 70 71void 72astwinsize(int fd, register int* rows, register int* cols) 73{ 74#ifdef TIOCGWINSZ 75#define NEED_ttctl 76 struct winsize ws; 77 78 if (!ttctl(fd, TIOCGWINSZ, &ws) && ws.ws_col > 0 && ws.ws_row > 0) 79 { 80 if (rows) *rows = ws.ws_row; 81 if (cols) *cols = ws.ws_col; 82 } 83 else 84#else 85#ifdef TIOCGSIZE 86#define NEED_ttctl 87 struct ttysize ts; 88 89 if (!ttctl(fd, TIOCGSIZE, &ts) && ts.ts_lines > 0 && ts.ts_cols > 0) 90 { 91 if (rows) *rows = ts.ts_lines; 92 if (cols) *cols = ts.ts_cols; 93 } 94 else 95#else 96#ifdef JWINSIZE 97#define NEED_ttctl 98 struct winsize ws; 99 100 if (!ttctl(fd, JWINSIZE, &ws) && ws.bytesx > 0 && ws.bytesy > 0) 101 { 102 if (rows) *rows = ws.bytesy; 103 if (cols) *cols = ws.bytesx; 104 } 105 else 106#endif 107#endif 108#endif 109 { 110 char* s; 111 112 if (rows) *rows = (s = getenv("LINES")) ? strtol(s, NiL, 0) : 0; 113 if (cols) *cols = (s = getenv("COLUMNS")) ? strtol(s, NiL, 0) : 0; 114 } 115} 116 117#ifdef NEED_ttctl 118 119/* 120 * tty ioctl() -- no cache 121 */ 122 123static int 124ttctl(register int fd, int op, void* tt) 125{ 126 register int v; 127 128 if (fd < 0) 129 { 130 for (fd = 0; fd <= 2; fd++) 131 if (!ioctl(fd, op, tt)) return(0); 132 if ((fd = open("/dev/tty", O_RDONLY|O_cloexec)) >= 0) 133 { 134 v = ioctl(fd, op, tt); 135 close(fd); 136 return(v); 137 } 138 } 139 else if (!ioctl(fd, op, tt)) return(0); 140 return(-1); 141} 142 143#endif 144