in src/link.c [1220:1322]
int link_detach(LINK_HANDLE link, bool close, const char* error_condition, const char* error_description, AMQP_VALUE info)
{
int result;
(void)error_condition;
(void)error_description;
(void)info;
if (link == NULL)
{
LogError("NULL link");
result = MU_FAILURE;
}
else if (link->is_closed)
{
result = 0;
}
else
{
ERROR_HANDLE error;
if (error_condition != NULL)
{
error = error_create(error_condition);
if (error == NULL)
{
LogInfo("Cannot create error for detach, detaching without error anyhow");
}
else
{
if (error_description != NULL)
{
if (error_set_description(error, error_description) != 0)
{
LogInfo("Cannot set error description on detach error, detaching anyhow");
}
}
if (info != NULL)
{
if (error_set_info(error, info) != 0)
{
LogInfo("Cannot set info map on detach error, detaching anyhow");
}
}
}
}
else
{
error = NULL;
}
switch (link->link_state)
{
case LINK_STATE_HALF_ATTACHED_ATTACH_SENT:
case LINK_STATE_HALF_ATTACHED_ATTACH_RECEIVED:
/* Sending detach when remote is not yet attached */
if (send_detach(link, close, error) != 0)
{
LogError("Sending detach frame failed");
result = MU_FAILURE;
}
else
{
set_link_state(link, LINK_STATE_DETACHED);
result = 0;
}
break;
case LINK_STATE_ATTACHED:
/* Send detach and wait for remote to respond */
if (send_detach(link, close, error) != 0)
{
LogError("Sending detach frame failed");
result = MU_FAILURE;
}
else
{
set_link_state(link, LINK_STATE_HALF_ATTACHED_ATTACH_SENT);
result = 0;
}
break;
case LINK_STATE_DETACHED:
/* Already detached */
result = 0;
break;
default:
case LINK_STATE_ERROR:
/* Already detached and in error state */
result = MU_FAILURE;
break;
}
if (error != NULL)
{
error_destroy(error);
}
}
return result;
}