1/*-
  2 * SPDX-License-Identifier: BSD-2-Clause
  3 *
  4 * Copyright (c) 2008 Ed Schouten <ed@FreeBSD.org>
  5 * All rights reserved.
  6 *
  7 * Portions of this software were developed under sponsorship from Snow
  8 * B.V., the Netherlands.
  9 *
 10 * Redistribution and use in source and binary forms, with or without
 11 * modification, are permitted provided that the following conditions
 12 * are met:
 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.
 18 *
 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
 29 * SUCH DAMAGE.
 30 */
 31
 32#ifndef _SYS_TTY_H_
 33#define	_SYS_TTY_H_
 34
 35#include <sys/param.h>
 36#include <sys/queue.h>
 37#include <sys/lock.h>
 38#include <sys/mutex.h>
 39#include <sys/condvar.h>
 40#include <sys/selinfo.h>
 41#include <sys/_termios.h>
 42#include <sys/ttycom.h>
 43#include <sys/ttyqueue.h>
 44
 45struct cdev;
 46struct file;
 47struct pgrp;
 48struct session;
 49struct ucred;
 50
 51struct ttydevsw;
 52
 53/*
 54 * Per-TTY structure, containing buffers, etc.
 55 *
 56 * List of locks
 57 * (t)	locked by t_mtx
 58 * (l)	locked by tty_list_sx
 59 * (c)	const until freeing
 60 */
 61struct tty {
 62	struct mtx	*t_mtx;		/* TTY lock. */
 63	struct mtx	t_mtxobj;	/* Per-TTY lock (when not borrowing). */
 64	TAILQ_ENTRY(tty) t_list;	/* (l) TTY list entry. */
 65	int		t_drainwait;	/* (t) TIOCDRAIN timeout seconds. */
 66	unsigned int	t_flags;	/* (t) Terminal option flags. */
 67/* Keep flags in sync with db_show_tty and pstat(8). */
 68#define	TF_NOPREFIX	0x00001	/* Don't prepend "tty" to device name. */
 69#define	TF_INITLOCK	0x00002	/* Create init/lock state devices. */
 70#define	TF_CALLOUT	0x00004	/* Create "cua" devices. */
 71#define	TF_OPENED_IN	0x00008	/* "tty" node is in use. */
 72#define	TF_OPENED_OUT	0x00010	/* "cua" node is in use. */
 73#define	TF_OPENED_CONS	0x00020 /* Device in use as console. */
 74#define	TF_OPENED	(TF_OPENED_IN|TF_OPENED_OUT|TF_OPENED_CONS)
 75#define	TF_GONE		0x00040	/* Device node is gone. */
 76#define	TF_OPENCLOSE	0x00080	/* Device is in open()/close(). */
 77#define	TF_ASYNC	0x00100	/* Asynchronous I/O enabled. */
 78#define	TF_LITERAL	0x00200	/* Accept the next character literally. */
 79#define	TF_HIWAT_IN	0x00400	/* We've reached the input watermark. */
 80#define	TF_HIWAT_OUT	0x00800	/* We've reached the output watermark. */
 81#define	TF_HIWAT	(TF_HIWAT_IN|TF_HIWAT_OUT)
 82#define	TF_STOPPED	0x01000	/* Output flow control - stopped. */
 83#define	TF_EXCLUDE	0x02000	/* Exclusive access. */
 84#define	TF_BYPASS	0x04000	/* Optimized input path. */
 85#define	TF_ZOMBIE	0x08000	/* Modem disconnect received. */
 86#define	TF_HOOK		0x10000	/* TTY has hook attached. */
 87#define	TF_BUSY_IN	0x20000	/* Process busy in read() -- not supported. */
 88#define	TF_BUSY_OUT	0x40000	/* Process busy in write(). */
 89#define	TF_BUSY		(TF_BUSY_IN|TF_BUSY_OUT)
 90	unsigned int	t_revokecnt;	/* (t) revoke() count. */
 91
 92	/* Buffering mechanisms. */
 93	struct ttyinq	t_inq;		/* (t) Input queue. */
 94	size_t		t_inlow;	/* (t) Input low watermark. */
 95	struct ttyoutq	t_outq;		/* (t) Output queue. */
 96	size_t		t_outlow;	/* (t) Output low watermark. */
 97
 98	/* Sleeping mechanisms. */
 99	struct cv	t_inwait;	/* (t) Input wait queue. */
100	struct cv	t_outwait;	/* (t) Output wait queue. */
101	struct cv	t_outserwait;	/* (t) Serial output wait queue. */
102	struct cv	t_bgwait;	/* (t) Background wait queue. */
103	struct cv	t_dcdwait;	/* (t) Carrier Detect wait queue. */
104
105	/* Polling mechanisms. */
106	struct selinfo	t_inpoll;	/* (t) Input poll queue. */
107	struct selinfo	t_outpoll;	/* (t) Output poll queue. */
108	struct sigio	*t_sigio;	/* (t) Asynchronous I/O. */
109
110	struct termios	t_termios;	/* (t) I/O processing flags. */
111	struct winsize	t_winsize;	/* (t) Window size. */
112	unsigned int	t_column;	/* (t) Current cursor position. */
113	unsigned int	t_writepos;	/* (t) Where input was interrupted. */
114	int		t_compatflags;	/* (t) COMPAT_43TTY flags. */
115
116	/* Init/lock-state devices. */
117	struct termios	t_termios_init_in;	/* tty%s.init. */
118	struct termios	t_termios_lock_in;	/* tty%s.lock. */
119	struct termios	t_termios_init_out;	/* cua%s.init. */
120	struct termios	t_termios_lock_out;	/* cua%s.lock. */
121
122	struct ttydevsw	*t_devsw;	/* (c) Driver hooks. */
123	struct ttyhook	*t_hook;	/* (t) Capture/inject hook. */
124
125	/* Process signal delivery. */
126	struct pgrp	*t_pgrp;	/* (t) Foreground process group. */
127	struct session	*t_session;	/* (t) Associated session. */
128	unsigned int	t_sessioncnt;	/* (t) Backpointing sessions. */
129
130	void		*t_devswsoftc;	/* (c) Soft config, for drivers. */
131	void		*t_hooksoftc;	/* (t) Soft config, for hooks. */
132	struct cdev	*t_dev;		/* (c) Primary character device. */
133
134	size_t		t_prbufsz;	/* (t) SIGINFO buffer size. */
135	char		t_prbuf[];	/* (t) SIGINFO buffer. */
136};
137
138/*
139 * Userland version of struct tty, for sysctl kern.ttys
140 */
141struct xtty {
142	size_t	xt_size;	/* Structure size. */
143	size_t	xt_insize;	/* Input queue size. */
144	size_t	xt_incc;	/* Canonicalized characters. */
145	size_t	xt_inlc;	/* Input line characters. */
146	size_t	xt_inlow;	/* Input low watermark. */
147	size_t	xt_outsize;	/* Output queue size. */
148	size_t	xt_outcc;	/* Output queue usage. */
149	size_t	xt_outlow;	/* Output low watermark. */
150	unsigned int xt_column;	/* Current column position. */
151	pid_t	xt_pgid;	/* Foreground process group. */
152	pid_t	xt_sid;		/* Session. */
153	unsigned int xt_flags;	/* Terminal option flags. */
154	uint32_t xt_dev;	/* Userland device. XXXKIB truncated */
155};
156
157#ifdef _KERNEL
158
159/* Used to distinguish between normal, callout, lock and init devices. */
160#define	TTYUNIT_INIT		0x1
161#define	TTYUNIT_LOCK		0x2
162#define	TTYUNIT_CALLOUT		0x4
163
164/* Allocation and deallocation. */
165struct tty *tty_alloc(struct ttydevsw *tsw, void *softc);
166struct tty *tty_alloc_mutex(struct ttydevsw *tsw, void *softc, struct mtx *mtx);
167void	tty_rel_pgrp(struct tty *tp, struct pgrp *pgrp);
168void	tty_rel_sess(struct tty *tp, struct session *sess);
169void	tty_rel_gone(struct tty *tp);
170
171#define	tty_lock(tp)		mtx_lock((tp)->t_mtx)
172#define	tty_unlock(tp)		mtx_unlock((tp)->t_mtx)
173#define	tty_lock_owned(tp)	mtx_owned((tp)->t_mtx)
174#define	tty_assert_locked(tp)	mtx_assert((tp)->t_mtx, MA_OWNED)
175#define	tty_getlock(tp)		((tp)->t_mtx)
176
177/* XXX Should migrate users to tty_assert_locked! */
178#define	tty_lock_assert(tp, ma)	mtx_assert((tp)->t_mtx, (ma))
179
180/* Device node creation. */
181int	tty_makedevf(struct tty *tp, struct ucred *cred, int flags,
182    const char *fmt, ...) __printflike(4, 5);
183#define	TTYMK_CLONING		0x1
184#define	tty_makedev(tp, cred, fmt, ...) \
185	(void )tty_makedevf((tp), (cred), 0, (fmt), ## __VA_ARGS__)
186#define	tty_makealias(tp,fmt,...) \
187	make_dev_alias((tp)->t_dev, fmt, ## __VA_ARGS__)
188
189/* Signalling processes. */
190void	tty_signal_sessleader(struct tty *tp, int signal);
191void	tty_signal_pgrp(struct tty *tp, int signal);
192/* Waking up readers/writers. */
193int	tty_wait(struct tty *tp, struct cv *cv);
194int	tty_wait_background(struct tty *tp, struct thread *td, int sig);
195int	tty_timedwait(struct tty *tp, struct cv *cv, int timo);
196void	tty_wakeup(struct tty *tp, int flags);
197
198/* System messages. */
199int	tty_checkoutq(struct tty *tp);
200int	tty_putchar(struct tty *tp, char c);
201int	tty_putstrn(struct tty *tp, const char *p, size_t n);
202
203int	tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag,
204    struct thread *td);
205int	tty_ioctl_compat(struct tty *tp, u_long cmd, caddr_t data,
206    int fflag, struct thread *td);
207void	tty_set_winsize(struct tty *tp, const struct winsize *wsz);
208void	tty_init_console(struct tty *tp, speed_t speed);
209void	tty_flush(struct tty *tp, int flags);
210void	tty_hiwat_in_block(struct tty *tp);
211void	tty_hiwat_in_unblock(struct tty *tp);
212dev_t	tty_udev(struct tty *tp);
213#define	tty_opened(tp)		((tp)->t_flags & TF_OPENED)
214#define	tty_gone(tp)		((tp)->t_flags & TF_GONE)
215#define	tty_softc(tp)		((tp)->t_devswsoftc)
216#define	tty_devname(tp)		devtoname((tp)->t_dev)
217
218/* Status line printing. */
219void	tty_info(struct tty *tp);
220
221/* /dev/console selection. */
222void	ttyconsdev_select(const char *name);
223
224/* Pseudo-terminal hooks. */
225int	pts_alloc(int fflags, struct thread *td, struct file *fp);
226int	pts_alloc_external(int fd, struct thread *td, struct file *fp,
227    struct cdev *dev, const char *name);
228
229/* Drivers and line disciplines also need to call these. */
230#include <sys/ttydisc.h>
231#include <sys/ttydevsw.h>
232#include <sys/ttyhook.h>
233#endif /* _KERNEL */
234
235#endif /* !_SYS_TTY_H_ */