diff options
| author | forsyth <forsyth@vitanuova.com> | 2010-11-27 16:29:55 +0000 |
|---|---|---|
| committer | forsyth <forsyth@vitanuova.com> | 2010-11-27 16:29:55 +0000 |
| commit | 9adf220f1d2c1df54cc4d55c578d08741a5c280c (patch) | |
| tree | 9007aeed4096f8ce65efacb6426116fd2ec659d2 /emu/port/ipif-posix.c | |
| parent | 6ce09f7706f6999009db17a5db2512eedece7f3f (diff) | |
20101127-1629
Diffstat (limited to 'emu/port/ipif-posix.c')
| -rw-r--r-- | emu/port/ipif-posix.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/emu/port/ipif-posix.c b/emu/port/ipif-posix.c index 77b5f85d..23e4bf95 100644 --- a/emu/port/ipif-posix.c +++ b/emu/port/ipif-posix.c @@ -10,6 +10,7 @@ #include <net/if_arp.h> #include <netinet/in.h> #include <netinet/tcp.h> +#include <arpa/inet.h> #include <netdb.h> #include <sys/ioctl.h> #undef ulong @@ -21,6 +22,15 @@ #include "ip.h" #include "error.h" +char Enotv4[] = "address not IPv4"; + +static void +ipw6(uchar *a, ulong w) +{ + memmove(a, v4prefix, IPv4off); + memmove(a+IPv4off, &w, IPv4addrlen); +} + int so_socket(int type) { @@ -42,10 +52,10 @@ so_socket(int type) oserror(); if(type == SOCK_DGRAM){ one = 1; - setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*)&one, sizeof (one)); + setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*)&one, sizeof(one)); }else{ one = 1; - setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)); + setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char*)&one, sizeof(one)); } return fd; } @@ -58,7 +68,6 @@ so_send(int sock, void *va, int len, void *hdr, int hdrlen) struct sockaddr_in *sin; char *h = hdr; - osenter(); if(hdr == 0) r = write(sock, va, len); @@ -94,7 +103,6 @@ so_recv(int sock, void *va, int len, void *hdr, int hdrlen) struct sockaddr_in *sin; char h[Udphdrlen]; - osenter(); if(hdr == 0) r = read(sock, va, len); @@ -106,7 +114,7 @@ so_recv(int sock, void *va, int len, void *hdr, int hdrlen) memset(h, 0, sizeof(h)); switch(hdrlen){ case OUdphdrlenv4: - memmove(h, &sin->sin_addr, 4); + memmove(h, &sin->sin_addr, IPv4addrlen); memmove(h+2*IPv4addrlen, &sin->sin_port, 2); break; case OUdphdrlen: @@ -120,6 +128,7 @@ so_recv(int sock, void *va, int len, void *hdr, int hdrlen) } /* alas there's no way to get the local addr/port correctly. Pretend. */ + memset(&sa, 0, sizeof(sa)); getsockname(sock, &sa, &l); switch(hdrlen){ case OUdphdrlenv4: @@ -150,17 +159,20 @@ so_close(int sock) } void -so_connect(int fd, unsigned long raddr, unsigned short rport) +so_connect(int fd, uchar *raddr, ushort rport) { int r; struct sockaddr sa; struct sockaddr_in *sin; + if(!isv4(raddr)) + error(Enotv4); + memset(&sa, 0, sizeof(sa)); sin = (struct sockaddr_in*)&sa; sin->sin_family = AF_INET; hnputs(&sin->sin_port, rport); - hnputl(&sin->sin_addr.s_addr, raddr); + memmove(&sin->sin_addr.s_addr, raddr+IPv4off, IPv4addrlen); osenter(); r = connect(fd, &sa, sizeof(sa)); @@ -170,7 +182,7 @@ so_connect(int fd, unsigned long raddr, unsigned short rport) } void -so_getsockname(int fd, unsigned long *laddr, unsigned short *lport) +so_getsockname(int fd, uchar *laddr, ushort *lport) { int len; struct sockaddr sa; @@ -182,9 +194,9 @@ so_getsockname(int fd, unsigned long *laddr, unsigned short *lport) sin = (struct sockaddr_in*)&sa; if(sin->sin_family != AF_INET || len != sizeof(*sin)) - error("not AF_INET"); + error(Enotv4); - *laddr = nhgetl(&sin->sin_addr.s_addr); + ipw6(laddr, sin->sin_addr.s_addr); *lport = nhgets(&sin->sin_port); } @@ -201,7 +213,7 @@ so_listen(int fd) } int -so_accept(int fd, unsigned long *raddr, unsigned short *rport) +so_accept(int fd, uchar *raddr, ushort *rport) { int nfd, len; struct sockaddr sa; @@ -217,15 +229,15 @@ so_accept(int fd, unsigned long *raddr, unsigned short *rport) oserror(); if(sin->sin_family != AF_INET || len != sizeof(*sin)) - error("not AF_INET"); + error(Enotv4); - *raddr = nhgetl(&sin->sin_addr.s_addr); + ipw6(raddr, sin->sin_addr.s_addr); *rport = nhgets(&sin->sin_port); return nfd; } void -so_bind(int fd, int su, unsigned long addr, unsigned short port) +so_bind(int fd, int su, uchar *addr, ushort port) { int i, one; struct sockaddr sa; @@ -243,7 +255,7 @@ so_bind(int fd, int su, unsigned long addr, 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); + memmove(&sin->sin_addr.s_addr, addr+IPv4off, IPv4addrlen); hnputs(&sin->sin_port, i); if(bind(fd, &sa, sizeof(sa)) >= 0) @@ -254,7 +266,7 @@ so_bind(int fd, int su, unsigned long addr, unsigned short port) memset(&sa, 0, sizeof(sa)); sin->sin_family = AF_INET; - hnputl(&sin->sin_addr.s_addr, addr); + memmove(&sin->sin_addr.s_addr, addr+IPv4off, IPv4addrlen); hnputs(&sin->sin_port, port); if(bind(fd, &sa, sizeof(sa)) < 0) @@ -265,7 +277,7 @@ int so_gethostbyname(char *host, char**hostv, int n) { int i; - unsigned char buf[32], *p; + uchar buf[32], *p; struct hostent *hp; hp = gethostbyname(host); |
