static NTSTATUS idmap_tdb_init_hwm(struct idmap_domain *dom) { uint32_t low_uid; uint32_t low_gid; bool update_uid = false; bool update_gid = false; struct idmap_tdb_context *ctx; NTSTATUS status; ctx = talloc_get_type(dom->private_data, struct idmap_tdb_context); status = dbwrap_fetch_uint32(ctx->db, HWM_USER, &low_uid); if (!NT_STATUS_IS_OK(status) || low_uid < dom->low_id) { update_uid = true; } status = dbwrap_fetch_uint32(ctx->db, HWM_GROUP, &low_gid); if (!NT_STATUS_IS_OK(status) || low_gid < dom->low_id) { update_gid = true; } if (!update_uid && !update_gid) { return NT_STATUS_OK; } if (dbwrap_transaction_start(ctx->db) != 0) { DEBUG(0, ("Unable to start upgrade transaction!\n")); return NT_STATUS_INTERNAL_DB_ERROR; } if (update_uid) { status = dbwrap_store_uint32(ctx->db, HWM_USER, dom->low_id); if (!NT_STATUS_IS_OK(status)) { dbwrap_transaction_cancel(ctx->db); DEBUG(0, ("Unable to initialise user hwm in idmap " "database: %s\n", nt_errstr(status))); return NT_STATUS_INTERNAL_DB_ERROR; } } if (update_gid) { status = dbwrap_store_uint32(ctx->db, HWM_GROUP, dom->low_id); if (!NT_STATUS_IS_OK(status)) { dbwrap_transaction_cancel(ctx->db); DEBUG(0, ("Unable to initialise group hwm in idmap " "database: %s\n", nt_errstr(status))); return NT_STATUS_INTERNAL_DB_ERROR; } } if (dbwrap_transaction_commit(ctx->db) != 0) { DEBUG(0, ("Unable to commit upgrade transaction!\n")); return NT_STATUS_INTERNAL_DB_ERROR; } return NT_STATUS_OK; }
static bool tdbsam_upgrade_next_rid(struct db_context *db) { TDB_CONTEXT *tdb; uint32 rid; bool ok = false; ok = dbwrap_fetch_uint32(db, NEXT_RID_STRING, &rid); if (ok) { return true; } tdb = tdb_open_log(state_path("winbindd_idmap.tdb"), 0, TDB_DEFAULT, O_RDONLY, 0644); if (tdb) { ok = tdb_fetch_uint32(tdb, "RID_COUNTER", &rid); if (!ok) { rid = BASE_RID; } tdb_close(tdb); } else { rid = BASE_RID; } if (dbwrap_store_uint32(db, NEXT_RID_STRING, rid) != 0) { return false; } return true; }
static NTSTATUS idmap_tdb_set_hwm(struct unixid *xid) { const char *hwmkey; const char *hwmtype; uint32_t hwm; uint32_t high_hwm; /* Get current high water mark */ switch (xid->type) { case ID_TYPE_UID: hwmkey = HWM_USER; hwmtype = "UID"; high_hwm = idmap_tdb_state.high_uid; break; case ID_TYPE_GID: hwmkey = HWM_GROUP; hwmtype = "GID"; high_hwm = idmap_tdb_state.high_gid; break; default: return NT_STATUS_INVALID_PARAMETER; } hwm = xid->id; if ((hwm = dbwrap_store_uint32(idmap_alloc_db, hwmkey, hwm)) == -1) { return NT_STATUS_INTERNAL_DB_ERROR; } /* Warn if it is out of range */ if (hwm >= high_hwm) { DEBUG(0, ("Warning: %s range full!! (max: %lu)\n", hwmtype, (unsigned long)high_hwm)); } return NT_STATUS_OK; }