summaryrefslogtreecommitdiff
path: root/emu
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
parent1ca4518d984a3e2dee44a160397cb720c61d2449 (diff)
20080204-1507
Diffstat (limited to 'emu')
-rw-r--r--emu/FreeBSD/ipif.c4
-rw-r--r--emu/NetBSD/ipif.c4
-rw-r--r--emu/Nt/ipif.c4
-rw-r--r--emu/port/devip.c16
-rw-r--r--emu/port/ip.h2
-rw-r--r--emu/port/ipif-posix.c4
6 files changed, 24 insertions, 10 deletions
diff --git a/emu/FreeBSD/ipif.c b/emu/FreeBSD/ipif.c
index 07065714..853e2e93 100644
--- a/emu/FreeBSD/ipif.c
+++ b/emu/FreeBSD/ipif.c
@@ -217,7 +217,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;
@@ -235,6 +235,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)
@@ -245,6 +246,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)
diff --git a/emu/NetBSD/ipif.c b/emu/NetBSD/ipif.c
index 07065714..853e2e93 100644
--- a/emu/NetBSD/ipif.c
+++ b/emu/NetBSD/ipif.c
@@ -217,7 +217,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;
@@ -235,6 +235,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)
@@ -245,6 +246,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)
diff --git a/emu/Nt/ipif.c b/emu/Nt/ipif.c
index eab9dd7f..4a4e8a12 100644
--- a/emu/Nt/ipif.c
+++ b/emu/Nt/ipif.c
@@ -254,7 +254,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;
@@ -272,6 +272,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)
@@ -282,6 +283,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)
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)