if (name[0] == 0 || name[0] == '/' || strstr(name, ":/")) {
return talloc_strdup(mem_ctx, name);
}
+ if (strncmp("tdb://", base_url, 6) == 0) {
+ base_url = base_url+6;
+ }
path = talloc_strdup(mem_ctx, base_url);
if (path == NULL) {
return NULL;
return full_name;
}
-struct cli_credentials *samdb_credentials(TALLOC_CTX *mem_ctx,
- struct tevent_context *event_ctx,
+/*
+ make sure the static credentials are not freed
+ */
+static int samdb_credentials_destructor(struct cli_credentials *creds)
+{
+ return -1;
+}
+
+/*
+ this returns a static set of system credentials. It is static so
+ that we always get the same pointer in ldb_wrap_connect()
+ */
+struct cli_credentials *samdb_credentials(struct tevent_context *event_ctx,
struct loadparm_context *lp_ctx)
{
- struct cli_credentials *cred = cli_credentials_init(mem_ctx);
+ static struct cli_credentials *static_credentials;
+ struct cli_credentials *cred;
+
+ if (static_credentials) {
+ return static_credentials;
+ }
+
+ cred = cli_credentials_init(talloc_autofree_context());
if (!cred) {
return NULL;
}
if (!NT_STATUS_IS_OK(cli_credentials_set_secrets(cred, event_ctx, lp_ctx, NULL, NULL,
SECRETS_LDAP_FILTER))) {
/* Perfectly OK - if not against an LDAP backend */
+ talloc_free(cred);
return NULL;
}
+ static_credentials = cred;
+ talloc_set_destructor(cred, samdb_credentials_destructor);
return cred;
}
struct ldb_context *ldb;
ldb = ldb_wrap_connect(mem_ctx, ev_ctx, lp_ctx,
lp_sam_url(lp_ctx), session_info,
- samdb_credentials(mem_ctx, ev_ctx, lp_ctx),
- 0, NULL);
+ samdb_credentials(ev_ctx, lp_ctx),
+ 0);
if (!ldb) {
return NULL;
}
- dsdb_make_schema_global(ldb);
return ldb;
}