Blame


1 fd04aace 2003-11-23 devnull #include <u.h>
2 fd04aace 2003-11-23 devnull #define NOPLAN9DEFINES
3 fd04aace 2003-11-23 devnull #include <libc.h>
4 fd04aace 2003-11-23 devnull #include <ip.h>
5 fd04aace 2003-11-23 devnull
6 fd04aace 2003-11-23 devnull #include <sys/socket.h>
7 fd04aace 2003-11-23 devnull #include <netinet/in.h>
8 fd04aace 2003-11-23 devnull
9 fd04aace 2003-11-23 devnull /*
10 fd04aace 2003-11-23 devnull * prefix of all v4 addresses
11 fd04aace 2003-11-23 devnull * copied from libip because libc cannot depend on libip
12 fd04aace 2003-11-23 devnull */
13 fd04aace 2003-11-23 devnull static uchar v4prefix[IPaddrlen] = {
14 fd04aace 2003-11-23 devnull 0, 0, 0, 0,
15 fd04aace 2003-11-23 devnull 0, 0, 0, 0,
16 fd04aace 2003-11-23 devnull 0, 0, 0xff, 0xff,
17 fd04aace 2003-11-23 devnull 0, 0, 0, 0
18 fd04aace 2003-11-23 devnull };
19 fd04aace 2003-11-23 devnull
20 fd04aace 2003-11-23 devnull long
21 fd04aace 2003-11-23 devnull udpread(int fd, Udphdr *hdr, void *buf, long n)
22 fd04aace 2003-11-23 devnull {
23 fd04aace 2003-11-23 devnull struct sockaddr_in sin;
24 fd04aace 2003-11-23 devnull socklen_t len;
25 fd04aace 2003-11-23 devnull
26 fd04aace 2003-11-23 devnull len = sizeof sin;
27 fd04aace 2003-11-23 devnull n = recvfrom(fd, buf, n, 0, (struct sockaddr*)&sin, &len);
28 fd04aace 2003-11-23 devnull if(len != sizeof sin){
29 fd04aace 2003-11-23 devnull werrstr("recvfrom acting weird");
30 fd04aace 2003-11-23 devnull return -1;
31 fd04aace 2003-11-23 devnull }
32 fd04aace 2003-11-23 devnull if(n < 0)
33 fd04aace 2003-11-23 devnull return -1;
34 fd04aace 2003-11-23 devnull memset(hdr, 0, sizeof *hdr);
35 fd04aace 2003-11-23 devnull memmove(hdr->raddr, v4prefix, IPaddrlen);
36 fd04aace 2003-11-23 devnull *(u32int*)(hdr->raddr+12) = *(u32int*)&sin.sin_addr;
37 fd04aace 2003-11-23 devnull *(u16int*)hdr->rport = *(u16int*)&sin.sin_port;
38 fd04aace 2003-11-23 devnull return n;
39 fd04aace 2003-11-23 devnull }
40 fd04aace 2003-11-23 devnull
41 fd04aace 2003-11-23 devnull long
42 fd04aace 2003-11-23 devnull udpwrite(int fd, Udphdr *hdr, void *buf, long n)
43 fd04aace 2003-11-23 devnull {
44 fd04aace 2003-11-23 devnull struct sockaddr_in sin;
45 fd04aace 2003-11-23 devnull
46 fd04aace 2003-11-23 devnull memset(&sin, 0, sizeof sin);
47 fd04aace 2003-11-23 devnull sin.sin_family = AF_INET;
48 fd04aace 2003-11-23 devnull *(u32int*)&sin.sin_addr = *(u32int*)(hdr->raddr+12);
49 fd04aace 2003-11-23 devnull *(u16int*)&sin.sin_port = *(u16int*)hdr->rport;
50 fd04aace 2003-11-23 devnull return sendto(fd, buf, n, 0, (struct sockaddr*)&sin, sizeof sin);
51 fd04aace 2003-11-23 devnull }