From 7e42d210121c9c2898caddcfc09d7e8d836c252e Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 21 Apr 2004 23:43:46 +0000 Subject: odds and ends --- src/libip/udp.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/libip/udp.c (limited to 'src/libip') diff --git a/src/libip/udp.c b/src/libip/udp.c new file mode 100644 index 00000000..8df03ba0 --- /dev/null +++ b/src/libip/udp.c @@ -0,0 +1,52 @@ +#include +#define NOPLAN9DEFINES +#include +#include + +#include +#include + +/* + * prefix of all v4 addresses + * copied from libip because libc cannot depend on libip + */ +static uchar v4prefix[IPaddrlen] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0xff, 0xff, + 0, 0, 0, 0 +}; + +long +udpread(int fd, Udphdr *hdr, void *buf, long n) +{ + struct sockaddr_in sin; + socklen_t len; + + len = sizeof sin; + n = recvfrom(fd, buf, n, 0, (struct sockaddr*)&sin, &len); + if(n < 0) + return -1; + if(len != sizeof sin){ + werrstr("recvfrom acting weird"); + return -1; + } + memset(hdr, 0, sizeof *hdr); + memmove(hdr->raddr, v4prefix, IPaddrlen); + *(u32int*)(hdr->raddr+12) = *(u32int*)&sin.sin_addr; + *(u16int*)hdr->rport = *(u16int*)&sin.sin_port; + return n; +} + +long +udpwrite(int fd, Udphdr *hdr, void *buf, long n) +{ + struct sockaddr_in sin; + + memset(&sin, 0, sizeof sin); + sin.sin_family = AF_INET; + *(u32int*)&sin.sin_addr = *(u32int*)(hdr->raddr+12); + *(u16int*)&sin.sin_port = *(u16int*)hdr->rport; + return sendto(fd, buf, n, 0, (struct sockaddr*)&sin, sizeof sin); +} + -- cgit v1.2.3