Blame


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