• Home
  • Raw
  • Download

Lines Matching +full:master +full:- +full:side

1 // SPDX-License-Identifier: GPL-2.0
5 * Added support for a Unix98-style ptmx device.
6 * -- C. Scott Ananian <cananian@alumni.princeton.edu>, 14-Jan-1998
50 if (tty->driver->subtype == PTY_TYPE_MASTER) in pty_close()
51 WARN_ON(tty->count > 1); in pty_close()
55 if (tty->count > 2) in pty_close()
58 set_bit(TTY_IO_ERROR, &tty->flags); in pty_close()
59 wake_up_interruptible(&tty->read_wait); in pty_close()
60 wake_up_interruptible(&tty->write_wait); in pty_close()
61 spin_lock_irq(&tty->ctrl_lock); in pty_close()
62 tty->packet = 0; in pty_close()
63 spin_unlock_irq(&tty->ctrl_lock); in pty_close()
64 /* Review - krefs on tty_link ?? */ in pty_close()
65 if (!tty->link) in pty_close()
67 set_bit(TTY_OTHER_CLOSED, &tty->link->flags); in pty_close()
68 wake_up_interruptible(&tty->link->read_wait); in pty_close()
69 wake_up_interruptible(&tty->link->write_wait); in pty_close()
70 if (tty->driver->subtype == PTY_TYPE_MASTER) { in pty_close()
71 set_bit(TTY_OTHER_CLOSED, &tty->flags); in pty_close()
73 if (tty->driver == ptm_driver) { in pty_close()
75 if (tty->link->driver_data) in pty_close()
76 devpts_pty_kill(tty->link->driver_data); in pty_close()
80 tty_vhangup(tty->link); in pty_close()
96 tty_wakeup(tty->link); in pty_unthrottle()
97 set_bit(TTY_THROTTLED, &tty->flags); in pty_unthrottle()
101 * pty_write - write to a pty
109 * the other side of the pty/tty pair.
114 struct tty_struct *to = tty->link; in pty_write()
116 if (tty->stopped || !c) in pty_write()
119 return tty_insert_flip_string_and_push_buffer(to->port, buf, c); in pty_write()
123 * pty_write_room - write space
132 if (tty->stopped) in pty_write_room()
134 return tty_buffer_space_avail(tty->link->port); in pty_write_room()
138 * pty_chars_in_buffer - characters currently in our tx queue
155 return -EFAULT; in pty_set_lock()
157 set_bit(TTY_PTY_LOCK, &tty->flags); in pty_set_lock()
159 clear_bit(TTY_PTY_LOCK, &tty->flags); in pty_set_lock()
165 int locked = test_bit(TTY_PTY_LOCK, &tty->flags); in pty_get_lock()
175 return -EFAULT; in pty_set_pktmode()
177 spin_lock_irq(&tty->ctrl_lock); in pty_set_pktmode()
179 if (!tty->packet) { in pty_set_pktmode()
180 tty->link->ctrl_status = 0; in pty_set_pktmode()
182 tty->packet = 1; in pty_set_pktmode()
185 tty->packet = 0; in pty_set_pktmode()
186 spin_unlock_irq(&tty->ctrl_lock); in pty_set_pktmode()
194 int pktmode = tty->packet; in pty_get_pktmode()
204 return -EINVAL; in pty_signal()
206 if (tty->link) { in pty_signal()
207 pgrp = tty_get_pgrp(tty->link); in pty_signal()
217 struct tty_struct *to = tty->link; in pty_flush_buffer()
223 if (to->packet) { in pty_flush_buffer()
224 spin_lock_irq(&tty->ctrl_lock); in pty_flush_buffer()
225 tty->ctrl_status |= TIOCPKT_FLUSHWRITE; in pty_flush_buffer()
226 wake_up_interruptible(&to->read_wait); in pty_flush_buffer()
227 spin_unlock_irq(&tty->ctrl_lock); in pty_flush_buffer()
233 if (!tty || !tty->link) in pty_open()
234 return -ENODEV; in pty_open()
236 if (test_bit(TTY_OTHER_CLOSED, &tty->flags)) in pty_open()
238 if (test_bit(TTY_PTY_LOCK, &tty->link->flags)) in pty_open()
240 if (tty->driver->subtype == PTY_TYPE_SLAVE && tty->link->count != 1) in pty_open()
243 clear_bit(TTY_IO_ERROR, &tty->flags); in pty_open()
244 clear_bit(TTY_OTHER_CLOSED, &tty->link->flags); in pty_open()
245 set_bit(TTY_THROTTLED, &tty->flags); in pty_open()
249 set_bit(TTY_IO_ERROR, &tty->flags); in pty_open()
250 return -EIO; in pty_open()
257 if (tty->link && tty->link->packet) { in pty_set_termios()
258 int extproc = (old_termios->c_lflag & EXTPROC) | L_EXTPROC(tty); in pty_set_termios()
259 int old_flow = ((old_termios->c_iflag & IXON) && in pty_set_termios()
260 (old_termios->c_cc[VSTOP] == '\023') && in pty_set_termios()
261 (old_termios->c_cc[VSTART] == '\021')); in pty_set_termios()
266 spin_lock_irq(&tty->ctrl_lock); in pty_set_termios()
268 tty->ctrl_status &= ~(TIOCPKT_DOSTOP | TIOCPKT_NOSTOP); in pty_set_termios()
270 tty->ctrl_status |= TIOCPKT_DOSTOP; in pty_set_termios()
272 tty->ctrl_status |= TIOCPKT_NOSTOP; in pty_set_termios()
275 tty->ctrl_status |= TIOCPKT_IOCTL; in pty_set_termios()
276 spin_unlock_irq(&tty->ctrl_lock); in pty_set_termios()
277 wake_up_interruptible(&tty->link->read_wait); in pty_set_termios()
281 tty->termios.c_cflag &= ~(CSIZE | PARENB); in pty_set_termios()
282 tty->termios.c_cflag |= (CS8 | CREAD); in pty_set_termios()
286 * pty_do_resize - resize event
297 struct tty_struct *pty = tty->link; in pty_resize()
299 /* For a PTY we need to lock the tty side */ in pty_resize()
300 mutex_lock(&tty->winsize_mutex); in pty_resize()
301 if (!memcmp(ws, &tty->winsize, sizeof(*ws))) in pty_resize()
316 tty->winsize = *ws; in pty_resize()
317 pty->winsize = *ws; /* Never used so will go away soon */ in pty_resize()
319 mutex_unlock(&tty->winsize_mutex); in pty_resize()
324 * pty_start - start() handler
325 * pty_stop - stop() handler
326 * @tty: tty being flow-controlled
328 * Propagates the TIOCPKT status to the master pty.
330 * NB: only the master pty can be in packet mode so only the slave
337 if (tty->link && tty->link->packet) { in pty_start()
338 spin_lock_irqsave(&tty->ctrl_lock, flags); in pty_start()
339 tty->ctrl_status &= ~TIOCPKT_STOP; in pty_start()
340 tty->ctrl_status |= TIOCPKT_START; in pty_start()
341 spin_unlock_irqrestore(&tty->ctrl_lock, flags); in pty_start()
342 wake_up_interruptible_poll(&tty->link->read_wait, EPOLLIN); in pty_start()
350 if (tty->link && tty->link->packet) { in pty_stop()
351 spin_lock_irqsave(&tty->ctrl_lock, flags); in pty_stop()
352 tty->ctrl_status &= ~TIOCPKT_START; in pty_stop()
353 tty->ctrl_status |= TIOCPKT_STOP; in pty_stop()
354 spin_unlock_irqrestore(&tty->ctrl_lock, flags); in pty_stop()
355 wake_up_interruptible_poll(&tty->link->read_wait, EPOLLIN); in pty_stop()
360 * pty_common_install - set up the pty pair
375 int idx = tty->index; in pty_common_install()
376 int retval = -ENOMEM; in pty_common_install()
378 /* Opening the slave first has always returned -EIO */ in pty_common_install()
379 if (driver->subtype != PTY_TYPE_MASTER) in pty_common_install()
380 return -EIO; in pty_common_install()
386 if (!try_module_get(driver->other->owner)) { in pty_common_install()
390 o_tty = alloc_tty_struct(driver->other, idx); in pty_common_install()
395 lockdep_set_subclass(&o_tty->termios_rwsem, TTY_LOCK_SLAVE); in pty_common_install()
403 driver->other->ttys[idx] = o_tty; in pty_common_install()
404 driver->ttys[idx] = tty; in pty_common_install()
406 memset(&tty->termios_locked, 0, sizeof(tty->termios_locked)); in pty_common_install()
407 tty->termios = driver->init_termios; in pty_common_install()
408 memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked)); in pty_common_install()
409 o_tty->termios = driver->other->init_termios; in pty_common_install()
415 tty_driver_kref_get(driver->other); in pty_common_install()
417 tty->link = o_tty; in pty_common_install()
418 o_tty->link = tty; in pty_common_install()
423 o_tty->port = ports[0]; in pty_common_install()
424 tty->port = ports[1]; in pty_common_install()
425 o_tty->port->itty = o_tty; in pty_common_install()
427 tty_buffer_set_lock_subclass(o_tty->port); in pty_common_install()
430 tty->count++; in pty_common_install()
431 o_tty->count++; in pty_common_install()
435 module_put(driver->other->owner); in pty_common_install()
444 tty_port_put(tty->port); in pty_cleanup()
457 struct tty_struct *pair = tty->link; in pty_remove()
458 driver->ttys[tty->index] = NULL; in pty_remove()
460 pair->driver->ttys[pair->index] = NULL; in pty_remove()
475 case TIOCSIG: /* Send signal to other side of pty */ in pty_bsd_ioctl()
478 return -EINVAL; in pty_bsd_ioctl()
480 return -ENOIOCTLCMD; in pty_bsd_ioctl()
488 * PTY ioctls don't require any special translation between 32-bit and in pty_bsd_compat_ioctl()
489 * 64-bit userspace, they are already compatible. in pty_bsd_compat_ioctl()
505 * The master side of a pty can do TIOCSPTLCK and thus
562 pty_driver->driver_name = "pty_master"; in legacy_pty_init()
563 pty_driver->name = "pty"; in legacy_pty_init()
564 pty_driver->major = PTY_MASTER_MAJOR; in legacy_pty_init()
565 pty_driver->minor_start = 0; in legacy_pty_init()
566 pty_driver->type = TTY_DRIVER_TYPE_PTY; in legacy_pty_init()
567 pty_driver->subtype = PTY_TYPE_MASTER; in legacy_pty_init()
568 pty_driver->init_termios = tty_std_termios; in legacy_pty_init()
569 pty_driver->init_termios.c_iflag = 0; in legacy_pty_init()
570 pty_driver->init_termios.c_oflag = 0; in legacy_pty_init()
571 pty_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; in legacy_pty_init()
572 pty_driver->init_termios.c_lflag = 0; in legacy_pty_init()
573 pty_driver->init_termios.c_ispeed = 38400; in legacy_pty_init()
574 pty_driver->init_termios.c_ospeed = 38400; in legacy_pty_init()
575 pty_driver->other = pty_slave_driver; in legacy_pty_init()
578 pty_slave_driver->driver_name = "pty_slave"; in legacy_pty_init()
579 pty_slave_driver->name = "ttyp"; in legacy_pty_init()
580 pty_slave_driver->major = PTY_SLAVE_MAJOR; in legacy_pty_init()
581 pty_slave_driver->minor_start = 0; in legacy_pty_init()
582 pty_slave_driver->type = TTY_DRIVER_TYPE_PTY; in legacy_pty_init()
583 pty_slave_driver->subtype = PTY_TYPE_SLAVE; in legacy_pty_init()
584 pty_slave_driver->init_termios = tty_std_termios; in legacy_pty_init()
585 pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; in legacy_pty_init()
586 pty_slave_driver->init_termios.c_ispeed = 38400; in legacy_pty_init()
587 pty_slave_driver->init_termios.c_ospeed = 38400; in legacy_pty_init()
588 pty_slave_driver->other = pty_driver; in legacy_pty_init()
605 * ptm_open_peer - open the peer of a pty
606 * @master: the open struct file of the ptmx device node
607 * @tty: the master of the pty being opened
611 * (where they have the master fd and cannot access or trust the mount
614 int ptm_open_peer(struct file *master, struct tty_struct *tty, int flags) in ptm_open_peer() argument
616 int fd = -1; in ptm_open_peer()
618 int retval = -EINVAL; in ptm_open_peer()
621 if (tty->driver != ptm_driver) in ptm_open_peer()
622 return -EIO; in ptm_open_peer()
631 path.mnt = devpts_mntget(master, tty->driver_data); in ptm_open_peer()
636 path.dentry = tty->link->driver_data; in ptm_open_peer()
667 return put_user(tty->index, (unsigned int __user *)arg); in pty_unix98_ioctl()
668 case TIOCSIG: /* Send signal to other side of pty */ in pty_unix98_ioctl()
672 return -ENOIOCTLCMD; in pty_unix98_ioctl()
680 * PTY ioctls don't require any special translation between 32-bit and in pty_unix98_compat_ioctl()
681 * 64-bit userspace, they are already compatible. in pty_unix98_compat_ioctl()
691 * ptm_unix98_lookup - find a pty master
695 * Look up a pty master device. Called under the tty_mutex for now.
702 /* Master must be open via /dev/ptmx */ in ptm_unix98_lookup()
703 return ERR_PTR(-EIO); in ptm_unix98_lookup()
707 * pts_unix98_lookup - find a pty slave
711 * Look up a pty master device. Called under the tty_mutex for now.
721 tty = devpts_get_priv(file->f_path.dentry); in pts_unix98_lookup()
723 /* Master must be open before slave */ in pts_unix98_lookup()
725 return ERR_PTR(-EIO); in pts_unix98_lookup()
739 if (tty->driver->subtype == PTY_TYPE_MASTER) in pty_unix98_remove()
740 fsi = tty->driver_data; in pty_unix98_remove()
742 fsi = tty->link->driver_data; in pty_unix98_remove()
745 devpts_kill_index(fsi, tty->index); in pty_unix98_remove()
752 seq_printf(m, "tty-index:\t%d\n", tty->index); in pty_show_fdinfo()
791 * ptmx_open - open a unix 98 pty master
795 * Allocate a unix98 pty master device from the ptmx driver.
797 * Locking: tty_mutex protects the init_dev work. tty->count should
813 filp->f_mode |= FMODE_NONOTIFY; in ptmx_open()
849 set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */ in ptmx_open()
850 tty->driver_data = fsi; in ptmx_open()
854 dentry = devpts_pty_new(fsi, index, tty->link); in ptmx_open()
859 tty->link->driver_data = dentry; in ptmx_open()
861 retval = ptm_driver->ops->open(tty, filp); in ptmx_open()
865 tty_debug_hangup(tty, "opening (count=%d)\n", tty->count); in ptmx_open()
871 // This will also put-ref the fsi in ptmx_open()
904 ptm_driver->driver_name = "pty_master"; in unix98_pty_init()
905 ptm_driver->name = "ptm"; in unix98_pty_init()
906 ptm_driver->major = UNIX98_PTY_MASTER_MAJOR; in unix98_pty_init()
907 ptm_driver->minor_start = 0; in unix98_pty_init()
908 ptm_driver->type = TTY_DRIVER_TYPE_PTY; in unix98_pty_init()
909 ptm_driver->subtype = PTY_TYPE_MASTER; in unix98_pty_init()
910 ptm_driver->init_termios = tty_std_termios; in unix98_pty_init()
911 ptm_driver->init_termios.c_iflag = 0; in unix98_pty_init()
912 ptm_driver->init_termios.c_oflag = 0; in unix98_pty_init()
913 ptm_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; in unix98_pty_init()
914 ptm_driver->init_termios.c_lflag = 0; in unix98_pty_init()
915 ptm_driver->init_termios.c_ispeed = 38400; in unix98_pty_init()
916 ptm_driver->init_termios.c_ospeed = 38400; in unix98_pty_init()
917 ptm_driver->other = pts_driver; in unix98_pty_init()
920 pts_driver->driver_name = "pty_slave"; in unix98_pty_init()
921 pts_driver->name = "pts"; in unix98_pty_init()
922 pts_driver->major = UNIX98_PTY_SLAVE_MAJOR; in unix98_pty_init()
923 pts_driver->minor_start = 0; in unix98_pty_init()
924 pts_driver->type = TTY_DRIVER_TYPE_PTY; in unix98_pty_init()
925 pts_driver->subtype = PTY_TYPE_SLAVE; in unix98_pty_init()
926 pts_driver->init_termios = tty_std_termios; in unix98_pty_init()
927 pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD; in unix98_pty_init()
928 pts_driver->init_termios.c_ispeed = 38400; in unix98_pty_init()
929 pts_driver->init_termios.c_ospeed = 38400; in unix98_pty_init()
930 pts_driver->other = ptm_driver; in unix98_pty_init()