MCPcopy Create free account
hub / github.com/PurpleI2P/i2pd / HandleHandshakeReceived

Method HandleHandshakeReceived

libi2pd_client/SAM.cpp:104–171  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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 (),

Callers

nothing calls this directly

Calls 3

LogPrintFunction · 0.85
ExtractVersionFunction · 0.85
CreateVersionFunction · 0.85

Tested by

no test coverage detected