s3-libnet-samsync: move all modules to startup,process,finish callbacks.
authorGünther Deschner <gd@samba.org>
Mon, 17 Nov 2008 18:34:56 +0000 (19:34 +0100)
committerGünther Deschner <gd@samba.org>
Tue, 18 Nov 2008 15:04:54 +0000 (16:04 +0100)
Guenther

source3/libnet/libnet_samsync.c
source3/libnet/libnet_samsync.h
source3/libnet/libnet_samsync_display.c
source3/libnet/libnet_samsync_keytab.c
source3/libnet/libnet_samsync_ldif.c
source3/libnet/libnet_samsync_passdb.c

index ab7ca21bda941e9765316d491ba53f6fd54c172a..ff2ba951bfc7e958fa7d483afcb04767a604e33e 100644 (file)
@@ -423,7 +423,6 @@ static NTSTATUS libnet_samsync_delta(enum netr_SamDatabaseID database_id,
                /* Process results */
                callback_status = ctx->ops->process_objects(mem_ctx, database_id,
                                                            delta_enum_array,
-                                                           NT_STATUS_IS_OK(result),
                                                            ctx);
                if (!NT_STATUS_IS_OK(callback_status)) {
                        result = callback_status;
index 23a3746fc917c83d6e6a444b6c1ef043b60f9e7f..cbd35fa327a0093676ccd0c77622213fe3eb223e 100644 (file)
@@ -35,7 +35,6 @@ struct samsync_ops {
        NTSTATUS (*process_objects)(TALLOC_CTX *mem_ctx,
                                    enum netr_SamDatabaseID id,
                                    struct netr_DELTA_ENUM_ARRAY *array,
-                                   bool last_query,
                                    struct samsync_context *ctx);
        NTSTATUS (*finish)(TALLOC_CTX *mem_ctx,
                           struct samsync_context *ctx,
index 5fdf327b741c319964d1de51083837c45889afc9..675fcd5a0dc96f134708d669567df9ddf93ae402 100644 (file)
@@ -163,7 +163,6 @@ static void display_rename_alias(uint32_t rid, struct netr_DELTA_RENAME *r)
 static NTSTATUS display_sam_entry(TALLOC_CTX *mem_ctx,
                                  enum netr_SamDatabaseID database_id,
                                  struct netr_DELTA_ENUM *r,
-                                 bool last_query,
                                  struct samsync_context *ctx)
 {
        union netr_DELTA_UNION u = r->delta_union;
@@ -288,14 +287,13 @@ static NTSTATUS display_sam_entry(TALLOC_CTX *mem_ctx,
 static NTSTATUS display_sam_entries(TALLOC_CTX *mem_ctx,
                                    enum netr_SamDatabaseID database_id,
                                    struct netr_DELTA_ENUM_ARRAY *r,
-                                   bool last_query,
                                    struct samsync_context *ctx)
 {
        int i;
 
        for (i = 0; i < r->num_deltas; i++) {
                display_sam_entry(mem_ctx, database_id, &r->delta_enum[i],
-                                 last_query, ctx);
+                                 ctx);
        }
 
        return NT_STATUS_OK;
index 679f9df480277bb9f4e1d11c1bd6550fc57c6ec3..4ec03af8863983b9937858d658fa3477e8513d2e 100644 (file)
@@ -75,7 +75,6 @@ static NTSTATUS fetch_sam_entry_keytab(TALLOC_CTX *mem_ctx,
                                       enum netr_SamDatabaseID database_id,
                                       uint32_t rid,
                                       struct netr_DELTA_USER *r,
-                                      bool last_query,
                                       struct libnet_keytab_context *ctx)
 {
        NTSTATUS status;
@@ -105,35 +104,50 @@ static NTSTATUS fetch_sam_entry_keytab(TALLOC_CTX *mem_ctx,
 /****************************************************************
 ****************************************************************/
 
-static NTSTATUS fetch_sam_entries_keytab(TALLOC_CTX *mem_ctx,
-                                        enum netr_SamDatabaseID database_id,
-                                        struct netr_DELTA_ENUM_ARRAY *r,
-                                        bool last_query,
-                                        struct samsync_context *ctx)
+static NTSTATUS init_keytab(TALLOC_CTX *mem_ctx,
+                           struct samsync_context *ctx,
+                           enum netr_SamDatabaseID database_id,
+                           uint64_t *sequence_num)
 {
-       NTSTATUS status = NT_STATUS_OK;
        krb5_error_code ret = 0;
-       static struct libnet_keytab_context *keytab_ctx = NULL;
-       int i;
+       NTSTATUS status;
+       struct libnet_keytab_context *keytab_ctx;
 
-       if (!keytab_ctx) {
-               ret = libnet_keytab_init(mem_ctx, ctx->output_filename,
-                                        &keytab_ctx);
-               if (ret) {
-                       status = krb5_to_nt_status(ret);
-                       goto out;
-               }
+       ret = libnet_keytab_init(mem_ctx, ctx->output_filename, &keytab_ctx);
+       if (ret) {
+               return krb5_to_nt_status(ret);
        }
 
+       keytab_ctx->clean_old_entries = ctx->clean_old_entries;
+       ctx->private_data = keytab_ctx;
+
        status = keytab_ad_connect(mem_ctx,
                                   ctx->domain_name,
                                   ctx->username,
                                   ctx->password,
                                   keytab_ctx);
        if (!NT_STATUS_IS_OK(status)) {
-               goto out;
+               TALLOC_FREE(keytab_ctx);
+               return status;
        }
 
+       return status;
+}
+
+/****************************************************************
+****************************************************************/
+
+static NTSTATUS fetch_sam_entries_keytab(TALLOC_CTX *mem_ctx,
+                                        enum netr_SamDatabaseID database_id,
+                                        struct netr_DELTA_ENUM_ARRAY *r,
+                                        struct samsync_context *ctx)
+{
+       struct libnet_keytab_context *keytab_ctx =
+               (struct libnet_keytab_context *)ctx->private_data;
+
+       NTSTATUS status = NT_STATUS_OK;
+       int i;
+
        for (i = 0; i < r->num_deltas; i++) {
 
                if (r->delta_enum[i].delta_type != NETR_DELTA_USER) {
@@ -143,52 +157,78 @@ static NTSTATUS fetch_sam_entries_keytab(TALLOC_CTX *mem_ctx,
                status = fetch_sam_entry_keytab(mem_ctx, database_id,
                                                r->delta_enum[i].delta_id_union.rid,
                                                r->delta_enum[i].delta_union.user,
-                                               last_query,
                                                keytab_ctx);
                if (!NT_STATUS_IS_OK(status)) {
                        goto out;
                }
        }
+ out:
+       return status;
+}
 
-       if (last_query) {
-
-               ret = libnet_keytab_add(keytab_ctx);
-               if (ret) {
-                       status = krb5_to_nt_status(ret);
-                       ctx->error_message = talloc_asprintf(mem_ctx,
-                               "Failed to add entries to keytab %s: %s",
-                               keytab_ctx->keytab_name, error_message(ret));
-                       goto out;
-               }
+/****************************************************************
+****************************************************************/
 
-               ctx->result_message = talloc_asprintf(mem_ctx,
-                       "Vampired %d accounts to keytab %s",
-                       keytab_ctx->count,
-                       keytab_ctx->keytab_name);
+static NTSTATUS close_keytab(TALLOC_CTX *mem_ctx,
+                            struct samsync_context *ctx,
+                            enum netr_SamDatabaseID database_id,
+                            uint64_t sequence_num)
+{
+       struct libnet_keytab_context *keytab_ctx =
+               (struct libnet_keytab_context *)ctx->private_data;
+       krb5_error_code ret;
+       NTSTATUS status;
 
+       ret = libnet_keytab_add(keytab_ctx);
+       if (ret) {
+               status = krb5_to_nt_status(ret);
+               ctx->error_message = talloc_asprintf(ctx,
+                       "Failed to add entries to keytab %s: %s",
+                       keytab_ctx->keytab_name, error_message(ret));
                TALLOC_FREE(keytab_ctx);
+               return status;
        }
 
-       return NT_STATUS_OK;
- out:
+       ctx->result_message = talloc_asprintf(ctx,
+               "Vampired %d accounts to keytab %s",
+               keytab_ctx->count,
+               keytab_ctx->keytab_name);
+
        TALLOC_FREE(keytab_ctx);
 
-       return status;
+       return NT_STATUS_OK;
 }
 
 #else
 
+static NTSTATUS init_keytab(TALLOC_CTX *mem_ctx,
+                           struct samsync_context *ctx,
+                           enum netr_SamDatabaseID database_id,
+                           uint64_t *sequence_num)
+{
+       return NT_STATUS_NOT_SUPPORTED;
+}
+
 static NTSTATUS fetch_sam_entries_keytab(TALLOC_CTX *mem_ctx,
                                         enum netr_SamDatabaseID database_id,
                                         struct netr_DELTA_ENUM_ARRAY *r,
-                                        bool last_query,
                                         struct samsync_context *ctx)
 {
        return NT_STATUS_NOT_SUPPORTED;
 }
 
+static NTSTATUS close_keytab(TALLOC_CTX *mem_ctx,
+                            struct samsync_context *ctx,
+                            enum netr_SamDatabaseID database_id,
+                            uint64_t sequence_num)
+{
+       return NT_STATUS_NOT_SUPPORTED;
+}
+
 #endif /* defined(HAVE_ADS) && defined(ENCTYPE_ARCFOUR_HMAC) */
 
 const struct samsync_ops libnet_samsync_keytab_ops = {
+       .startup                = init_keytab,
        .process_objects        = fetch_sam_entries_keytab,
+       .finish                 = close_keytab
 };
index 7f794e7d8c6f48b60e49107b7826ff03edcac016..495a828749de19b8c73cfe52bf37a0b033517591 100644 (file)
 static uint32 ldif_gid = 999;
 static uint32 ldif_uid = 999;
 
+/* global counters */
+static uint32_t g_index = 0;
+static uint32_t a_index = 0;
+
 /* Structure for mapping accounts to groups */
 /* Array element is the group rid */
 typedef struct _groupmap {
@@ -1046,8 +1050,8 @@ static NTSTATUS fetch_sam_entry_ldif(TALLOC_CTX *mem_ctx,
                                     enum netr_SamDatabaseID database_id,
                                     struct netr_DELTA_ENUM *r,
                                     struct samsync_context *ctx,
-                                    uint32_t *a_index,
-                                    uint32_t *g_index)
+                                    uint32_t *a_index_p,
+                                    uint32_t *g_index_p)
 {
        union netr_DELTA_UNION u = r->delta_union;
        union netr_DELTA_ID_UNION id = r->delta_id_union;
@@ -1061,34 +1065,34 @@ static NTSTATUS fetch_sam_entry_ldif(TALLOC_CTX *mem_ctx,
                case NETR_DELTA_GROUP:
                        fetch_group_info_to_ldif(mem_ctx,
                                                 u.group,
-                                                &l->groupmap[*g_index],
+                                                &l->groupmap[*g_index_p],
                                                 l->add_file,
                                                 ctx->domain_sid_str,
                                                 l->suffix);
-                       (*g_index)++;
+                       (*g_index_p)++;
                        break;
 
                case NETR_DELTA_USER:
                        fetch_account_info_to_ldif(mem_ctx,
                                                   u.user,
                                                   l->groupmap,
-                                                  &l->accountmap[*a_index],
+                                                  &l->accountmap[*a_index_p],
                                                   l->add_file,
                                                   ctx->domain_sid_str,
                                                   l->suffix,
                                                   l->num_alloced);
-                       (*a_index)++;
+                       (*a_index_p)++;
                        break;
 
                case NETR_DELTA_ALIAS:
                        fetch_alias_info_to_ldif(mem_ctx,
                                                 u.alias,
-                                                &l->groupmap[*g_index],
+                                                &l->groupmap[*g_index_p],
                                                 l->add_file,
                                                 ctx->domain_sid_str,
                                                 l->suffix,
                                                 database_id);
-                       (*g_index)++;
+                       (*g_index_p)++;
                        break;
 
                case NETR_DELTA_GROUP_MEMBER:
@@ -1156,15 +1160,12 @@ static NTSTATUS ldif_realloc_maps(TALLOC_CTX *mem_ctx,
 /****************************************************************
 ****************************************************************/
 
-static NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx,
-                                      enum netr_SamDatabaseID database_id,
-                                      struct netr_DELTA_ENUM_ARRAY *r,
-                                      bool last_query,
-                                      struct samsync_context *ctx)
+static NTSTATUS init_ldif(TALLOC_CTX *mem_ctx,
+                         struct samsync_context *ctx,
+                         enum netr_SamDatabaseID database_id,
+                         uint64_t *sequence_num)
 {
        NTSTATUS status;
-       int i;
-       uint32_t g_index = 0, a_index = 0;
        struct samsync_ldif_context *ldif_ctx =
                (struct samsync_ldif_context *)ctx->private_data;
 
@@ -1174,11 +1175,27 @@ static NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx,
                                   ctx->domain_sid_str,
                                   &ldif_ctx);
        if (!NT_STATUS_IS_OK(status)) {
-               goto failed;
+               return status;
        }
 
        ctx->private_data = ldif_ctx;
 
+       return NT_STATUS_OK;
+}
+
+/****************************************************************
+****************************************************************/
+
+static NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx,
+                                      enum netr_SamDatabaseID database_id,
+                                      struct netr_DELTA_ENUM_ARRAY *r,
+                                      struct samsync_context *ctx)
+{
+       NTSTATUS status;
+       int i;
+       struct samsync_ldif_context *ldif_ctx =
+               (struct samsync_ldif_context *)ctx->private_data;
+
        status = ldif_realloc_maps(mem_ctx, ldif_ctx, r->num_deltas);
        if (!NT_STATUS_IS_OK(status)) {
                goto failed;
@@ -1193,18 +1210,6 @@ static NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx,
                }
        }
 
-       /* This was the last query */
-       if (last_query) {
-               ldif_write_output(database_id, ldif_ctx);
-               if (ldif_ctx->ldif_file != stdout) {
-                       ctx->result_message = talloc_asprintf(mem_ctx,
-                               "Vampired %d accounts and %d groups to %s",
-                               a_index, g_index, ctx->output_filename);
-               }
-               ldif_free_context(ldif_ctx);
-               ctx->private_data = NULL;
-       }
-
        return NT_STATUS_OK;
 
  failed:
@@ -1214,19 +1219,61 @@ static NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx,
        return status;
 }
 
+/****************************************************************
+****************************************************************/
+
+static NTSTATUS close_ldif(TALLOC_CTX *mem_ctx,
+                          struct samsync_context *ctx,
+                          enum netr_SamDatabaseID database_id,
+                          uint64_t sequence_num)
+{
+       struct samsync_ldif_context *ldif_ctx =
+               (struct samsync_ldif_context *)ctx->private_data;
+
+       /* This was the last query */
+       ldif_write_output(database_id, ldif_ctx);
+       if (ldif_ctx->ldif_file != stdout) {
+               ctx->result_message = talloc_asprintf(ctx,
+                       "Vampired %d accounts and %d groups to %s",
+                       a_index, g_index, ctx->output_filename);
+       }
+
+       ldif_free_context(ldif_ctx);
+       ctx->private_data = NULL;
+
+       return NT_STATUS_OK;
+}
+
 #else /* HAVE_LDAP */
 
+static NTSTATUS init_ldif(TALLOC_CTX *mem_ctx,
+                         struct samsync_context *ctx,
+                         enum netr_SamDatabaseID database_id,
+                         uint64_t *sequence_num)
+{
+       return NT_STATUS_NOT_SUPPORTED;
+}
+
 static NTSTATUS fetch_sam_entries_ldif(TALLOC_CTX *mem_ctx,
                                       enum netr_SamDatabaseID database_id,
                                       struct netr_DELTA_ENUM_ARRAY *r,
-                                      bool last_query,
                                       struct samsync_context *ctx)
 {
        return NT_STATUS_NOT_SUPPORTED;
 }
 
+static NTSTATUS close_ldif(TALLOC_CTX *mem_ctx,
+                          struct samsync_context *ctx,
+                          enum netr_SamDatabaseID database_id,
+                          uint64_t sequence_num)
+{
+       return NT_STATUS_NOT_SUPPORTED;
+}
+
 #endif
 
 const struct samsync_ops libnet_samsync_ldif_ops = {
+       .startup                = init_ldif,
        .process_objects        = fetch_sam_entries_ldif,
+       .finish                 = close_ldif,
 };
index 10c7ff110f4032a8292c814db75098efa2569505..08c8190d418122a45b7596c971080a1bcd455e2b 100644 (file)
@@ -775,7 +775,6 @@ static NTSTATUS fetch_sam_entry(TALLOC_CTX *mem_ctx,
 static NTSTATUS fetch_sam_entries(TALLOC_CTX *mem_ctx,
                                  enum netr_SamDatabaseID database_id,
                                  struct netr_DELTA_ENUM_ARRAY *r,
-                                 bool last_query,
                                  struct samsync_context *ctx)
 {
        int i;