summaryrefslogtreecommitdiff
path: root/emu/port/devip.c
diff options
context:
space:
mode:
Diffstat (limited to 'emu/port/devip.c')
-rw-r--r--emu/port/devip.c16
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