dgechoprintroute.c 913 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. #include "unp.h"
  2. void
  3. dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
  4. {
  5. int n;
  6. char mesg[MAXLINE];
  7. int on;
  8. char control[MAXLINE];
  9. struct msghdr msg;
  10. struct cmsghdr *cmsg;
  11. struct iovec iov[1];
  12. on = 1;
  13. Setsockopt(sockfd, IPPROTO_IPV6, IPV6_RECVRTHDR, &on, sizeof(on));
  14. bzero(&msg, sizeof(msg));
  15. iov[0].iov_base = mesg;
  16. msg.msg_name = pcliaddr;
  17. msg.msg_iov = iov;
  18. msg.msg_iovlen = 1;
  19. msg.msg_control = control;
  20. for ( ; ; ) {
  21. msg.msg_namelen = clilen;
  22. msg.msg_controllen = sizeof(control);
  23. iov[0].iov_len = MAXLINE;
  24. n = Recvmsg(sockfd, &msg, 0);
  25. for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
  26. cmsg = CMSG_NXTHDR(&msg, cmsg)) {
  27. if (cmsg->cmsg_level == IPPROTO_IPV6 &&
  28. cmsg->cmsg_type == IPV6_RTHDR) {
  29. inet6_srcrt_print(CMSG_DATA(cmsg));
  30. Inet6_rth_reverse(CMSG_DATA(cmsg), CMSG_DATA(cmsg));
  31. }
  32. }
  33. iov[0].iov_len = n;
  34. Sendmsg(sockfd, &msg, 0);
  35. }
  36. }