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