The cleanup function also retrieves the state object, removes remaining watchers using `netresolve_backend_watch_fd()` and/or `netresolve_backend_remove_timeout()`, closes open file descriptors, returns allocated memory (except the context object itself which is freed by netresolve itself).
+Calls to the above functions in a single backend are serialized, calling a backend API function doesn't cause any side effects for the backend.
+
## Known bugs
The library doesn't currently sort paths according to their priority and/or RFC rules. The c-ares library blocks when /etc/resolv.conf is empty instead of quitting immediately, which in turn breaks tests when offline. The DNS backend doesn't support search domains. For more information, see the `TODO` file.
return "connecting";
case NETRESOLVE_STATE_DONE:
return "done";
+ case NETRESOLVE_STATE_ERROR:
+ return "error";
case NETRESOLVE_STATE_FAILED:
return "failed";
}
setup(query, backend->settings + 1);
if (query->state == NETRESOLVE_STATE_SETUP)
netresolve_query_set_state(query, NETRESOLVE_STATE_WAITING);
+ if (query->state == NETRESOLVE_STATE_ERROR)
+ netresolve_query_set_state(query, NETRESOLVE_STATE_FAILED);
} else
netresolve_query_set_state(query, NETRESOLVE_STATE_FAILED);
}
abort();
}
netresolve_watch_fd(query->channel, query->delayed_fd, POLLIN);
- } else
- netresolve_query_set_state(query, NETRESOLVE_STATE_CONNECTING);
+ }
break;
case NETRESOLVE_STATE_CONNECTING:
cleanup_query(query);
if (query->channel->callbacks.on_success)
query->channel->callbacks.on_success(query, query->channel->callbacks.user_data);
break;
+ case NETRESOLVE_STATE_ERROR:
+ break;
case NETRESOLVE_STATE_FAILED:
if (query->response.pathcount)
error("Failed reply has data.");
switch (query->state) {
case NETRESOLVE_STATE_WAITING_MORE:
case NETRESOLVE_STATE_WAITING:
- return backend && backend->dispatch && (backend->dispatch(query, fd, events), true);
+ if (backend && backend->dispatch) {
+ backend->dispatch(query, fd, events);
+ if (query->state == NETRESOLVE_STATE_RESOLVED)
+ netresolve_query_set_state(query, NETRESOLVE_STATE_CONNECTING);
+ if (query->state == NETRESOLVE_STATE_ERROR)
+ netresolve_query_set_state(query, NETRESOLVE_STATE_FAILED);
+ return true;
+ }
+ return false;
case NETRESOLVE_STATE_RESOLVED:
return dispatch_timeout(query, &query->delayed_fd, NETRESOLVE_STATE_CONNECTING, fd, events);
case NETRESOLVE_STATE_CONNECTING: