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 45 struct cdev; 46 struct file; 47 struct pgrp; 48 struct session; 49 struct ucred; 50 51 struct 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 */ 61 struct 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 */ 141 struct 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. */ 165 struct tty *tty_alloc(struct ttydevsw *tsw, void *softc); 166 struct tty *tty_alloc_mutex(struct ttydevsw *tsw, void *softc, struct mtx *mtx); 167 void tty_rel_pgrp(struct tty *tp, struct pgrp *pgrp); 168 void tty_rel_sess(struct tty *tp, struct session *sess); 169 void 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. */ 181 int 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. */ 190 void tty_signal_sessleader(struct tty *tp, int signal); 191 void tty_signal_pgrp(struct tty *tp, int signal); 192 /* Waking up readers/writers. */ 193 int tty_wait(struct tty *tp, struct cv *cv); 194 int tty_wait_background(struct tty *tp, struct thread *td, int sig); 195 int tty_timedwait(struct tty *tp, struct cv *cv, int timo); 196 void tty_wakeup(struct tty *tp, int flags); 197 198 /* System messages. */ 199 int tty_checkoutq(struct tty *tp); 200 int tty_putchar(struct tty *tp, char c); 201 int tty_putstrn(struct tty *tp, const char *p, size_t n); 202 203 int tty_ioctl(struct tty *tp, u_long cmd, void *data, int fflag, 204 struct thread *td); 205 int tty_ioctl_compat(struct tty *tp, u_long cmd, caddr_t data, 206 int fflag, struct thread *td); 207 void tty_set_winsize(struct tty *tp, const struct winsize *wsz); 208 void tty_init_console(struct tty *tp, speed_t speed); 209 void tty_flush(struct tty *tp, int flags); 210 void tty_hiwat_in_block(struct tty *tp); 211 void tty_hiwat_in_unblock(struct tty *tp); 212 dev_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. */ 219 void tty_info(struct tty *tp); 220 221 /* /dev/console selection. */ 222 void ttyconsdev_select(const char *name); 223 224 /* Pseudo-terminal hooks. */ 225 int pts_alloc(int fflags, struct thread *td, struct file *fp); 226 int 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_ */ 236