Re: [PATCH 0/3] SIGWINCH problem with terminal apps still alive

From: Adam TlaÅka
Date: Tue Oct 14 2008 - 08:52:22 EST


Hello,

I am sending sligtly corrected patch.
In case of ioctl(,TIOCSWINSZ,) on pty side we should send signal to
master side too. I've tested it on modified unix putty version
and it works properly.

Signed-off-by: Adam Tla/lka <atlka@xxxxxxxxx>

Maybe we could optimize code more and not call
get_pid() and put_pid() if they are not needed - in case
where there is no master/slave pair.

Regards

--
Adam TlaÅka mailto:atlka@xxxxxxxxx ^v^ ^v^ ^v^
System & Network Administration Group - - - ~~~~~~
Computer Center, GdaÅsk University of Technology, Poland
--- tty_io_orig.c 2008-10-10 05:37:30.000000000 +0200
+++ tty_io.c 2008-10-14 14:28:50.000000000 +0200
@@ -2522,29 +2522,33 @@ int tty_do_resize(struct tty_struct *tty
struct pid *pgrp, *rpgrp;
unsigned long flags;

- /* For a PTY we need to lock the tty side */
+ /* in case of resize ioctl on slave */
+ if ((tty == real_tty)
+ && tty->driver->type == TTY_DRIVER_TYPE_PTY)
+ tty = tty->link;
+
+ /* for a PTY we need to lock the tty side */
mutex_lock(&real_tty->termios_mutex);
- if (!memcmp(ws, &tty->winsize, sizeof(*ws)))
- goto done;
- /* Get the PID values and reference them so we can
- avoid holding the tty ctrl lock while sending signals */
- spin_lock_irqsave(&tty->ctrl_lock, flags);
- pgrp = get_pid(tty->pgrp);
- rpgrp = get_pid(real_tty->pgrp);
- spin_unlock_irqrestore(&tty->ctrl_lock, flags);
-
- if (pgrp)
- kill_pgrp(pgrp, SIGWINCH, 1);
- if (rpgrp != pgrp && rpgrp)
- kill_pgrp(rpgrp, SIGWINCH, 1);
-
- put_pid(pgrp);
- put_pid(rpgrp);
-
- tty->winsize = *ws;
+ flags = memcmp(ws, &real_tty->winsize, sizeof(*ws));
real_tty->winsize = *ws;
-done:
mutex_unlock(&real_tty->termios_mutex);
+ if (flags){
+ /* Get the PID values and reference them so we can
+ avoid holding the tty ctrl lock while sending signals */
+ spin_lock_irqsave(&tty->ctrl_lock, flags);
+ pgrp = get_pid(tty->pgrp);
+ rpgrp = get_pid(real_tty->pgrp);
+ spin_unlock_irqrestore(&tty->ctrl_lock, flags);
+
+ if (pgrp)
+ kill_pgrp(pgrp, SIGWINCH, 1);
+ if (rpgrp != pgrp && rpgrp)
+ kill_pgrp(rpgrp, SIGWINCH, 1);
+
+ put_pid(pgrp);
+ put_pid(rpgrp);
+ }
+
return 0;
}

@@ -2996,7 +3000,7 @@ long tty_ioctl(struct file *file, unsign
case TIOCSTI:
return tiocsti(tty, p);
case TIOCGWINSZ:
- return tiocgwinsz(tty, p);
+ return tiocgwinsz(real_tty, p);
case TIOCSWINSZ:
return tiocswinsz(tty, real_tty, p);
case TIOCCONS: