2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright (c) 2008 Ed Schouten <ed@FreeBSD.org>
7 * Portions of this software were developed under sponsorship from Snow
8 * B.V., the Netherlands.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 #include <sys/param.h>
38 #include <sys/queue.h>
40 #include <sys/mutex.h>
41 #include <sys/condvar.h>
42 #include <sys/selinfo.h>
43 #include <sys/_termios.h>
44 #include <sys/ttycom.h>
45 #include <sys/ttyqueue.h>
56 * Per-TTY structure, containing buffers, etc.
60 * (l) locked by tty_list_sx
61 * (c) const until freeing
64 struct mtx *t_mtx; /* TTY lock. */
65 struct mtx t_mtxobj; /* Per-TTY lock (when not borrowing). */
66 TAILQ_ENTRY(tty) t_list; /* (l) TTY list entry. */
67 int t_drainwait; /* (t) TIOCDRAIN timeout seconds. */
68 unsigned int t_flags; /* (t) Terminal option flags. */
69 /* Keep flags in sync with db_show_tty and pstat(8). */
70 #define TF_NOPREFIX 0x00001 /* Don't prepend "tty" to device name. */
71 #define TF_INITLOCK 0x00002 /* Create init/lock state devices. */
72 #define TF_CALLOUT 0x00004 /* Create "cua" devices. */
73 #define TF_OPENED_IN 0x00008 /* "tty" node is in use. */
74 #define TF_OPENED_OUT 0x00010 /* "cua" node is in use. */
75 #define TF_OPENED_CONS 0x00020 /* Device in use as console. */
76 #define TF_OPENED (TF_OPENED_IN|TF_OPENED_OUT|TF_OPENED_CONS)
77 #define TF_GONE 0x00040 /* Device node is gone. */
78 #define TF_OPENCLOSE 0x00080 /* Device is in open()/close(). */
79 #define TF_ASYNC 0x00100 /* Asynchronous I/O enabled. */
80 #define TF_LITERAL 0x00200 /* Accept the next character literally. */
81 #define TF_HIWAT_IN 0x00400 /* We've reached the input watermark. */
82 #define TF_HIWAT_OUT 0x00800 /* We've reached the output watermark. */
83 #define TF_HIWAT (TF_HIWAT_IN|TF_HIWAT_OUT)
84 #define TF_STOPPED 0x01000 /* Output flow control - stopped. */
85 #define TF_EXCLUDE 0x02000 /* Exclusive access. */
86 #define TF_BYPASS 0x04000 /* Optimized input path. */
87 #define TF_ZOMBIE 0x08000 /* Modem disconnect received. */
88 #define TF_HOOK 0x10000 /* TTY has hook attached. */
89 #define TF_BUSY_IN 0x20000 /* Process busy in read() -- not supported. */
90 #define TF_BUSY_OUT 0x40000 /* Process busy in write(). */
91 #define TF_BUSY (TF_BUSY_IN|TF_BUSY_OUT)
92 unsigned int t_revokecnt; /* (t) revoke() count. */
94 /* Buffering mechanisms. */
95 struct ttyinq t_inq; /* (t) Input queue. */
96 size_t t_inlow; /* (t) Input low watermark. */
97 struct ttyoutq t_outq; /* (t) Output queue. */
98 size_t t_outlow; /* (t) Output low watermark. */
100 /* Sleeping mechanisms. */
101 struct cv t_inwait; /* (t) Input wait queue. */
102 struct cv t_outwait; /* (t) Output wait queue. */
103 struct cv t_outserwait; /* (t) Serial output wait queue. */
104 struct cv t_bgwait; /* (t) Background wait queue. */
105 struct cv t_dcdwait; /* (t) Carrier Detect wait queue. */
107 /* Polling mechanisms. */
108 struct selinfo t_inpoll; /* (t) Input poll queue. */
109 struct selinfo t_outpoll; /* (t) Output poll queue. */
110 struct sigio *t_sigio; /* (t) Asynchronous I/O. */
112 struct termios t_termios; /* (t) I/O processing flags. */
113 struct winsize t_winsize; /* (t) Window size. */
114 unsigned int t_column; /* (t) Current cursor position. */
115 unsigned int t_writepos; /* (t) Where input was interrupted. */
116 int t_compatflags; /* (t) COMPAT_43TTY flags. */
118 /* Init/lock-state devices. */
119 struct termios t_termios_init_in; /* tty%s.init. */
120 struct termios t_termios_lock_in; /* tty%s.lock. */
121 struct termios t_termios_init_out; /* cua%s.init. */
122 struct termios t_termios_lock_out; /* cua%s.lock. */
124 struct ttydevsw *t_devsw; /* (c) Driver hooks. */
125 struct ttyhook *t_hook; /* (t) Capture/inject hook. */
127 /* Process signal delivery. */
128 struct pgrp *t_pgrp; /* (t) Foreground process group. */
129 struct session *t_session; /* (t) Associated session. */
130 unsigned int t_sessioncnt; /* (t) Backpointing sessions. */
132 void *t_devswsoftc; /* (c) Soft config, for drivers. */
133 void *t_hooksoftc; /* (t) Soft config, for hooks. */
134 struct cdev *t_dev; /* (c) Primary character device. */
138 * Userland version of struct tty, for sysctl kern.ttys
141 size_t xt_size; /* Structure size. */
142 size_t xt_insize; /* Input queue size. */
143 size_t xt_incc; /* Canonicalized characters. */
144 size_t xt_inlc; /* Input line charaters. */
145 size_t xt_inlow; /* Input low watermark. */
146 size_t xt_outsize; /* Output queue size. */
147 size_t xt_outcc; /* Output queue usage. */
148 size_t xt_outlow; /* Output low watermark. */
149 unsigned int xt_column; /* Current column position. */
150 pid_t xt_pgid; /* Foreground process group. */
151 pid_t xt_sid; /* Session. */
152 unsigned int xt_flags; /* Terminal option flags. */
153 uint32_t xt_dev; /* Userland device. XXXKIB truncated */
158 /* Used to distinguish between normal, callout, lock and init devices. */
159 #define TTYUNIT_INIT 0x1
160 #define TTYUNIT_LOCK 0x2
161 #define TTYUNIT_CALLOUT 0x4
163 /* Allocation and deallocation. */
164 struct tty *tty_alloc(struct ttydevsw *tsw, void *softc);
165 struct tty *tty_alloc_mutex(struct ttydevsw *tsw, void *softc, struct mtx *mtx);
166 void tty_rel_pgrp(struct tty *tp, struct pgrp *pgrp);
167 void tty_rel_sess(struct tty *tp, struct session *sess);
168 void tty_rel_gone(struct tty *tp);
170 #define tty_lock(tp) mtx_lock((tp)->t_mtx)
171 #define tty_unlock(tp) mtx_unlock((tp)->t_mtx)
172 #define tty_lock_owned(tp) mtx_owned((tp)->t_mtx)
173 #define tty_assert_locked(tp) mtx_assert((tp)->t_mtx, MA_OWNED)
174 #define tty_getlock(tp) ((tp)->t_mtx)
176 /* XXX Should migrate users to tty_assert_locked! */
177 #define tty_lock_assert(tp, ma) mtx_assert((tp)->t_mtx, (ma))
179 /* Device node creation. */
180 int tty_makedevf(struct tty *tp, struct ucred *cred, int flags,
181 const char *fmt, ...) __printflike(4, 5);
182 #define TTYMK_CLONING 0x1
183 #define tty_makedev(tp, cred, fmt, ...) \
184 (void )tty_makedevf((tp), (cred), 0, (fmt), ## __VA_ARGS__)
185 #define tty_makealias(tp,fmt,...) \
186 make_dev_alias((tp)->t_dev, fmt, ## __VA_ARGS__)
188 /* Signalling processes. */
189 void tty_signal_sessleader(struct tty *tp, int signal);
190 void tty_signal_pgrp(struct tty *tp, int signal);
191 /* Waking up readers/writers. */
192 int tty_wait(struct tty *tp, struct cv *cv);
193 int tty_wait_background(struct tty *tp, struct thread *td, int sig);
194 int tty_timedwait(struct tty *tp, struct cv *cv, int timo);
195 void tty_wakeup(struct tty *tp, int flags);
197 /* System messages. */
198 int tty_checkoutq(struct tty *tp);
199 int tty_putchar(struct tty *tp, char c);
201 int tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag,
203 int tty_ioctl_compat(struct tty *tp, u_long cmd, caddr_t data,
204 int fflag, struct thread *td);
205 void tty_set_winsize(struct tty *tp, const struct winsize *wsz);
206 void tty_init_console(struct tty *tp, speed_t speed);
207 void tty_flush(struct tty *tp, int flags);
208 void tty_hiwat_in_block(struct tty *tp);
209 void tty_hiwat_in_unblock(struct tty *tp);
210 dev_t tty_udev(struct tty *tp);
211 #define tty_opened(tp) ((tp)->t_flags & TF_OPENED)
212 #define tty_gone(tp) ((tp)->t_flags & TF_GONE)
213 #define tty_softc(tp) ((tp)->t_devswsoftc)
214 #define tty_devname(tp) devtoname((tp)->t_dev)
216 /* Status line printing. */
217 void tty_info(struct tty *tp);
219 /* /dev/console selection. */
220 void ttyconsdev_select(const char *name);
222 /* Pseudo-terminal hooks. */
223 int pts_alloc(int fflags, struct thread *td, struct file *fp);
224 int pts_alloc_external(int fd, struct thread *td, struct file *fp,
225 struct cdev *dev, const char *name);
227 /* Drivers and line disciplines also need to call these. */
228 #include <sys/ttydisc.h>
229 #include <sys/ttydevsw.h>
230 #include <sys/ttyhook.h>
233 #endif /* !_SYS_TTY_H_ */