summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/utils/net_rpc_samsync.c71
1 files changed, 40 insertions, 31 deletions
diff --git a/source3/utils/net_rpc_samsync.c b/source3/utils/net_rpc_samsync.c
index bc07341674..af23b3c609 100644
--- a/source3/utils/net_rpc_samsync.c
+++ b/source3/utils/net_rpc_samsync.c
@@ -356,7 +356,14 @@ static NTSTATUS samsync_init_context(TALLOC_CTX *mem_ctx,
NT_STATUS_HAVE_NO_MEMORY(ctx);
ctx->mode = mode;
- ctx->domain_sid = domain_sid;
+
+ if (domain_sid) {
+ ctx->domain_sid = sid_dup_talloc(mem_ctx, domain_sid);
+ NT_STATUS_HAVE_NO_MEMORY(ctx->domain_sid);
+
+ ctx->domain_sid_str = sid_string_talloc(mem_ctx, ctx->domain_sid);
+ NT_STATUS_HAVE_NO_MEMORY(ctx->domain_sid_str);
+ }
*ctx_p = ctx;
@@ -2079,8 +2086,10 @@ static NTSTATUS fetch_groupmem_info_to_ldif(struct netr_DELTA_GROUP_MEMBER *r,
****************************************************************/
static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx,
- struct samsync_context *ctx,
- enum netr_SamDatabaseID database_id)
+ enum netr_SamDatabaseID database_id,
+ const char *ldif_filename,
+ const char *domain_sid_str,
+ struct samsync_ldif_context **ctx)
{
NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
struct samsync_ldif_context *r;
@@ -2088,13 +2097,6 @@ static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx,
const char *mod_template = "/tmp/mod.ldif.XXXXXX";
const char *builtin_sid = "S-1-5-32";
- if (ctx->ldif && ctx->ldif->initialized) {
- return NT_STATUS_OK;
- }
-
- r = TALLOC_ZERO_P(mem_ctx, struct samsync_ldif_context);
- NT_STATUS_HAVE_NO_MEMORY(r);
-
/* Get other smb.conf data */
if (!(lp_workgroup()) || !*(lp_workgroup())) {
DEBUG(0,("workgroup missing from smb.conf--exiting\n"));
@@ -2102,26 +2104,31 @@ static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx,
}
/* Get the ldap suffix */
- r->suffix = lp_ldap_suffix();
- if (r->suffix == NULL || strcmp(r->suffix, "") == 0) {
+ if (!(lp_ldap_suffix()) || !*(lp_ldap_suffix())) {
DEBUG(0,("ldap suffix missing from smb.conf--exiting\n"));
exit(1);
}
- /* Get the sid */
- ctx->domain_sid_str = sid_string_talloc(mem_ctx, ctx->domain_sid);
- NT_STATUS_HAVE_NO_MEMORY(ctx->domain_sid_str);
+ if (*ctx && (*ctx)->initialized) {
+ return NT_STATUS_OK;
+ }
+
+ r = TALLOC_ZERO_P(mem_ctx, struct samsync_ldif_context);
+ NT_STATUS_HAVE_NO_MEMORY(r);
+
+ /* Get the ldap suffix */
+ r->suffix = lp_ldap_suffix();
/* Ensure we have an output file */
- if (ctx->ldif_filename) {
- r->ldif_file = fopen(ctx->ldif_filename, "a");
+ if (ldif_filename) {
+ r->ldif_file = fopen(ldif_filename, "a");
} else {
r->ldif_file = stdout;
}
if (!r->ldif_file) {
- fprintf(stderr, "Could not open %s\n", ctx->ldif_filename);
- DEBUG(1, ("Could not open %s\n", ctx->ldif_filename));
+ fprintf(stderr, "Could not open %s\n", ldif_filename);
+ DEBUG(1, ("Could not open %s\n", ldif_filename));
status = NT_STATUS_UNSUCCESSFUL;
goto done;
}
@@ -2167,7 +2174,7 @@ static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx,
/* Initial database population */
if (database_id == SAM_DATABASE_DOMAIN) {
- status = populate_ldap_for_ldif(ctx->domain_sid_str,
+ status = populate_ldap_for_ldif(domain_sid_str,
r->suffix,
builtin_sid,
r->add_file);
@@ -2178,7 +2185,7 @@ static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx,
status = map_populate_groups(mem_ctx,
r->groupmap,
r->accountmap,
- ctx->domain_sid_str,
+ domain_sid_str,
r->suffix,
builtin_sid);
if (!NT_STATUS_IS_OK(status)) {
@@ -2188,7 +2195,7 @@ static NTSTATUS ldif_init_context(TALLOC_CTX *mem_ctx,
r->initialized = true;
- ctx->ldif = r;
+ *ctx = r;
return NT_STATUS_OK;
done:
@@ -2237,10 +2244,8 @@ static void ldif_free_context(struct samsync_ldif_context *r)
****************************************************************/
static void ldif_write_output(enum netr_SamDatabaseID database_id,
- struct samsync_context *ctx)
+ struct samsync_ldif_context *l)
{
- struct samsync_ldif_context *l = ctx->ldif;
-
/* Write ldif data to the user's file */
if (database_id == SAM_DATABASE_DOMAIN) {
fprintf(l->ldif_file,
@@ -2407,7 +2412,11 @@ static NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx,
int i;
uint32_t g_index = 0, a_index = 0;
- status = ldif_init_context(mem_ctx, ctx, database_id);
+ status = ldif_init_context(mem_ctx,
+ database_id,
+ ctx->ldif_filename,
+ ctx->domain_sid_str,
+ &ctx->ldif);
if (!NT_STATUS_IS_OK(status)) {
goto failed;
}
@@ -2428,7 +2437,7 @@ static NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx,
/* This was the last query */
if (NT_STATUS_IS_OK(result)) {
- ldif_write_output(database_id, ctx);
+ ldif_write_output(database_id, ctx->ldif);
ldif_free_context(ctx->ldif);
ctx->ldif = NULL;
}
@@ -2500,7 +2509,6 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
}
/* fetch domain */
- ctx->domain_sid = domain_sid;
result = process_database(pipe_hnd, SAM_DATABASE_DOMAIN,
fetch_sam_entries, ctx);
if (!NT_STATUS_IS_OK(result)) {
@@ -2513,7 +2521,8 @@ NTSTATUS rpc_vampire_internals(struct net_context *c,
}
/* fetch builtin */
- ctx->domain_sid = &global_sid_Builtin;
+ ctx->domain_sid = sid_dup_talloc(mem_ctx, &global_sid_Builtin);
+ ctx->domain_sid_str = sid_string_talloc(mem_ctx, ctx->domain_sid);
result = process_database(pipe_hnd, SAM_DATABASE_BUILTIN,
fetch_sam_entries, ctx);
if (!NT_STATUS_IS_OK(result)) {
@@ -2553,7 +2562,6 @@ NTSTATUS rpc_vampire_ldif_internals(struct net_context *c,
}
/* fetch domain */
- ctx->domain_sid = domain_sid;
status = process_database(pipe_hnd, SAM_DATABASE_DOMAIN,
fetch_sam_entries_ldif, ctx);
if (!NT_STATUS_IS_OK(status)) {
@@ -2566,7 +2574,8 @@ NTSTATUS rpc_vampire_ldif_internals(struct net_context *c,
}
/* fetch builtin */
- ctx->domain_sid = &global_sid_Builtin;
+ ctx->domain_sid = sid_dup_talloc(mem_ctx, &global_sid_Builtin);
+ ctx->domain_sid_str = sid_string_talloc(mem_ctx, ctx->domain_sid);
status = process_database(pipe_hnd, SAM_DATABASE_BUILTIN,
fetch_sam_entries_ldif, ctx);
if (!NT_STATUS_IS_OK(status)) {