THE SOFTWARE.
*/
-#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
+#include <poll.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
-#include <sys/time.h>
-#include <sys/types.h>
#include <time.h>
#include <unistd.h>
-#define MAX(x, y) ((x) >= (y) ? (x) : (y))
#define MIN(x, y) ((x) <= (y) ? (x) : (y))
static int
token_bucket_time = time(NULL);
token_bucket_tokens = MAX_TOKEN_BUCKET_TOKENS;
int send4 = 0;
+ struct pollfd fds[2];
+ if (dht_socket >= 0) {
+ fds[0].fd = dht_socket;
+ fds[0].events = POLLIN;
+ } else {
+ fds[0].fd = -1;
+ }
+ if (dht_socket6 >= 0) {
+ fds[1].fd = dht_socket6;
+ fds[1].events = POLLIN;
+ } else {
+ fds[1].fd = -1;
+ }
while (1) {
- struct timeval tv;
- fd_set readfds;
-
+ int tv_sec = 0;
if ((dht_socket >= 0 && list_elements(&v4_confirmed) <= 16) ||
(dht_socket6 >= 0 && list_elements(&v6_confirmed) <= 16))
- tv.tv_sec = 0;
+ tv_sec = 0;
else
- tv.tv_sec = random() % 30;
- tv.tv_usec = random() % 1000000;
-
- FD_ZERO(&readfds);
- if (dht_socket >= 0)
- FD_SET(dht_socket, &readfds);
- if (dht_socket6 >= 0)
- FD_SET(dht_socket6, &readfds);
+ tv_sec = random() % 30;
+ int tv_msec = random() % 1000;
if (dht_debug)
debugf(
list_elements(&v4_new),
list_elements(&v6_new));
- int rc = select(MAX(dht_socket, dht_socket6) + 1, &readfds, NULL, NULL, &tv);
+ int rc = poll(fds, 2, tv_sec * 1000 + tv_msec);
if (rc < 0) {
- if (errno != EINTR) {
- perror("select");
- sleep(1);
- }
+ perror("poll");
+ sleep(1);
}
if (rc > 0) {
struct sockaddr_storage source_storage;
struct sockaddr *source = (struct sockaddr *)&source_storage;
socklen_t sourcelen = sizeof(source_storage);
- if (dht_socket >= 0 && FD_ISSET(dht_socket, &readfds)) {
- rc = recvfrom(dht_socket, buf, 1536, 0, source, &sourcelen);
- } else if (dht_socket6 >= 0 && FD_ISSET(dht_socket6, &readfds)) {
- rc = recvfrom(dht_socket6, buf, 1536, 0, source, &sourcelen);
+ if (fds[0].revents != 0) {
+ if ((fds[0].revents & (POLLERR | POLLNVAL)) > 0) {
+ fprintf(stderr, "error in fds[0]");
+ rc = -1;
+ } else {
+ rc = recvfrom(dht_socket, buf, 1536, 0, source, &sourcelen);
+ }
+ } else if (fds[1].revents != 0) {
+ if ((fds[1].revents & (POLLERR | POLLNVAL)) > 0) {
+ fprintf(stderr, "error in fds[1]");
+ rc = -1;
+ } else {
+ rc = recvfrom(dht_socket6, buf, 1536, 0, source, &sourcelen);
+ };
}
if (rc < 0 || sourcelen > sizeof(struct sockaddr_storage))