]> git.ipfire.org Git - thirdparty/util-linux.git/blame - include/ttyutils.h
Merge branch 'lsfd--close-all' of https://github.com/masatake/util-linux
[thirdparty/util-linux.git] / include / ttyutils.h
CommitLineData
0f23ee0c
KZ
1/*
2 * No copyright is claimed. This code is in the public domain; do with
3 * it what you wish.
4 *
5 * Written by Karel Zak <kzak@redhat.com>
6 */
0b6198ec
DR
7#ifndef UTIL_LINUX_TTYUTILS_H
8#define UTIL_LINUX_TTYUTILS_H
879a7ab4 9
e872e320 10#include <stdlib.h>
879a7ab4 11#include <termios.h>
7e9a9af1 12#include <limits.h>
e872e320
PU
13#ifdef HAVE_SYS_IOCTL_H
14#include <sys/ioctl.h>
15#endif
00c505d9
MF
16#ifdef HAVE_SYS_TTYDEFAULTS_H
17#include <sys/ttydefaults.h>
18#endif
879a7ab4 19
726ffb4a
KZ
20#ifdef USE_TTY_GROUP
21# define TTY_MODE 0620
22#else
23# define TTY_MODE 0600
24#endif
25#define TTYGRPNAME "tty" /* name of group to own ttys */
26
f5664477
WF
27/* Some shorthands for control characters. */
28#define CTL(x) ((x) ^ 0100) /* Assumes ASCII dialect */
29#define CR CTL('M') /* carriage return */
30#define NL CTL('J') /* line feed */
31#define BS CTL('H') /* back space */
32#define DEL CTL('?') /* delete */
33
34/* Defaults for line-editing etc. characters; you may want to change these. */
35#define DEF_ERASE DEL /* default erase character */
36#define DEF_INTR CTL('C') /* default interrupt character */
37#define DEF_QUIT CTL('\\') /* default quit char */
38#define DEF_KILL CTL('U') /* default kill char */
39#define DEF_EOF CTL('D') /* default EOF char */
40#define DEF_EOL 0
41#define DEF_SWITCH 0 /* default switch char */
42
67129513
SJ
43/* Fallback for termios->c_cc[] */
44#ifndef CREPRINT
45# define CREPRINT ('r' & 037)
46#endif
47#ifndef CDISCARD
48# define CDISCARD ('o' & 037)
49#endif
50
51/* Default termios->iflag */
52#ifndef TTYDEF_IFLAG
53# define TTYDEF_IFLAG (BRKINT | ICRNL | IMAXBEL | IXON | IXANY)
54#endif
55
56/* Default termios->oflag */
57#ifndef TTYDEF_OFLAG
58# define TTYDEF_OFLAG (OPOST | ONLCR /*| OXTABS*/)
59#endif
60
61/* Default termios->lflag */
62#ifndef TTYDEF_LFLAG
63# define TTYDEF_LFLAG (ECHO | ICANON | ISIG | IEXTEN | ECHOE|ECHOKE|ECHOCTL)
64#endif
65
66/* Default termios->cflag */
67#ifndef TTYDEF_CFLAG
68# define TTYDEF_CFLAG (CREAD | CS8 | HUPCL)
69#endif
70
a73f59fa
KZ
71/* Storage for things detected while the login name was read. */
72struct chardata {
73 int erase; /* erase character */
74 int kill; /* kill character */
75 int eol; /* end-of-line character */
76 int parity; /* what parity did we see */
77 int capslock; /* upper case without lower case */
78};
79
f5664477
WF
80#define INIT_CHARDATA(ptr) do { \
81 (ptr)->erase = DEF_ERASE; \
82 (ptr)->kill = DEF_KILL; \
ee978576 83 (ptr)->eol = CR; \
f5664477
WF
84 (ptr)->parity = 0; \
85 (ptr)->capslock = 0; \
86 } while (0)
87
f46a8d7e 88extern int get_terminal_dimension(int *cols, int *lines);
43b4f7ea 89extern int get_terminal_width(int default_width);
4d9b788d 90extern int get_terminal_type(const char **type);
cba97be9 91extern char *get_terminal_default_type(const char *ttyname, int is_serial);
a6d9d23b 92extern int get_terminal_stdfd(void);
285c1f3a 93extern int get_terminal_name(const char **path, const char **name,
507341f8 94 const char **number);
4e76adb0 95
879a7ab4
KZ
96#define UL_TTY_KEEPCFLAGS (1 << 1)
97#define UL_TTY_UTF8 (1 << 2)
98
99static inline void reset_virtual_console(struct termios *tp, int flags)
100{
101 /* Use defaults of <sys/ttydefaults.h> for base settings */
102 tp->c_iflag |= TTYDEF_IFLAG;
103 tp->c_oflag |= TTYDEF_OFLAG;
104 tp->c_lflag |= TTYDEF_LFLAG;
105
106 if ((flags & UL_TTY_KEEPCFLAGS) == 0) {
107#ifdef CBAUD
108 tp->c_lflag &= ~CBAUD;
109#endif
110 tp->c_cflag |= (B38400 | TTYDEF_CFLAG);
111 }
112
113 /* Sane setting, allow eight bit characters, no carriage return delay
114 * the same result as `stty sane cr0 pass8'
115 */
c32270d4
CE
116#ifndef IUCLC
117# define IUCLC 0
118#endif
119#ifndef NL0
120# define NL0 0
121#endif
122#ifndef CR0
123# define CR0 0
124#endif
125#ifndef BS0
126# define BS0 0
127#endif
128#ifndef VT0
129# define VT0 0
130#endif
131#ifndef FF0
132# define FF0 0
133#endif
134#ifndef OLCUC
135# define OLCUC 0
136#endif
137#ifndef OFILL
138# define OFILL 0
139#endif
140#ifndef NLDLY
141# define NLDLY 0
142#endif
143#ifndef CRDLY
144# define CRDLY 0
145#endif
146#ifndef BSDLY
147# define BSDLY 0
148#endif
149#ifndef VTDLY
150# define VTDLY 0
151#endif
152#ifndef FFDLY
153# define FFDLY 0
67129513
SJ
154#endif
155#ifndef TAB0
156# define TAB0 0
157#endif
158#ifndef TABDLY
159# define TABDLY 0
c32270d4
CE
160#endif
161
879a7ab4
KZ
162 tp->c_iflag |= (BRKINT | ICRNL | IMAXBEL);
163 tp->c_iflag &= ~(IGNBRK | INLCR | IGNCR | IXOFF | IUCLC | IXANY | ISTRIP);
164 tp->c_oflag |= (OPOST | ONLCR | NL0 | CR0 | TAB0 | BS0 | VT0 | FF0);
165 tp->c_oflag &= ~(OLCUC | OCRNL | ONOCR | ONLRET | OFILL | \
166 NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
b8b8e768
KZ
167 tp->c_lflag |= (ISIG | ICANON | IEXTEN | ECHO|ECHOE|ECHOK|ECHOKE|ECHOCTL);
168 tp->c_lflag &= ~(ECHONL|ECHOPRT | NOFLSH | TOSTOP);
879a7ab4
KZ
169
170 if ((flags & UL_TTY_KEEPCFLAGS) == 0) {
171 tp->c_cflag |= (CREAD | CS8 | HUPCL);
172 tp->c_cflag &= ~(PARODD | PARENB);
173 }
174#ifdef OFDEL
175 tp->c_oflag &= ~OFDEL;
176#endif
177#ifdef XCASE
178 tp->c_lflag &= ~XCASE;
179#endif
180#ifdef IUTF8
181 if (flags & UL_TTY_UTF8)
182 tp->c_iflag |= IUTF8; /* Set UTF-8 input flag */
183 else
184 tp->c_iflag &= ~IUTF8;
185#endif
186 /* VTIME and VMIN can overlap with VEOF and VEOL since they are
187 * only used for non-canonical mode. We just set the at the
188 * beginning, so nothing bad should happen.
189 */
190 tp->c_cc[VTIME] = 0;
191 tp->c_cc[VMIN] = 1;
192 tp->c_cc[VINTR] = CINTR;
193 tp->c_cc[VQUIT] = CQUIT;
194 tp->c_cc[VERASE] = CERASE; /* ASCII DEL (0177) */
195 tp->c_cc[VKILL] = CKILL;
196 tp->c_cc[VEOF] = CEOF;
197#ifdef VSWTC
198 tp->c_cc[VSWTC] = _POSIX_VDISABLE;
199#elif defined(VSWTCH)
200 tp->c_cc[VSWTCH] = _POSIX_VDISABLE;
201#endif
202 tp->c_cc[VSTART] = CSTART;
203 tp->c_cc[VSTOP] = CSTOP;
204 tp->c_cc[VSUSP] = CSUSP;
205 tp->c_cc[VEOL] = _POSIX_VDISABLE;
206 tp->c_cc[VREPRINT] = CREPRINT;
207 tp->c_cc[VDISCARD] = CDISCARD;
208 tp->c_cc[VWERASE] = CWERASE;
209 tp->c_cc[VLNEXT] = CLNEXT;
210 tp->c_cc[VEOL2] = _POSIX_VDISABLE;
211}
0b6198ec
DR
212
213#endif /* UTIL_LINUX_TTYUTILS_H */