static struct dns_connection *setup_connection(struct torture_context *tctx) { DNS_ERROR err; struct dns_connection *conn; err = dns_open_connection(getenv("DC_SERVER_IP"), DNS_TCP, tctx, &conn); if (!ERR_DNS_IS_OK(err)) { printf("Failed to open connection to DNS server\n"); return NULL; } return conn; }
DNS_ERROR dns_negotiate_sec_ctx( const char *target_realm, const char *servername, const char *keyname, gss_ctx_id_t *gss_ctx, enum dns_ServerType srv_type ) { OM_uint32 major, minor; char *upcaserealm, *targetname; DNS_ERROR err; gss_buffer_desc input_name; struct dns_connection *conn; gss_name_t targ_name; gss_OID_desc nt_host_oid_desc = {10, (const char *)"\x2a\x86\x48\x86\xf7\x12\x01\x02\x02\x01"}; TALLOC_CTX *mem_ctx; if (!(mem_ctx = talloc_init("dns_negotiate_sec_ctx"))) { return ERROR_DNS_NO_MEMORY; } err = dns_open_connection( servername, DNS_TCP, mem_ctx, &conn ); if (!ERR_DNS_IS_OK(err)) goto error; if (!(upcaserealm = talloc_strdup(mem_ctx, target_realm))) { err = ERROR_DNS_NO_MEMORY; goto error; } strupr(upcaserealm); if (!(targetname = talloc_asprintf(mem_ctx, "dns/%s@%s", servername, upcaserealm))) { err = ERROR_DNS_NO_MEMORY; goto error; } input_name.value = targetname; input_name.length = strlen(targetname); major = gss_import_name( &minor, &input_name, &nt_host_oid_desc, &targ_name ); if (major) { err = ERROR_DNS_GSS_ERROR; goto error; } err = dns_negotiate_gss_ctx_int(mem_ctx, conn, keyname, targ_name, gss_ctx, srv_type ); gss_release_name( &minor, &targ_name ); error: TALLOC_FREE(mem_ctx); return err; }