#include "heimdal/lib/roken/resolve.h"
struct dns_ex_state {
- bool do_getaddrinfo;
bool do_fallback;
- bool do_srv;
uint32_t flags;
uint16_t port;
struct nbt_name name;
char *addrs;
bool first;
uint32_t i;
+ bool do_srv = (state->flags & RESOLVE_NAME_FLAG_DNS_SRV);
/* this is the blocking call we are going to lots of trouble
to avoid in the parent */
- reply = dns_lookup(state->name.name, state->do_srv?"SRV":"A");
+ reply = dns_lookup(state->name.name, do_srv?"SRV":"A");
if (!reply) {
goto done;
}
- if (state->do_srv) {
+ if (do_srv) {
dns_srv_order(reply);
}
continue;
}
- if (state->do_srv) {
+ if (do_srv) {
/* we are only interested in SRV records */
if (rr->type != T_SRV) {
continue;
continue;
}
- if (state->do_srv) {
+ if (do_srv) {
/* we are only interested in SRV records */
if (rr->type != T_SRV) {
continue;
}
first = true;
for (i=0; i < count; i++) {
+ uint16_t port;
if (!addrs_rr[i]) {
continue;
}
+
+ if (srv_rr[i] &&
+ (state->flags & RESOLVE_NAME_FLAG_OVERWRITE_PORT)) {
+ port = srv_rr[i]->u.srv->port;
+ } else {
+ port = state->port;
+ }
+
addrs = talloc_asprintf_append_buffer(addrs, "%s%s:%u/%s",
first?"":",",
inet_ntoa(*addrs_rr[i]->u.a),
- state->port,
+ port,
addrs_rr[i]->domain);
if (!addrs) {
goto done;
uint32_t flags,
uint16_t port,
struct nbt_name *name,
- bool do_getaddrinfo,
- bool do_fallback,
- bool do_srv)
+ bool do_fallback)
{
struct composite_context *c;
struct dns_ex_state *state;
c = composite_create(mem_ctx, event_ctx);
if (c == NULL) return NULL;
- if (composite_nomem(c->event_ctx, c)) return c;
+ if (flags & RESOLVE_NAME_FLAG_FORCE_NBT) {
+ composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+ return c;
+ }
state = talloc_zero(c, struct dns_ex_state);
if (composite_nomem(state, c)) return c;
return c;
}
- state->do_getaddrinfo = do_getaddrinfo;
state->do_fallback = do_fallback;
- state->do_srv = do_srv;
state->flags = flags;
state->port = port;
if (state->child == 0) {
close(fd[0]);
- if (state->do_getaddrinfo) {
- run_child_getaddrinfo(state, fd[1]);
- } else {
+ if (state->flags & RESOLVE_NAME_FLAG_FORCE_DNS) {
run_child_dns_lookup(state, fd[1]);
+ } else {
+ run_child_getaddrinfo(state, fd[1]);
}
_exit(0);
}
c = composite_create(mem_ctx, event_ctx);
if (c == NULL) return NULL;
- if (composite_nomem(c->event_ctx, c)) return c;
+ if (flags & RESOLVE_NAME_FLAG_FORCE_DNS) {
+ composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+ return c;
+ }
+
+ if (strlen(name->name) > 15) {
+ composite_error(c, NT_STATUS_OBJECT_NAME_NOT_FOUND);
+ return c;
+ }
state = talloc(c, struct nbtlist_state);
if (composite_nomem(state, c)) return c;
struct event_context;
#include "../libcli/nbt/libnbt.h"
+
+/* force that only NBT name resolution is used */
+#define RESOLVE_NAME_FLAG_FORCE_NBT 0x00000001
+/* force that only DNS name resolution is used */
+#define RESOLVE_NAME_FLAG_FORCE_DNS 0x00000002
+/* tell the dns resolver to do a DNS SRV lookup */
+#define RESOLVE_NAME_FLAG_DNS_SRV 0x00000004
+/* allow the resolver to overwrite the given port, e.g. for DNS SRV */
+#define RESOLVE_NAME_FLAG_OVERWRITE_PORT 0x00000008
+
typedef struct composite_context *(*resolve_name_send_fn)(TALLOC_CTX *mem_ctx,
struct event_context *,
void *privdata,