aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/char/tty_io.c19
-rw-r--r--fs/open.c3
-rw-r--r--include/linux/tty.h1
3 files changed, 21 insertions, 2 deletions
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
index 913b50258f90..b5f57d0b30ee 100644
--- a/drivers/char/tty_io.c
+++ b/drivers/char/tty_io.c
@@ -730,6 +730,25 @@ void tty_vhangup(struct tty_struct *tty)
730EXPORT_SYMBOL(tty_vhangup); 730EXPORT_SYMBOL(tty_vhangup);
731 731
732/** 732/**
733 * tty_vhangup_self - process vhangup for own ctty
734 *
735 * Perform a vhangup on the current controlling tty
736 */
737
738void tty_vhangup_self(void)
739{
740 struct tty_struct *tty;
741
742 mutex_lock(&tty_mutex);
743 tty = get_current_tty();
744 if (tty) {
745 tty_vhangup(tty);
746 tty_kref_put(tty);
747 }
748 mutex_unlock(&tty_mutex);
749}
750
751/**
733 * tty_hung_up_p - was tty hung up 752 * tty_hung_up_p - was tty hung up
734 * @filp: file pointer of tty 753 * @filp: file pointer of tty
735 * 754 *
diff --git a/fs/open.c b/fs/open.c
index 07da9359481c..5596049863bf 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -1141,8 +1141,7 @@ EXPORT_SYMBOL(sys_close);
1141asmlinkage long sys_vhangup(void) 1141asmlinkage long sys_vhangup(void)
1142{ 1142{
1143 if (capable(CAP_SYS_TTY_CONFIG)) { 1143 if (capable(CAP_SYS_TTY_CONFIG)) {
1144 /* XXX: this needs locking */ 1144 tty_vhangup_self();
1145 tty_vhangup(current->signal->tty);
1146 return 0; 1145 return 0;
1147 } 1146 }
1148 return -EPERM; 1147 return -EPERM;
diff --git a/include/linux/tty.h b/include/linux/tty.h
index c30ed8d3bcbd..e00393a3d1c9 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -361,6 +361,7 @@ extern int is_ignored(int sig);
361extern int tty_signal(int sig, struct tty_struct *tty); 361extern int tty_signal(int sig, struct tty_struct *tty);
362extern void tty_hangup(struct tty_struct *tty); 362extern void tty_hangup(struct tty_struct *tty);
363extern void tty_vhangup(struct tty_struct *tty); 363extern void tty_vhangup(struct tty_struct *tty);
364extern void tty_vhangup_self(void);
364extern void tty_unhangup(struct file *filp); 365extern void tty_unhangup(struct file *filp);
365extern int tty_hung_up_p(struct file *filp); 366extern int tty_hung_up_p(struct file *filp);
366extern void do_SAK(struct tty_struct *tty); 367extern void do_SAK(struct tty_struct *tty);