Exemplo n.º 1
0
/**
 * @brief Get supplementary groups given uid
 *
 * @param[in]  uid  The uid of the user
 * @param[out]  group_data
 *
 * @return true if successful, false otherwise
 */
bool uid2grp(uid_t uid, struct group_data **gdata)
{
	bool success = false;

	PTHREAD_RWLOCK_rdlock(&uid2grp_user_lock);
	success = uid2grp_lookup_by_uid(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_uid(uid);
		PTHREAD_RWLOCK_unlock(&uid2grp_user_lock);
	}

	*gdata = uid2grp_allocate_by_uid(uid);
	PTHREAD_RWLOCK_wrlock(&uid2grp_user_lock);
	if (*gdata)
		uid2grp_add_user(*gdata);
	success = uid2grp_lookup_by_uid(uid, gdata);
	if (success)
		uid2grp_hold_group_data(*gdata);
	PTHREAD_RWLOCK_unlock(&uid2grp_user_lock);

	return success;
}
Exemplo n.º 2
0
bool uid2grp(uid_t uid, struct group_data **pgdata)
{
	bool success;

	struct gsh_buffdesc name;
	struct gsh_buffdesc *pname = &name;

	pthread_rwlock_rdlock(&uid2grp_user_lock);

	success = uid2grp_lookup_by_uid(uid, &pname, pgdata);

	pthread_rwlock_unlock(&uid2grp_user_lock);

	if (success)
		return true;
	else {
		if (pwentuid2grp(uid, &name, *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, "uid2grp %u", uid);
			return true;
		} else
			return false;
	}
}