struct pdb_methods *m;
struct pdb_samba_dsdb_state *state;
NTSTATUS status;
+ char *errstring = NULL;
+ int ret;
if ( !NT_STATUS_IS_OK(status = make_pdb_method( &m )) ) {
return status;
goto nomem;
}
- if (location) {
- state->ldb = samdb_connect_url(state,
- state->ev,
- state->lp_ctx,
- system_session(state->lp_ctx),
- 0, location);
- } else {
- state->ldb = samdb_connect(state,
- state->ev,
- state->lp_ctx,
- system_session(state->lp_ctx), 0);
+ if (location == NULL) {
+ location = "sam.ldb";
}
+ ret = samdb_connect_url(state,
+ state->ev,
+ state->lp_ctx,
+ system_session(state->lp_ctx),
+ 0, location,
+ &state->ldb, &errstring);
+
if (!state->ldb) {
- DEBUG(0, ("samdb_connect failed\n"));
+ DEBUG(0, ("samdb_connect failed: %s: %s\n",
+ errstring, ldb_strerror(ret)));
status = NT_STATUS_INTERNAL_ERROR;
goto fail;
}
isc_result_t result;
struct ldb_dn *dn;
NTSTATUS nt_status;
+ int ret;
+ char *errstring = NULL;
if (dlz_bind9_state != NULL) {
*dbdata = dlz_bind9_state;
}
}
- state->samdb = samdb_connect_url(state, state->ev_ctx, state->lp,
- system_session(state->lp), 0, state->options.url);
- if (state->samdb == NULL) {
- state->log(ISC_LOG_ERROR, "samba_dlz: Failed to connect to %s",
- state->options.url);
+ ret = samdb_connect_url(state, state->ev_ctx, state->lp,
+ system_session(state->lp), 0,
+ state->options.url,
+ &state->samdb, &errstring);
+ if (ret != LDB_SUCCESS) {
+ state->log(ISC_LOG_ERROR,
+ "samba_dlz: Failed to connect to %s: %s",
+ errstring, ldb_strerror(ret));
result = ISC_R_FAILURE;
goto failed;
}
connect to the SAM database specified by URL
return an opaque context pointer on success, or NULL on failure
*/
-struct ldb_context *samdb_connect_url(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev_ctx,
- struct loadparm_context *lp_ctx,
- struct auth_session_info *session_info,
- unsigned int flags, const char *url)
+int samdb_connect_url(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev_ctx,
+ struct loadparm_context *lp_ctx,
+ struct auth_session_info *session_info,
+ unsigned int flags, const char *url,
+ struct ldb_context **ldb_ret,
+ char **errstring)
{
- struct ldb_context *ldb;
+ struct ldb_context *ldb = NULL;
int ret;
-
+ *ldb_ret = NULL;
+ *errstring = NULL;
ldb = ldb_wrap_find(url, ev_ctx, lp_ctx, session_info, NULL, flags);
- if (ldb != NULL)
- return talloc_reference(mem_ctx, ldb);
+ if (ldb != NULL) {
+ *ldb_ret = talloc_reference(mem_ctx, ldb);
+ if (*ldb_ret == NULL) {
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
+ return LDB_SUCCESS;
+ }
ldb = samba_ldb_init(mem_ctx, ev_ctx, lp_ctx, session_info, NULL);
- if (ldb == NULL)
- return NULL;
+ if (ldb == NULL) {
+ *errstring = talloc_asprintf(mem_ctx,
+ "Failed to set up Samba ldb "
+ "wrappers with samba_ldb_init() "
+ "to connect to %s",
+ url);
+ return LDB_ERR_OPERATIONS_ERROR;
+ }
dsdb_set_global_schema(ldb);
ret = samba_ldb_connect(ldb, lp_ctx, url, flags);
if (ret != LDB_SUCCESS) {
+ *errstring = talloc_asprintf(mem_ctx,
+ "Failed to connect to %s: %s",
+ url,
+ ldb_errstring(ldb));
talloc_free(ldb);
- return NULL;
+ return LDB_ERR_OPERATIONS_ERROR;
}
if (!ldb_wrap_add(url, ev_ctx, lp_ctx, session_info, NULL, flags, ldb)) {
+ *errstring = talloc_asprintf(mem_ctx,
+ "Failed to add cached DB reference"
+ " to %s",
+ url);
talloc_free(ldb);
- return NULL;
+ return LDB_ERR_OPERATIONS_ERROR;
}
- return ldb;
+ *ldb_ret = ldb;
+ return LDB_SUCCESS;
}
struct auth_session_info *session_info,
unsigned int flags)
{
- return samdb_connect_url(mem_ctx, ev_ctx, lp_ctx, session_info, flags, "sam.ldb");
+ char *errstring;
+ struct ldb_context *ldb;
+ int ret = samdb_connect_url(mem_ctx, ev_ctx, lp_ctx, session_info, flags,
+ "sam.ldb", &ldb, &errstring);
+ if (ret == LDB_SUCCESS) {
+ return ldb;
+ }
+ return NULL;
}
/****************************************************************************
const char *zone_name)
{
struct torture_context *tctx = talloc_get_type((void *)view, struct torture_context);
- struct ldb_context *samdb = samdb_connect_url(tctx, NULL, tctx->lp_ctx,
- system_session(tctx->lp_ctx),
- 0,
- test_dlz_bind9_binddns_dir(tctx, "dns/sam.ldb"));
+ struct ldb_context *samdb = NULL;
+ char *errstring = NULL;
+ int ret = samdb_connect_url(tctx, NULL, tctx->lp_ctx,
+ system_session(tctx->lp_ctx),
+ 0,
+ test_dlz_bind9_binddns_dir(tctx, "dns/sam.ldb"),
+ &samdb, &errstring);
struct ldb_message *msg;
- int ret;
const char *attrs[] = {
NULL
};
- if (!samdb) {
+ if (ret != LDB_SUCCESS) {
torture_fail(tctx, "Failed to connect to samdb");
return ISC_R_FAILURE;
}