6 #include <sys/socket.h>
7 #include <netinet/in.h>
10 udpread(int fd, Udphdr *hdr, void *buf, long n)
12 struct sockaddr_in sin;
16 if(getsockname(fd, (struct sockaddr*)&sin, &len) < 0)
18 if(len != sizeof sin){
19 werrstr("getsockname acting weird");
22 memset(hdr, 0, sizeof *hdr);
23 memmove(hdr->laddr, v4prefix, IPaddrlen);
24 memmove(hdr->laddr+12, &sin.sin_addr, sizeof(u32int));
25 memmove(hdr->lport, &sin.sin_port, sizeof(u16int));
28 n = recvfrom(fd, buf, n, 0, (struct sockaddr*)&sin, &len);
31 if(len != sizeof sin){
32 werrstr("recvfrom acting weird");
35 memmove(hdr->raddr, v4prefix, IPaddrlen);
36 memmove(hdr->raddr+12, &sin.sin_addr, sizeof(u32int));
37 memmove(hdr->rport, &sin.sin_port, sizeof(u16int));
43 udpwrite(int fd, Udphdr *hdr, void *buf, long n)
45 struct sockaddr_in sin;
47 memset(&sin, 0, sizeof sin);
48 sin.sin_family = AF_INET;
49 memmove(&sin.sin_addr, hdr->raddr+12, 4);
50 memmove(&sin.sin_port, hdr->rport, 2);
51 return sendto(fd, buf, n, 0, (struct sockaddr*)&sin, sizeof sin);