void socket_transport_disconnect()

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));
        }
    }
}