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