start(netresolve_backend_t resolver, char **settings)
{
const char *node = netresolve_backend_get_node(resolver);
- bool loopback = netresolve_backend_get_flag(resolver, NETRESOLVE_FLAG_DEFAULT_LOOPBACK);
/* Fail for non-NULL node name and when defaulting to loopback is requested. */
- if (loopback || (node && *node)) {
+ if (netresolve_backend_get_default_loopback(resolver) || (node && *node)) {
netresolve_backend_failed(resolver);
return;
}
struct addrinfo *result;
int status;
- if (!netresolve_backend_get_flag(resolver, NETRESOLVE_FLAG_DEFAULT_LOOPBACK))
+ if (!netresolve_backend_get_default_loopback(resolver))
hints.ai_flags |= AI_PASSIVE;
status = getaddrinfo(node, service, &hints, &result);
if (!hints)
hints = &default_hints;
- if (hints->ai_flags & AI_PASSIVE)
- netresolve_unset_flag(resolver, NETRESOLVE_FLAG_DEFAULT_LOOPBACK);
- else
- netresolve_set_flag(resolver, NETRESOLVE_FLAG_DEFAULT_LOOPBACK);
+ netresolve_set_default_loopback(resolver, !(hints->ai_flags & AI_PASSIVE));
status = netresolve_resolve(resolver, node, service, hints->ai_family, hints->ai_socktype, hints->ai_protocol);
int netresolve_backend_get_family(netresolve_backend_t resolver);
int netresolve_backend_get_protocol(netresolve_backend_t resolver);
int netresolve_backend_get_socktype(netresolve_backend_t resolver);
-bool netresolve_backend_get_flag(netresolve_backend_t resolver, netresolve_flag_t flag);
+bool netresolve_backend_get_default_loopback(netresolve_backend_t resolver);
/* Output */
void netresolve_backend_add_path(netresolve_backend_t resolver,
#ifndef NETRESOLVE_COMMON_H
#define NETRESOLVE_COMMON_H
-typedef enum netresolve_flag {
- /* NETRESOLVE_FLAG_DEFAULT_LOOPBACK:
- *
- * Translate `NULL` to `127.0.0.1` and `::1` instead of `0.0.0.0` and
- * `::`. Implemented together by `any` and `loopback`. Passed reversed
- * as `AI_PASSIVE` to `getaddrinfo()`.
- */
- NETRESOLVE_FLAG_DEFAULT_LOOPBACK, // reversed AI_PASSIVE
- // NETRESOLVE_FLAG_ADDRCONFIG,
- // NETRESOLVE_FLAG_NUMERICHOST,
- // AI_V4MAPPED, AI_ALL
- // NETRESOLVE_FLAG_NUMERICSERV,
- // NETRESOLVE_FLAG_CANONNAME,
- _NETRESOLVE_FLAG_COUNT
-} netresolve_flag_t;
-
#endif /* NETRESOLVE_COMMON_H */
/* Configuration API */
void netresolve_set_log_level(netresolve_t resolver, int level);
void netresolve_set_backend_string(netresolve_t resolver, const char *string);
-void netresolve_set_flag(netresolve_t resolver, netresolve_flag_t flag);
-void netresolve_unset_flag(netresolve_t resolver, netresolve_flag_t flag);
+void netresolve_set_default_loopback(netresolve_t resolver, bool value);
/* Callback API */
typedef void (*netresolve_callback_t)(netresolve_t resolver, void *user_data);
}
bool
-netresolve_backend_get_flag(netresolve_backend_t resolver, netresolve_flag_t flag)
+netresolve_backend_get_default_loopback(netresolve_backend_t resolver)
{
- return resolver->request.flags & (1 << flag);
+ return resolver->request.default_loopback;
}
static size_t
const char *service;
int socktype;
int protocol;
- /* See `netresolve-common.h` for details. */
- int flags;
+ /* Advanced configuration */
+ bool default_loopback;
} request;
struct netresolve_response {
struct netresolve_path *paths;
resolver->first_connect_timeout = -1;
- if (strtob(secure_getenv("NETRESOLVE_FLAG_DEFAULT_LOOPBACK")))
- netresolve_set_flag(resolver, NETRESOLVE_FLAG_DEFAULT_LOOPBACK);
+ netresolve_set_default_loopback(resolver, strtob(secure_getenv("NETRESOLVE_FLAG_DEFAULT_LOOPBACK")));
return resolver;
}
}
void
-netresolve_set_flag(netresolve_t resolver, netresolve_flag_t flag)
+netresolve_set_default_loopback(netresolve_t resolver, bool value)
{
- if (flag >= _NETRESOLVE_FLAG_COUNT)
- return;
-
- resolver->request.flags |= (1 << flag);
-}
-
-void
-netresolve_unset_flag(netresolve_t resolver, netresolve_flag_t flag)
-{
- if (flag >= _NETRESOLVE_FLAG_COUNT)
- return;
-
- resolver->request.flags &= ~(1 << flag);
+ resolver->request.default_loopback = value;
}
void
resolver->callbacks.on_connect = NULL;
resolver->callbacks.user_data_sock = user_data;
- netresolve_unset_flag(resolver, NETRESOLVE_FLAG_DEFAULT_LOOPBACK);
+ netresolve_set_default_loopback(resolver, false);
}
void
resolver->callbacks.on_connect = on_connect;
resolver->callbacks.user_data_sock = user_data;
- netresolve_set_flag(resolver, NETRESOLVE_FLAG_DEFAULT_LOOPBACK);
+ netresolve_set_default_loopback(resolver, true);
}
static struct netresolve_backend *