diff options
-rw-r--r-- | source3/winbindd/idmap_autorid.c | 52 |
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) |