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 69 static int ttctl(int, int, void*); 70 71 void 72 astwinsize(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 123 static int 124 ttctl(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