summaryrefslogtreecommitdiff
path: root/emu/port/devip.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2008-02-04 15:00:38 +0000
committerCharles.Forsyth <devnull@localhost>2008-02-04 15:00:38 +0000
commit7d71f6aed094027aed1a43cdd7e91674892f7e89 (patch)
treec6400a09eda697ed0faeed3fde1a5544551a3864 /emu/port/devip.c
parent1ca4518d984a3e2dee44a160397cb720c61d2449 (diff)
20080204-1507
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