udp.c 1.1 KB

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