From 40056f4655c644ba356b6418180cacc33c7c1357 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Mon, 14 May 2012 21:31:11 -0400 Subject: [PATCH] bind --- driver.c | 3 +-- mbind.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 mbind.c diff --git a/driver.c b/driver.c index 5ca55aa..8410607 100644 --- a/driver.c +++ b/driver.c @@ -116,8 +116,7 @@ int driver( case PRU_BIND: // KERNbind(int fd, struct sockaddr *my_addr, int addrlen, int *ERRNO) - //return do_bind(socknum, m, m_len, addr, addrlen, rights); - return 0; + return mbind(socknum, p1, p2, p3, p4, p5); break; case PRU_CONNECT: diff --git a/mbind.c b/mbind.c new file mode 100644 index 0000000..b18bc6f --- /dev/null +++ b/mbind.c @@ -0,0 +1,65 @@ +#include "marignotti.h" +#include +#include +#include + +#include + +#include "s16debug.h" + + +#pragma noroot +#pragma optimize 79 + +int mbind(Entry *e, void *p1, void *p2, void *p3, void *p4, void *p5) +{ + Word port; + Word t; + Word terr; + + xsockaddr_in *addr = (xsockaddr_in *)p3; + int addrlen = p4 ? *(int *)p4 : 0; + + port = addr->sin_port; + asm { + lda 0) + { + union xsplit s; + s.i32 = addr->sin_addr; + s16_debug_printf("bind family = %d address = %d.%d.%d.%d port = %d", + addr->sin_family, + s.i8[0], s.i8[1], s.i8[2], s.i8[3], + port); + } + + + if (e->_TYPE != SOCK_STREAM) + return EOPNOTSUPP; + + if (addrlen < 8 || !addr) return EINVAL; + if (addr->sin_family != AF_INET) return EINVAL; + + // don't re-bind if listen() or connect() called. + + IncBusy(); + terr = TCPIPStatusTCP(e->ipid, &e->sr); + if (t) terr = t; + e->terr = t; + DecBusy(); + + if (e->sr.srState != TCPSCLOSED) return EINVAL; + + // address component is ignored -- only port is used. + + IncBusy(); + TCPIPSetSourcePort(e->ipid, port); + DecBusy(); + + return 0; + +} \ No newline at end of file