1
2#ifndef _LINUX_TTY_H
3#define _LINUX_TTY_H
4
5#include <linux/fs.h>
6#include <linux/major.h>
7#include <linux/termios.h>
8#include <linux/workqueue.h>
9#include <linux/tty_buffer.h>
10#include <linux/tty_driver.h>
11#include <linux/tty_ldisc.h>
12#include <linux/tty_port.h>
13#include <linux/mutex.h>
14#include <linux/tty_flags.h>
15#include <uapi/linux/tty.h>
16#include <linux/rwsem.h>
17#include <linux/llist.h>
18
19
20
21
22
23
24#define NR_UNIX98_PTY_DEFAULT 4096
25#define NR_UNIX98_PTY_RESERVE 1024
26#define NR_UNIX98_PTY_MAX (1 << MINORBITS)
27
28
29
30
31
32
33#define __DISABLED_CHAR '\0'
34
35#define INTR_CHAR(tty) ((tty)->termios.c_cc[VINTR])
36#define QUIT_CHAR(tty) ((tty)->termios.c_cc[VQUIT])
37#define ERASE_CHAR(tty) ((tty)->termios.c_cc[VERASE])
38#define KILL_CHAR(tty) ((tty)->termios.c_cc[VKILL])
39#define EOF_CHAR(tty) ((tty)->termios.c_cc[VEOF])
40#define TIME_CHAR(tty) ((tty)->termios.c_cc[VTIME])
41#define MIN_CHAR(tty) ((tty)->termios.c_cc[VMIN])
42#define SWTC_CHAR(tty) ((tty)->termios.c_cc[VSWTC])
43#define START_CHAR(tty) ((tty)->termios.c_cc[VSTART])
44#define STOP_CHAR(tty) ((tty)->termios.c_cc[VSTOP])
45#define SUSP_CHAR(tty) ((tty)->termios.c_cc[VSUSP])
46#define EOL_CHAR(tty) ((tty)->termios.c_cc[VEOL])
47#define REPRINT_CHAR(tty) ((tty)->termios.c_cc[VREPRINT])
48#define DISCARD_CHAR(tty) ((tty)->termios.c_cc[VDISCARD])
49#define WERASE_CHAR(tty) ((tty)->termios.c_cc[VWERASE])
50#define LNEXT_CHAR(tty) ((tty)->termios.c_cc[VLNEXT])
51#define EOL2_CHAR(tty) ((tty)->termios.c_cc[VEOL2])
52
53#define _I_FLAG(tty, f) ((tty)->termios.c_iflag & (f))
54#define _O_FLAG(tty, f) ((tty)->termios.c_oflag & (f))
55#define _C_FLAG(tty, f) ((tty)->termios.c_cflag & (f))
56#define _L_FLAG(tty, f) ((tty)->termios.c_lflag & (f))
57
58#define I_IGNBRK(tty) _I_FLAG((tty), IGNBRK)
59#define I_BRKINT(tty) _I_FLAG((tty), BRKINT)
60#define I_IGNPAR(tty) _I_FLAG((tty), IGNPAR)
61#define I_PARMRK(tty) _I_FLAG((tty), PARMRK)
62#define I_INPCK(tty) _I_FLAG((tty), INPCK)
63#define I_ISTRIP(tty) _I_FLAG((tty), ISTRIP)
64#define I_INLCR(tty) _I_FLAG((tty), INLCR)
65#define I_IGNCR(tty) _I_FLAG((tty), IGNCR)
66#define I_ICRNL(tty) _I_FLAG((tty), ICRNL)
67#define I_IUCLC(tty) _I_FLAG((tty), IUCLC)
68#define I_IXON(tty) _I_FLAG((tty), IXON)
69#define I_IXANY(tty) _I_FLAG((tty), IXANY)
70#define I_IXOFF(tty) _I_FLAG((tty), IXOFF)
71#define I_IMAXBEL(tty) _I_FLAG((tty), IMAXBEL)
72#define I_IUTF8(tty) _I_FLAG((tty), IUTF8)
73
74#define O_OPOST(tty) _O_FLAG((tty), OPOST)
75#define O_OLCUC(tty) _O_FLAG((tty), OLCUC)
76#define O_ONLCR(tty) _O_FLAG((tty), ONLCR)
77#define O_OCRNL(tty) _O_FLAG((tty), OCRNL)
78#define O_ONOCR(tty) _O_FLAG((tty), ONOCR)
79#define O_ONLRET(tty) _O_FLAG((tty), ONLRET)
80#define O_OFILL(tty) _O_FLAG((tty), OFILL)
81#define O_OFDEL(tty) _O_FLAG((tty), OFDEL)
82#define O_NLDLY(tty) _O_FLAG((tty), NLDLY)
83#define O_CRDLY(tty) _O_FLAG((tty), CRDLY)
84#define O_TABDLY(tty) _O_FLAG((tty), TABDLY)
85#define O_BSDLY(tty) _O_FLAG((tty), BSDLY)
86#define O_VTDLY(tty) _O_FLAG((tty), VTDLY)
87#define O_FFDLY(tty) _O_FLAG((tty), FFDLY)
88
89#define C_BAUD(tty) _C_FLAG((tty), CBAUD)
90#define C_CSIZE(tty) _C_FLAG((tty), CSIZE)
91#define C_CSTOPB(tty) _C_FLAG((tty), CSTOPB)
92#define C_CREAD(tty) _C_FLAG((tty), CREAD)
93#define C_PARENB(tty) _C_FLAG((tty), PARENB)
94#define C_PARODD(tty) _C_FLAG((tty), PARODD)
95#define C_HUPCL(tty) _C_FLAG((tty), HUPCL)
96#define C_CLOCAL(tty) _C_FLAG((tty), CLOCAL)
97#define C_CIBAUD(tty) _C_FLAG((tty), CIBAUD)
98#define C_CRTSCTS(tty) _C_FLAG((tty), CRTSCTS)
99#define C_CMSPAR(tty) _C_FLAG((tty), CMSPAR)
100
101#define L_ISIG(tty) _L_FLAG((tty), ISIG)
102#define L_ICANON(tty) _L_FLAG((tty), ICANON)
103#define L_XCASE(tty) _L_FLAG((tty), XCASE)
104#define L_ECHO(tty) _L_FLAG((tty), ECHO)
105#define L_ECHOE(tty) _L_FLAG((tty), ECHOE)
106#define L_ECHOK(tty) _L_FLAG((tty), ECHOK)
107#define L_ECHONL(tty) _L_FLAG((tty), ECHONL)
108#define L_NOFLSH(tty) _L_FLAG((tty), NOFLSH)
109#define L_TOSTOP(tty) _L_FLAG((tty), TOSTOP)
110#define L_ECHOCTL(tty) _L_FLAG((tty), ECHOCTL)
111#define L_ECHOPRT(tty) _L_FLAG((tty), ECHOPRT)
112#define L_ECHOKE(tty) _L_FLAG((tty), ECHOKE)
113#define L_FLUSHO(tty) _L_FLAG((tty), FLUSHO)
114#define L_PENDIN(tty) _L_FLAG((tty), PENDIN)
115#define L_IEXTEN(tty) _L_FLAG((tty), IEXTEN)
116#define L_EXTPROC(tty) _L_FLAG((tty), EXTPROC)
117
118struct device;
119struct signal_struct;
120struct tty_operations;
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143struct tty_struct {
144 int magic;
145 struct kref kref;
146 struct device *dev;
147 struct tty_driver *driver;
148 const struct tty_operations *ops;
149 int index;
150
151
152 struct ld_semaphore ldisc_sem;
153 struct tty_ldisc *ldisc;
154
155 struct mutex atomic_write_lock;
156 struct mutex legacy_mutex;
157 struct mutex throttle_mutex;
158 struct rw_semaphore termios_rwsem;
159 struct mutex winsize_mutex;
160
161 struct ktermios termios, termios_locked;
162 char name[64];
163 unsigned long flags;
164 int count;
165 struct winsize winsize;
166
167 struct {
168 spinlock_t lock;
169 bool stopped;
170 bool tco_stopped;
171 unsigned long unused[0];
172 } __aligned(sizeof(unsigned long)) flow;
173
174 struct {
175 spinlock_t lock;
176 struct pid *pgrp;
177 struct pid *session;
178 unsigned char pktstatus;
179 bool packet;
180 unsigned long unused[0];
181 } __aligned(sizeof(unsigned long)) ctrl;
182
183 int hw_stopped;
184 unsigned int receive_room;
185 int flow_change;
186
187 struct tty_struct *link;
188 struct fasync_struct *fasync;
189 wait_queue_head_t write_wait;
190 wait_queue_head_t read_wait;
191 struct work_struct hangup_work;
192 void *disc_data;
193 void *driver_data;
194 spinlock_t files_lock;
195 struct list_head tty_files;
196
197#define N_TTY_BUF_SIZE 4096
198
199 int closing;
200 unsigned char *write_buf;
201 int write_cnt;
202
203 struct work_struct SAK_work;
204 struct tty_port *port;
205} __randomize_layout;
206
207
208struct tty_file_private {
209 struct tty_struct *tty;
210 struct file *file;
211 struct list_head list;
212};
213
214
215#define TTY_MAGIC 0x5401
216
217
218
219
220
221
222
223
224
225#define TTY_THROTTLED 0
226#define TTY_IO_ERROR 1
227#define TTY_OTHER_CLOSED 2
228#define TTY_EXCLUSIVE 3
229#define TTY_DO_WRITE_WAKEUP 5
230#define TTY_LDISC_OPEN 11
231#define TTY_PTY_LOCK 16
232#define TTY_NO_WRITE_SPLIT 17
233#define TTY_HUPPED 18
234#define TTY_HUPPING 19
235#define TTY_LDISC_CHANGING 20
236#define TTY_LDISC_HALTED 22
237
238static inline bool tty_io_nonblock(struct tty_struct *tty, struct file *file)
239{
240 return file->f_flags & O_NONBLOCK ||
241 test_bit(TTY_LDISC_CHANGING, &tty->flags);
242}
243
244static inline bool tty_io_error(struct tty_struct *tty)
245{
246 return test_bit(TTY_IO_ERROR, &tty->flags);
247}
248
249static inline bool tty_throttled(struct tty_struct *tty)
250{
251 return test_bit(TTY_THROTTLED, &tty->flags);
252}
253
254#ifdef CONFIG_TTY
255extern void tty_kref_put(struct tty_struct *tty);
256extern struct pid *tty_get_pgrp(struct tty_struct *tty);
257extern void tty_vhangup_self(void);
258extern void disassociate_ctty(int priv);
259extern dev_t tty_devnum(struct tty_struct *tty);
260extern void proc_clear_tty(struct task_struct *p);
261extern struct tty_struct *get_current_tty(void);
262
263extern int __init tty_init(void);
264extern const char *tty_name(const struct tty_struct *tty);
265extern struct tty_struct *tty_kopen_exclusive(dev_t device);
266extern struct tty_struct *tty_kopen_shared(dev_t device);
267extern void tty_kclose(struct tty_struct *tty);
268extern int tty_dev_name_to_number(const char *name, dev_t *number);
269#else
270static inline void tty_kref_put(struct tty_struct *tty)
271{ }
272static inline struct pid *tty_get_pgrp(struct tty_struct *tty)
273{ return NULL; }
274static inline void tty_vhangup_self(void)
275{ }
276static inline void disassociate_ctty(int priv)
277{ }
278static inline dev_t tty_devnum(struct tty_struct *tty)
279{ return 0; }
280static inline void proc_clear_tty(struct task_struct *p)
281{ }
282static inline struct tty_struct *get_current_tty(void)
283{ return NULL; }
284
285static inline int __init tty_init(void)
286{ return 0; }
287static inline const char *tty_name(const struct tty_struct *tty)
288{ return "(none)"; }
289static inline struct tty_struct *tty_kopen_exclusive(dev_t device)
290{ return ERR_PTR(-ENODEV); }
291static inline void tty_kclose(struct tty_struct *tty)
292{ }
293static inline int tty_dev_name_to_number(const char *name, dev_t *number)
294{ return -ENOTSUPP; }
295#endif
296
297extern struct ktermios tty_std_termios;
298
299extern int vcs_init(void);
300
301extern struct class *tty_class;
302
303
304
305
306
307
308
309
310
311
312static inline struct tty_struct *tty_kref_get(struct tty_struct *tty)
313{
314 if (tty)
315 kref_get(&tty->kref);
316 return tty;
317}
318
319extern const char *tty_driver_name(const struct tty_struct *tty);
320extern void tty_wait_until_sent(struct tty_struct *tty, long timeout);
321extern void stop_tty(struct tty_struct *tty);
322extern void start_tty(struct tty_struct *tty);
323extern void tty_write_message(struct tty_struct *tty, char *msg);
324extern int tty_send_xchar(struct tty_struct *tty, char ch);
325extern int tty_put_char(struct tty_struct *tty, unsigned char c);
326extern unsigned int tty_chars_in_buffer(struct tty_struct *tty);
327extern unsigned int tty_write_room(struct tty_struct *tty);
328extern void tty_driver_flush_buffer(struct tty_struct *tty);
329extern void tty_unthrottle(struct tty_struct *tty);
330extern int tty_throttle_safe(struct tty_struct *tty);
331extern int tty_unthrottle_safe(struct tty_struct *tty);
332extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws);
333extern int tty_get_icount(struct tty_struct *tty,
334 struct serial_icounter_struct *icount);
335extern int is_current_pgrp_orphaned(void);
336extern void tty_hangup(struct tty_struct *tty);
337extern void tty_vhangup(struct tty_struct *tty);
338extern int tty_hung_up_p(struct file *filp);
339extern void do_SAK(struct tty_struct *tty);
340extern void __do_SAK(struct tty_struct *tty);
341extern void no_tty(void);
342extern speed_t tty_termios_baud_rate(struct ktermios *termios);
343extern void tty_termios_encode_baud_rate(struct ktermios *termios,
344 speed_t ibaud, speed_t obaud);
345extern void tty_encode_baud_rate(struct tty_struct *tty,
346 speed_t ibaud, speed_t obaud);
347
348
349
350
351
352
353
354
355
356
357
358static inline speed_t tty_get_baud_rate(struct tty_struct *tty)
359{
360 return tty_termios_baud_rate(&tty->termios);
361}
362
363unsigned char tty_get_char_size(unsigned int cflag);
364unsigned char tty_get_frame_size(unsigned int cflag);
365
366extern void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old);
367extern int tty_termios_hw_change(const struct ktermios *a, const struct ktermios *b);
368extern int tty_set_termios(struct tty_struct *tty, struct ktermios *kt);
369
370extern void tty_wakeup(struct tty_struct *tty);
371
372extern int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
373 unsigned int cmd, unsigned long arg);
374extern int tty_perform_flush(struct tty_struct *tty, unsigned long arg);
375extern struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx);
376extern void tty_release_struct(struct tty_struct *tty, int idx);
377extern void tty_init_termios(struct tty_struct *tty);
378extern void tty_save_termios(struct tty_struct *tty);
379extern int tty_standard_install(struct tty_driver *driver,
380 struct tty_struct *tty);
381
382extern struct mutex tty_mutex;
383
384
385extern void n_tty_inherit_ops(struct tty_ldisc_ops *ops);
386#ifdef CONFIG_TTY
387extern void __init n_tty_init(void);
388#else
389static inline void n_tty_init(void) { }
390#endif
391
392
393#ifdef CONFIG_AUDIT
394extern void tty_audit_exit(void);
395extern void tty_audit_fork(struct signal_struct *sig);
396extern int tty_audit_push(void);
397#else
398static inline void tty_audit_exit(void)
399{
400}
401static inline void tty_audit_fork(struct signal_struct *sig)
402{
403}
404static inline int tty_audit_push(void)
405{
406 return 0;
407}
408#endif
409
410
411extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
412 unsigned int cmd, unsigned long arg);
413
414
415
416extern int vt_ioctl(struct tty_struct *tty,
417 unsigned int cmd, unsigned long arg);
418
419extern long vt_compat_ioctl(struct tty_struct *tty,
420 unsigned int cmd, unsigned long arg);
421
422
423
424extern void tty_lock(struct tty_struct *tty);
425extern int tty_lock_interruptible(struct tty_struct *tty);
426extern void tty_unlock(struct tty_struct *tty);
427extern void tty_lock_slave(struct tty_struct *tty);
428extern void tty_unlock_slave(struct tty_struct *tty);
429extern void tty_set_lock_subclass(struct tty_struct *tty);
430
431#endif
432