From baac061d27e5013572cc4bc7bb2c08ab6c38d552 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Wed, 8 Dec 2021 13:30:17 +0300 Subject: [PATCH] telnet: destroy the specific client when disconnecting --- code/espurna/telnet.cpp | 24 ++++++++++++------------ code/espurna/telnet.h | 3 --- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/code/espurna/telnet.cpp b/code/espurna/telnet.cpp index f4cce84b..a7e0f51d 100644 --- a/code/espurna/telnet.cpp +++ b/code/espurna/telnet.cpp @@ -183,14 +183,12 @@ void _telnetDisconnect(unsigned char clientId) { #elif TELNET_SERVER == TELNET_SERVER_ASYNC -void _telnetCleanUp() { - schedule_function([] () { - for (unsigned char clientId=0; clientId < TELNET_MAX_CLIENTS; ++clientId) { - if (!_telnetClients[clientId]->connected()) { - _telnetClients[clientId] = nullptr; - DEBUG_MSG_P(PSTR("[TELNET] Client #%d disconnected\n"), clientId); - wifiApCheck(); - } +void _telnetCleanUp(unsigned char id) { + schedule_function([id] () { + if (_telnetClients[id] && !_telnetClients[id]->connected()) { + _telnetClients[id] = nullptr; + DEBUG_MSG_P(PSTR("[TELNET] Client #%d disconnected\n"), id); + wifiApCheck(); } }); } @@ -325,10 +323,12 @@ size_t _telnetWrite(unsigned char clientId, const char * message) { } void _telnetData(unsigned char clientId, char * data, size_t len) { + static constexpr unsigned char TelnetIac { 0xFF }; + static constexpr unsigned char TelnetXeof { 0xEC }; - if ((len >= 2) && (data[0] == TELNET_IAC)) { + if ((len >= 2) && (static_cast(data[0]) == TelnetIac)) { // C-d is sent as two bytes (sometimes repeating) - if (data[1] == TELNET_XEOF) { + if (static_cast(data[1]) == TelnetXeof) { _telnetDisconnect(clientId); } return; // Ignore telnet negotiation @@ -451,7 +451,7 @@ void _telnetSetupClient(unsigned char i, AsyncClient *client) { _telnetData(i, reinterpret_cast(data), len); }); client->onDisconnect([i](void*, AsyncClient*) { - _telnetCleanUp(); + _telnetCleanUp(i); }); // XXX: AsyncClient does not have copy ctor @@ -526,7 +526,7 @@ bool telnetDebugSend(const char* prefix, const char* data) { #endif // DEBUG_TELNET_SUPPORT unsigned char telnetWrite(unsigned char ch) { - char data[1] = {ch}; + const char data[1] { static_cast(ch) }; return _telnetWrite(data, 1); } diff --git a/code/espurna/telnet.h b/code/espurna/telnet.h index 0800af86..38b60b5e 100644 --- a/code/espurna/telnet.h +++ b/code/espurna/telnet.h @@ -10,9 +10,6 @@ Copyright (C) 2017-2019 by Xose Pérez #include -constexpr unsigned char TELNET_IAC = 0xFF; -constexpr unsigned char TELNET_XEOF = 0xEC; - uint16_t telnetPort(); bool telnetConnected(); unsigned char telnetWrite(unsigned char ch);