diff options
Diffstat (limited to 'emu/port')
| -rw-r--r-- | emu/port/devip.c | 16 | ||||
| -rw-r--r-- | emu/port/ip.h | 2 | ||||
| -rw-r--r-- | emu/port/ipif-posix.c | 4 |
3 files changed, 15 insertions, 7 deletions
diff --git a/emu/port/devip.c b/emu/port/devip.c index 2e1a9b1a..e70d7dc3 100644 --- a/emu/port/devip.c +++ b/emu/port/devip.c @@ -614,7 +614,7 @@ setladdr(Conv *c) { ulong laddr; - /* TO DO: this can't be right for hosts with several addresses */ + /* TO DO: this can't be right for hosts with several addresses before connect/accept */ so_getsockname(c->sfd, &laddr, &c->lport); ipw6(c->laddr, laddr); } @@ -626,10 +626,16 @@ static void setlport(Conv *c) { ulong laddr; - - so_bind(c->sfd, c->restricted, c->lport); - if(c->lport == 0) - so_getsockname(c->sfd, &laddr, &c->lport); + ushort p; + + so_bind(c->sfd, c->restricted, ip6w(c->laddr), c->lport); + if(c->lport == 0 || ipcmp(c->laddr, IPnoaddr) == 0){ + so_getsockname(c->sfd, &laddr, &p); + if(c->lport == 0) + c->lport = p; + if(ipcmp(c->laddr, IPnoaddr) == 0) + ipw6(c->laddr, laddr); + } } static int diff --git a/emu/port/ip.h b/emu/port/ip.h index f4666f45..1462b755 100644 --- a/emu/port/ip.h +++ b/emu/port/ip.h @@ -18,7 +18,7 @@ typedef struct Conv Conv; extern int so_socket(int type); extern void so_connect(int, unsigned long, unsigned short); extern void so_getsockname(int, unsigned long*, unsigned short*); -extern void so_bind(int, int, unsigned short); +extern void so_bind(int, int, unsigned long, unsigned short); extern void so_listen(int); extern int so_accept(int, unsigned long*, unsigned short*); extern int so_getservbyname(char*, char*, char*); diff --git a/emu/port/ipif-posix.c b/emu/port/ipif-posix.c index 2502e183..fffc4e7c 100644 --- a/emu/port/ipif-posix.c +++ b/emu/port/ipif-posix.c @@ -225,7 +225,7 @@ so_accept(int fd, unsigned long *raddr, unsigned short *rport) } void -so_bind(int fd, int su, unsigned short port) +so_bind(int fd, int su, unsigned long addr, unsigned short port) { int i, one; struct sockaddr sa; @@ -243,6 +243,7 @@ so_bind(int fd, int su, unsigned short port) for(i = 600; i < 1024; i++) { memset(&sa, 0, sizeof(sa)); sin->sin_family = AF_INET; + hnputl(&sin->sin_addr.s_addr, addr); hnputs(&sin->sin_port, i); if(bind(fd, &sa, sizeof(sa)) >= 0) @@ -253,6 +254,7 @@ so_bind(int fd, int su, unsigned short port) memset(&sa, 0, sizeof(sa)); sin->sin_family = AF_INET; + hnputl(&sin->sin_addr.s_addr, addr); hnputs(&sin->sin_port, port); if(bind(fd, &sa, sizeof(sa)) < 0) |
