in source/aws_profile.c [617:693]
static int s_profile_collection_add_profile(
struct aws_profile_collection *profile_collection,
const struct aws_byte_cursor *profile_name,
bool has_prefix,
const struct profile_file_parse_context *context,
struct aws_profile **current_profile_out) {
*current_profile_out = NULL;
struct aws_string *key =
aws_string_new_from_array(profile_collection->allocator, profile_name->ptr, profile_name->len);
if (key == NULL) {
return AWS_OP_ERR;
}
struct aws_profile *existing_profile = NULL;
struct aws_hash_element *element = NULL;
aws_hash_table_find(&profile_collection->profiles, key, &element);
if (element != NULL) {
existing_profile = element->value;
}
aws_string_destroy(key);
if (profile_collection->profile_source == AWS_PST_CONFIG && s_is_default_profile_name(profile_name)) {
/*
* In a config file, "profile default" always supercedes "default"
*/
if (!has_prefix && existing_profile && existing_profile->has_profile_prefix) {
/*
* existing one supercedes: ignore this (and its properties) completely by failing the add
* which sets the current profile to NULL
*/
AWS_LOGF_WARN(
AWS_LS_SDKUTILS_PROFILE,
"Existing prefixed default config profile supercedes unprefixed default profile");
s_log_parse_context(AWS_LL_WARN, context);
return AWS_OP_SUCCESS;
}
if (has_prefix && existing_profile && !existing_profile->has_profile_prefix) {
/*
* stomp over existing: remove it, then proceed with add
* element destroy function will clean up the profile and key
*/
AWS_LOGF_WARN(
AWS_LS_SDKUTILS_PROFILE, "Prefixed default config profile replacing unprefixed default profile");
s_log_parse_context(AWS_LL_WARN, context);
aws_hash_table_remove(&profile_collection->profiles, element->key, NULL, NULL);
existing_profile = NULL;
}
}
if (existing_profile) {
*current_profile_out = existing_profile;
return AWS_OP_SUCCESS;
}
struct aws_profile *new_profile = aws_profile_new(profile_collection->allocator, profile_name, has_prefix);
if (new_profile == NULL) {
goto on_aws_profile_new_failure;
}
if (aws_hash_table_put(&profile_collection->profiles, new_profile->name, new_profile, NULL)) {
goto on_hash_table_put_failure;
}
*current_profile_out = new_profile;
return AWS_OP_SUCCESS;
on_hash_table_put_failure:
aws_profile_destroy(new_profile);
on_aws_profile_new_failure:
return AWS_OP_ERR;
}