summaryrefslogtreecommitdiff
path: root/emu/port/ipif-posix.c
diff options
context:
space:
mode:
Diffstat (limited to 'emu/port/ipif-posix.c')
-rw-r--r--emu/port/ipif-posix.c46
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);