if (pw && pw->pw_name)
ui->pw_name = adu_strdup(pw->pw_name);
- DEBUG_LOG("opening table for uid %u\n", (unsigned)ui->uid);
+ INFO_LOG("opening table for uid %u\n", (unsigned)ui->uid);
if (create) {
ret = osl(osl_create_table(ui->desc));
if (ret < 0)
if (!ui_used(ui))
continue;
+ if (!ui->table)
+ continue;
+ INFO_LOG("closing user table for uid %u\n", (unsigned)ui->uid);
ret = osl(osl_close_table(ui->table, OSL_MARK_CLEAN));
if (ret < 0)
ERROR_LOG("failed to close user table %u: %s\n",
comp);
}
-int read_uid_file(struct uid_range *admissible_uids)
+int open_admissible_user_tables(struct uid_range *admissible_uids)
+{
+ struct user_info *ui;
+
+ assert(uid_hash_table);
+ DEBUG_LOG("size: %d\n", uid_hash_table_size);
+ FOR_EACH_USER(ui) {
+ int ret;
+
+ if (!ui_used(ui)) {
+ continue;
+ }
+ if (!uid_is_admissible(ui->uid, admissible_uids)) {
+ DEBUG_LOG("uid %u is not admissible\n", ui->uid);
+ ui->flags &= ~UI_FL_ADMISSIBLE;
+ continue;
+ }
+ ui->flags |= UI_FL_ADMISSIBLE;
+ if (ui->table)
+ continue;
+ ret = open_user_table(ui, 0);
+ if (ret < 0)
+ return ret;
+ }
+ return 1;
+}
+
+int read_uid_file(void)
{
size_t size;
uint32_t n;
assert(ui);
if (ui_used(ui)) { /* impossible */
ERROR_LOG("duplicate user id!?\n");
- ret =-EFAULT;
+ ret = -EFAULT;
goto out;
}
ui->uid = uid;
ui->flags |= UI_FL_SLOT_USED;
- if (!uid_is_admissible(uid, admissible_uids))
- continue;
- ui->flags |= UI_FL_ADMISSIBLE;
- ret = open_user_table(ui, 0);
- if (ret < 0)
- return ret;
}
ret = 1;
out: