diff options
| author | Charles.Forsyth <devnull@localhost> | 2008-02-04 15:00:38 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2008-02-04 15:00:38 +0000 |
| commit | 7d71f6aed094027aed1a43cdd7e91674892f7e89 (patch) | |
| tree | c6400a09eda697ed0faeed3fde1a5544551a3864 | |
| parent | 1ca4518d984a3e2dee44a160397cb720c61d2449 (diff) | |
20080204-1507
| -rw-r--r-- | CHANGES | 2 | ||||
| -rw-r--r-- | emu/FreeBSD/ipif.c | 4 | ||||
| -rw-r--r-- | emu/NetBSD/ipif.c | 4 | ||||
| -rw-r--r-- | emu/Nt/ipif.c | 4 | ||||
| -rw-r--r-- | emu/port/devip.c | 16 | ||||
| -rw-r--r-- | emu/port/ip.h | 2 | ||||
| -rw-r--r-- | emu/port/ipif-posix.c | 4 | ||||
| -rw-r--r-- | include/version.h | 2 |
8 files changed, 27 insertions, 11 deletions
@@ -1,3 +1,5 @@ +20080204 + emu/*/*ipif*.c and devip.c: try to allow local address to be set (changes so_bind signature in emu/ip.h) 20080201 change foldbranch in limbo/gen.c to prevent loss of `no return value' diagnostics 20080131 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) diff --git a/include/version.h b/include/version.h index 4928d5f7..48813421 100644 --- a/include/version.h +++ b/include/version.h @@ -1 +1 @@ -#define VERSION "Fourth Edition (20080201)" +#define VERSION "Fourth Edition (20080204)" |
