in win32/src/socket_transport_win32.c [371:408]
void socket_transport_disconnect(SOCKET_TRANSPORT_HANDLE socket_transport)
{
// Codes_SOCKET_TRANSPORT_WIN32_09_027: [ If socket_transport is NULL, socket_transport_disconnect shall fail and return. ]
if (socket_transport == NULL)
{
LogError("Invalid arguments: SOCKET_TRANSPORT_HANDLE socket_transport: %p",
socket_transport);
}
else
{
// Codes_SOCKET_TRANSPORT_WIN32_09_028: [ socket_transport_disconnect shall call sm_close_begin to begin the closing process. ]
SM_RESULT close_result = sm_close_begin(socket_transport->sm);
if (close_result == SM_EXEC_GRANTED)
{
// Codes_SOCKET_TRANSPORT_WIN32_09_083: [ If shutdown does not return 0 on a socket that is not a binding socket, the socket is not valid therefore socket_transport_disconnect shall not call close ]
if (socket_transport->type != SOCKET_BINDING && shutdown(socket_transport->socket, SD_BOTH) != 0)
{
LogLastError("shutdown failed on socket: %" PRI_SOCKET "", socket_transport->socket);
}
else
{
// Codes_SOCKET_TRANSPORT_WIN32_09_030: [ socket_transport_disconnect shall call closesocket to disconnect the connected socket. ]
if (closesocket(socket_transport->socket) != 0)
{
LogLastError("Failure in closesocket %" PRI_SOCKET "", socket_transport->socket);
}
}
// Codes_SOCKET_TRANSPORT_WIN32_09_031: [ socket_transport_disconnect shall call sm_close_end. ]
sm_close_end(socket_transport->sm);
}
// Codes_SOCKET_TRANSPORT_WIN32_09_029: [ If sm_close_begin does not return SM_EXEC_GRANTED, socket_transport_disconnect shall fail and return. ]
else
{
LogError("sm_close_begin failed with %" PRI_MU_ENUM, MU_ENUM_VALUE(SM_RESULT, close_result));
}
}
}