| 102 | } |
| 103 | |
| 104 | void SAMSocket::HandleHandshakeReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred) |
| 105 | { |
| 106 | if (ecode) |
| 107 | { |
| 108 | LogPrint (eLogError, "SAM: Handshake read error: ", ecode.message ()); |
| 109 | if (ecode != boost::asio::error::operation_aborted) |
| 110 | Terminate ("SAM: handshake read error"); |
| 111 | } |
| 112 | else |
| 113 | { |
| 114 | m_Buffer[bytes_transferred] = 0; |
| 115 | char * eol = (char *)memchr (m_Buffer, '\n', bytes_transferred); |
| 116 | if (eol) |
| 117 | *eol = 0; |
| 118 | LogPrint (eLogDebug, "SAM: Handshake ", m_Buffer); |
| 119 | char * separator = strchr (m_Buffer, ' '); |
| 120 | if (separator) |
| 121 | { |
| 122 | separator = strchr (separator + 1, ' '); |
| 123 | if (separator) |
| 124 | *separator = 0; |
| 125 | } |
| 126 | |
| 127 | if (!strcmp (m_Buffer, SAM_HANDSHAKE)) |
| 128 | { |
| 129 | int minVer = 0, maxVer = 0; |
| 130 | // try to find MIN and MAX, 3.0 if not found |
| 131 | if (separator) |
| 132 | { |
| 133 | separator++; |
| 134 | auto params = ExtractParams (separator); |
| 135 | auto maxVerStr = params[SAM_PARAM_MAX]; |
| 136 | if (!maxVerStr.empty ()) |
| 137 | maxVer = ExtractVersion (maxVerStr); |
| 138 | auto minVerStr = params[SAM_PARAM_MIN]; |
| 139 | if (!minVerStr.empty ()) |
| 140 | minVer = ExtractVersion (minVerStr); |
| 141 | } |
| 142 | // version negotiation |
| 143 | if (maxVer && maxVer <= MAX_SAM_VERSION) |
| 144 | m_Version = maxVer; |
| 145 | else if (minVer && minVer >= MIN_SAM_VERSION && minVer <= MAX_SAM_VERSION) |
| 146 | m_Version = minVer; |
| 147 | else if (!maxVer && !minVer) |
| 148 | m_Version = MIN_SAM_VERSION; |
| 149 | else |
| 150 | { |
| 151 | LogPrint (eLogError, "SAM: Handshake version mismatch ", minVer, " ", maxVer); |
| 152 | SendMessageReply (SAM_HANDSHAKE_NOVERSION, true); |
| 153 | return; |
| 154 | } |
| 155 | // send reply |
| 156 | #ifdef _MSC_VER |
| 157 | size_t l = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_HANDSHAKE_REPLY, CreateVersion (m_Version).c_str ()); |
| 158 | #else |
| 159 | size_t l = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_HANDSHAKE_REPLY, CreateVersion (m_Version).c_str ()); |
| 160 | #endif |
| 161 | boost::asio::async_write (m_Socket, boost::asio::buffer (m_Buffer, l), boost::asio::transfer_all (), |
nothing calls this directly
no test coverage detected