sshnet: get rid of Announced state, simplify
This commit is contained in:
parent
634292c2f8
commit
ed6b42863c
1 changed files with 28 additions and 34 deletions
|
@ -45,7 +45,6 @@ enum
|
||||||
{
|
{
|
||||||
Closed,
|
Closed,
|
||||||
Dialing,
|
Dialing,
|
||||||
Announced,
|
|
||||||
Listen,
|
Listen,
|
||||||
Established,
|
Established,
|
||||||
Teardown,
|
Teardown,
|
||||||
|
@ -55,7 +54,6 @@ enum
|
||||||
char *statestr[] = {
|
char *statestr[] = {
|
||||||
"Closed",
|
"Closed",
|
||||||
"Dialing",
|
"Dialing",
|
||||||
"Announced",
|
|
||||||
"Listen",
|
"Listen",
|
||||||
"Established",
|
"Established",
|
||||||
"Teardown",
|
"Teardown",
|
||||||
|
@ -310,14 +308,26 @@ getclient(int num)
|
||||||
}
|
}
|
||||||
|
|
||||||
Client*
|
Client*
|
||||||
getlistener(char *host, int port)
|
acceptclient(char *lhost, int lport, char *rhost, int rport)
|
||||||
{
|
{
|
||||||
|
Client *c, *nc;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
USED(host);
|
|
||||||
for(i = 0; i < nclient; i++){
|
for(i = 0; i < nclient; i++){
|
||||||
if(client[i]->state == Listen && client[i]->lport == port)
|
c = client[i];
|
||||||
return client[i];
|
if(c->state == Listen && c->lport == lport && c->wq != nil){
|
||||||
|
nc = client[newclient()];
|
||||||
|
nc->wq = c->wq;
|
||||||
|
c->wq = nc->wq->aux;
|
||||||
|
nc->wq->aux = nil;
|
||||||
|
free(nc->lhost);
|
||||||
|
nc->lhost = lhost;
|
||||||
|
nc->lport = lport;
|
||||||
|
free(nc->rhost);
|
||||||
|
nc->rhost = rhost;
|
||||||
|
nc->rport = rport;
|
||||||
|
return nc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
@ -493,15 +503,13 @@ closeclient(Client *c)
|
||||||
c->state = Closed;
|
c->state = Closed;
|
||||||
sendmsg(pack(nil, "bu", MSG_CHANNEL_CLOSE, c->servernum));
|
sendmsg(pack(nil, "bu", MSG_CHANNEL_CLOSE, c->servernum));
|
||||||
break;
|
break;
|
||||||
case Announced:
|
case Listen:
|
||||||
|
c->state = Closed;
|
||||||
sendmsg(pack(nil, "bsbsu", MSG_GLOBAL_REQUEST,
|
sendmsg(pack(nil, "bsbsu", MSG_GLOBAL_REQUEST,
|
||||||
"cancel-tcpip-forward", 20,
|
"cancel-tcpip-forward", 20,
|
||||||
0,
|
0,
|
||||||
c->lhost, strlen(c->lhost),
|
c->lhost, strlen(c->lhost),
|
||||||
c->lport));
|
c->lport));
|
||||||
/* wet floor */
|
|
||||||
case Listen:
|
|
||||||
c->state = Closed;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
while((m = c->mq) != nil){
|
while((m = c->mq) != nil){
|
||||||
|
@ -859,7 +867,7 @@ ctlwrite(Req *r, Client *c)
|
||||||
free(c->rhost);
|
free(c->rhost);
|
||||||
c->rhost = estrdup9p("::");
|
c->rhost = estrdup9p("::");
|
||||||
c->rport = 0;
|
c->rport = 0;
|
||||||
c->state = Announced;
|
c->state = Listen;
|
||||||
sendmsg(pack(nil, "bsbsu", MSG_GLOBAL_REQUEST,
|
sendmsg(pack(nil, "bsbsu", MSG_GLOBAL_REQUEST,
|
||||||
"tcpip-forward", 13, 0,
|
"tcpip-forward", 13, 0,
|
||||||
c->lhost, strlen(c->lhost), c->lport));
|
c->lhost, strlen(c->lhost), c->lport));
|
||||||
|
@ -1045,20 +1053,11 @@ fsopen(Req *r)
|
||||||
respond(r, nil);
|
respond(r, nil);
|
||||||
break;
|
break;
|
||||||
case Qlisten:
|
case Qlisten:
|
||||||
if(client[NUM(path)]->state != Announced){
|
if(client[NUM(path)]->state != Listen){
|
||||||
respond(r, "not announced");
|
respond(r, "no address set");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
n = newclient();
|
queuewreq(client[NUM(path)], r);
|
||||||
free(client[n]->lhost);
|
|
||||||
client[n]->lhost = estrdup9p(client[NUM(path)]->lhost);
|
|
||||||
client[n]->lport = client[NUM(path)]->lport;
|
|
||||||
r->fid->qid.path = PATH(Qctl, n);
|
|
||||||
r->ofcall.qid.path = r->fid->qid.path;
|
|
||||||
r->aux = nil;
|
|
||||||
client[n]->wq = r;
|
|
||||||
client[n]->ref++;
|
|
||||||
client[n]->state = Listen;
|
|
||||||
break;
|
break;
|
||||||
case Qclone:
|
case Qclone:
|
||||||
n = newclient();
|
n = newclient();
|
||||||
|
@ -1199,19 +1198,13 @@ handlemsg(Msg *m)
|
||||||
}
|
}
|
||||||
lhost = smprint("%.*s", utfnlen(lhost, ln), lhost);
|
lhost = smprint("%.*s", utfnlen(lhost, ln), lhost);
|
||||||
rhost = smprint("%.*s", utfnlen(rhost, rn), rhost);
|
rhost = smprint("%.*s", utfnlen(rhost, rn), rhost);
|
||||||
c = getlistener(lhost, lport);
|
c = acceptclient(lhost, lport, rhost, rport);
|
||||||
if(c == nil){
|
if(c == nil){
|
||||||
free(lhost);
|
free(lhost);
|
||||||
free(rhost);
|
free(rhost);
|
||||||
n = 2, s = "connection refused";
|
n = 2, s = "connection refused";
|
||||||
goto Reject;
|
goto Reject;
|
||||||
}
|
}
|
||||||
free(c->lhost);
|
|
||||||
c->lhost = lhost;
|
|
||||||
c->lport = lport;
|
|
||||||
free(c->rhost);
|
|
||||||
c->rhost = rhost;
|
|
||||||
c->rport = rport;
|
|
||||||
c->servernum = chan;
|
c->servernum = chan;
|
||||||
c->recvwin = WinPackets*MaxPacket;
|
c->recvwin = WinPackets*MaxPacket;
|
||||||
c->recvacc = 0;
|
c->recvacc = 0;
|
||||||
|
@ -1219,12 +1212,13 @@ handlemsg(Msg *m)
|
||||||
c->sendpkt = pkt;
|
c->sendpkt = pkt;
|
||||||
c->sendwin = win;
|
c->sendwin = win;
|
||||||
c->state = Established;
|
c->state = Established;
|
||||||
|
|
||||||
sendmsg(pack(nil, "buuuu", MSG_CHANNEL_OPEN_CONFIRMATION,
|
sendmsg(pack(nil, "buuuu", MSG_CHANNEL_OPEN_CONFIRMATION,
|
||||||
c->servernum, c->num, c->recvwin, MaxPacket));
|
c->servernum, c->num, c->recvwin, MaxPacket));
|
||||||
if(c->wq == nil){
|
|
||||||
teardownclient(c);
|
c->ref++;
|
||||||
break;
|
c->wq->fid->qid.path = PATH(Qctl, c->num);
|
||||||
}
|
c->wq->ofcall.qid.path = c->wq->fid->qid.path;
|
||||||
respond(c->wq, nil);
|
respond(c->wq, nil);
|
||||||
c->wq = nil;
|
c->wq = nil;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue