Messages in this thread Patch in this message | | | Date | Tue, 14 Oct 2008 16:11:57 +0200 | From | Adam Tlałka <> | Subject | Re: [PATCH 0/4] SIGWINCH problem with terminal apps still alive |
| |
> 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@pg.gda.pl> > > 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.
Not it is after small changes and proper path in patch.
Signed-off-by: Adam Tla/lka <atlka@pg.gda.pl>
Regards
-- Adam Tlałka mailto:atlka@pg.gda.pl ^v^ ^v^ ^v^ System & Network Administration Group - - - ~~~~~~ Computer Center, Gdańsk University of Technology, Poland --- drivers/char/tty_io_orig.c 2008-10-10 05:37:30.000000000 +0200 +++ drivers/char/tty_io.c 2008-10-14 15:58:54.000000000 +0200 @@ -2522,29 +2522,32 @@ 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); + put_pid(pgrp); + } + if (rpgrp != pgrp && rpgrp){ + kill_pgrp(rpgrp, SIGWINCH, 1); + put_pid(rpgrp); + } + } + return 0; } @@ -2996,7 +2999,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: | |