^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 1991, 1992 Linus Torvalds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * or rs-channels. It also implements echoing, cooked mode etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Kill-line thanks to John T Kohl, who also corrected VMIN = VTIME = 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * Modified by Theodore Ts'o, 9/14/92, to dynamically allocate the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * tty_struct and tty_queue structures. Previously there was an array
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * of 256 tty_struct's which was statically allocated, and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * tty_queue structures were allocated at boot time. Both are now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * dynamically allocated only when the tty is open.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Also restructured routines so that there is more of a separation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * between the high-level tty routines (tty_io.c and tty_ioctl.c) and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * the low-level tty routines (serial.c, pty.c, console.c). This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * makes for cleaner and more compact code. -TYT, 9/17/92
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * which can be dynamically activated and de-activated by the line
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * discipline handling modules (like SLIP).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * NOTE: pay no attention to the line discipline code (yet); its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * interface is still subject to change in this version...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * -- TYT, 1/31/92
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * Added functionality to the OPOST tty handling. No delays, but all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * other bits should be there.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * -- Nick Holloway <alfie@dcs.warwick.ac.uk>, 27th May 1993.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * Rewrote canonical mode and added more termios flags.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * -- julian@uhunix.uhcc.hawaii.edu (J. Cowley), 13Jan94
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * Reorganized FASYNC support so mouse code can share it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * -- ctm@ardi.com, 9Sep95
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * New TIOCLINUX variants added.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * -- mj@k332.feld.cvut.cz, 19-Nov-95
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * Restrict vt switching via ioctl()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * -- grif@cs.ucr.edu, 5-Dec-95
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * Move console and virtual terminal code to more appropriate files,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * implement CONFIG_VT and generalize console device interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * -- Marko Kohtala <Marko.Kohtala@hut.fi>, March 97
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * Rewrote tty_init_dev and tty_release_dev to eliminate races.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * -- Bill Hawes <whawes@star.net>, June 97
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * Added devfs support.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) * -- C. Scott Ananian <cananian@alumni.princeton.edu>, 13-Jan-1998
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) * Added support for a Unix98-style ptmx device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) * -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * Reduced memory usage for older ARM systems
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) * -- Russell King <rmk@arm.linux.org.uk>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) * Move do_SAK() into process context. Less stack use in devfs functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) * alloc_tty_struct() always uses kmalloc()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) * -- Andrew Morton <andrewm@uow.edu.eu> 17Mar01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #include <linux/major.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #include <linux/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #include <linux/fcntl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #include <linux/sched/signal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #include <linux/sched/task.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #include <linux/tty.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #include <linux/tty_driver.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #include <linux/tty_flip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #include <linux/devpts_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #include <linux/file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #include <linux/fdtable.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #include <linux/console.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #include <linux/timer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #include <linux/ctype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #include <linux/kd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #include <linux/poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #include <linux/ppp-ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #include <linux/device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #include <linux/wait.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #include <linux/bitops.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #include <linux/serial.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #include <linux/ratelimit.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #include <linux/compat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #include <linux/kbd_kern.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #include <linux/vt_kern.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #include <linux/selection.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #include <linux/kmod.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #include <linux/nsproxy.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #undef TTY_DEBUG_HANGUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #ifdef TTY_DEBUG_HANGUP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) # define tty_debug_hangup(tty, f, args...) tty_debug(tty, f, ##args)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) # define tty_debug_hangup(tty, f, args...) do { } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define TTY_PARANOIA_CHECK 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define CHECK_TTY_COUNT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct ktermios tty_std_termios = { /* for the benefit of tty drivers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) .c_iflag = ICRNL | IXON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) .c_oflag = OPOST | ONLCR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) .c_cflag = B38400 | CS8 | CREAD | HUPCL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) .c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ECHOCTL | ECHOKE | IEXTEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) .c_cc = INIT_C_CC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) .c_ispeed = 38400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .c_ospeed = 38400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) /* .c_line = N_TTY, */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) EXPORT_SYMBOL(tty_std_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /* This list gets poked at by procfs and various bits of boot up code. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) could do with some rationalisation such as pulling the tty proc function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) into this file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) LIST_HEAD(tty_drivers); /* linked list of tty drivers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* Mutex to protect creating and releasing a tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) DEFINE_MUTEX(tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) static ssize_t tty_read(struct kiocb *, struct iov_iter *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) static ssize_t tty_write(struct kiocb *, struct iov_iter *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) static __poll_t tty_poll(struct file *, poll_table *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static int tty_open(struct inode *, struct file *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) static long tty_compat_ioctl(struct file *file, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) unsigned long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define tty_compat_ioctl NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) static int __tty_fasync(int fd, struct file *filp, int on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static int tty_fasync(int fd, struct file *filp, int on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) static void release_tty(struct tty_struct *tty, int idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) * free_tty_struct - free a disused tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) * @tty: tty struct to free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * Free the write buffers, tty queue and tty memory itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * Locking: none. Must be called after tty is definitely unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) static void free_tty_struct(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) tty_ldisc_deinit(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) put_device(tty->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) kfree(tty->write_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) tty->magic = 0xDEADDEAD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) kfree(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) static inline struct tty_struct *file_tty(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) return ((struct tty_file_private *)file->private_data)->tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) int tty_alloc_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) struct tty_file_private *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) priv = kmalloc(sizeof(*priv), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (!priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) file->private_data = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) /* Associate a new file with the tty structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) void tty_add_file(struct tty_struct *tty, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) struct tty_file_private *priv = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) priv->tty = tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) priv->file = file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) list_add(&priv->list, &tty->tty_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) * tty_free_file - free file->private_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) * This shall be used only for fail path handling when tty_add_file was not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) * called yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) void tty_free_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) struct tty_file_private *priv = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) file->private_data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) kfree(priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) /* Delete file from its tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) static void tty_del_file(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct tty_file_private *priv = file->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct tty_struct *tty = priv->tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) list_del(&priv->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) tty_free_file(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * tty_name - return tty naming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) * @tty: tty structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * Convert a tty structure into a name. The name reflects the kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * naming policy and if udev is in use may not reflect user space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) * Locking: none
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) const char *tty_name(const struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) if (!tty) /* Hmm. NULL pointer. That's fun. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return "NULL tty";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) return tty->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) EXPORT_SYMBOL(tty_name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) const char *tty_driver_name(const struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) if (!tty || !tty->driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) return "";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) return tty->driver->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) static int tty_paranoia_check(struct tty_struct *tty, struct inode *inode,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) const char *routine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #ifdef TTY_PARANOIA_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (!tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) pr_warn("(%d:%d): %s: NULL tty\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) imajor(inode), iminor(inode), routine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (tty->magic != TTY_MAGIC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) pr_warn("(%d:%d): %s: bad magic number\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) imajor(inode), iminor(inode), routine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* Caller must hold tty_lock */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) static int check_tty_count(struct tty_struct *tty, const char *routine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #ifdef CHECK_TTY_COUNT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) struct list_head *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) int count = 0, kopen_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) list_for_each(p, &tty->tty_files) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) tty->driver->subtype == PTY_TYPE_SLAVE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) tty->link && tty->link->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) if (tty_port_kopened(tty->port))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) kopen_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) if (tty->count != (count + kopen_count)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) tty_warn(tty, "%s: tty->count(%d) != (#fd's(%d) + #kopen's(%d))\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) routine, tty->count, count, kopen_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) return (count + kopen_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * get_tty_driver - find device of a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * @device: device identifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) * @index: returns the index of the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) * This routine returns a tty driver structure, given a device number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) * and also passes back the index number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) * Locking: caller must hold tty_mutex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) static struct tty_driver *get_tty_driver(dev_t device, int *index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) struct tty_driver *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) list_for_each_entry(p, &tty_drivers, tty_drivers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) dev_t base = MKDEV(p->major, p->minor_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if (device < base || device >= base + p->num)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) *index = device - base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) return tty_driver_kref_get(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) * tty_dev_name_to_number - return dev_t for device name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) * @name: user space name of device under /dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) * @number: pointer to dev_t that this function will populate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) * This function converts device names like ttyS0 or ttyUSB1 into dev_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) * like (4, 64) or (188, 1). If no corresponding driver is registered then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) * the function returns -ENODEV.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) * Locking: this acquires tty_mutex to protect the tty_drivers list from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) * being modified while we are traversing it, and makes sure to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) * release it before exiting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) int tty_dev_name_to_number(const char *name, dev_t *number)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) struct tty_driver *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) int index, prefix_length = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) const char *str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) for (str = name; *str && !isdigit(*str); str++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (!*str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) ret = kstrtoint(str, 10, &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) prefix_length = str - name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) list_for_each_entry(p, &tty_drivers, tty_drivers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) if (prefix_length == strlen(p->name) && strncmp(name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) p->name, prefix_length) == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) if (index < p->num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) *number = MKDEV(p->major, p->minor_start + index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /* if here then driver wasn't found */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) ret = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) EXPORT_SYMBOL_GPL(tty_dev_name_to_number);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #ifdef CONFIG_CONSOLE_POLL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) * tty_find_polling_driver - find device of a polled tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) * @name: name string to match
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) * @line: pointer to resulting tty line nr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) * This routine returns a tty driver structure, given a name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) * and the condition that the tty driver is capable of polled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) * operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) struct tty_driver *tty_find_polling_driver(char *name, int *line)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) struct tty_driver *p, *res = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) int tty_line = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) char *str, *stp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) for (str = name; *str; str++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) if ((*str >= '0' && *str <= '9') || *str == ',')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) if (!*str)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) len = str - name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) tty_line = simple_strtoul(str, &str, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) /* Search through the tty devices to look for a match */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) list_for_each_entry(p, &tty_drivers, tty_drivers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) if (!len || strncmp(name, p->name, len) != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) stp = str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) if (*stp == ',')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) stp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) if (*stp == '\0')
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) stp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) if (tty_line >= 0 && tty_line < p->num && p->ops &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) p->ops->poll_init && !p->ops->poll_init(p, tty_line, stp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) res = tty_driver_kref_get(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) *line = tty_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) EXPORT_SYMBOL_GPL(tty_find_polling_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) static ssize_t hung_up_tty_read(struct kiocb *iocb, struct iov_iter *to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) static ssize_t hung_up_tty_write(struct kiocb *iocb, struct iov_iter *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /* No kernel lock held - none needed ;) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) static __poll_t hung_up_tty_poll(struct file *filp, poll_table *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) return EPOLLIN | EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLRDNORM | EPOLLWRNORM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) static long hung_up_tty_ioctl(struct file *file, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) static long hung_up_tty_compat_ioctl(struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) return cmd == TIOCSPGRP ? -ENOTTY : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) static int hung_up_tty_fasync(int fd, struct file *file, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) static void tty_show_fdinfo(struct seq_file *m, struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (tty && tty->ops && tty->ops->show_fdinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) tty->ops->show_fdinfo(tty, m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) static const struct file_operations tty_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) .llseek = no_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) .read_iter = tty_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) .write_iter = tty_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) .splice_read = generic_file_splice_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) .splice_write = iter_file_splice_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) .poll = tty_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) .unlocked_ioctl = tty_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) .compat_ioctl = tty_compat_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) .open = tty_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) .release = tty_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) .fasync = tty_fasync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) .show_fdinfo = tty_show_fdinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) static const struct file_operations console_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) .llseek = no_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) .read_iter = tty_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) .write_iter = redirected_tty_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) .splice_read = generic_file_splice_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) .splice_write = iter_file_splice_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) .poll = tty_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) .unlocked_ioctl = tty_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) .compat_ioctl = tty_compat_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) .open = tty_open,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) .release = tty_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) .fasync = tty_fasync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) static const struct file_operations hung_up_tty_fops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) .llseek = no_llseek,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) .read_iter = hung_up_tty_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) .write_iter = hung_up_tty_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) .poll = hung_up_tty_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) .unlocked_ioctl = hung_up_tty_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) .compat_ioctl = hung_up_tty_compat_ioctl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) .release = tty_release,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) .fasync = hung_up_tty_fasync,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) static DEFINE_SPINLOCK(redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) static struct file *redirect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) extern void tty_sysctl_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) * tty_wakeup - request more data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * @tty: terminal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * Internal and external helper for wakeups of tty. This function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * informs the line discipline if present that the driver is ready
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) * to receive more output data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) void tty_wakeup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) ld = tty_ldisc_ref(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) if (ld) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) if (ld->ops->write_wakeup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) ld->ops->write_wakeup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) EXPORT_SYMBOL_GPL(tty_wakeup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) * __tty_hangup - actual handler for hangup events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) * @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) * This can be called by a "kworker" kernel thread. That is process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) * synchronous but doesn't hold any locks, so we need to make sure we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) * have the appropriate locks for what we're doing.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) * The hangup event clears any pending redirections onto the hung up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) * device. It ensures future writes will error and it does the needed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) * line discipline hangup and signal delivery. The tty object itself
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) * remains intact.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) * BTM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) * redirect lock for undoing redirection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) * file list lock for manipulating list of ttys
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) * tty_ldiscs_lock from called functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * termios_rwsem resetting termios data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * tasklist_lock to walk task list for hangup event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) * ->siglock to protect ->signal/->sighand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) static void __tty_hangup(struct tty_struct *tty, int exit_session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) struct file *cons_filp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) struct file *filp, *f = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) struct tty_file_private *priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) int closecount = 0, n;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) int refs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) spin_lock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) if (redirect && file_tty(redirect) == tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) f = redirect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) redirect = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) if (test_bit(TTY_HUPPED, &tty->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) * Some console devices aren't actually hung up for technical and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) * historical reasons, which can lead to indefinite interruptible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) * sleep in n_tty_read(). The following explicitly tells
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) * n_tty_read() to abort readers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) set_bit(TTY_HUPPING, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) /* inuse_filps is protected by the single tty lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) this really needs to change if we want to flush the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) workqueue with the lock held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) check_tty_count(tty, "tty_hangup");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) /* This breaks for file handles being sent over AF_UNIX sockets ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) list_for_each_entry(priv, &tty->tty_files, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) filp = priv->file;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) if (filp->f_op->write_iter == redirected_tty_write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) cons_filp = filp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) if (filp->f_op->write_iter != tty_write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) closecount++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) __tty_fasync(-1, filp, 0); /* can't block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) filp->f_op = &hung_up_tty_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) refs = tty_signal_session_leader(tty, exit_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) /* Account for the p->signal references we killed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) while (refs--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) tty_ldisc_hangup(tty, cons_filp != NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) spin_lock_irq(&tty->ctrl_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) clear_bit(TTY_THROTTLED, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) put_pid(tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) put_pid(tty->pgrp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) tty->session = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) tty->pgrp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) tty->ctrl_status = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) spin_unlock_irq(&tty->ctrl_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) * If one of the devices matches a console pointer, we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) * cannot just call hangup() because that will cause
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) * tty->count and state->count to go out of sync.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) * So we just call close() the right number of times.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) if (cons_filp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) if (tty->ops->close)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) for (n = 0; n < closecount; n++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) tty->ops->close(tty, cons_filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) } else if (tty->ops->hangup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) tty->ops->hangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) * We don't want to have driver/ldisc interactions beyond the ones
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) * we did here. The driver layer expects no calls after ->hangup()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) * from the ldisc side, which is now guaranteed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) set_bit(TTY_HUPPED, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) clear_bit(TTY_HUPPING, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) if (f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) fput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) static void do_tty_hangup(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) struct tty_struct *tty =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) container_of(work, struct tty_struct, hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) __tty_hangup(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) * tty_hangup - trigger a hangup event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) * @tty: tty to hangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) * A carrier loss (virtual or otherwise) has occurred on this like
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) * schedule a hangup sequence to run after this event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) void tty_hangup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) tty_debug_hangup(tty, "hangup\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) schedule_work(&tty->hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) EXPORT_SYMBOL(tty_hangup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) * tty_vhangup - process vhangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) * @tty: tty to hangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) * The user has asked via system call for the terminal to be hung up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) * We do this synchronously so that when the syscall returns the process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) * is complete. That guarantee is necessary for security reasons.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) void tty_vhangup(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) tty_debug_hangup(tty, "vhangup\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) __tty_hangup(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) EXPORT_SYMBOL(tty_vhangup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) * tty_vhangup_self - process vhangup for own ctty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) * Perform a vhangup on the current controlling tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) void tty_vhangup_self(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) tty = get_current_tty();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) tty_vhangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) * tty_vhangup_session - hangup session leader exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) * @tty: tty to hangup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) * The session leader is exiting and hanging up its controlling terminal.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) * Every process in the foreground process group is signalled SIGHUP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) * We do this synchronously so that when the syscall returns the process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) * is complete. That guarantee is necessary for security reasons.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) void tty_vhangup_session(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) tty_debug_hangup(tty, "session hangup\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) __tty_hangup(tty, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * tty_hung_up_p - was tty hung up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) * @filp: file pointer of tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * Return true if the tty has been subject to a vhangup or a carrier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) * loss
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) int tty_hung_up_p(struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) return (filp && filp->f_op == &hung_up_tty_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) EXPORT_SYMBOL(tty_hung_up_p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) * stop_tty - propagate flow control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) * @tty: tty to stop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) * Perform flow control to the driver. May be called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) * on an already stopped device and will not re-call the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) * method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) * This functionality is used by both the line disciplines for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) * halting incoming flow and by the driver. It may therefore be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) * called from any context, may be under the tty atomic_write_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) * but not always.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) * flow_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) void __stop_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) if (tty->stopped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) tty->stopped = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) if (tty->ops->stop)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) tty->ops->stop(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) void stop_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) spin_lock_irqsave(&tty->flow_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) __stop_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) spin_unlock_irqrestore(&tty->flow_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) EXPORT_SYMBOL(stop_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) * start_tty - propagate flow control
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) * @tty: tty to start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) * Start a tty that has been stopped if at all possible. If this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) * tty was previous stopped and is now being started, the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) * start method is invoked and the line discipline woken.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) * flow_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) void __start_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) if (!tty->stopped || tty->flow_stopped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) tty->stopped = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) if (tty->ops->start)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) tty->ops->start(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) tty_wakeup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) void start_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) spin_lock_irqsave(&tty->flow_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) __start_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) spin_unlock_irqrestore(&tty->flow_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) EXPORT_SYMBOL(start_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) static void tty_update_time(struct timespec64 *time)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) time64_t sec = ktime_get_real_seconds();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) * We only care if the two values differ in anything other than the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) * lower three bits (i.e every 8 seconds). If so, then we can update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) * the time of the tty device, otherwise it could be construded as a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) * security leak to let userspace know the exact timing of the tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) if ((sec ^ time->tv_sec) & ~7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) time->tv_sec = sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) * Iterate on the ldisc ->read() function until we've gotten all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) * the data the ldisc has for us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) * The "cookie" is something that the ldisc read function can fill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) * in to let us know that there is more data to be had.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) * We promise to continue to call the ldisc until it stops returning
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) * data or clears the cookie. The cookie may be something that the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) * ldisc maintains state for and needs to free.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) static int iterate_tty_read(struct tty_ldisc *ld, struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) struct file *file, struct iov_iter *to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) void *cookie = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) unsigned long offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) char kernel_buf[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) size_t count = iov_iter_count(to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) do {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) int size, copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) size = count > sizeof(kernel_buf) ? sizeof(kernel_buf) : count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) size = ld->ops->read(tty, file, kernel_buf, size, &cookie, offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) if (!size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) if (size < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) /* Did we have an earlier error (ie -EFAULT)? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) retval = size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) * -EOVERFLOW means we didn't have enough space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) * for a whole packet, and we shouldn't return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) * a partial result.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) if (retval == -EOVERFLOW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) copied = copy_to_iter(kernel_buf, size, to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) offset += copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) count -= copied;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) * If the user copy failed, we still need to do another ->read()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) * call if we had a cookie to let the ldisc clear up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) * But make sure size is zeroed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) if (unlikely(copied != size)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) retval = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) } while (cookie);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) /* We always clear tty buffer in case they contained passwords */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) memzero_explicit(kernel_buf, sizeof(kernel_buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) return offset ? offset : retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) * tty_read - read method for tty device files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) * @file: pointer to tty file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) * @buf: user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) * @count: size of user buffer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) * @ppos: unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) * Perform the read system call function on this terminal device. Checks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) * for hung up devices before calling the line discipline method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) * Locks the line discipline internally while needed. Multiple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) * read calls may be outstanding in parallel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) static ssize_t tty_read(struct kiocb *iocb, struct iov_iter *to)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) struct file *file = iocb->ki_filp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) struct inode *inode = file_inode(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) if (tty_paranoia_check(tty, inode, "tty_read"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) if (!tty || tty_io_error(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) /* We want to wait for the line discipline to sort out in this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) situation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) return hung_up_tty_read(iocb, to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) i = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) if (ld->ops->read)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) i = iterate_tty_read(ld, tty, file, to);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) if (i > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) tty_update_time(&inode->i_atime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) return i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) static void tty_write_unlock(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) mutex_unlock(&tty->atomic_write_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) static int tty_write_lock(struct tty_struct *tty, int ndelay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) if (!mutex_trylock(&tty->atomic_write_lock)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) if (ndelay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) if (mutex_lock_interruptible(&tty->atomic_write_lock))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) return -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) * Split writes up in sane blocksizes to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) * denial-of-service type attacks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) static inline ssize_t do_tty_write(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) ssize_t (*write)(struct tty_struct *, struct file *, const unsigned char *, size_t),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) struct file *file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) struct iov_iter *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) size_t count = iov_iter_count(from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) ssize_t ret, written = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) unsigned int chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) ret = tty_write_lock(tty, file->f_flags & O_NDELAY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) * We chunk up writes into a temporary buffer. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) * simplifies low-level drivers immensely, since they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) * don't have locking issues and user mode accesses.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) * But if TTY_NO_WRITE_SPLIT is set, we should use a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) * big chunk-size..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) * The default chunk-size is 2kB, because the NTTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) * layer has problems with bigger chunks. It will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) * claim to be able to handle more characters than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) * it actually does.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) * FIXME: This can probably go away now except that 64K chunks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) * are too likely to fail unless switched to vmalloc...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) chunk = 2048;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) if (test_bit(TTY_NO_WRITE_SPLIT, &tty->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) chunk = 65536;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) if (count < chunk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) chunk = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) /* write_buf/write_cnt is protected by the atomic_write_lock mutex */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) if (tty->write_cnt < chunk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) unsigned char *buf_chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) if (chunk < 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) chunk = 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) buf_chunk = kmalloc(chunk, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) if (!buf_chunk) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) ret = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) kfree(tty->write_buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) tty->write_cnt = chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) tty->write_buf = buf_chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) /* Do the write .. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) for (;;) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) size_t size = count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) if (size > chunk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) size = chunk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) ret = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) if (copy_from_iter(tty->write_buf, size, from) != size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) ret = write(tty, file, tty->write_buf, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) if (ret <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) written += ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) if (ret > size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) /* FIXME! Have Al check this! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) if (ret != size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) iov_iter_revert(from, size-ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) count -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) if (!count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) ret = -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) cond_resched();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) if (written) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) tty_update_time(&file_inode(file)->i_mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) ret = written;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) tty_write_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) * tty_write_message - write a message to a certain tty, not just the console.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) * @tty: the destination tty_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) * @msg: the message to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) * This is used for messages that need to be redirected to a specific tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) * We don't put it into the syslog queue right now maybe in the future if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) * really needed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) * We must still hold the BTM and test the CLOSING flag for the moment.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) void tty_write_message(struct tty_struct *tty, char *msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) mutex_lock(&tty->atomic_write_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) if (tty->ops->write && tty->count > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) tty->ops->write(tty, msg, strlen(msg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) tty_write_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) * tty_write - write method for tty device file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) * @file: tty file pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) * @buf: user data to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) * @count: bytes to write
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) * @ppos: unused
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) * Write data to a tty device via the line discipline.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) * Locks the line discipline as required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) * Writes to the tty driver are serialized by the atomic_write_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) * and are then processed in chunks to the device. The line discipline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) * write method will not be invoked in parallel for each device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) static ssize_t file_tty_write(struct file *file, struct kiocb *iocb, struct iov_iter *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) ssize_t ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) if (tty_paranoia_check(tty, file_inode(file), "tty_write"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) if (!tty || !tty->ops->write || tty_io_error(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) /* Short term debug to catch buggy drivers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) if (tty->ops->write_room == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) tty_err(tty, "missing write_room method\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) return hung_up_tty_write(iocb, from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) if (!ld->ops->write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) ret = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) ret = do_tty_write(ld->ops->write, tty, file, from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) static ssize_t tty_write(struct kiocb *iocb, struct iov_iter *from)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) return file_tty_write(iocb->ki_filp, iocb, from);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) ssize_t redirected_tty_write(struct kiocb *iocb, struct iov_iter *iter)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) struct file *p = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) spin_lock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) if (redirect)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) p = get_file(redirect);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) * We know the redirected tty is just another tty, we can can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) * call file_tty_write() directly with that file pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) if (p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) ssize_t res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) res = file_tty_write(p, iocb, iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) fput(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) return tty_write(iocb, iter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) * tty_send_xchar - send priority character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) * Send a high priority character to the tty even if stopped
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) * Locking: none for xchar method, write ordering for write method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) int tty_send_xchar(struct tty_struct *tty, char ch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) int was_stopped = tty->stopped;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) if (tty->ops->send_xchar) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) down_read(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) tty->ops->send_xchar(tty, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) up_read(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) if (tty_write_lock(tty, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) return -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) down_read(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) if (was_stopped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) start_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) tty->ops->write(tty, &ch, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) if (was_stopped)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) stop_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) up_read(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) tty_write_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) static char ptychar[] = "pqrstuvwxyzabcde";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) * pty_line_name - generate name for a pty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) * @driver: the tty driver in use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) * @index: the minor number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) * @p: output buffer of at least 6 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) * Generate a name from a driver reference and write it to the output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) * Locking: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) static void pty_line_name(struct tty_driver *driver, int index, char *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) int i = index + driver->name_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) /* ->name is initialized to "ttyp", but "tty" is expected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) sprintf(p, "%s%c%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) driver->subtype == PTY_TYPE_SLAVE ? "tty" : driver->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) ptychar[i >> 4 & 0xf], i & 0xf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) * tty_line_name - generate name for a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) * @driver: the tty driver in use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) * @index: the minor number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) * @p: output buffer of at least 7 bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) * Generate a name from a driver reference and write it to the output
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) * Locking: None
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) static ssize_t tty_line_name(struct tty_driver *driver, int index, char *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) return sprintf(p, "%s", driver->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) return sprintf(p, "%s%d", driver->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) index + driver->name_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) * tty_driver_lookup_tty() - find an existing tty, if any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) * @driver: the driver for the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) * @idx: the minor number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) * Return the tty, if found. If not found, return NULL or ERR_PTR() if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) * driver lookup() method returns an error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) * Locking: tty_mutex must be held. If the tty is found, bump the tty kref.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) static struct tty_struct *tty_driver_lookup_tty(struct tty_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) struct file *file, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) if (driver->ops->lookup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) if (!file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) tty = ERR_PTR(-EIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) tty = driver->ops->lookup(driver, file, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) tty = driver->ttys[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) if (!IS_ERR(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) tty_kref_get(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) * tty_init_termios - helper for termios setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) * @tty: the tty to set up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) * Initialise the termios structure for this tty. This runs under
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) * the tty_mutex currently so we can be relaxed about ordering.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) void tty_init_termios(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) struct ktermios *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) int idx = tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) tty->termios = tty->driver->init_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) /* Check for lazy saved data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) tp = tty->driver->termios[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) if (tp != NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) tty->termios = *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) tty->termios.c_line = tty->driver->init_termios.c_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) tty->termios = tty->driver->init_termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) /* Compatibility until drivers always set this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) EXPORT_SYMBOL_GPL(tty_init_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) int tty_standard_install(struct tty_driver *driver, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) tty_init_termios(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) tty_driver_kref_get(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) tty->count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) driver->ttys[tty->index] = tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) EXPORT_SYMBOL_GPL(tty_standard_install);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) * tty_driver_install_tty() - install a tty entry in the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) * @driver: the driver for the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) * @tty: the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) * Install a tty object into the driver tables. The tty->index field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) * will be set by the time this is called. This method is responsible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) * for ensuring any need additional structures are allocated and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) * configured.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) * Locking: tty_mutex for now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) static int tty_driver_install_tty(struct tty_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) return driver->ops->install ? driver->ops->install(driver, tty) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) tty_standard_install(driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) * tty_driver_remove_tty() - remove a tty from the driver tables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) * @driver: the driver for the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) * @tty: tty to remove
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) * Remvoe a tty object from the driver tables. The tty->index field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) * will be set by the time this is called.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) * Locking: tty_mutex for now
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) static void tty_driver_remove_tty(struct tty_driver *driver, struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) if (driver->ops->remove)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) driver->ops->remove(driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) driver->ttys[tty->index] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) * tty_reopen() - fast re-open of an open tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) * @tty: the tty to open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) * Return 0 on success, -errno on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) * Re-opens on master ptys are not allowed and return -EIO.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) * Locking: Caller must hold tty_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) static int tty_reopen(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) struct tty_driver *driver = tty->driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) if (driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) driver->subtype == PTY_TYPE_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) if (!tty->count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) if (test_bit(TTY_EXCLUSIVE, &tty->flags) && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) if (ld) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) retval = tty_ldisc_lock(tty, 5 * HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) if (!tty->ldisc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) retval = tty_ldisc_reinit(tty, tty->termios.c_line);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) tty_ldisc_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) if (retval == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) tty->count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) * tty_init_dev - initialise a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) * @driver: tty driver we are opening a device on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) * @idx: device index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) * Prepare a tty device. This may not be a "new" clean device but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) * could also be an active device. The pty drivers require special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) * handling because of this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) * The function is called under the tty_mutex, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) * protects us from the tty struct or driver itself going away.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) * On exit the tty device has the line discipline attached and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) * a reference count of 1. If a pair was created for pty/tty use
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) * and the other was a pty master then it too has a reference count of 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) * WSH 06/09/97: Rewritten to remove races and properly clean up after a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) * failed open. The new code protects the open with a mutex, so it's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) * really quite straightforward. The mutex locking can probably be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) * relaxed for the (most common) case of reopening a tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) * Return: returned tty structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) * First time open is complex, especially for PTY devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) * This code guarantees that either everything succeeds and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) * TTY is ready for operation, or else the table slots are vacated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) * and the allocated memory released. (Except that the termios
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) * may be retained.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) if (!try_module_get(driver->owner))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) tty = alloc_tty_struct(driver, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) if (!tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) retval = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) goto err_module_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) retval = tty_driver_install_tty(driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) if (retval < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) goto err_free_tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) if (!tty->port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) tty->port = driver->ports[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) if (WARN_RATELIMIT(!tty->port,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) "%s: %s driver does not set tty->port. This would crash the kernel. Fix the driver!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) __func__, tty->driver->name)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) retval = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) goto err_release_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) retval = tty_ldisc_lock(tty, 5 * HZ);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) goto err_release_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) tty->port->itty = tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) * Structures all installed ... call the ldisc open routines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) * If we fail here just call release_tty to clean up. No need
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) * to decrement the use counts, as release_tty doesn't care.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) retval = tty_ldisc_setup(tty, tty->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) goto err_release_tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) tty_ldisc_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) /* Return the tty locked so that it cannot vanish under the caller */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) err_free_tty:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) free_tty_struct(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) err_module_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) module_put(driver->owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) return ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) /* call the tty release_tty routine to clean out this slot */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) err_release_tty:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) tty_ldisc_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) tty_info_ratelimited(tty, "ldisc open failed (%d), clearing slot %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) retval, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) err_release_lock:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) release_tty(tty, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) return ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) * tty_save_termios() - save tty termios data in driver table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) * @tty: tty whose termios data to save
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) * Locking: Caller guarantees serialisation with tty_init_termios().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) void tty_save_termios(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) struct ktermios *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) int idx = tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) /* If the port is going to reset then it has no termios to save */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) /* Stash the termios data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) tp = tty->driver->termios[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) if (tp == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) tp = kmalloc(sizeof(*tp), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) if (tp == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) tty->driver->termios[idx] = tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) *tp = tty->termios;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) EXPORT_SYMBOL_GPL(tty_save_termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) * tty_flush_works - flush all works of a tty/pty pair
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) * @tty: tty device to flush works for (or either end of a pty pair)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) * Sync flush all works belonging to @tty (and the 'other' tty).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) static void tty_flush_works(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) flush_work(&tty->SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) flush_work(&tty->hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) if (tty->link) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) flush_work(&tty->link->SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) flush_work(&tty->link->hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) * release_one_tty - release tty structure memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) * @work: work of tty we are obliterating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) * Releases memory associated with a tty structure, and clears out the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) * driver table slots. This function is called when a device is no longer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) * in use. It also gets called when setup of a device fails.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) * takes the file list lock internally when working on the list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) * of ttys that the driver keeps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) * This method gets called from a work queue so that the driver private
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) * cleanup ops can sleep (needed for USB at least)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) static void release_one_tty(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) struct tty_struct *tty =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) container_of(work, struct tty_struct, hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) struct tty_driver *driver = tty->driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) struct module *owner = driver->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) if (tty->ops->cleanup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) tty->ops->cleanup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) tty->magic = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) tty_driver_kref_put(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) module_put(owner);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) spin_lock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) list_del_init(&tty->tty_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) spin_unlock(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) put_pid(tty->pgrp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) put_pid(tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) free_tty_struct(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) static void queue_release_one_tty(struct kref *kref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) struct tty_struct *tty = container_of(kref, struct tty_struct, kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) /* The hangup queue is now free so we can reuse it rather than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) waste a chunk of memory for each port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) INIT_WORK(&tty->hangup_work, release_one_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) schedule_work(&tty->hangup_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) * tty_kref_put - release a tty kref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) * @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) * Release a reference to a tty device and if need be let the kref
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) * layer destruct the object for us
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) void tty_kref_put(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) if (tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) kref_put(&tty->kref, queue_release_one_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) EXPORT_SYMBOL(tty_kref_put);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) * release_tty - release tty structure memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) * Release both @tty and a possible linked partner (think pty pair),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) * and decrement the refcount of the backing module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) * tty_mutex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) * takes the file list lock internally when working on the list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) * of ttys that the driver keeps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) static void release_tty(struct tty_struct *tty, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) /* This should always be true but check for the moment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) WARN_ON(tty->index != idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) WARN_ON(!mutex_is_locked(&tty_mutex));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) if (tty->ops->shutdown)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) tty->ops->shutdown(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) tty_save_termios(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) tty_driver_remove_tty(tty->driver, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) if (tty->port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) tty->port->itty = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) if (tty->link)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) tty->link->port->itty = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) if (tty->port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) tty_buffer_cancel_work(tty->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) if (tty->link)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) tty_buffer_cancel_work(tty->link->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) tty_kref_put(tty->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) * tty_release_checks - check a tty before real release
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) * @tty: tty to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) * @idx: index of the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) * Performs some paranoid checking before true release of the @tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) * This is a no-op unless TTY_PARANOIA_CHECK is defined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) static int tty_release_checks(struct tty_struct *tty, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) #ifdef TTY_PARANOIA_CHECK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) if (idx < 0 || idx >= tty->driver->num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) tty_debug(tty, "bad idx %d\n", idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) /* not much to check for devpts */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) if (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) if (tty != tty->driver->ttys[idx]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) tty_debug(tty, "bad driver table[%d] = %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) idx, tty->driver->ttys[idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) if (tty->driver->other) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) struct tty_struct *o_tty = tty->link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) if (o_tty != tty->driver->other->ttys[idx]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) tty_debug(tty, "bad other table[%d] = %p\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) idx, tty->driver->other->ttys[idx]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) if (o_tty->link != tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) tty_debug(tty, "bad link = %p\n", o_tty->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) * tty_kclose - closes tty opened by tty_kopen
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) * @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) * Performs the final steps to release and free a tty device. It is the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) * same as tty_release_struct except that it also resets TTY_PORT_KOPENED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) * flag on tty->port.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) void tty_kclose(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) * Ask the line discipline code to release its structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) tty_ldisc_release(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) /* Wait for pending work before tty destruction commmences */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) tty_flush_works(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) tty_debug_hangup(tty, "freeing structure\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) * The release_tty function takes care of the details of clearing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) * the slots and preserving the termios structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) tty_port_set_kopened(tty->port, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) release_tty(tty, tty->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) EXPORT_SYMBOL_GPL(tty_kclose);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) * tty_release_struct - release a tty struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) * @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) * @idx: index of the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) * Performs the final steps to release and free a tty device. It is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) * roughly the reverse of tty_init_dev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) void tty_release_struct(struct tty_struct *tty, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) * Ask the line discipline code to release its structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) tty_ldisc_release(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) /* Wait for pending work before tty destruction commmences */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) tty_flush_works(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) tty_debug_hangup(tty, "freeing structure\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) * The release_tty function takes care of the details of clearing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) * the slots and preserving the termios structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) release_tty(tty, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) EXPORT_SYMBOL_GPL(tty_release_struct);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) * tty_release - vfs callback for close
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) * @inode: inode of tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) * @filp: file pointer for handle to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) * Called the last time each file handle is closed that references
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) * this tty. There may however be several such references.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) * Takes bkl. See tty_release_dev
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) * Even releasing the tty structures is a tricky business.. We have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) * to be very careful that the structures are all released at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) * same time, as interrupts might otherwise get the wrong pointers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) * WSH 09/09/97: rewritten to avoid some nasty race conditions that could
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) * lead to double frees or releasing memory still in use.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) int tty_release(struct inode *inode, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) struct tty_struct *tty = file_tty(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) struct tty_struct *o_tty = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) int do_sleep, final;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) int idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) long timeout = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) int once = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) if (tty_paranoia_check(tty, inode, __func__))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) check_tty_count(tty, __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) __tty_fasync(-1, filp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) idx = tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) tty->driver->subtype == PTY_TYPE_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) o_tty = tty->link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) if (tty_release_checks(tty, idx)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) tty_debug_hangup(tty, "releasing (count=%d)\n", tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) if (tty->ops->close)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) tty->ops->close(tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) /* If tty is pty master, lock the slave pty (stable lock order) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) tty_lock_slave(o_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) * Sanity check: if tty->count is going to zero, there shouldn't be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) * any waiters on tty->read_wait or tty->write_wait. We test the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) * wait queues and kick everyone out _before_ actually starting to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) * close. This ensures that we won't block while releasing the tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) * structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) * The test for the o_tty closing is necessary, since the master and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) * slave sides may close in any order. If the slave side closes out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) * first, its count will be one, since the master side holds an open.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) * Thus this test wouldn't be triggered at the time the slave closed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) * so we do it now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) while (1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) do_sleep = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782) if (tty->count <= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) if (waitqueue_active(&tty->read_wait)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) wake_up_poll(&tty->read_wait, EPOLLIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) do_sleep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) if (waitqueue_active(&tty->write_wait)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) wake_up_poll(&tty->write_wait, EPOLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) do_sleep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) if (o_tty && o_tty->count <= 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) if (waitqueue_active(&o_tty->read_wait)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) wake_up_poll(&o_tty->read_wait, EPOLLIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) do_sleep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) if (waitqueue_active(&o_tty->write_wait)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798) wake_up_poll(&o_tty->write_wait, EPOLLOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) do_sleep++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) if (!do_sleep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) if (once) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) once = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) tty_warn(tty, "read/write wait queue active!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) schedule_timeout_killable(timeout);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) if (timeout < 120 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) timeout = 2 * timeout + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) timeout = MAX_SCHEDULE_TIMEOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) if (o_tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) if (--o_tty->count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) tty_warn(tty, "bad slave count (%d)\n", o_tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) o_tty->count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) if (--tty->count < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) tty_warn(tty, "bad tty->count (%d)\n", tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) tty->count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) * We've decremented tty->count, so we need to remove this file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) * descriptor off the tty->tty_files list; this serves two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) * purposes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) * - check_tty_count sees the correct number of file descriptors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) * associated with this tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) * - do_tty_hangup no longer sees this file descriptor as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) * something that needs to be handled for hangups.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) tty_del_file(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) * Perform some housekeeping before deciding whether to return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) * If _either_ side is closing, make sure there aren't any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) * processes that still think tty or o_tty is their controlling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) * tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) if (!tty->count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) read_lock(&tasklist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) session_clear_tty(tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) if (o_tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) session_clear_tty(o_tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) read_unlock(&tasklist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) /* check whether both sides are closing ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) final = !tty->count && !(o_tty && o_tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) tty_unlock_slave(o_tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) /* At this point, the tty->count == 0 should ensure a dead tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) cannot be re-opened by a racing opener */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) if (!final)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) tty_debug_hangup(tty, "final close\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) tty_release_struct(tty, idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) * tty_open_current_tty - get locked tty of current task
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) * @device: device number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) * @filp: file pointer to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) * @return: locked tty of the current task iff @device is /dev/tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) * Performs a re-open of the current task's controlling tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) * We cannot return driver and index like for the other nodes because
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) * devpts will not work then. It expects inodes to be from devpts FS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) static struct tty_struct *tty_open_current_tty(dev_t device, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) if (device != MKDEV(TTYAUX_MAJOR, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) tty = get_current_tty();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) return ERR_PTR(-ENXIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) filp->f_flags |= O_NONBLOCK; /* Don't let /dev/tty block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) /* noctty = 1; */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) tty_kref_put(tty); /* safe to drop the kref now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) retval = tty_reopen(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) if (retval < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) tty = ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) * tty_lookup_driver - lookup a tty driver for a given device file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) * @device: device number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) * @filp: file pointer to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) * @index: index for the device in the @return driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) * @return: driver for this inode (with increased refcount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) * If @return is not erroneous, the caller is responsible to decrement the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) * refcount by tty_driver_kref_put.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) * Locking: tty_mutex protects get_tty_driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) static struct tty_driver *tty_lookup_driver(dev_t device, struct file *filp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) int *index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) struct tty_driver *driver = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) switch (device) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) #ifdef CONFIG_VT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) case MKDEV(TTY_MAJOR, 0): {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) extern struct tty_driver *console_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) driver = tty_driver_kref_get(console_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) *index = fg_console;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) case MKDEV(TTYAUX_MAJOR, 1): {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) struct tty_driver *console_driver = console_device(index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) if (console_driver) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) driver = tty_driver_kref_get(console_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) if (driver && filp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) /* Don't let /dev/console block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) filp->f_flags |= O_NONBLOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) if (driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) tty_driver_kref_put(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) driver = get_tty_driver(device, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) if (!driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) return driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) * tty_kopen - open a tty device for kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) * @device: dev_t of device to open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) * Opens tty exclusively for kernel. Performs the driver lookup,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) * makes sure it's not already opened and performs the first-time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) * tty initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) * Returns the locked initialized &tty_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) * Claims the global tty_mutex to serialize:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) * - concurrent first-time tty initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) * - concurrent tty driver removal w/ lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) * - concurrent tty removal from driver table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) struct tty_struct *tty_kopen(dev_t device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) struct tty_driver *driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) int index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) driver = tty_lookup_driver(device, NULL, &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) if (IS_ERR(driver)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) return ERR_CAST(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) /* check whether we're reopening an existing tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) tty = tty_driver_lookup_tty(driver, NULL, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) if (IS_ERR(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) /* drop kref from tty_driver_lookup_tty() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) tty = ERR_PTR(-EBUSY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) } else { /* tty_init_dev returns tty with the tty_lock held */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) tty = tty_init_dev(driver, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) if (IS_ERR(tty))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) tty_port_set_kopened(tty->port, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) tty_driver_kref_put(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) EXPORT_SYMBOL_GPL(tty_kopen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) * tty_open_by_driver - open a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) * @device: dev_t of device to open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) * @filp: file pointer to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011) * Performs the driver lookup, checks for a reopen, or otherwise
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) * performs the first-time tty initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) * Returns the locked initialized or re-opened &tty_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) * Claims the global tty_mutex to serialize:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) * - concurrent first-time tty initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) * - concurrent tty driver removal w/ lookup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) * - concurrent tty removal from driver table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) static struct tty_struct *tty_open_by_driver(dev_t device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) struct tty_driver *driver = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) int index = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) driver = tty_lookup_driver(device, filp, &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) if (IS_ERR(driver)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) return ERR_CAST(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) /* check whether we're reopening an existing tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) tty = tty_driver_lookup_tty(driver, filp, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) if (IS_ERR(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) if (tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) if (tty_port_kopened(tty->port)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) tty_kref_put(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) tty = ERR_PTR(-EBUSY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) retval = tty_lock_interruptible(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) tty_kref_put(tty); /* drop kref from tty_driver_lookup_tty() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) if (retval == -EINTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) retval = -ERESTARTSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) tty = ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) retval = tty_reopen(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) if (retval < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) tty = ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) } else { /* Returns with the tty_lock held for now */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) tty = tty_init_dev(driver, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) tty_driver_kref_put(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) * tty_open - open a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) * @inode: inode of device file
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) * @filp: file pointer to tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) * tty_open and tty_release keep up the tty count that contains the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) * number of opens done on a tty. We cannot use the inode-count, as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) * different inodes might point to the same tty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) * Open-counting is needed for pty masters, as well as for keeping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) * track of serial lines: DTR is dropped when the last close happens.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) * (This is not done solely through tty->count, now. - Ted 1/27/92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) * The termios state of a pty is reset on first open so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) * settings don't persist across reuse.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) * Locking: tty_mutex protects tty, tty_lookup_driver and tty_init_dev.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) * tty->count should protect the rest.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) * ->siglock protects ->signal/->sighand
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) * Note: the tty_unlock/lock cases without a ref are only safe due to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) * tty_mutex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) static int tty_open(struct inode *inode, struct file *filp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) int noctty, retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) dev_t device = inode->i_rdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) unsigned saved_flags = filp->f_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) nonseekable_open(inode, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106) retry_open:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) retval = tty_alloc_file(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) tty = tty_open_current_tty(device, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) tty = tty_open_by_driver(device, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) if (IS_ERR(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) tty_free_file(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) retval = PTR_ERR(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) if (retval != -EAGAIN || signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) schedule();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) goto retry_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) tty_add_file(tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) check_tty_count(tty, __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) tty_debug_hangup(tty, "opening (count=%d)\n", tty->count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) if (tty->ops->open)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) retval = tty->ops->open(tty, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) retval = -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) filp->f_flags = saved_flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) if (retval) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) tty_debug_hangup(tty, "open error %d, releasing\n", retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) tty_unlock(tty); /* need to call tty_release without BTM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) tty_release(inode, filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) if (retval != -ERESTARTSYS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) schedule();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) * Need to reset f_op in case a hangup happened.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) if (tty_hung_up_p(filp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) filp->f_op = &tty_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) goto retry_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) clear_bit(TTY_HUPPED, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) noctty = (filp->f_flags & O_NOCTTY) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) (IS_ENABLED(CONFIG_VT) && device == MKDEV(TTY_MAJOR, 0)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) device == MKDEV(TTYAUX_MAJOR, 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) tty->driver->subtype == PTY_TYPE_MASTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) if (!noctty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) tty_open_proc_set_tty(filp, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170) * tty_poll - check tty status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) * @filp: file being polled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) * @wait: poll wait structures to update
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) * Call the line discipline polling method to obtain the poll
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) * status of the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) * Locking: locks called line discipline but ldisc poll method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) * may be re-entered freely by other callers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181) static __poll_t tty_poll(struct file *filp, poll_table *wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) struct tty_struct *tty = file_tty(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) __poll_t ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) if (tty_paranoia_check(tty, file_inode(filp), "tty_poll"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) return hung_up_tty_poll(filp, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) if (ld->ops->poll)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) ret = ld->ops->poll(tty, filp, wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) static int __tty_fasync(int fd, struct file *filp, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) struct tty_struct *tty = file_tty(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) if (tty_paranoia_check(tty, file_inode(filp), "tty_fasync"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) retval = fasync_helper(fd, filp, on, &tty->fasync);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) if (retval <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) if (on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) enum pid_type type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) struct pid *pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) spin_lock_irqsave(&tty->ctrl_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) if (tty->pgrp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) pid = tty->pgrp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) type = PIDTYPE_PGID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) pid = task_pid(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) type = PIDTYPE_TGID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) get_pid(pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) spin_unlock_irqrestore(&tty->ctrl_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) __f_setown(filp, pid, type, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) put_pid(pid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) static int tty_fasync(int fd, struct file *filp, int on)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) struct tty_struct *tty = file_tty(filp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) int retval = -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) tty_lock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) if (!tty_hung_up_p(filp))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) retval = __tty_fasync(fd, filp, on);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) tty_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) * tiocsti - fake input character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) * @tty: tty to fake input into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) * @p: pointer to character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) * Fake input to a tty device. Does the necessary locking and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) * input management.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) * FIXME: does not honour flow control ??
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) * Called functions take tty_ldiscs_lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) * current->signal->tty check is safe without locks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) static int tiocsti(struct tty_struct *tty, char __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) char ch, mbz = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) if (get_user(ch, p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) tty_audit_tiocsti(tty, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) tty_buffer_lock_exclusive(tty->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) if (ld->ops->receive_buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) ld->ops->receive_buf(tty, &ch, &mbz, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) tty_buffer_unlock_exclusive(tty->port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) * tiocgwinsz - implement window query ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) * @tty: tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) * @arg: user buffer for result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) * Copies the kernel idea of the window size into the user buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) * Locking: tty->winsize_mutex is taken to ensure the winsize data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) * is consistent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) mutex_lock(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) err = copy_to_user(arg, &tty->winsize, sizeof(*arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) mutex_unlock(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) return err ? -EFAULT: 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) * tty_do_resize - resize event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) * @tty: tty being resized
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) * @ws: new dimensions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) * Update the termios variables and send the necessary signals to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311) * peform a terminal resize correctly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314) int tty_do_resize(struct tty_struct *tty, struct winsize *ws)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) struct pid *pgrp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) /* Lock the tty */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319) mutex_lock(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) /* Signal the foreground process group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) pgrp = tty_get_pgrp(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) if (pgrp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) kill_pgrp(pgrp, SIGWINCH, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327) put_pid(pgrp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) tty->winsize = *ws;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) mutex_unlock(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) EXPORT_SYMBOL(tty_do_resize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) * tiocswinsz - implement window size set ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) * @tty: tty side of tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) * @arg: user buffer for result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) * Copies the user idea of the window size to the kernel. Traditionally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) * this is just advisory information but for the Linux console it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) * actually has driver level meaning and triggers a VC resize.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) * Driver dependent. The default do_resize method takes the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) * tty termios mutex and ctrl_lock. The console takes its own lock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) * then calls into the default method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) static int tiocswinsz(struct tty_struct *tty, struct winsize __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) struct winsize tmp_ws;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) if (copy_from_user(&tmp_ws, arg, sizeof(*arg)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357) if (tty->ops->resize)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) return tty->ops->resize(tty, &tmp_ws);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360) return tty_do_resize(tty, &tmp_ws);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364) * tioccons - allow admin to move logical console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) * @file: the file to become console
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) * Allow the administrator to move the redirected console device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) * Locking: uses redirect_lock to guard the redirect information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372) static int tioccons(struct file *file)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) if (!capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) if (file->f_op->write_iter == redirected_tty_write) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) struct file *f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) spin_lock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) f = redirect;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) redirect = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) if (f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) fput(f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) if (file->f_op->write_iter != tty_write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) if (!(file->f_mode & FMODE_WRITE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) return -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) if (!(file->f_mode & FMODE_CAN_WRITE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) spin_lock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) if (redirect) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) redirect = get_file(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) spin_unlock(&redirect_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) * tiocsetd - set line discipline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404) * @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) * @p: pointer to user data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) * Set the line discipline according to user request.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) * Locking: see tty_set_ldisc, this function is just a helper
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) static int tiocsetd(struct tty_struct *tty, int __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) int disc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) if (get_user(disc, p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) ret = tty_set_ldisc(tty, disc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) * tiocgetd - get line discipline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) * @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428) * @p: pointer to user data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) * Retrieves the line discipline id directly from the ldisc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) * Locking: waits for ldisc reference (in case the line discipline
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) * is changing or the tty is being hungup)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) static int tiocgetd(struct tty_struct *tty, int __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) ret = put_user(ld->ops->num, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) * send_break - performed time break
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) * @tty: device to break on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) * @duration: timeout in mS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) * Perform a timed break on hardware that lacks its own driver level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) * timed break functionality.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) * Locking:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) * atomic_write_lock serializes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) static int send_break(struct tty_struct *tty, unsigned int duration)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) if (tty->ops->break_ctl == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) if (tty->driver->flags & TTY_DRIVER_HARDWARE_BREAK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) retval = tty->ops->break_ctl(tty, duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) /* Do the work ourselves */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) if (tty_write_lock(tty, 0) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) return -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) retval = tty->ops->break_ctl(tty, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) if (!signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) msleep_interruptible(duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) retval = tty->ops->break_ctl(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) tty_write_unlock(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) retval = -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) * tty_tiocmget - get modem status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) * @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) * @p: pointer to result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) * Obtain the modem status bits from the tty driver if the feature
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495) * is supported. Return -ENOTTY if it is not available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) * Locking: none (up to the driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) static int tty_tiocmget(struct tty_struct *tty, int __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502) int retval = -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) if (tty->ops->tiocmget) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) retval = tty->ops->tiocmget(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) if (retval >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) retval = put_user(retval, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) * tty_tiocmset - set modem status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) * @tty: tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) * @cmd: command - clear bits, set bits or set all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517) * @p: pointer to desired bits
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519) * Set the modem status bits from the tty driver if the feature
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) * is supported. Return -ENOTTY if it is not available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) * Locking: none (up to the driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) static int tty_tiocmset(struct tty_struct *tty, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526) unsigned __user *p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) unsigned int set, clear, val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) if (tty->ops->tiocmset == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) retval = get_user(val, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) set = clear = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) case TIOCMBIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) set = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) case TIOCMBIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543) clear = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) case TIOCMSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) set = val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) clear = ~val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) set &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) clear &= TIOCM_DTR|TIOCM_RTS|TIOCM_OUT1|TIOCM_OUT2|TIOCM_LOOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) return tty->ops->tiocmset(tty, set, clear);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) static int tty_tiocgicount(struct tty_struct *tty, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) int retval = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) struct serial_icounter_struct icount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) memset(&icount, 0, sizeof(icount));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) if (tty->ops->get_icount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) retval = tty->ops->get_icount(tty, &icount);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562) if (retval != 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) if (copy_to_user(arg, &icount, sizeof(icount)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569) static int tty_tiocsserial(struct tty_struct *tty, struct serial_struct __user *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) static DEFINE_RATELIMIT_STATE(depr_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) DEFAULT_RATELIMIT_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) DEFAULT_RATELIMIT_BURST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) char comm[TASK_COMM_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575) struct serial_struct v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) if (copy_from_user(&v, ss, sizeof(*ss)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) flags = v.flags & ASYNC_DEPRECATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) if (flags && __ratelimit(&depr_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) pr_warn("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) __func__, get_task_comm(comm, current), flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) if (!tty->ops->set_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) return tty->ops->set_serial(tty, &v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) static int tty_tiocgserial(struct tty_struct *tty, struct serial_struct __user *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593) struct serial_struct v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) memset(&v, 0, sizeof(v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) if (!tty->ops->get_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) err = tty->ops->get_serial(tty, &v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) if (!err && copy_to_user(ss, &v, sizeof(v)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) * if pty, return the slave side (real_tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) * otherwise, return self
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) static struct tty_struct *tty_pair_get_tty(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) tty->driver->subtype == PTY_TYPE_MASTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) tty = tty->link;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) * Split this up, as gcc can choke on it otherwise..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622) struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) struct tty_struct *real_tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624) void __user *p = (void __user *)arg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) if (tty_paranoia_check(tty, file_inode(file), "tty_ioctl"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) real_tty = tty_pair_get_tty(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) * Factor out some common prep work
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) case TIOCSETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) case TIOCSBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) case TIOCCBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) case TCSBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) case TCSBRKP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) retval = tty_check_change(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) if (cmd != TIOCCBRK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) tty_wait_until_sent(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) return -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) * Now do the stuff.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) case TIOCSTI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) return tiocsti(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659) case TIOCGWINSZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) return tiocgwinsz(real_tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) case TIOCSWINSZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) return tiocswinsz(real_tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) case TIOCCONS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) return real_tty != tty ? -EINVAL : tioccons(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) case TIOCEXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) set_bit(TTY_EXCLUSIVE, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) case TIOCNXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669) clear_bit(TTY_EXCLUSIVE, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) case TIOCGEXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) int excl = test_bit(TTY_EXCLUSIVE, &tty->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) return put_user(excl, (int __user *)p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) case TIOCGETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677) return tiocgetd(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) case TIOCSETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) return tiocsetd(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) case TIOCVHANGUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) if (!capable(CAP_SYS_ADMIN))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) return -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) tty_vhangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) case TIOCGDEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) unsigned int ret = new_encode_dev(tty_devnum(real_tty));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) return put_user(ret, (unsigned int __user *)p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) * Break handling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) case TIOCSBRK: /* Turn break on, unconditionally */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) if (tty->ops->break_ctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) return tty->ops->break_ctl(tty, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) case TIOCCBRK: /* Turn break off, unconditionally */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) if (tty->ops->break_ctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) return tty->ops->break_ctl(tty, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) case TCSBRK: /* SVID version: non-zero arg --> no break */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) /* non-zero arg means wait for all output data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) * to be sent (performed above) but don't send break.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) * This is used by the tcdrain() termios function.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) if (!arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) return send_break(tty, 250);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) case TCSBRKP: /* support for POSIX tcsendbreak() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) return send_break(tty, arg ? arg*100 : 250);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) case TIOCMGET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713) return tty_tiocmget(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) case TIOCMSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) case TIOCMBIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) case TIOCMBIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) return tty_tiocmset(tty, cmd, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) case TIOCGICOUNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) return tty_tiocgicount(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720) case TCFLSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) switch (arg) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722) case TCIFLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) case TCIOFLUSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) /* flush tty buffer and allow ldisc to process ioctl */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) tty_buffer_flush(tty, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) case TIOCSSERIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) return tty_tiocsserial(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) case TIOCGSERIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) return tty_tiocgserial(tty, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733) case TIOCGPTPEER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) /* Special because the struct file is needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735) return ptm_open_peer(file, tty, (int)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) retval = tty_jobctrl_ioctl(tty, real_tty, file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) if (retval != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) if (tty->ops->ioctl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) retval = tty->ops->ioctl(tty, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) if (retval != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) return hung_up_tty_ioctl(file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) retval = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) if (ld->ops->ioctl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) retval = ld->ops->ioctl(tty, file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) if (retval == -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) retval = -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761) struct serial_struct32 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) compat_int_t type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) compat_int_t line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) compat_uint_t port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) compat_int_t irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) compat_int_t flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767) compat_int_t xmit_fifo_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) compat_int_t custom_divisor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) compat_int_t baud_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) unsigned short close_delay;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) char io_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772) char reserved_char;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) compat_int_t hub6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) unsigned short closing_wait; /* time to wait before closing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) unsigned short closing_wait2; /* no longer used... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) compat_uint_t iomem_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) unsigned short iomem_reg_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) unsigned int port_high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) /* compat_ulong_t iomap_base FIXME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) compat_int_t reserved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) static int compat_tty_tiocsserial(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784) struct serial_struct32 __user *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786) static DEFINE_RATELIMIT_STATE(depr_flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) DEFAULT_RATELIMIT_INTERVAL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) DEFAULT_RATELIMIT_BURST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) char comm[TASK_COMM_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) struct serial_struct32 v32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) struct serial_struct v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794) if (copy_from_user(&v32, ss, sizeof(*ss)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) memcpy(&v, &v32, offsetof(struct serial_struct32, iomem_base));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) v.iomem_base = compat_ptr(v32.iomem_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) v.iomem_reg_shift = v32.iomem_reg_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) v.port_high = v32.port_high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) v.iomap_base = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) flags = v.flags & ASYNC_DEPRECATED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805) if (flags && __ratelimit(&depr_flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) pr_warn("%s: '%s' is using deprecated serial flags (with no effect): %.8x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) __func__, get_task_comm(comm, current), flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) if (!tty->ops->set_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) return tty->ops->set_serial(tty, &v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813) static int compat_tty_tiocgserial(struct tty_struct *tty,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) struct serial_struct32 __user *ss)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) struct serial_struct32 v32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817) struct serial_struct v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) memset(&v, 0, sizeof(v));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821) memset(&v32, 0, sizeof(v32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823) if (!tty->ops->get_serial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) return -ENOTTY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) err = tty->ops->get_serial(tty, &v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) memcpy(&v32, &v, offsetof(struct serial_struct32, iomem_base));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) v32.iomem_base = (unsigned long)v.iomem_base >> 32 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) 0xfffffff : ptr_to_compat(v.iomem_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830) v32.iomem_reg_shift = v.iomem_reg_shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) v32.port_high = v.port_high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) if (copy_to_user(ss, &v32, sizeof(v32)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) err = -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) static long tty_compat_ioctl(struct file *file, unsigned int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) unsigned long arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) struct tty_struct *tty = file_tty(file);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) struct tty_ldisc *ld;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) int retval = -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) case TIOCOUTQ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) case TIOCSTI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) case TIOCGWINSZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848) case TIOCSWINSZ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) case TIOCGEXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) case TIOCGETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) case TIOCSETD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) case TIOCGDEV:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) case TIOCMGET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854) case TIOCMSET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) case TIOCMBIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) case TIOCMBIS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) case TIOCGICOUNT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858) case TIOCGPGRP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) case TIOCSPGRP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860) case TIOCGSID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) case TIOCSERGETLSR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862) case TIOCGRS485:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) case TIOCSRS485:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) #ifdef TIOCGETP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865) case TIOCGETP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) case TIOCSETP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) case TIOCSETN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) #ifdef TIOCGETC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) case TIOCGETC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) case TIOCSETC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) #ifdef TIOCGLTC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) case TIOCGLTC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) case TIOCSLTC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877) case TCSETSF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) case TCSETSW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) case TCSETS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) case TCGETS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) #ifdef TCGETS2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882) case TCGETS2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) case TCSETSF2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) case TCSETSW2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885) case TCSETS2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) case TCGETA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) case TCSETAF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) case TCSETAW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890) case TCSETA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) case TIOCGLCKTRMIOS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892) case TIOCSLCKTRMIOS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) #ifdef TCGETX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) case TCGETX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) case TCSETX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) case TCSETXW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) case TCSETXF:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) case TIOCGSOFTCAR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) case TIOCSSOFTCAR:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902) case PPPIOCGCHAN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) case PPPIOCGUNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) return tty_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) case TIOCCONS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) case TIOCEXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) case TIOCNXCL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) case TIOCVHANGUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) case TIOCSBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) case TIOCCBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911) case TCSBRK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) case TCSBRKP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) case TCFLSH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914) case TIOCGPTPEER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) case TIOCNOTTY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) case TIOCSCTTY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) case TCXONC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) case TIOCMIWAIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) case TIOCSERCONFIG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) return tty_ioctl(file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) if (tty_paranoia_check(tty, file_inode(file), "tty_ioctl"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927) case TIOCSSERIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) return compat_tty_tiocsserial(tty, compat_ptr(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) case TIOCGSERIAL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) return compat_tty_tiocgserial(tty, compat_ptr(arg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) if (tty->ops->compat_ioctl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933) retval = tty->ops->compat_ioctl(tty, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) if (retval != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) ld = tty_ldisc_ref_wait(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) if (!ld)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) return hung_up_tty_compat_ioctl(file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) if (ld->ops->compat_ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) retval = ld->ops->compat_ioctl(tty, file, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) if (retval == -ENOIOCTLCMD && ld->ops->ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) retval = ld->ops->ioctl(tty, file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) (unsigned long)compat_ptr(cmd), arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946) tty_ldisc_deref(ld);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952) static int this_tty(const void *t, struct file *file, unsigned fd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) if (likely(file->f_op->read_iter != tty_read))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956) return file_tty(file) != t ? 0 : fd + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960) * This implements the "Secure Attention Key" --- the idea is to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) * prevent trojan horses by killing all processes associated with this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962) * tty when the user hits the "Secure Attention Key". Required for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) * super-paranoid applications --- see the Orange Book for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) * This code could be nicer; ideally it should send a HUP, wait a few
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966) * seconds, then send a INT, and then a KILL signal. But you then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) * have to coordinate with the init process, since all processes associated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) * with the current tty must be dead before the new getty is allowed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) * to spawn.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) * Now, if it would be correct ;-/ The current code has a nasty hole -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) * it doesn't catch files in flight. We may send the descriptor to ourselves
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973) * via AF_UNIX socket, close it and later fetch from socket. FIXME.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) * Nasty bug: do_SAK is being called in interrupt context. This can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) * deadlock. We punt it up to process context. AKPM - 16Mar2001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) void __do_SAK(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) #ifdef TTY_SOFT_SAK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) tty_hangup(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) struct task_struct *g, *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) struct pid *session;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991) spin_lock_irqsave(&tty->ctrl_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) session = get_pid(tty->session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) spin_unlock_irqrestore(&tty->ctrl_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) tty_ldisc_flush(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997) tty_driver_flush_buffer(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) read_lock(&tasklist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) /* Kill the entire session */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001) do_each_pid_task(session, PIDTYPE_SID, p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) tty_notice(tty, "SAK: killed process %d (%s): by session\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003) task_pid_nr(p), p->comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_SID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) } while_each_pid_task(session, PIDTYPE_SID, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007) /* Now kill any processes that happen to have the tty open */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) do_each_thread(g, p) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) if (p->signal->tty == tty) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) tty_notice(tty, "SAK: killed process %d (%s): by controlling tty\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) task_pid_nr(p), p->comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_SID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015) task_lock(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) i = iterate_fd(p->files, 0, this_tty, tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) if (i != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) tty_notice(tty, "SAK: killed process %d (%s): by fd#%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) task_pid_nr(p), p->comm, i - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020) group_send_sig_info(SIGKILL, SEND_SIG_PRIV, p, PIDTYPE_SID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) task_unlock(p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023) } while_each_thread(g, p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) read_unlock(&tasklist_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) put_pid(session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) static void do_SAK_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) struct tty_struct *tty =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) container_of(work, struct tty_struct, SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) __do_SAK(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) * The tq handling here is a little racy - tty->SAK_work may already be queued.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) * Fortunately we don't need to worry, because if ->SAK_work is already queued,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) * the values which we write to it will be identical to the values which it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040) * already has. --akpm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) void do_SAK(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) schedule_work(&tty->SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) EXPORT_SYMBOL(do_SAK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) /* Must put_device() after it's unused! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) static struct device *tty_get_device(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) dev_t devt = tty_devnum(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) return class_find_device_by_devt(tty_class, devt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) * alloc_tty_struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) * This subroutine allocates and initializes a tty structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064) * Locking: none - tty in question is not exposed at this point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) struct tty_struct *alloc_tty_struct(struct tty_driver *driver, int idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) struct tty_struct *tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) tty = kzalloc(sizeof(*tty), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) if (!tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) kref_init(&tty->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076) tty->magic = TTY_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) if (tty_ldisc_init(tty)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) kfree(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) tty->session = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) tty->pgrp = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083) mutex_init(&tty->legacy_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) mutex_init(&tty->throttle_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) init_rwsem(&tty->termios_rwsem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) mutex_init(&tty->winsize_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) init_ldsem(&tty->ldisc_sem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) init_waitqueue_head(&tty->write_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) init_waitqueue_head(&tty->read_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) INIT_WORK(&tty->hangup_work, do_tty_hangup);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) mutex_init(&tty->atomic_write_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) spin_lock_init(&tty->ctrl_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) spin_lock_init(&tty->flow_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094) spin_lock_init(&tty->files_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) INIT_LIST_HEAD(&tty->tty_files);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) INIT_WORK(&tty->SAK_work, do_SAK_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) tty->driver = driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) tty->ops = driver->ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100) tty->index = idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) tty_line_name(driver, idx, tty->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102) tty->dev = tty_get_device(tty);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) return tty;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) * tty_put_char - write one character to a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109) * @tty: tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) * @ch: character
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) * Write one byte to the tty using the provided put_char method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) * if present. Returns the number of characters successfully output.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) * Note: the specific put_char operation in the driver layer may go
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) * away soon. Don't call it directly, use this method
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) int tty_put_char(struct tty_struct *tty, unsigned char ch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) if (tty->ops->put_char)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) return tty->ops->put_char(tty, ch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) return tty->ops->write(tty, &ch, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125) EXPORT_SYMBOL_GPL(tty_put_char);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) struct class *tty_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) static int tty_cdev_add(struct tty_driver *driver, dev_t dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130) unsigned int index, unsigned int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) /* init here, since reused cdevs cause crashes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135) driver->cdevs[index] = cdev_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) if (!driver->cdevs[index])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) driver->cdevs[index]->ops = &tty_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) driver->cdevs[index]->owner = driver->owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140) err = cdev_add(driver->cdevs[index], dev, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) kobject_put(&driver->cdevs[index]->kobj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) * tty_register_device - register a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148) * @driver: the tty driver that describes the tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) * @index: the index in the tty driver for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) * @device: a struct device that is associated with this tty device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) * This field is optional, if there is no known struct device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) * for this tty device it can be set to NULL safely.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) * Returns a pointer to the struct device for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) * (or ERR_PTR(-EFOO) on error).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) * This call is required to be made to register an individual tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) * if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) * that bit is not set, this function should not be called by a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) * driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) * Locking: ??
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) struct device *tty_register_device(struct tty_driver *driver, unsigned index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) struct device *device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) return tty_register_device_attr(driver, index, device, NULL, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) EXPORT_SYMBOL(tty_register_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) static void tty_device_create_release(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) dev_dbg(dev, "releasing...\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) kfree(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) * tty_register_device_attr - register a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180) * @driver: the tty driver that describes the tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) * @index: the index in the tty driver for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) * @device: a struct device that is associated with this tty device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) * This field is optional, if there is no known struct device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) * for this tty device it can be set to NULL safely.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) * @drvdata: Driver data to be set to device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) * @attr_grp: Attribute group to be set on device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) * Returns a pointer to the struct device for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) * (or ERR_PTR(-EFOO) on error).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) * This call is required to be made to register an individual tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) * if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set. If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) * that bit is not set, this function should not be called by a tty
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) * driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) * Locking: ??
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) struct device *tty_register_device_attr(struct tty_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199) unsigned index, struct device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) void *drvdata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) const struct attribute_group **attr_grp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) char name[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) dev_t devt = MKDEV(driver->major, driver->minor_start) + index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) struct ktermios *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) struct device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207) int retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) if (index >= driver->num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) pr_err("%s: Attempt to register invalid tty line number (%d)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) driver->name, index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) if (driver->type == TTY_DRIVER_TYPE_PTY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) pty_line_name(driver, index, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) tty_line_name(driver, index, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) dev = kzalloc(sizeof(*dev), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) dev->devt = devt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) dev->class = tty_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) dev->parent = device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) dev->release = tty_device_create_release;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) dev_set_name(dev, "%s", name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) dev->groups = attr_grp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) dev_set_drvdata(dev, drvdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232) dev_set_uevent_suppress(dev, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) retval = device_register(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) goto err_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) * Free any saved termios data so that the termios state is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) * reset when reusing a minor number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) tp = driver->termios[index];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) if (tp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) driver->termios[index] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246) kfree(tp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) retval = tty_cdev_add(driver, devt, index, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) if (retval)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) goto err_del;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) dev_set_uevent_suppress(dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255) kobject_uevent(&dev->kobj, KOBJ_ADD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) return dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259) err_del:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) device_del(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) err_put:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) put_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) return ERR_PTR(retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) EXPORT_SYMBOL_GPL(tty_register_device_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) * tty_unregister_device - unregister a tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) * @driver: the tty driver that describes the tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271) * @index: the index in the tty driver for this tty device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) * If a tty device is registered with a call to tty_register_device() then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) * this function must be called when the tty device is gone.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) * Locking: ??
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) void tty_unregister_device(struct tty_driver *driver, unsigned index)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) device_destroy(tty_class,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) MKDEV(driver->major, driver->minor_start) + index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283) if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) cdev_del(driver->cdevs[index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285) driver->cdevs[index] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) EXPORT_SYMBOL(tty_unregister_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) * __tty_alloc_driver -- allocate tty driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) * @lines: count of lines this driver can handle at most
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) * @owner: module which is responsible for this driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294) * @flags: some of TTY_DRIVER_* flags, will be set in driver->flags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296) * This should not be called directly, some of the provided macros should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) * used instead. Use IS_ERR and friends on @retval.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299) struct tty_driver *__tty_alloc_driver(unsigned int lines, struct module *owner,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) unsigned long flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) struct tty_driver *driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) unsigned int cdevs = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) if (!lines || (flags & TTY_DRIVER_UNNUMBERED_NODE && lines > 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) return ERR_PTR(-EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) driver = kzalloc(sizeof(*driver), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310) if (!driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) kref_init(&driver->kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) driver->magic = TTY_DRIVER_MAGIC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315) driver->num = lines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) driver->owner = owner;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) driver->flags = flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) if (!(flags & TTY_DRIVER_DEVPTS_MEM)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) driver->ttys = kcalloc(lines, sizeof(*driver->ttys),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322) driver->termios = kcalloc(lines, sizeof(*driver->termios),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324) if (!driver->ttys || !driver->termios) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326) goto err_free_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) if (!(flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331) driver->ports = kcalloc(lines, sizeof(*driver->ports),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) if (!driver->ports) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) goto err_free_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) cdevs = lines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) driver->cdevs = kcalloc(cdevs, sizeof(*driver->cdevs), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) if (!driver->cdevs) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) goto err_free_all;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) return driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) err_free_all:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) kfree(driver->ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) kfree(driver->ttys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) kfree(driver->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) kfree(driver->cdevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) kfree(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353) return ERR_PTR(err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) EXPORT_SYMBOL(__tty_alloc_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) static void destruct_tty_driver(struct kref *kref)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359) struct tty_driver *driver = container_of(kref, struct tty_driver, kref);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) struct ktermios *tp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) if (driver->flags & TTY_DRIVER_INSTALLED) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) for (i = 0; i < driver->num; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) tp = driver->termios[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) if (tp) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) driver->termios[i] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368) kfree(tp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) tty_unregister_device(driver, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) proc_tty_unregister_driver(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) cdev_del(driver->cdevs[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) kfree(driver->cdevs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) kfree(driver->ports);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) kfree(driver->termios);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) kfree(driver->ttys);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) kfree(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) void tty_driver_kref_put(struct tty_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386) kref_put(&driver->kref, destruct_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) EXPORT_SYMBOL(tty_driver_kref_put);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) void tty_set_operations(struct tty_driver *driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) const struct tty_operations *op)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393) driver->ops = op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) EXPORT_SYMBOL(tty_set_operations);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) void put_tty_driver(struct tty_driver *d)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) tty_driver_kref_put(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) EXPORT_SYMBOL(put_tty_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) * Called by a tty driver to register itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) int tty_register_driver(struct tty_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) dev_t dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411) struct device *d;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) if (!driver->major) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) error = alloc_chrdev_region(&dev, driver->minor_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) driver->num, driver->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) if (!error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) driver->major = MAJOR(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) driver->minor_start = MINOR(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) dev = MKDEV(driver->major, driver->minor_start);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) error = register_chrdev_region(dev, driver->num, driver->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) if (error < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425) goto err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428) error = tty_cdev_add(driver, dev, 0, driver->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) if (error)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) goto err_unreg_char;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434) list_add(&driver->tty_drivers, &tty_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438) for (i = 0; i < driver->num; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) d = tty_register_device(driver, i, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) if (IS_ERR(d)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441) error = PTR_ERR(d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) goto err_unreg_devs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) proc_tty_register_driver(driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) driver->flags |= TTY_DRIVER_INSTALLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450) err_unreg_devs:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) for (i--; i >= 0; i--)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) tty_unregister_device(driver, i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) list_del(&driver->tty_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) err_unreg_char:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) unregister_chrdev_region(dev, driver->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461) return error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) EXPORT_SYMBOL(tty_register_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) * Called by a tty driver to unregister itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) int tty_unregister_driver(struct tty_driver *driver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471) /* FIXME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) if (driver->refcount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) unregister_chrdev_region(MKDEV(driver->major, driver->minor_start),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) driver->num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) mutex_lock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478) list_del(&driver->tty_drivers);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) mutex_unlock(&tty_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) EXPORT_SYMBOL(tty_unregister_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) dev_t tty_devnum(struct tty_struct *tty)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487) return MKDEV(tty->driver->major, tty->driver->minor_start) + tty->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) EXPORT_SYMBOL(tty_devnum);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) void tty_default_fops(struct file_operations *fops)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493) *fops = tty_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) static char *tty_devnode(struct device *dev, umode_t *mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) if (!mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500) if (dev->devt == MKDEV(TTYAUX_MAJOR, 0) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) dev->devt == MKDEV(TTYAUX_MAJOR, 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) *mode = 0666;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506) static int __init tty_class_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) tty_class = class_create(THIS_MODULE, "tty");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509) if (IS_ERR(tty_class))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) return PTR_ERR(tty_class);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) tty_class->devnode = tty_devnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) postcore_initcall(tty_class_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) /* 3/2004 jmc: why do these devices exist? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518) static struct cdev tty_cdev, console_cdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) static ssize_t show_cons_active(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) struct console *cs[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) struct console *c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526) ssize_t count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528) console_lock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) for_each_console(c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) if (!c->device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) if (!c->write)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534) if ((c->flags & CON_ENABLED) == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) cs[i++] = c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) if (i >= ARRAY_SIZE(cs))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) while (i--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) int index = cs[i]->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) struct tty_driver *drv = cs[i]->device(cs[i], &index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) /* don't resolve tty0 as some programs depend on it */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) if (drv && (cs[i]->index > 0 || drv->major != TTY_MAJOR))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) count += tty_line_name(drv, index, buf + count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) count += sprintf(buf + count, "%s%d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) cs[i]->name, cs[i]->index);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) count += sprintf(buf + count, "%c", i ? ' ':'\n');
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) console_unlock();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) static DEVICE_ATTR(active, S_IRUGO, show_cons_active, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) static struct attribute *cons_dev_attrs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560) &dev_attr_active.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) ATTRIBUTE_GROUPS(cons_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) static struct device *consdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) void console_sysfs_notify(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) if (consdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) sysfs_notify(&consdev->kobj, NULL, "active");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) * Ok, now we can initialize the rest of the tty devices and can count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) * on memory allocations, interrupts etc..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) int __init tty_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580) tty_sysctl_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) cdev_init(&tty_cdev, &tty_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) panic("Couldn't register /dev/tty driver\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) cdev_init(&console_cdev, &console_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) panic("Couldn't register /dev/console driver\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591) consdev = device_create_with_groups(tty_class, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) MKDEV(TTYAUX_MAJOR, 1), NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) cons_dev_groups, "console");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) if (IS_ERR(consdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) consdev = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) #ifdef CONFIG_VT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) vty_init(&console_fops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602)