summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@rei2.9hal>2012-03-11 09:13:49 +0100
committercinap_lenrek <cinap_lenrek@rei2.9hal>2012-03-11 09:13:49 +0100
commit51a43ed5c5065c07233e9401297ff3947a158f97 (patch)
tree5c03b3e928595e7b031438ee0468d834a6a5d119
parent3a83a68e0bd65e6609f067cd2d2c3acaa2364ff1 (diff)
socksd: support for BIND command
-rw-r--r--sys/src/cmd/ip/socksd.c48
1 files changed, 33 insertions, 15 deletions
diff --git a/sys/src/cmd/ip/socksd.c b/sys/src/cmd/ip/socksd.c
index 3b5dc140f..2b1aef1c2 100644
--- a/sys/src/cmd/ip/socksd.c
+++ b/sys/src/cmd/ip/socksd.c
@@ -98,9 +98,9 @@ void
main(int argc, char *argv[])
{
uchar buf[8*1024], *p;
- char dir[40], *s;
+ char dir[40], ldir[40], *s;
+ int cmd, fd, cfd, n;
NetConnInfo *nc;
- int fd, n;
fmtinstall('I', eipfmt);
@@ -178,24 +178,21 @@ main(int argc, char *argv[])
}
}
- nc = nil;
dir[0] = 0;
- fd = -1;
- switch(buf[1]){
+ fd = cfd = -1;
+ cmd = buf[1];
+ switch(cmd){
case 0x01: /* CONNECT */
if((s = addr2str("tcp", buf)) == nil)
return;
- fd = dial(s, 0, dir, 0);
+ fd = dial(s, 0, dir, &cfd);
+ break;
+ case 0x02: /* BIND */
+ fd = announce("tcp!*!0", dir);
break;
}
- if(fd >= 0){
- if((nc = getnetconninfo(dir, -1)) == nil){
- close(fd);
- fd = -1;
- }
- }
-
+Reply:
/* reply */
buf[1] = sockerr(fd < 0); /* status */
if(socksver == 4){
@@ -215,11 +212,32 @@ main(int argc, char *argv[])
return;
}
}
- if((n = str2addr(nc->laddr, buf)) <= 0)
+ if((nc = getnetconninfo(dir, cfd)) == nil)
+ return;
+ if((n = str2addr((cmd & 0x100) ? nc->raddr : nc->laddr, buf)) <= 0)
return;
if(write(1, buf, n) != n)
return;
+ switch(cmd){
+ default:
+ return;
+ case 0x01: /* CONNECT */
+ break;
+ case 0x02: /* BIND */
+ cfd = listen(dir, ldir);
+ close(fd);
+ fd = -1;
+ if(cfd >= 0){
+ strcpy(dir, ldir);
+ fd = accept(cfd, dir);
+ }
+ cmd |= 0x100;
+ goto Reply;
+ case 0x102:
+ break;
+ }
+
/* relay data */
switch(rfork(RFMEM|RFPROC|RFFDG|RFNOWAIT)){
case -1:
@@ -233,7 +251,7 @@ main(int argc, char *argv[])
while((n = read(0, buf, sizeof(buf))) > 0)
if(write(1, buf, n) != n)
break;
+ hangup(cfd);
postnote(PNGROUP, getpid(), "kill");
- exits(0);
}