diff options
Diffstat (limited to 'emu/port/devip.c')
| -rw-r--r-- | emu/port/devip.c | 16 |
1 files changed, 11 insertions, 5 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 |
