muxed client changes

Howard Chu hyc at symas.com
Thu Jun 17 10:33:45 EST 2010


Howard Chu wrote:
> Howard Chu wrote:
>> Everything should work exactly as before when connecting to an unpatached
>> server. With a patched server and patched shell you'll have local editing plus
>> command history. I'm still working out how to pass-thru the command completion
>> bits.
>>
> Ugh. Except that this only works well for a single client; if you mux another
> session in everything breaks. The GNU readline library assumes it's only
> working with one display in one process; it doesn't work well trying to mux it
> across multiple ttys. Is there a particular reason why the muxing code didn't
> just relay the session data from the master to the slave client, rather than
> passing file descriptors to the master and having it write directly to the
> slave's tty? I guess it saves on memory copies, but it also limits the other
> clients.

I've tweaked the mux framework to solve this:

Date:   Wed Jun 16 17:22:11 2010 -0700

     Add a new channel type for muxed clients.

     Previously the slave client process did nothing but wait for an
     exit message from the master. Now, it handles all terminal input
     and forwards the data to the master. This input is performed in
     the new SSH_CHANNEL_MUX_OPEN channel type in the slave process.
     The master still runs a regular SSH_CHANNEL_OPEN session to the
     remote host on behalf of the slave, and it still writes all of
     this channel output directly to the slave tty, but it no longer
     does any reading, and the channel's rfd is set to -1.

     Splitting things apart like this allows each session to operate
     their ttys independently without mixing up mode changes. It also
     allows the slave client to suspend itself on demand.

     Further additions to the mux framework include a WINCH message;
     the slave client handles its own SIGWINCH events and sends the
     data to the master, which forwards it to the remote host. This
     eliminates the need for the master to poll every session with
     TIOCGWINSZ and send size updates for every session at once.

     Also, to support readline, the master session has an output filter
     to search for a commandline prompt on the tail of the incoming
     data. This also gets sent from the master to the slave process.

     Likewise, tty-change messages received for the session are forwarded
     from the master to the slave process.

Something else I just noticed; the escape filter was broken anyway when muxed 
clients were around because it depended on a single last_was_cr flag, even 
though it could be processing input for many sessions in an interleaved order. 
As such it would fail to detect an escape character in a lot of situations 
where it should have seen it. That's fixed by splitting things up this way too.

Patches available here:  http://github.com/hyc/OpenSSH-LINEMODE

  channels.c   |   53 +++++++-----
  channels.h   |    4 +-
  clientloop.c |  199 ++++++++++++++++++++++++++++++++++++-------
  clientloop.h |    9 ++
  mux.c        |  271 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
  packet.c     |   12 +++
  packet.h     |    4 +-
  ttymodes.c   |   35 ++++----

-- 
   -- Howard Chu
   CTO, Symas Corp.           http://www.symas.com
   Director, Highland Sun     http://highlandsun.com/hyc/
   Chief Architect, OpenLDAP  http://www.openldap.org/project/


More information about the openssh-unix-dev mailing list