bool name2grp(const struct gsh_buffdesc *name, struct group_data **gdata) { bool success = false; uid_t uid = -1; PTHREAD_RWLOCK_rdlock(&uid2grp_user_lock); success = uid2grp_lookup_by_uname(name, &uid, gdata); /* Handle common case first */ if (success && !uid2grp_expired(*gdata)) { uid2grp_hold_group_data(*gdata); PTHREAD_RWLOCK_unlock(&uid2grp_user_lock); return success; } PTHREAD_RWLOCK_unlock(&uid2grp_user_lock); if (success) { /* Cache entry is expired */ PTHREAD_RWLOCK_wrlock(&uid2grp_user_lock); uid2grp_remove_by_uname(name); PTHREAD_RWLOCK_unlock(&uid2grp_user_lock); } *gdata = uid2grp_allocate_by_name(name); PTHREAD_RWLOCK_wrlock(&uid2grp_user_lock); if (*gdata) uid2grp_add_user(*gdata); success = uid2grp_lookup_by_uname(name, &uid, gdata); if (success) uid2grp_hold_group_data(*gdata); PTHREAD_RWLOCK_unlock(&uid2grp_user_lock); return success; }
bool name2grp(const struct gsh_buffdesc *name, struct group_data **pgdata) { bool success; uid_t uid = -1; pthread_rwlock_rdlock(&uid2grp_user_lock); success = uid2grp_lookup_by_uname(name, &uid, pgdata); pthread_rwlock_unlock(&uid2grp_user_lock); if (success) return true; else { /* Something we can mutate and count on as terminated */ char *namebuff = alloca(name->len + 1); memcpy(namebuff, name->addr, name->len); *(namebuff + name->len) = '\0'; if (pwentname2grp(namebuff, &uid, *pgdata)) { pthread_rwlock_wrlock(&uid2grp_user_lock); success = uid2grp_add_user(name, uid, *pgdata); pthread_rwlock_unlock(&uid2grp_user_lock); if (!success) LogMajor(COMPONENT_IDMAPPER, "name2grp %s", namebuff); return true; } else return false; } }