summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/winbindd/idmap_autorid.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/source3/winbindd/idmap_autorid.c b/source3/winbindd/idmap_autorid.c
index a60f926fac..85ddca2242 100644
--- a/source3/winbindd/idmap_autorid.c
+++ b/source3/winbindd/idmap_autorid.c
@@ -35,6 +35,8 @@
#define DBGC_CLASS DBGC_IDMAP
#define HWM "NEXT RANGE"
+#define ALLOC_HWM "NEXT ALLOC ID"
+#define ALLOC_POOL_SIZE 500
#define CONFIGKEY "CONFIG"
struct autorid_global_config {
@@ -361,6 +363,17 @@ static NTSTATUS idmap_autorid_db_init(void)
}
}
+ /* Initialize high water mark for alloc pool to 0 */
+ hwm = dbwrap_fetch_int32(autorid_db, ALLOC_HWM);
+ if ((hwm < 0)) {
+ if (!NT_STATUS_IS_OK
+ (dbwrap_trans_store_int32(autorid_db, ALLOC_HWM, 0))) {
+ DEBUG(0,
+ ("Unable to initialise HWM in autorid "
+ "database\n"));
+ return NT_STATUS_INTERNAL_DB_ERROR;
+ }
+ }
return NT_STATUS_OK;
}
@@ -542,6 +555,44 @@ done:
return status;
}
+static NTSTATUS idmap_autorid_allocate_id(struct idmap_domain *dom,
+ struct unixid *xid) {
+
+ struct autorid_global_config *globalcfg;
+ NTSTATUS ret;
+ uint32_t hwm;
+
+ if (!strequal(dom->name, "*")) {
+ DEBUG(3, ("idmap_autorid_allocate_id: "
+ "Refusing creation of mapping for domain'%s'. "
+ "Currently only supported for the default "
+ "domain \"*\".\n",
+ dom->name));
+ return NT_STATUS_NOT_IMPLEMENTED;
+ }
+
+ globalcfg = talloc_get_type(dom->private_data,
+ struct autorid_global_config);
+
+ if (!dbwrap_fetch_uint32(autorid_db, ALLOC_HWM, &hwm)) {
+ DEBUG(1, ("Failed to fetch current allocation HWM value!\n"));
+ return NT_STATUS_INTERNAL_ERROR;
+ }
+
+ if (hwm > ALLOC_POOL_SIZE) {
+ DEBUG(1, ("allocation pool is depleted!\n"));
+ return NT_STATUS_NO_MEMORY;
+ }
+
+ ret = dbwrap_change_uint32_atomic(autorid_db, ALLOC_HWM, &(xid->id), 1);
+ if (!NT_STATUS_IS_OK(ret)) {
+ DEBUG(1, ("Fatal error while allocating new ID!\n"));
+ }
+ xid->id = (xid->id)+(globalcfg->minvalue);
+
+ return ret;
+}
+
/*
Close the idmap tdb instance
*/
@@ -549,6 +600,7 @@ static struct idmap_methods autorid_methods = {
.init = idmap_autorid_initialize,
.unixids_to_sids = idmap_autorid_unixids_to_sids,
.sids_to_unixids = idmap_autorid_sids_to_unixids,
+ .allocate_id = idmap_autorid_allocate_id
};
NTSTATUS idmap_autorid_init(void)