aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/tty_ioctl.c33
1 files changed, 27 insertions, 6 deletions
diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c
index 851cfcd2702a..d769e43f73fb 100644
--- a/drivers/char/tty_ioctl.c
+++ b/drivers/char/tty_ioctl.c
@@ -756,6 +756,32 @@ static int send_prio_char(struct tty_struct *tty, char ch)
756} 756}
757 757
758/** 758/**
759 * tty_change_softcar - carrier change ioctl helper
760 * @tty: tty to update
761 * @arg: enable/disable CLOCAL
762 *
763 * Perform a change to the CLOCAL state and call into the driver
764 * layer to make it visible. All done with the termios mutex
765 */
766
767static int tty_change_softcar(struct tty_struct *tty, int arg)
768{
769 int ret = 0;
770 int bit = arg ? CLOCAL : 0;
771 struct ktermios old = *tty->termios;
772
773 mutex_lock(&tty->termios_mutex);
774 tty->termios->c_cflag &= ~CLOCAL;
775 tty->termios->c_cflag |= bit;
776 if (tty->driver->set_termios)
777 tty->driver->set_termios(tty, &old);
778 if ((tty->termios->c_cflag & CLOCAL) != bit)
779 ret = -EINVAL;
780 mutex_unlock(&tty->termios_mutex);
781 return ret;
782}
783
784/**
759 * tty_mode_ioctl - mode related ioctls 785 * tty_mode_ioctl - mode related ioctls
760 * @tty: tty for the ioctl 786 * @tty: tty for the ioctl
761 * @file: file pointer for the tty 787 * @file: file pointer for the tty
@@ -865,12 +891,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
865 case TIOCSSOFTCAR: 891 case TIOCSSOFTCAR:
866 if (get_user(arg, (unsigned int __user *) arg)) 892 if (get_user(arg, (unsigned int __user *) arg))
867 return -EFAULT; 893 return -EFAULT;
868 mutex_lock(&tty->termios_mutex); 894 return tty_change_softcar(tty, arg);
869 tty->termios->c_cflag =
870 ((tty->termios->c_cflag & ~CLOCAL) |
871 (arg ? CLOCAL : 0));
872 mutex_unlock(&tty->termios_mutex);
873 return 0;
874 default: 895 default:
875 return -ENOIOCTLCMD; 896 return -ENOIOCTLCMD;
876 } 897 }