#include "common.h"
-struct event_loop {
+struct priv_async {
int epoll_fd;
int epoll_count;
+ int finished;
};
static void
watch_fd(netresolve_query_t query, int fd, int events, void *user_data)
{
- struct event_loop *loop = user_data;
+ struct priv_async *priv = user_data;
struct epoll_event event = { .events = events, .data = { .fd = fd} };
- if (epoll_ctl(loop->epoll_fd, EPOLL_CTL_DEL, fd, &event) != -1)
- loop->epoll_count--;
+ if (epoll_ctl(priv->epoll_fd, EPOLL_CTL_DEL, fd, &event) != -1)
+ priv->epoll_count--;
else if (errno != ENOENT) {
perror("epoll_ctl");
abort();
}
if (!events)
return;
- if (epoll_ctl(loop->epoll_fd, EPOLL_CTL_ADD, fd, &event) != -1)
- loop->epoll_count++;
+ if (epoll_ctl(priv->epoll_fd, EPOLL_CTL_ADD, fd, &event) != -1)
+ priv->epoll_count++;
else {
perror("epoll_ctl");
abort();
static void
on_success(netresolve_query_t query, void *user_data)
{
+ struct priv_async *priv = user_data;
int which = *(int *) netresolve_query_get_user_data(query);
- int *count = user_data;
switch (which) {
case 1:
abort();
}
- (*count)++;
+ priv->finished++;
}
int
main(int argc, char **argv)
{
- struct event_loop loop;
+ struct priv_async priv = { 0 };
netresolve_t channel;
netresolve_query_t query1, query2;
- int finished = 0;
const char *node1 = "1:2:3:4:5:6:7:8%999999";
const char *node2 = "1.2.3.4%999999";
int data1 = 1;
int protocol = IPPROTO_TCP;
/* Create epoll file descriptor. */
- loop.epoll_fd = epoll_create1(EPOLL_CLOEXEC);
- if (loop.epoll_fd == -1) {
+ priv.epoll_fd = epoll_create1(EPOLL_CLOEXEC);
+ if (priv.epoll_fd == -1) {
perror("epoll_create1");
abort();
}
- loop.epoll_count = 0;
+ priv.epoll_count = 0;
/* Create a channel. */
channel = netresolve_open();
}
/* Set callbacks. */
- netresolve_set_fd_callback(channel, watch_fd, &loop);
- netresolve_set_success_callback(channel, on_success, &finished);
+ netresolve_set_fd_callback(channel, watch_fd, &priv);
+ netresolve_set_success_callback(channel, on_success, &priv);
/* Resolver configuration. */
netresolve_set_family(channel, family);
assert(netresolve_query_get_user_data(query2) == &data2);
/* Run the main loop. */
- while (loop.epoll_count > 0) {
+ while (priv.epoll_count > 0) {
static const int maxevents = 10;
struct epoll_event events[maxevents];
int nevents;
int i;
- nevents = epoll_wait(loop.epoll_fd, events, maxevents, -1);
+ nevents = epoll_wait(priv.epoll_fd, events, maxevents, -1);
if (nevents == -1) {
perror("epoll_wait");
abort();
netresolve_dispatch_fd(channel, events[i].data.fd, events[i].events);
}
- assert(finished == 2);
+ assert(priv.finished == 2);
/* Clean up. */
netresolve_close(channel);
- close(loop.epoll_fd);
+ close(priv.epoll_fd);
- assert(loop.epoll_count == 0);
+ assert(priv.epoll_count == 0);
exit(EXIT_SUCCESS);
}