idmap_autorid: add idmap_autorid_delete_domain_ranges()
authorMichael Adam <obnox@samba.org>
Wed, 18 Sep 2013 01:04:52 +0000 (03:04 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 1 Oct 2013 08:49:26 +0000 (10:49 +0200)
This uses the new idmap_autorid_iterate_domain_ranges() function.
Based on earlier patch by Atul Kulkarni <atul.kulkarni@in.ibm.com>.

Signed-off-by: Michael Adam <obnox@samba.org>
source3/include/idmap_autorid.h
source3/winbindd/idmap_autorid_tdb.c

index 512453c9c423d80cf185e43c5bbef61b56223529..4c5c184f06156735652bf3f518c8b23577336c8e 100644 (file)
@@ -188,4 +188,12 @@ NTSTATUS idmap_autorid_iterate_domain_ranges_read(struct db_context *db,
                                        void *private_data,
                                        int *count);
 
+/**
+ * delete all range mappings for a given domain
+ */
+NTSTATUS idmap_autorid_delete_domain_ranges(struct db_context *db,
+                                           const char *domsid,
+                                           bool force,
+                                           int *count);
+
 #endif /* _IDMAP_AUTORID_H_ */
index d5c5cc4e92913f9d7d88bb38a6cf21b087e46b82..f6da99692cc70b6bc9f8bdeefd587516eecb59d8 100644 (file)
@@ -1168,3 +1168,84 @@ NTSTATUS idmap_autorid_iterate_domain_ranges_read(struct db_context *db,
 
        return status;
 }
+
+
+/*
+ * Delete all ranges configured for a given domain
+ */
+
+struct delete_domain_ranges_visitor_ctx {
+       bool force;
+};
+
+static NTSTATUS idmap_autorid_delete_domain_ranges_visitor(
+                                               struct db_context *db,
+                                               const char *domsid,
+                                               uint32_t domain_range_index,
+                                               uint32_t rangenum,
+                                               void *private_data)
+{
+       struct delete_domain_ranges_visitor_ctx *ctx;
+       NTSTATUS status;
+
+       ctx = (struct delete_domain_ranges_visitor_ctx *)private_data;
+
+       status = idmap_autorid_delete_range_by_sid(db, domsid, domain_range_index, ctx->force);
+       return status;
+}
+
+struct idmap_autorid_delete_domain_ranges_ctx {
+       const char *domsid;
+       bool force;
+       int count; /* output: count records operated on */
+};
+
+static NTSTATUS idmap_autorid_delete_domain_ranges_action(struct db_context *db,
+                                                         void *private_data)
+{
+       struct idmap_autorid_delete_domain_ranges_ctx *ctx;
+       struct delete_domain_ranges_visitor_ctx visitor_ctx;
+       int count;
+       NTSTATUS status;
+
+       ctx = (struct idmap_autorid_delete_domain_ranges_ctx *)private_data;
+
+       ZERO_STRUCT(visitor_ctx);
+       visitor_ctx.force = ctx->force;
+
+       status = idmap_autorid_iterate_domain_ranges(db,
+                               ctx->domsid,
+                               idmap_autorid_delete_domain_ranges_visitor,
+                               &visitor_ctx,
+                               &count);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       ctx->count = count;
+
+       return NT_STATUS_OK;
+}
+
+NTSTATUS idmap_autorid_delete_domain_ranges(struct db_context *db,
+                                           const char *domsid,
+                                           bool force,
+                                           int *count)
+{
+       NTSTATUS status;
+       struct idmap_autorid_delete_domain_ranges_ctx ctx;
+
+       ZERO_STRUCT(ctx);
+       ctx.domsid = domsid;
+       ctx.force = force;
+
+       status = dbwrap_trans_do(db, idmap_autorid_delete_domain_ranges_action,
+                                &ctx);
+       if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+
+       *count = ctx.count;
+
+       return NT_STATUS_OK;
+}