+ case MSG_CHANNEL_OPEN:
+ if(unpack(m, "_suuususu", &s, &n, &chan,
+ &win, &pkt,
+ &lhost, &ln, &lport,
+ &rhost, &rn, &rport) < 0)
+ break;
+ if(n != 15 || strncmp(s, "forwarded-tcpip", 15) != 0){
+ n = 3, s = "unknown open type";
+ Reject:
+ sendmsg(pack(nil, "buus", MSG_CHANNEL_OPEN_FAILURE,
+ chan, n, s, strlen(s)));
+ break;
+ }
+ lhost = smprint("%.*s", utfnlen(lhost, ln), lhost);
+ rhost = smprint("%.*s", utfnlen(rhost, rn), rhost);
+ c = getlistener(lhost, lport);
+ if(c == nil){
+ free(lhost);
+ free(rhost);
+ n = 2, s = "connection refused";
+ goto Reject;
+ }
+ free(c->lhost);
+ c->lhost = lhost;
+ c->lport = lport;
+ free(c->rhost);
+ c->rhost = rhost;
+ c->rport = rport;
+ c->servernum = chan;
+ c->recvwin = WinPackets*MaxPacket;
+ c->recvacc = 0;
+ c->eof = 0;
+ c->sendpkt = pkt;
+ c->sendwin = win;
+ c->state = Established;
+ sendmsg(pack(nil, "buuuu", MSG_CHANNEL_OPEN_CONFIRMATION,
+ c->servernum, c->num, c->recvwin, MaxPacket));
+ if(c->wq == nil){
+ teardownclient(c);
+ break;
+ }
+ respond(c->wq, nil);
+ c->wq = nil;
+ break;