Loading drivers/char/pty.c +44 −42 Original line number Diff line number Diff line Loading @@ -8,10 +8,12 @@ * Added TTY_DO_WRITE_WAKEUP to enable n_tty to send POLL_OUT to * waiting writers -- Sapan Bhatia <sapan@corewars.org> * * * When reading this code see also fs/devpts. In particular note that the * driver_data field is used by the devpts side as a binding to the devpts * inode. */ #include <linux/module.h> /* For EXPORT_SYMBOL */ #include <linux/module.h> #include <linux/errno.h> #include <linux/interrupt.h> Loading @@ -24,12 +26,12 @@ #include <linux/init.h> #include <linux/sysctl.h> #include <linux/device.h> #include <asm/uaccess.h> #include <asm/system.h> #include <linux/uaccess.h> #include <linux/bitops.h> #include <linux/devpts_fs.h> #include <asm/system.h> /* These are global because they are accessed in tty_io.c */ #ifdef CONFIG_UNIX98_PTYS struct tty_driver *ptm_driver; Loading @@ -38,12 +40,10 @@ static struct tty_driver *pts_driver; static void pty_close(struct tty_struct *tty, struct file *filp) { if (!tty) return; if (tty->driver->subtype == PTY_TYPE_MASTER) { if (tty->count > 1) printk("master pty_close: count = %d!!\n", tty->count); } else { BUG_ON(!tty); if (tty->driver->subtype == PTY_TYPE_MASTER) WARN_ON(tty->count > 1); else { if (tty->count > 2) return; } Loading Loading @@ -101,7 +101,8 @@ static void pty_unthrottle(struct tty_struct * tty) * not our partners. We can't just take the other one blindly without * risking deadlocks. */ static int pty_write(struct tty_struct * tty, const unsigned char *buf, int count) static int pty_write(struct tty_struct *tty, const unsigned char *buf, int count) { struct tty_struct *to = tty->link; int c; Loading Loading @@ -156,14 +157,15 @@ static int pty_chars_in_buffer(struct tty_struct *tty) /* The ldisc must report 0 if no characters available to be read */ count = to->ldisc.ops->chars_in_buffer(to); if (tty->driver->subtype == PTY_TYPE_SLAVE) return count; if (tty->driver->subtype == PTY_TYPE_SLAVE) return count; /* Master side driver ... if the other side's read buffer is less than * half full, return 0 to allow writers to proceed; otherwise return * the count. This leaves a comfortable margin to avoid overflow, * and still allows half a buffer's worth of typed-ahead commands. */ return ((count < N_TTY_BUF_SIZE/2) ? 0 : count); return (count < N_TTY_BUF_SIZE/2) ? 0 : count; } /* Set the lock flag on a pty */ Loading Loading @@ -221,7 +223,8 @@ static int pty_open(struct tty_struct *tty, struct file * filp) return retval; } static void pty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) static void pty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) { tty->termios->c_cflag &= ~(CSIZE | PARENB); tty->termios->c_cflag |= (CS8 | CREAD); Loading Loading @@ -381,9 +384,9 @@ static inline void legacy_pty_init(void) { } * Otherwise one can eat up all kernel memory by opening /dev/ptmx repeatedly. */ int pty_limit = NR_UNIX98_PTY_DEFAULT; static int pty_limit_min = 0; static int pty_limit_min; static int pty_limit_max = NR_UNIX98_PTY_MAX; static int pty_count = 0; static int pty_count; static struct cdev ptmx_cdev; Loading Loading @@ -537,11 +540,10 @@ static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty) pty_count++; return 0; free_mem_out: kfree(o_tty->termios); pty_unix98_shutdown(o_tty); module_put(o_tty->driver->owner); free_tty_struct(o_tty); kfree(tty->termios_locked); kfree(tty->termios); pty_unix98_shutdown(tty); free_tty_struct(tty); module_put(driver->owner); return -ENOMEM; Loading Loading
drivers/char/pty.c +44 −42 Original line number Diff line number Diff line Loading @@ -8,10 +8,12 @@ * Added TTY_DO_WRITE_WAKEUP to enable n_tty to send POLL_OUT to * waiting writers -- Sapan Bhatia <sapan@corewars.org> * * * When reading this code see also fs/devpts. In particular note that the * driver_data field is used by the devpts side as a binding to the devpts * inode. */ #include <linux/module.h> /* For EXPORT_SYMBOL */ #include <linux/module.h> #include <linux/errno.h> #include <linux/interrupt.h> Loading @@ -24,12 +26,12 @@ #include <linux/init.h> #include <linux/sysctl.h> #include <linux/device.h> #include <asm/uaccess.h> #include <asm/system.h> #include <linux/uaccess.h> #include <linux/bitops.h> #include <linux/devpts_fs.h> #include <asm/system.h> /* These are global because they are accessed in tty_io.c */ #ifdef CONFIG_UNIX98_PTYS struct tty_driver *ptm_driver; Loading @@ -38,12 +40,10 @@ static struct tty_driver *pts_driver; static void pty_close(struct tty_struct *tty, struct file *filp) { if (!tty) return; if (tty->driver->subtype == PTY_TYPE_MASTER) { if (tty->count > 1) printk("master pty_close: count = %d!!\n", tty->count); } else { BUG_ON(!tty); if (tty->driver->subtype == PTY_TYPE_MASTER) WARN_ON(tty->count > 1); else { if (tty->count > 2) return; } Loading Loading @@ -101,7 +101,8 @@ static void pty_unthrottle(struct tty_struct * tty) * not our partners. We can't just take the other one blindly without * risking deadlocks. */ static int pty_write(struct tty_struct * tty, const unsigned char *buf, int count) static int pty_write(struct tty_struct *tty, const unsigned char *buf, int count) { struct tty_struct *to = tty->link; int c; Loading Loading @@ -156,14 +157,15 @@ static int pty_chars_in_buffer(struct tty_struct *tty) /* The ldisc must report 0 if no characters available to be read */ count = to->ldisc.ops->chars_in_buffer(to); if (tty->driver->subtype == PTY_TYPE_SLAVE) return count; if (tty->driver->subtype == PTY_TYPE_SLAVE) return count; /* Master side driver ... if the other side's read buffer is less than * half full, return 0 to allow writers to proceed; otherwise return * the count. This leaves a comfortable margin to avoid overflow, * and still allows half a buffer's worth of typed-ahead commands. */ return ((count < N_TTY_BUF_SIZE/2) ? 0 : count); return (count < N_TTY_BUF_SIZE/2) ? 0 : count; } /* Set the lock flag on a pty */ Loading Loading @@ -221,7 +223,8 @@ static int pty_open(struct tty_struct *tty, struct file * filp) return retval; } static void pty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) static void pty_set_termios(struct tty_struct *tty, struct ktermios *old_termios) { tty->termios->c_cflag &= ~(CSIZE | PARENB); tty->termios->c_cflag |= (CS8 | CREAD); Loading Loading @@ -381,9 +384,9 @@ static inline void legacy_pty_init(void) { } * Otherwise one can eat up all kernel memory by opening /dev/ptmx repeatedly. */ int pty_limit = NR_UNIX98_PTY_DEFAULT; static int pty_limit_min = 0; static int pty_limit_min; static int pty_limit_max = NR_UNIX98_PTY_MAX; static int pty_count = 0; static int pty_count; static struct cdev ptmx_cdev; Loading Loading @@ -537,11 +540,10 @@ static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty) pty_count++; return 0; free_mem_out: kfree(o_tty->termios); pty_unix98_shutdown(o_tty); module_put(o_tty->driver->owner); free_tty_struct(o_tty); kfree(tty->termios_locked); kfree(tty->termios); pty_unix98_shutdown(tty); free_tty_struct(tty); module_put(driver->owner); return -ENOMEM; Loading