readloop.c 963 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "ping.h"
  2. void
  3. readloop(void)
  4. {
  5. int size;
  6. char recvbuf[BUFSIZE];
  7. char controlbuf[BUFSIZE];
  8. struct msghdr msg;
  9. struct iovec iov;
  10. ssize_t n;
  11. struct timeval tval;
  12. sockfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);
  13. setuid(getuid()); /* don't need special permissions any more */
  14. if (pr->finit)
  15. (*pr->finit)();
  16. size = 60 * 1024; /* OK if setsockopt fails */
  17. setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));
  18. sig_alrm(SIGALRM); /* send first packet */
  19. iov.iov_base = recvbuf;
  20. iov.iov_len = sizeof(recvbuf);
  21. msg.msg_name = pr->sarecv;
  22. msg.msg_iov = &iov;
  23. msg.msg_iovlen = 1;
  24. msg.msg_control = controlbuf;
  25. for ( ; ; ) {
  26. msg.msg_namelen = pr->salen;
  27. msg.msg_controllen = sizeof(controlbuf);
  28. n = recvmsg(sockfd, &msg, 0);
  29. if (n < 0) {
  30. if (errno == EINTR)
  31. continue;
  32. else
  33. err_sys("recvmsg error");
  34. }
  35. Gettimeofday(&tval, NULL);
  36. (*pr->fproc)(recvbuf, n, &msg, &tval);
  37. }
  38. }