[out,ref] samPwdChangeReason *reject_reason
);
+ typedef [enum16bit] enum {
+ WB_DOMINFO_DOMAIN_UNKNOWN = 0x0000,
+ WB_DOMINFO_DOMAIN_NATIVE = 0x0001,
+ WB_DOMINFO_DOMAIN_AD = 0x0002,
+ WB_DOMINFO_DOMAIN_PRIMARY = 0x0004,
+ WB_DOMINFO_DOMAIN_OFFLINE = 0x0008
+ } DomainInfoFlags;
+
+ NTSTATUS wbint_InitConnection(
+ [in,string,charset(UTF8)] char *dcname,
+ [out,string,charset(UTF8)] char **name,
+ [out,string,charset(UTF8)] char **alt_name,
+ [out,ref] dom_sid *sid,
+ [out,ref] DomainInfoFlags *flags
+ );
+
/* Public methods available via IRPC */
typedef [switch_type(uint16)] union netr_LogonLevel netr_LogonLevel;
#include "idmap.h"
#include "libcli/auth/netlogon_creds_cli.h"
#include "../lib/util/pidfile.h"
+#include "librpc/gen_ndr/ndr_winbind_c.h"
#undef DBGC_CLASS
#define DBGC_CLASS DBGC_WINBIND
struct winbindd_request *init_req;
struct winbindd_response *response;
struct tevent_req *pending_subreq;
+ struct wbint_InitConnection r;
};
static void wb_domain_request_cleanup(struct tevent_req *req,
if (IS_DC || domain->primary || domain->internal) {
/* The primary domain has to find the DC name itself */
- state->init_req->cmd = WINBINDD_INIT_CONNECTION;
- fstrcpy(state->init_req->domain_name, domain->name);
- state->init_req->data.init_conn.is_primary = domain->primary;
- fstrcpy(state->init_req->data.init_conn.dcname, "");
+ state->r.in.dcname = talloc_strdup(state, "");
+ if (tevent_req_nomem(state->r.in.dcname, req)) {
+ return;
+ }
- subreq = wb_child_request_send(state, state->ev, state->child,
- state->init_req);
+ subreq = dcerpc_wbint_InitConnection_r_send(state,
+ state->ev,
+ state->child->binding_handle,
+ &state->r);
if (tevent_req_nomem(subreq, req)) {
return;
}
while (dcname != NULL && *dcname == '\\') {
dcname++;
}
- state->init_req->cmd = WINBINDD_INIT_CONNECTION;
- fstrcpy(state->init_req->domain_name, state->domain->name);
- state->init_req->data.init_conn.is_primary = False;
- fstrcpy(state->init_req->data.init_conn.dcname,
- dcname);
+
+ state->r.in.dcname = talloc_strdup(state, dcname);
+ if (tevent_req_nomem(state->r.in.dcname, req)) {
+ return;
+ }
TALLOC_FREE(dcinfo);
- subreq = wb_child_request_send(state, state->ev, state->child,
- state->init_req);
+ subreq = dcerpc_wbint_InitConnection_r_send(state,
+ state->ev,
+ state->child->binding_handle,
+ &state->r);
if (tevent_req_nomem(subreq, req)) {
return;
}
subreq, struct tevent_req);
struct wb_domain_request_state *state = tevent_req_data(
req, struct wb_domain_request_state);
- struct winbindd_response *response;
- int ret, err;
+ NTSTATUS status;
state->pending_subreq = NULL;
- ret = wb_child_request_recv(subreq, talloc_tos(), &response, &err);
+ status = dcerpc_wbint_InitConnection_r_recv(subreq, state);
TALLOC_FREE(subreq);
- if (ret == -1) {
- tevent_req_error(req, err);
+ if (NT_STATUS_IS_ERR(status)) {
+ tevent_req_error(req, map_errno_from_nt_status(status));
return;
}
- if (!string_to_sid(&state->domain->sid,
- response->data.domain_info.sid)) {
- DEBUG(1,("init_child_recv: Could not convert sid %s "
- "from string\n", response->data.domain_info.sid));
- tevent_req_error(req, EINVAL);
+ status = state->r.out.result;
+ if (NT_STATUS_IS_ERR(status)) {
+ tevent_req_error(req, map_errno_from_nt_status(status));
return;
}
+ state->domain->sid = *state->r.out.sid;
+
talloc_free(state->domain->name);
- state->domain->name = talloc_strdup(state->domain,
- response->data.domain_info.name);
+ state->domain->name = talloc_strdup(state->domain, *state->r.out.name);
if (state->domain->name == NULL) {
tevent_req_error(req, ENOMEM);
return;
}
- if (response->data.domain_info.alt_name[0] != '\0') {
+ if (*state->r.out.alt_name != NULL &&
+ strlen(*state->r.out.alt_name) > 0) {
talloc_free(state->domain->alt_name);
state->domain->alt_name = talloc_strdup(state->domain,
- response->data.domain_info.alt_name);
+ *state->r.out.alt_name);
if (state->domain->alt_name == NULL) {
tevent_req_error(req, ENOMEM);
return;
}
}
- state->domain->native_mode = response->data.domain_info.native_mode;
+ state->domain->native_mode =
+ (*state->r.out.flags & WB_DOMINFO_DOMAIN_NATIVE);
state->domain->active_directory =
- response->data.domain_info.active_directory;
+ (*state->r.out.flags & WB_DOMINFO_DOMAIN_AD);
state->domain->initialized = true;
- TALLOC_FREE(response);
-
subreq = wb_child_request_send(state, state->ev, state->child,
state->request);
if (tevent_req_nomem(subreq, req)) {
#include "rpc_client/util_netlogon.h"
#include "libsmb/dsgetdcname.h"
#include "lib/global_contexts.h"
-#include "lib/util/string_wrappers.h"
NTSTATUS _wbint_Ping(struct pipes_struct *p, struct wbint_Ping *r)
{
return NT_STATUS_OK;
}
-enum winbindd_result winbindd_dual_init_connection(struct winbindd_domain *domain,
- struct winbindd_cli_state *state)
+NTSTATUS _wbint_InitConnection(struct pipes_struct *p,
+ struct wbint_InitConnection *r)
{
- /* Ensure null termination */
- state->request->domain_name
- [sizeof(state->request->domain_name)-1]='\0';
- state->request->data.init_conn.dcname
- [sizeof(state->request->data.init_conn.dcname)-1]='\0';
+ struct winbindd_domain *domain = wb_child_domain();
- if (strlen(state->request->data.init_conn.dcname) > 0) {
+ if (r->in.dcname != NULL && strlen(r->in.dcname) > 0) {
TALLOC_FREE(domain->dcname);
- domain->dcname = talloc_strdup(domain,
- state->request->data.init_conn.dcname);
+ domain->dcname = talloc_strdup(domain, r->in.dcname);
if (domain->dcname == NULL) {
- return WINBINDD_ERROR;
+ return NT_STATUS_NO_MEMORY;
}
}
domain->name, (int)domain->online);
}
- fstrcpy(state->response->data.domain_info.name, domain->name);
- fstrcpy(state->response->data.domain_info.alt_name, domain->alt_name);
- sid_to_fstring(state->response->data.domain_info.sid, &domain->sid);
+ *r->out.name = talloc_strdup(p->mem_ctx, domain->name);
+ if (*r->out.name == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
- state->response->data.domain_info.native_mode
- = domain->native_mode;
- state->response->data.domain_info.active_directory
- = domain->active_directory;
- state->response->data.domain_info.primary
- = domain->primary;
+ if (domain->alt_name != NULL) {
+ *r->out.alt_name = talloc_strdup(p->mem_ctx, domain->alt_name);
+ if (*r->out.alt_name == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ }
- return WINBINDD_OK;
+ r->out.sid = dom_sid_dup(p->mem_ctx, &domain->sid);
+ if (r->out.sid == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ *r->out.flags = 0;
+ if (domain->native_mode) {
+ *r->out.flags |= WB_DOMINFO_DOMAIN_NATIVE;
+ }
+ if (domain->active_directory) {
+ *r->out.flags |= WB_DOMINFO_DOMAIN_AD;
+ }
+ if (domain->primary) {
+ *r->out.flags |= WB_DOMINFO_DOMAIN_PRIMARY;
+ }
+
+ return NT_STATUS_OK;
}
bool reset_cm_connection_on_error(struct winbindd_domain *domain,