xref: /freebsd/contrib/ncurses/progs/reset_cmd.c (revision 21817992b3314c908ab50f0bb88d2ee750b9c4ac)
1aae38d10SBaptiste Daroussin /****************************************************************************
2*21817992SBaptiste Daroussin  * Copyright 2019-2023,2024 Thomas E. Dickey                                *
3e1865124SBaptiste Daroussin  * Copyright 2016,2017 Free Software Foundation, Inc.                       *
4aae38d10SBaptiste Daroussin  *                                                                          *
5aae38d10SBaptiste Daroussin  * Permission is hereby granted, free of charge, to any person obtaining a  *
6aae38d10SBaptiste Daroussin  * copy of this software and associated documentation files (the            *
7aae38d10SBaptiste Daroussin  * "Software"), to deal in the Software without restriction, including      *
8aae38d10SBaptiste Daroussin  * without limitation the rights to use, copy, modify, merge, publish,      *
9aae38d10SBaptiste Daroussin  * distribute, distribute with modifications, sublicense, and/or sell       *
10aae38d10SBaptiste Daroussin  * copies of the Software, and to permit persons to whom the Software is    *
11aae38d10SBaptiste Daroussin  * furnished to do so, subject to the following conditions:                 *
12aae38d10SBaptiste Daroussin  *                                                                          *
13aae38d10SBaptiste Daroussin  * The above copyright notice and this permission notice shall be included  *
14aae38d10SBaptiste Daroussin  * in all copies or substantial portions of the Software.                   *
15aae38d10SBaptiste Daroussin  *                                                                          *
16aae38d10SBaptiste Daroussin  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
17aae38d10SBaptiste Daroussin  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
18aae38d10SBaptiste Daroussin  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
19aae38d10SBaptiste Daroussin  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
20aae38d10SBaptiste Daroussin  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
21aae38d10SBaptiste Daroussin  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
22aae38d10SBaptiste Daroussin  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
23aae38d10SBaptiste Daroussin  *                                                                          *
24aae38d10SBaptiste Daroussin  * Except as contained in this notice, the name(s) of the above copyright   *
25aae38d10SBaptiste Daroussin  * holders shall not be used in advertising or otherwise to promote the     *
26aae38d10SBaptiste Daroussin  * sale, use or other dealings in this Software without prior written       *
27aae38d10SBaptiste Daroussin  * authorization.                                                           *
28aae38d10SBaptiste Daroussin  ****************************************************************************/
29aae38d10SBaptiste Daroussin 
30aae38d10SBaptiste Daroussin /****************************************************************************
31aae38d10SBaptiste Daroussin  *  Author: Thomas E. Dickey                                                *
32aae38d10SBaptiste Daroussin  ****************************************************************************/
33aae38d10SBaptiste Daroussin 
34aae38d10SBaptiste Daroussin #include <reset_cmd.h>
35aae38d10SBaptiste Daroussin #include <tty_settings.h>
36aae38d10SBaptiste Daroussin 
37aae38d10SBaptiste Daroussin #include <errno.h>
38aae38d10SBaptiste Daroussin #include <stdio.h>
39aae38d10SBaptiste Daroussin #include <fcntl.h>
40aae38d10SBaptiste Daroussin 
41aae38d10SBaptiste Daroussin #if HAVE_SIZECHANGE
42aae38d10SBaptiste Daroussin # if !defined(sun) || !TERMIOS
43aae38d10SBaptiste Daroussin #  if HAVE_SYS_IOCTL_H
44aae38d10SBaptiste Daroussin #   include <sys/ioctl.h>
45aae38d10SBaptiste Daroussin #  endif
46aae38d10SBaptiste Daroussin # endif
47aae38d10SBaptiste Daroussin #endif
48aae38d10SBaptiste Daroussin 
49aae38d10SBaptiste Daroussin #if NEED_PTEM_H
50*21817992SBaptiste Daroussin /* they neglected to define struct winsize in termios.h -- it is only
51aae38d10SBaptiste Daroussin    in termio.h	*/
52aae38d10SBaptiste Daroussin #include <sys/stream.h>
53aae38d10SBaptiste Daroussin #include <sys/ptem.h>
54aae38d10SBaptiste Daroussin #endif
55aae38d10SBaptiste Daroussin 
56*21817992SBaptiste Daroussin MODULE_ID("$Id: reset_cmd.c,v 1.37 2024/04/08 17:29:34 tom Exp $")
57aae38d10SBaptiste Daroussin 
58aae38d10SBaptiste Daroussin /*
59aae38d10SBaptiste Daroussin  * SCO defines TIOCGSIZE and the corresponding struct.  Other systems (SunOS,
60aae38d10SBaptiste Daroussin  * Solaris, IRIX) define TIOCGWINSZ and struct winsize.
61aae38d10SBaptiste Daroussin  */
62aae38d10SBaptiste Daroussin #ifdef TIOCGSIZE
63aae38d10SBaptiste Daroussin # define IOCTL_GET_WINSIZE TIOCGSIZE
64aae38d10SBaptiste Daroussin # define IOCTL_SET_WINSIZE TIOCSSIZE
65aae38d10SBaptiste Daroussin # define STRUCT_WINSIZE struct ttysize
66aae38d10SBaptiste Daroussin # define WINSIZE_ROWS(n) n.ts_lines
67aae38d10SBaptiste Daroussin # define WINSIZE_COLS(n) n.ts_cols
68aae38d10SBaptiste Daroussin #else
69aae38d10SBaptiste Daroussin # ifdef TIOCGWINSZ
70aae38d10SBaptiste Daroussin #  define IOCTL_GET_WINSIZE TIOCGWINSZ
71aae38d10SBaptiste Daroussin #  define IOCTL_SET_WINSIZE TIOCSWINSZ
72aae38d10SBaptiste Daroussin #  define STRUCT_WINSIZE struct winsize
73aae38d10SBaptiste Daroussin #  define WINSIZE_ROWS(n) n.ws_row
74aae38d10SBaptiste Daroussin #  define WINSIZE_COLS(n) n.ws_col
75aae38d10SBaptiste Daroussin # endif
76aae38d10SBaptiste Daroussin #endif
77aae38d10SBaptiste Daroussin 
78*21817992SBaptiste Daroussin #define set_flags(target, mask)    target |= mask
79*21817992SBaptiste Daroussin #define clear_flags(target, mask)  target &= ~((unsigned)(mask))
80*21817992SBaptiste Daroussin 
81aae38d10SBaptiste Daroussin static FILE *my_file;
82aae38d10SBaptiste Daroussin 
83aae38d10SBaptiste Daroussin static bool use_reset = FALSE;	/* invoked as reset */
84aae38d10SBaptiste Daroussin static bool use_init = FALSE;	/* invoked as init */
85aae38d10SBaptiste Daroussin 
86*21817992SBaptiste Daroussin static GCC_NORETURN void
failed(const char * msg)87aae38d10SBaptiste Daroussin failed(const char *msg)
88aae38d10SBaptiste Daroussin {
89aae38d10SBaptiste Daroussin     int code = errno;
90aae38d10SBaptiste Daroussin 
91aae38d10SBaptiste Daroussin     (void) fprintf(stderr, "%s: %s: %s\n", _nc_progname, msg, strerror(code));
92aae38d10SBaptiste Daroussin     restore_tty_settings();
93aae38d10SBaptiste Daroussin     (void) fprintf(my_file, "\n");
94aae38d10SBaptiste Daroussin     fflush(my_file);
95aae38d10SBaptiste Daroussin     ExitProgram(ErrSystem(code));
96aae38d10SBaptiste Daroussin     /* NOTREACHED */
97aae38d10SBaptiste Daroussin }
98aae38d10SBaptiste Daroussin 
99aae38d10SBaptiste Daroussin static bool
cat_file(char * file)100aae38d10SBaptiste Daroussin cat_file(char *file)
101aae38d10SBaptiste Daroussin {
102aae38d10SBaptiste Daroussin     FILE *fp;
103aae38d10SBaptiste Daroussin     size_t nr;
104aae38d10SBaptiste Daroussin     char buf[BUFSIZ];
105aae38d10SBaptiste Daroussin     bool sent = FALSE;
106aae38d10SBaptiste Daroussin 
107aae38d10SBaptiste Daroussin     if (file != 0) {
108*21817992SBaptiste Daroussin 	if ((fp = safe_fopen(file, "r")) == 0)
109aae38d10SBaptiste Daroussin 	    failed(file);
110aae38d10SBaptiste Daroussin 
111aae38d10SBaptiste Daroussin 	while ((nr = fread(buf, sizeof(char), sizeof(buf), fp)) != 0) {
112aae38d10SBaptiste Daroussin 	    if (fwrite(buf, sizeof(char), nr, my_file) != nr) {
113aae38d10SBaptiste Daroussin 		failed(file);
114aae38d10SBaptiste Daroussin 	    }
115aae38d10SBaptiste Daroussin 	    sent = TRUE;
116aae38d10SBaptiste Daroussin 	}
117aae38d10SBaptiste Daroussin 	fclose(fp);
118aae38d10SBaptiste Daroussin     }
119aae38d10SBaptiste Daroussin     return sent;
120aae38d10SBaptiste Daroussin }
121aae38d10SBaptiste Daroussin 
122aae38d10SBaptiste Daroussin static int
out_char(int c)123aae38d10SBaptiste Daroussin out_char(int c)
124aae38d10SBaptiste Daroussin {
125aae38d10SBaptiste Daroussin     return putc(c, my_file);
126aae38d10SBaptiste Daroussin }
127aae38d10SBaptiste Daroussin 
128aae38d10SBaptiste Daroussin /**************************************************************************
129aae38d10SBaptiste Daroussin  * Mode-setting logic
130aae38d10SBaptiste Daroussin  **************************************************************************/
131aae38d10SBaptiste Daroussin 
132aae38d10SBaptiste Daroussin /* some BSD systems have these built in, some systems are missing
133aae38d10SBaptiste Daroussin  * one or more definitions. The safest solution is to override unless the
134aae38d10SBaptiste Daroussin  * commonly-altered ones are defined.
135aae38d10SBaptiste Daroussin  */
136aae38d10SBaptiste Daroussin #if !(defined(CERASE) && defined(CINTR) && defined(CKILL) && defined(CQUIT))
137aae38d10SBaptiste Daroussin #undef CEOF
138aae38d10SBaptiste Daroussin #undef CERASE
139aae38d10SBaptiste Daroussin #undef CINTR
140aae38d10SBaptiste Daroussin #undef CKILL
141aae38d10SBaptiste Daroussin #undef CLNEXT
142aae38d10SBaptiste Daroussin #undef CRPRNT
143aae38d10SBaptiste Daroussin #undef CQUIT
144aae38d10SBaptiste Daroussin #undef CSTART
145aae38d10SBaptiste Daroussin #undef CSTOP
146aae38d10SBaptiste Daroussin #undef CSUSP
147aae38d10SBaptiste Daroussin #endif
148aae38d10SBaptiste Daroussin 
149aae38d10SBaptiste Daroussin /* control-character defaults */
150aae38d10SBaptiste Daroussin #ifndef CEOF
151aae38d10SBaptiste Daroussin #define CEOF	CTRL('D')
152aae38d10SBaptiste Daroussin #endif
153aae38d10SBaptiste Daroussin #ifndef CERASE
154aae38d10SBaptiste Daroussin #define CERASE	CTRL('H')
155aae38d10SBaptiste Daroussin #endif
156aae38d10SBaptiste Daroussin #ifndef CINTR
157aae38d10SBaptiste Daroussin #define CINTR	127		/* ^? */
158aae38d10SBaptiste Daroussin #endif
159aae38d10SBaptiste Daroussin #ifndef CKILL
160aae38d10SBaptiste Daroussin #define CKILL	CTRL('U')
161aae38d10SBaptiste Daroussin #endif
162aae38d10SBaptiste Daroussin #ifndef CLNEXT
163aae38d10SBaptiste Daroussin #define CLNEXT  CTRL('v')
164aae38d10SBaptiste Daroussin #endif
165aae38d10SBaptiste Daroussin #ifndef CRPRNT
166aae38d10SBaptiste Daroussin #define CRPRNT  CTRL('r')
167aae38d10SBaptiste Daroussin #endif
168aae38d10SBaptiste Daroussin #ifndef CQUIT
169aae38d10SBaptiste Daroussin #define CQUIT	CTRL('\\')
170aae38d10SBaptiste Daroussin #endif
171aae38d10SBaptiste Daroussin #ifndef CSTART
172aae38d10SBaptiste Daroussin #define CSTART	CTRL('Q')
173aae38d10SBaptiste Daroussin #endif
174aae38d10SBaptiste Daroussin #ifndef CSTOP
175aae38d10SBaptiste Daroussin #define CSTOP	CTRL('S')
176aae38d10SBaptiste Daroussin #endif
177aae38d10SBaptiste Daroussin #ifndef CSUSP
178aae38d10SBaptiste Daroussin #define CSUSP	CTRL('Z')
179aae38d10SBaptiste Daroussin #endif
180aae38d10SBaptiste Daroussin 
181aae38d10SBaptiste Daroussin #if defined(_POSIX_VDISABLE)
182aae38d10SBaptiste Daroussin #define DISABLED(val)   (((_POSIX_VDISABLE != -1) \
183aae38d10SBaptiste Daroussin 		       && ((val) == _POSIX_VDISABLE)) \
184aae38d10SBaptiste Daroussin 		      || ((val) <= 0))
185aae38d10SBaptiste Daroussin #else
186aae38d10SBaptiste Daroussin #define DISABLED(val)   ((int)(val) <= 0)
187aae38d10SBaptiste Daroussin #endif
188aae38d10SBaptiste Daroussin 
189aae38d10SBaptiste Daroussin #define CHK(val, dft)   (unsigned char) (DISABLED(val) ? dft : val)
190aae38d10SBaptiste Daroussin 
191aae38d10SBaptiste Daroussin #define reset_char(item, value) \
192aae38d10SBaptiste Daroussin     tty_settings->c_cc[item] = CHK(tty_settings->c_cc[item], value)
193aae38d10SBaptiste Daroussin 
194aae38d10SBaptiste Daroussin /*
195*21817992SBaptiste Daroussin  * Simplify ifdefs
196*21817992SBaptiste Daroussin  */
197*21817992SBaptiste Daroussin #ifndef BSDLY
198*21817992SBaptiste Daroussin #define BSDLY 0
199*21817992SBaptiste Daroussin #endif
200*21817992SBaptiste Daroussin #ifndef CRDLY
201*21817992SBaptiste Daroussin #define CRDLY 0
202*21817992SBaptiste Daroussin #endif
203*21817992SBaptiste Daroussin #ifndef ECHOCTL
204*21817992SBaptiste Daroussin #define ECHOCTL 0
205*21817992SBaptiste Daroussin #endif
206*21817992SBaptiste Daroussin #ifndef ECHOKE
207*21817992SBaptiste Daroussin #define ECHOKE 0
208*21817992SBaptiste Daroussin #endif
209*21817992SBaptiste Daroussin #ifndef ECHOPRT
210*21817992SBaptiste Daroussin #define ECHOPRT 0
211*21817992SBaptiste Daroussin #endif
212*21817992SBaptiste Daroussin #ifndef FFDLY
213*21817992SBaptiste Daroussin #define FFDLY 0
214*21817992SBaptiste Daroussin #endif
215*21817992SBaptiste Daroussin #ifndef IMAXBEL
216*21817992SBaptiste Daroussin #define IMAXBEL 0
217*21817992SBaptiste Daroussin #endif
218*21817992SBaptiste Daroussin #ifndef IUCLC
219*21817992SBaptiste Daroussin #define IUCLC 0
220*21817992SBaptiste Daroussin #endif
221*21817992SBaptiste Daroussin #ifndef IXANY
222*21817992SBaptiste Daroussin #define IXANY 0
223*21817992SBaptiste Daroussin #endif
224*21817992SBaptiste Daroussin #ifndef NLDLY
225*21817992SBaptiste Daroussin #define NLDLY 0
226*21817992SBaptiste Daroussin #endif
227*21817992SBaptiste Daroussin #ifndef OCRNL
228*21817992SBaptiste Daroussin #define OCRNL 0
229*21817992SBaptiste Daroussin #endif
230*21817992SBaptiste Daroussin #ifndef OFDEL
231*21817992SBaptiste Daroussin #define OFDEL 0
232*21817992SBaptiste Daroussin #endif
233*21817992SBaptiste Daroussin #ifndef OFILL
234*21817992SBaptiste Daroussin #define OFILL 0
235*21817992SBaptiste Daroussin #endif
236*21817992SBaptiste Daroussin #ifndef OLCUC
237*21817992SBaptiste Daroussin #define OLCUC 0
238*21817992SBaptiste Daroussin #endif
239*21817992SBaptiste Daroussin #ifndef ONLCR
240*21817992SBaptiste Daroussin #define ONLCR 0
241*21817992SBaptiste Daroussin #endif
242*21817992SBaptiste Daroussin #ifndef ONLRET
243*21817992SBaptiste Daroussin #define ONLRET 0
244*21817992SBaptiste Daroussin #endif
245*21817992SBaptiste Daroussin #ifndef ONOCR
246*21817992SBaptiste Daroussin #define ONOCR 0
247*21817992SBaptiste Daroussin #endif
248*21817992SBaptiste Daroussin #ifndef OXTABS
249*21817992SBaptiste Daroussin #define OXTABS 0
250*21817992SBaptiste Daroussin #endif
251*21817992SBaptiste Daroussin #ifndef TAB3
252*21817992SBaptiste Daroussin #define TAB3 0
253*21817992SBaptiste Daroussin #endif
254*21817992SBaptiste Daroussin #ifndef TABDLY
255*21817992SBaptiste Daroussin #define TABDLY 0
256*21817992SBaptiste Daroussin #endif
257*21817992SBaptiste Daroussin #ifndef TOSTOP
258*21817992SBaptiste Daroussin #define TOSTOP 0
259*21817992SBaptiste Daroussin #endif
260*21817992SBaptiste Daroussin #ifndef VTDLY
261*21817992SBaptiste Daroussin #define VTDLY 0
262*21817992SBaptiste Daroussin #endif
263*21817992SBaptiste Daroussin #ifndef XCASE
264*21817992SBaptiste Daroussin #define XCASE 0
265*21817992SBaptiste Daroussin #endif
266*21817992SBaptiste Daroussin 
267*21817992SBaptiste Daroussin /*
268aae38d10SBaptiste Daroussin  * Reset the terminal mode bits to a sensible state.  Very useful after
269aae38d10SBaptiste Daroussin  * a child program dies in raw mode.
270aae38d10SBaptiste Daroussin  */
271aae38d10SBaptiste Daroussin void
reset_tty_settings(int fd,TTY * tty_settings,int noset)272*21817992SBaptiste Daroussin reset_tty_settings(int fd, TTY * tty_settings, int noset)
273aae38d10SBaptiste Daroussin {
274*21817992SBaptiste Daroussin     unsigned mask;
275*21817992SBaptiste Daroussin #ifdef TIOCMGET
276*21817992SBaptiste Daroussin     int modem_bits;
277*21817992SBaptiste Daroussin #endif
278*21817992SBaptiste Daroussin 
279aae38d10SBaptiste Daroussin     GET_TTY(fd, tty_settings);
280aae38d10SBaptiste Daroussin 
281aae38d10SBaptiste Daroussin #ifdef TERMIOS
282aae38d10SBaptiste Daroussin #if defined(VDISCARD) && defined(CDISCARD)
283aae38d10SBaptiste Daroussin     reset_char(VDISCARD, CDISCARD);
284aae38d10SBaptiste Daroussin #endif
285aae38d10SBaptiste Daroussin     reset_char(VEOF, CEOF);
286aae38d10SBaptiste Daroussin     reset_char(VERASE, CERASE);
287*21817992SBaptiste Daroussin #if defined(VERASE2) && defined(CERASE2)
288*21817992SBaptiste Daroussin     reset_char(VERASE2, CERASE2);
289*21817992SBaptiste Daroussin #endif
290aae38d10SBaptiste Daroussin #if defined(VFLUSH) && defined(CFLUSH)
291aae38d10SBaptiste Daroussin     reset_char(VFLUSH, CFLUSH);
292aae38d10SBaptiste Daroussin #endif
293aae38d10SBaptiste Daroussin     reset_char(VINTR, CINTR);
294aae38d10SBaptiste Daroussin     reset_char(VKILL, CKILL);
295aae38d10SBaptiste Daroussin #if defined(VLNEXT) && defined(CLNEXT)
296aae38d10SBaptiste Daroussin     reset_char(VLNEXT, CLNEXT);
297aae38d10SBaptiste Daroussin #endif
298aae38d10SBaptiste Daroussin     reset_char(VQUIT, CQUIT);
299aae38d10SBaptiste Daroussin #if defined(VREPRINT) && defined(CRPRNT)
300aae38d10SBaptiste Daroussin     reset_char(VREPRINT, CRPRNT);
301aae38d10SBaptiste Daroussin #endif
302aae38d10SBaptiste Daroussin #if defined(VSTART) && defined(CSTART)
303aae38d10SBaptiste Daroussin     reset_char(VSTART, CSTART);
304aae38d10SBaptiste Daroussin #endif
305aae38d10SBaptiste Daroussin #if defined(VSTOP) && defined(CSTOP)
306aae38d10SBaptiste Daroussin     reset_char(VSTOP, CSTOP);
307aae38d10SBaptiste Daroussin #endif
308aae38d10SBaptiste Daroussin #if defined(VSUSP) && defined(CSUSP)
309aae38d10SBaptiste Daroussin     reset_char(VSUSP, CSUSP);
310aae38d10SBaptiste Daroussin #endif
311aae38d10SBaptiste Daroussin #if defined(VWERASE) && defined(CWERASE)
312aae38d10SBaptiste Daroussin     reset_char(VWERASE, CWERASE);
313aae38d10SBaptiste Daroussin #endif
314aae38d10SBaptiste Daroussin 
315*21817992SBaptiste Daroussin     clear_flags(tty_settings->c_iflag, (IGNBRK
316aae38d10SBaptiste Daroussin 					| PARMRK
317aae38d10SBaptiste Daroussin 					| INPCK
318aae38d10SBaptiste Daroussin 					| ISTRIP
319aae38d10SBaptiste Daroussin 					| INLCR
320aae38d10SBaptiste Daroussin 					| IGNCR
321aae38d10SBaptiste Daroussin 					| IUCLC
322aae38d10SBaptiste Daroussin 					| IXANY
323aae38d10SBaptiste Daroussin 					| IXOFF));
324aae38d10SBaptiste Daroussin 
325*21817992SBaptiste Daroussin     set_flags(tty_settings->c_iflag, (BRKINT
326aae38d10SBaptiste Daroussin 				      | IGNPAR
327aae38d10SBaptiste Daroussin 				      | ICRNL
328aae38d10SBaptiste Daroussin 				      | IXON
329*21817992SBaptiste Daroussin 				      | IMAXBEL));
330aae38d10SBaptiste Daroussin 
331*21817992SBaptiste Daroussin     clear_flags(tty_settings->c_oflag, (0
332aae38d10SBaptiste Daroussin 					| OLCUC
333aae38d10SBaptiste Daroussin 					| OCRNL
334aae38d10SBaptiste Daroussin 					| ONOCR
335aae38d10SBaptiste Daroussin 					| ONLRET
336aae38d10SBaptiste Daroussin 					| OFILL
337aae38d10SBaptiste Daroussin 					| OFDEL
338aae38d10SBaptiste Daroussin 					| NLDLY
339aae38d10SBaptiste Daroussin 					| CRDLY
340aae38d10SBaptiste Daroussin 					| TABDLY
341aae38d10SBaptiste Daroussin 					| BSDLY
342aae38d10SBaptiste Daroussin 					| VTDLY
343*21817992SBaptiste Daroussin 					| FFDLY));
344aae38d10SBaptiste Daroussin 
345*21817992SBaptiste Daroussin     set_flags(tty_settings->c_oflag, (OPOST
346*21817992SBaptiste Daroussin 				      | ONLCR));
347aae38d10SBaptiste Daroussin 
348*21817992SBaptiste Daroussin     mask = (CSIZE | CSTOPB | PARENB | PARODD);
349*21817992SBaptiste Daroussin #ifdef TIOCMGET
350*21817992SBaptiste Daroussin     /* leave clocal alone if this appears to use a modem */
351*21817992SBaptiste Daroussin     if (ioctl(fd, TIOCMGET, &modem_bits) == -1)
352*21817992SBaptiste Daroussin 	mask |= CLOCAL;
353*21817992SBaptiste Daroussin #else
354*21817992SBaptiste Daroussin     /* cannot check - use the behavior from tset */
355*21817992SBaptiste Daroussin     mask |= CLOCAL;
356*21817992SBaptiste Daroussin #endif
357*21817992SBaptiste Daroussin     clear_flags(tty_settings->c_cflag, mask);
358*21817992SBaptiste Daroussin 
359*21817992SBaptiste Daroussin     set_flags(tty_settings->c_cflag, (CS8 | CREAD));
360*21817992SBaptiste Daroussin     clear_flags(tty_settings->c_lflag, (ECHONL
361aae38d10SBaptiste Daroussin 					| NOFLSH
362aae38d10SBaptiste Daroussin 					| TOSTOP
363aae38d10SBaptiste Daroussin 					| ECHOPRT
364*21817992SBaptiste Daroussin 					| XCASE));
365aae38d10SBaptiste Daroussin 
366*21817992SBaptiste Daroussin     set_flags(tty_settings->c_lflag, (ISIG
367aae38d10SBaptiste Daroussin 				      | ICANON
368aae38d10SBaptiste Daroussin 				      | ECHO
369aae38d10SBaptiste Daroussin 				      | ECHOE
370aae38d10SBaptiste Daroussin 				      | ECHOK
371aae38d10SBaptiste Daroussin 				      | ECHOCTL
372*21817992SBaptiste Daroussin 				      | ECHOKE));
373*21817992SBaptiste Daroussin #endif /* TERMIOS */
374aae38d10SBaptiste Daroussin 
375*21817992SBaptiste Daroussin     if (!noset) {
376aae38d10SBaptiste Daroussin 	SET_TTY(fd, tty_settings);
377aae38d10SBaptiste Daroussin     }
378*21817992SBaptiste Daroussin }
379aae38d10SBaptiste Daroussin 
380aae38d10SBaptiste Daroussin /*
381aae38d10SBaptiste Daroussin  * Returns a "good" value for the erase character.  This is loosely based on
382aae38d10SBaptiste Daroussin  * the BSD4.4 logic.
383aae38d10SBaptiste Daroussin  */
384aae38d10SBaptiste Daroussin static int
default_erase(void)385aae38d10SBaptiste Daroussin default_erase(void)
386aae38d10SBaptiste Daroussin {
387aae38d10SBaptiste Daroussin     int result;
388aae38d10SBaptiste Daroussin 
389aae38d10SBaptiste Daroussin     if (over_strike
390aae38d10SBaptiste Daroussin 	&& VALID_STRING(key_backspace)
391aae38d10SBaptiste Daroussin 	&& strlen(key_backspace) == 1) {
392aae38d10SBaptiste Daroussin 	result = key_backspace[0];
393aae38d10SBaptiste Daroussin     } else {
394aae38d10SBaptiste Daroussin 	result = CERASE;
395aae38d10SBaptiste Daroussin     }
396aae38d10SBaptiste Daroussin 
397aae38d10SBaptiste Daroussin     return result;
398aae38d10SBaptiste Daroussin }
399aae38d10SBaptiste Daroussin 
400aae38d10SBaptiste Daroussin /*
401aae38d10SBaptiste Daroussin  * Update the values of the erase, interrupt, and kill characters in the TTY
402aae38d10SBaptiste Daroussin  * parameter.
403aae38d10SBaptiste Daroussin  *
404aae38d10SBaptiste Daroussin  * SVr4 tset (e.g., Solaris 2.5) only modifies the intr, quit or erase
405aae38d10SBaptiste Daroussin  * characters if they're unset, or if we specify them as options.  This differs
406aae38d10SBaptiste Daroussin  * from BSD 4.4 tset, which always sets erase.
407aae38d10SBaptiste Daroussin  */
408aae38d10SBaptiste Daroussin void
set_control_chars(TTY * tty_settings,int my_erase,int my_intr,int my_kill)409aae38d10SBaptiste Daroussin set_control_chars(TTY * tty_settings, int my_erase, int my_intr, int my_kill)
410aae38d10SBaptiste Daroussin {
4117a656419SBaptiste Daroussin #if defined(EXP_WIN32_DRIVER)
4127a656419SBaptiste Daroussin     /* noop */
4137a656419SBaptiste Daroussin     (void) tty_settings;
4147a656419SBaptiste Daroussin     (void) my_erase;
4157a656419SBaptiste Daroussin     (void) my_intr;
4167a656419SBaptiste Daroussin     (void) my_kill;
4177a656419SBaptiste Daroussin #else
418aae38d10SBaptiste Daroussin     if (DISABLED(tty_settings->c_cc[VERASE]) || my_erase >= 0) {
419aae38d10SBaptiste Daroussin 	tty_settings->c_cc[VERASE] = UChar((my_erase >= 0)
420aae38d10SBaptiste Daroussin 					   ? my_erase
421aae38d10SBaptiste Daroussin 					   : default_erase());
422aae38d10SBaptiste Daroussin     }
423aae38d10SBaptiste Daroussin 
424aae38d10SBaptiste Daroussin     if (DISABLED(tty_settings->c_cc[VINTR]) || my_intr >= 0) {
425aae38d10SBaptiste Daroussin 	tty_settings->c_cc[VINTR] = UChar((my_intr >= 0)
426aae38d10SBaptiste Daroussin 					  ? my_intr
427aae38d10SBaptiste Daroussin 					  : CINTR);
428aae38d10SBaptiste Daroussin     }
429aae38d10SBaptiste Daroussin 
430aae38d10SBaptiste Daroussin     if (DISABLED(tty_settings->c_cc[VKILL]) || my_kill >= 0) {
431aae38d10SBaptiste Daroussin 	tty_settings->c_cc[VKILL] = UChar((my_kill >= 0)
432aae38d10SBaptiste Daroussin 					  ? my_kill
433aae38d10SBaptiste Daroussin 					  : CKILL);
434aae38d10SBaptiste Daroussin     }
4357a656419SBaptiste Daroussin #endif
436aae38d10SBaptiste Daroussin }
437aae38d10SBaptiste Daroussin 
438aae38d10SBaptiste Daroussin /*
439aae38d10SBaptiste Daroussin  * Set up various conversions in the TTY parameter, including parity, tabs,
440aae38d10SBaptiste Daroussin  * returns, echo, and case, according to the termcap entry.
441aae38d10SBaptiste Daroussin  */
442aae38d10SBaptiste Daroussin void
set_conversions(TTY * tty_settings)443aae38d10SBaptiste Daroussin set_conversions(TTY * tty_settings)
444aae38d10SBaptiste Daroussin {
4457a656419SBaptiste Daroussin #if defined(EXP_WIN32_DRIVER)
4467a656419SBaptiste Daroussin     /* FIXME */
4477a656419SBaptiste Daroussin #else
448*21817992SBaptiste Daroussin     set_flags(tty_settings->c_oflag, ONLCR);
449*21817992SBaptiste Daroussin     set_flags(tty_settings->c_iflag, ICRNL);
450*21817992SBaptiste Daroussin     set_flags(tty_settings->c_lflag, ECHO);
451*21817992SBaptiste Daroussin     set_flags(tty_settings->c_oflag, OXTABS);
452aae38d10SBaptiste Daroussin 
453aae38d10SBaptiste Daroussin     /* test used to be tgetflag("NL") */
454aae38d10SBaptiste Daroussin     if (VALID_STRING(newline) && newline[0] == '\n' && !newline[1]) {
455aae38d10SBaptiste Daroussin 	/* Newline, not linefeed. */
456*21817992SBaptiste Daroussin 	clear_flags(tty_settings->c_oflag, ONLCR);
457*21817992SBaptiste Daroussin 	clear_flags(tty_settings->c_iflag, ICRNL);
458aae38d10SBaptiste Daroussin     }
459*21817992SBaptiste Daroussin #if OXTABS
460aae38d10SBaptiste Daroussin     /* test used to be tgetflag("pt") */
461aae38d10SBaptiste Daroussin     if (VALID_STRING(set_tab) && VALID_STRING(clear_all_tabs))
462*21817992SBaptiste Daroussin 	clear_flags(tty_settings->c_oflag, OXTABS);
463aae38d10SBaptiste Daroussin #endif /* OXTABS */
464*21817992SBaptiste Daroussin     set_flags(tty_settings->c_lflag, (ECHOE | ECHOK));
4657a656419SBaptiste Daroussin #endif
466aae38d10SBaptiste Daroussin }
467aae38d10SBaptiste Daroussin 
468aae38d10SBaptiste Daroussin static bool
sent_string(const char * s)469aae38d10SBaptiste Daroussin sent_string(const char *s)
470aae38d10SBaptiste Daroussin {
471aae38d10SBaptiste Daroussin     bool sent = FALSE;
472aae38d10SBaptiste Daroussin     if (VALID_STRING(s)) {
473aae38d10SBaptiste Daroussin 	tputs(s, 0, out_char);
474aae38d10SBaptiste Daroussin 	sent = TRUE;
475aae38d10SBaptiste Daroussin     }
476aae38d10SBaptiste Daroussin     return sent;
477aae38d10SBaptiste Daroussin }
478aae38d10SBaptiste Daroussin 
479aae38d10SBaptiste Daroussin static bool
to_left_margin(void)480aae38d10SBaptiste Daroussin to_left_margin(void)
481aae38d10SBaptiste Daroussin {
482aae38d10SBaptiste Daroussin     if (VALID_STRING(carriage_return)) {
483aae38d10SBaptiste Daroussin 	sent_string(carriage_return);
484aae38d10SBaptiste Daroussin     } else {
485aae38d10SBaptiste Daroussin 	out_char('\r');
486aae38d10SBaptiste Daroussin     }
487aae38d10SBaptiste Daroussin     return TRUE;
488aae38d10SBaptiste Daroussin }
489aae38d10SBaptiste Daroussin 
490aae38d10SBaptiste Daroussin /*
491aae38d10SBaptiste Daroussin  * Set the hardware tabs on the terminal, using the 'ct' (clear all tabs),
492aae38d10SBaptiste Daroussin  * 'st' (set one tab) and 'ch' (horizontal cursor addressing) capabilities.
493aae38d10SBaptiste Daroussin  * This is done before 'if' and 'is', so they can recover in case of error.
494aae38d10SBaptiste Daroussin  *
495aae38d10SBaptiste Daroussin  * Return TRUE if we set any tab stops, FALSE if not.
496aae38d10SBaptiste Daroussin  */
497aae38d10SBaptiste Daroussin static bool
reset_tabstops(int wide)498aae38d10SBaptiste Daroussin reset_tabstops(int wide)
499aae38d10SBaptiste Daroussin {
500aae38d10SBaptiste Daroussin     if ((init_tabs != 8)
501aae38d10SBaptiste Daroussin 	&& VALID_NUMERIC(init_tabs)
502aae38d10SBaptiste Daroussin 	&& VALID_STRING(set_tab)
503aae38d10SBaptiste Daroussin 	&& VALID_STRING(clear_all_tabs)) {
504aae38d10SBaptiste Daroussin 	int c;
505aae38d10SBaptiste Daroussin 
506aae38d10SBaptiste Daroussin 	to_left_margin();
507aae38d10SBaptiste Daroussin 	tputs(clear_all_tabs, 0, out_char);
508aae38d10SBaptiste Daroussin 	if (init_tabs > 1) {
509aae38d10SBaptiste Daroussin 	    if (init_tabs > wide)
510aae38d10SBaptiste Daroussin 		init_tabs = (short) wide;
511aae38d10SBaptiste Daroussin 	    for (c = init_tabs; c < wide; c += init_tabs) {
512aae38d10SBaptiste Daroussin 		fprintf(my_file, "%*s", init_tabs, " ");
513aae38d10SBaptiste Daroussin 		tputs(set_tab, 0, out_char);
514aae38d10SBaptiste Daroussin 	    }
515aae38d10SBaptiste Daroussin 	    to_left_margin();
516aae38d10SBaptiste Daroussin 	}
517aae38d10SBaptiste Daroussin 	return (TRUE);
518aae38d10SBaptiste Daroussin     }
519aae38d10SBaptiste Daroussin     return (FALSE);
520aae38d10SBaptiste Daroussin }
521aae38d10SBaptiste Daroussin 
522aae38d10SBaptiste Daroussin /* Output startup string. */
523aae38d10SBaptiste Daroussin bool
send_init_strings(int fd GCC_UNUSED,TTY * old_settings)524aae38d10SBaptiste Daroussin send_init_strings(int fd GCC_UNUSED, TTY * old_settings)
525aae38d10SBaptiste Daroussin {
526aae38d10SBaptiste Daroussin     int i;
527aae38d10SBaptiste Daroussin     bool need_flush = FALSE;
528aae38d10SBaptiste Daroussin 
529aae38d10SBaptiste Daroussin     (void) old_settings;
530*21817992SBaptiste Daroussin #if TAB3
531aae38d10SBaptiste Daroussin     if (old_settings != 0 &&
532aae38d10SBaptiste Daroussin 	old_settings->c_oflag & (TAB3 | ONLCR | OCRNL | ONLRET)) {
533aae38d10SBaptiste Daroussin 	old_settings->c_oflag &= (TAB3 | ONLCR | OCRNL | ONLRET);
534aae38d10SBaptiste Daroussin 	SET_TTY(fd, old_settings);
535aae38d10SBaptiste Daroussin     }
536aae38d10SBaptiste Daroussin #endif
537aae38d10SBaptiste Daroussin     if (use_reset || use_init) {
538aae38d10SBaptiste Daroussin 	if (VALID_STRING(init_prog)) {
539aae38d10SBaptiste Daroussin 	    IGNORE_RC(system(init_prog));
540aae38d10SBaptiste Daroussin 	}
541aae38d10SBaptiste Daroussin 
542aae38d10SBaptiste Daroussin 	need_flush |= sent_string((use_reset && (reset_1string != 0))
543aae38d10SBaptiste Daroussin 				  ? reset_1string
544aae38d10SBaptiste Daroussin 				  : init_1string);
545aae38d10SBaptiste Daroussin 
546aae38d10SBaptiste Daroussin 	need_flush |= sent_string((use_reset && (reset_2string != 0))
547aae38d10SBaptiste Daroussin 				  ? reset_2string
548aae38d10SBaptiste Daroussin 				  : init_2string);
549aae38d10SBaptiste Daroussin 
550aae38d10SBaptiste Daroussin 	if (VALID_STRING(clear_margins)) {
551aae38d10SBaptiste Daroussin 	    need_flush |= sent_string(clear_margins);
552*21817992SBaptiste Daroussin 	}
553aae38d10SBaptiste Daroussin #if defined(set_lr_margin)
554*21817992SBaptiste Daroussin 	else if (VALID_STRING(set_lr_margin)) {
5557a656419SBaptiste Daroussin 	    need_flush |= sent_string(TIPARM_2(set_lr_margin, 0, columns - 1));
556*21817992SBaptiste Daroussin 	}
557aae38d10SBaptiste Daroussin #endif
558aae38d10SBaptiste Daroussin #if defined(set_left_margin_parm) && defined(set_right_margin_parm)
559*21817992SBaptiste Daroussin 	else if (VALID_STRING(set_left_margin_parm)
560aae38d10SBaptiste Daroussin 		 && VALID_STRING(set_right_margin_parm)) {
5617a656419SBaptiste Daroussin 	    need_flush |= sent_string(TIPARM_1(set_left_margin_parm, 0));
5627a656419SBaptiste Daroussin 	    need_flush |= sent_string(TIPARM_1(set_right_margin_parm,
563aae38d10SBaptiste Daroussin 					       columns - 1));
564*21817992SBaptiste Daroussin 	}
565aae38d10SBaptiste Daroussin #endif
566*21817992SBaptiste Daroussin 	else if (VALID_STRING(set_left_margin)
567aae38d10SBaptiste Daroussin 		 && VALID_STRING(set_right_margin)) {
568aae38d10SBaptiste Daroussin 	    need_flush |= to_left_margin();
569aae38d10SBaptiste Daroussin 	    need_flush |= sent_string(set_left_margin);
570aae38d10SBaptiste Daroussin 	    if (VALID_STRING(parm_right_cursor)) {
5717a656419SBaptiste Daroussin 		need_flush |= sent_string(TIPARM_1(parm_right_cursor,
572aae38d10SBaptiste Daroussin 						   columns - 1));
573aae38d10SBaptiste Daroussin 	    } else {
574aae38d10SBaptiste Daroussin 		for (i = 0; i < columns - 1; i++) {
575aae38d10SBaptiste Daroussin 		    out_char(' ');
576aae38d10SBaptiste Daroussin 		    need_flush = TRUE;
577aae38d10SBaptiste Daroussin 		}
578aae38d10SBaptiste Daroussin 	    }
579aae38d10SBaptiste Daroussin 	    need_flush |= sent_string(set_right_margin);
580aae38d10SBaptiste Daroussin 	    need_flush |= to_left_margin();
581aae38d10SBaptiste Daroussin 	}
582aae38d10SBaptiste Daroussin 
583aae38d10SBaptiste Daroussin 	need_flush |= reset_tabstops(columns);
584aae38d10SBaptiste Daroussin 
585aae38d10SBaptiste Daroussin 	need_flush |= cat_file((use_reset && reset_file) ? reset_file : init_file);
586aae38d10SBaptiste Daroussin 
587aae38d10SBaptiste Daroussin 	need_flush |= sent_string((use_reset && (reset_3string != 0))
588aae38d10SBaptiste Daroussin 				  ? reset_3string
589aae38d10SBaptiste Daroussin 				  : init_3string);
590aae38d10SBaptiste Daroussin     }
591aae38d10SBaptiste Daroussin 
592aae38d10SBaptiste Daroussin     return need_flush;
593aae38d10SBaptiste Daroussin }
594aae38d10SBaptiste Daroussin 
595aae38d10SBaptiste Daroussin /*
596aae38d10SBaptiste Daroussin  * Tell the user if a control key has been changed from the default value.
597aae38d10SBaptiste Daroussin  */
598aae38d10SBaptiste Daroussin static void
show_tty_change(TTY * old_settings,TTY * new_settings,const char * name,int which,unsigned def)599aae38d10SBaptiste Daroussin show_tty_change(TTY * old_settings,
600aae38d10SBaptiste Daroussin 		TTY * new_settings,
601aae38d10SBaptiste Daroussin 		const char *name,
602aae38d10SBaptiste Daroussin 		int which,
603aae38d10SBaptiste Daroussin 		unsigned def)
604aae38d10SBaptiste Daroussin {
6057a656419SBaptiste Daroussin     unsigned older = 0, newer = 0;
606aae38d10SBaptiste Daroussin     char *p;
607aae38d10SBaptiste Daroussin 
6087a656419SBaptiste Daroussin #if defined(EXP_WIN32_DRIVER)
6097a656419SBaptiste Daroussin     /* noop */
6107a656419SBaptiste Daroussin     (void) old_settings;
6117a656419SBaptiste Daroussin     (void) new_settings;
6127a656419SBaptiste Daroussin     (void) name;
6137a656419SBaptiste Daroussin     (void) which;
6147a656419SBaptiste Daroussin     (void) def;
6157a656419SBaptiste Daroussin #else
616aae38d10SBaptiste Daroussin     newer = new_settings->c_cc[which];
617aae38d10SBaptiste Daroussin     older = old_settings->c_cc[which];
618aae38d10SBaptiste Daroussin 
619aae38d10SBaptiste Daroussin     if (older == newer && older == def)
620aae38d10SBaptiste Daroussin 	return;
6217a656419SBaptiste Daroussin #endif
622aae38d10SBaptiste Daroussin     (void) fprintf(stderr, "%s %s ", name, older == newer ? "is" : "set to");
623aae38d10SBaptiste Daroussin 
624aae38d10SBaptiste Daroussin     if (DISABLED(newer)) {
625aae38d10SBaptiste Daroussin 	(void) fprintf(stderr, "undef.\n");
626aae38d10SBaptiste Daroussin 	/*
627aae38d10SBaptiste Daroussin 	 * Check 'delete' before 'backspace', since the key_backspace value
628aae38d10SBaptiste Daroussin 	 * is ambiguous.
629aae38d10SBaptiste Daroussin 	 */
630aae38d10SBaptiste Daroussin     } else if (newer == 0177) {
631aae38d10SBaptiste Daroussin 	(void) fprintf(stderr, "delete.\n");
632aae38d10SBaptiste Daroussin     } else if ((p = key_backspace) != 0
633aae38d10SBaptiste Daroussin 	       && newer == (unsigned char) p[0]
634aae38d10SBaptiste Daroussin 	       && p[1] == '\0') {
635aae38d10SBaptiste Daroussin 	(void) fprintf(stderr, "backspace.\n");
636aae38d10SBaptiste Daroussin     } else if (newer < 040) {
637aae38d10SBaptiste Daroussin 	newer ^= 0100;
638aae38d10SBaptiste Daroussin 	(void) fprintf(stderr, "control-%c (^%c).\n", UChar(newer), UChar(newer));
639aae38d10SBaptiste Daroussin     } else
640aae38d10SBaptiste Daroussin 	(void) fprintf(stderr, "%c.\n", UChar(newer));
641aae38d10SBaptiste Daroussin }
642aae38d10SBaptiste Daroussin 
643aae38d10SBaptiste Daroussin /**************************************************************************
644aae38d10SBaptiste Daroussin  * Miscellaneous.
645aae38d10SBaptiste Daroussin  **************************************************************************/
646aae38d10SBaptiste Daroussin 
647aae38d10SBaptiste Daroussin void
reset_start(FILE * fp,bool is_reset,bool is_init)648aae38d10SBaptiste Daroussin reset_start(FILE *fp, bool is_reset, bool is_init)
649aae38d10SBaptiste Daroussin {
650aae38d10SBaptiste Daroussin     my_file = fp;
651aae38d10SBaptiste Daroussin     use_reset = is_reset;
652aae38d10SBaptiste Daroussin     use_init = is_init;
653aae38d10SBaptiste Daroussin }
654aae38d10SBaptiste Daroussin 
655aae38d10SBaptiste Daroussin void
reset_flush(void)656aae38d10SBaptiste Daroussin reset_flush(void)
657aae38d10SBaptiste Daroussin {
658aae38d10SBaptiste Daroussin     if (my_file != 0)
659aae38d10SBaptiste Daroussin 	fflush(my_file);
660aae38d10SBaptiste Daroussin }
661aae38d10SBaptiste Daroussin 
662aae38d10SBaptiste Daroussin void
print_tty_chars(TTY * old_settings,TTY * new_settings)663aae38d10SBaptiste Daroussin print_tty_chars(TTY * old_settings, TTY * new_settings)
664aae38d10SBaptiste Daroussin {
6657a656419SBaptiste Daroussin #if defined(EXP_WIN32_DRIVER)
6667a656419SBaptiste Daroussin     /* noop */
6677a656419SBaptiste Daroussin #else
668aae38d10SBaptiste Daroussin     show_tty_change(old_settings, new_settings, "Erase", VERASE, CERASE);
669aae38d10SBaptiste Daroussin     show_tty_change(old_settings, new_settings, "Kill", VKILL, CKILL);
670aae38d10SBaptiste Daroussin     show_tty_change(old_settings, new_settings, "Interrupt", VINTR, CINTR);
6717a656419SBaptiste Daroussin #endif
672aae38d10SBaptiste Daroussin }
673aae38d10SBaptiste Daroussin 
674aae38d10SBaptiste Daroussin #if HAVE_SIZECHANGE
675aae38d10SBaptiste Daroussin /*
676aae38d10SBaptiste Daroussin  * Set window size if not set already, but update our copy of the values if the
677aae38d10SBaptiste Daroussin  * size was set.
678aae38d10SBaptiste Daroussin  */
679aae38d10SBaptiste Daroussin void
set_window_size(int fd,NCURSES_INT2 * high,NCURSES_INT2 * wide)680*21817992SBaptiste Daroussin set_window_size(int fd, NCURSES_INT2 *high, NCURSES_INT2 *wide)
681aae38d10SBaptiste Daroussin {
682aae38d10SBaptiste Daroussin     STRUCT_WINSIZE win;
683aae38d10SBaptiste Daroussin     (void) ioctl(fd, IOCTL_GET_WINSIZE, &win);
684aae38d10SBaptiste Daroussin     if (WINSIZE_ROWS(win) == 0 &&
685aae38d10SBaptiste Daroussin 	WINSIZE_COLS(win) == 0) {
686aae38d10SBaptiste Daroussin 	if (*high > 0 && *wide > 0) {
687aae38d10SBaptiste Daroussin 	    WINSIZE_ROWS(win) = (unsigned short) *high;
688aae38d10SBaptiste Daroussin 	    WINSIZE_COLS(win) = (unsigned short) *wide;
689aae38d10SBaptiste Daroussin 	    (void) ioctl(fd, IOCTL_SET_WINSIZE, &win);
690aae38d10SBaptiste Daroussin 	}
691aae38d10SBaptiste Daroussin     } else if (WINSIZE_ROWS(win) > 0 &&
692aae38d10SBaptiste Daroussin 	       WINSIZE_COLS(win) > 0) {
693aae38d10SBaptiste Daroussin 	*high = (short) WINSIZE_ROWS(win);
694aae38d10SBaptiste Daroussin 	*wide = (short) WINSIZE_COLS(win);
695aae38d10SBaptiste Daroussin     }
696aae38d10SBaptiste Daroussin }
697aae38d10SBaptiste Daroussin #endif
698