| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #include "ping.h"
- void
- readloop(void)
- {
- int size;
- char recvbuf[BUFSIZE];
- char controlbuf[BUFSIZE];
- struct msghdr msg;
- struct iovec iov;
- ssize_t n;
- struct timeval tval;
- sockfd = Socket(pr->sasend->sa_family, SOCK_RAW, pr->icmpproto);
- setuid(getuid()); /* don't need special permissions any more */
- if (pr->finit)
- (*pr->finit)();
- size = 60 * 1024; /* OK if setsockopt fails */
- setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));
- sig_alrm(SIGALRM); /* send first packet */
- iov.iov_base = recvbuf;
- iov.iov_len = sizeof(recvbuf);
- msg.msg_name = pr->sarecv;
- msg.msg_iov = &iov;
- msg.msg_iovlen = 1;
- msg.msg_control = controlbuf;
- for ( ; ; ) {
- msg.msg_namelen = pr->salen;
- msg.msg_controllen = sizeof(controlbuf);
- n = recvmsg(sockfd, &msg, 0);
- if (n < 0) {
- if (errno == EINTR)
- continue;
- else
- err_sys("recvmsg error");
- }
- Gettimeofday(&tval, NULL);
- (*pr->fproc)(recvbuf, n, &msg, &tval);
- }
- }
|