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 *(u32int*)(hdr->laddr+12) = *(u32int*)&sin.sin_addr;
25 *(u16int*)hdr->lport = *(u16int*)&sin.sin_port;
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 *(u32int*)(hdr->raddr+12) = *(u32int*)&sin.sin_addr;
37 *(u16int*)hdr->rport = *(u16int*)&sin.sin_port;
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 *(u32int*)&sin.sin_addr = *(u32int*)(hdr->raddr+12);
50 *(u16int*)&sin.sin_port = *(u16int*)hdr->rport;
51 return sendto(fd, buf, n, 0, (struct sockaddr*)&sin, sizeof sin);