diff --git a/src/network/core/tcp_admin.cpp b/src/network/core/tcp_admin.cpp index 0271598830..e87dd5924b 100644 --- a/src/network/core/tcp_admin.cpp +++ b/src/network/core/tcp_admin.cpp @@ -87,6 +87,7 @@ NetworkRecvStatus NetworkAdminSocketHandler::HandlePacket(Packet *p) case ADMIN_PACKET_SERVER_CONSOLE: return this->Receive_SERVER_CONSOLE(p); case ADMIN_PACKET_SERVER_CMD_NAMES: return this->Receive_SERVER_CMD_NAMES(p); case ADMIN_PACKET_SERVER_CMD_LOGGING: return this->Receive_SERVER_CMD_LOGGING(p); + case ADMIN_PACKET_SERVER_RCON_END: return this->Receive_SERVER_RCON_END(p); default: if (this->HasClientQuit()) { @@ -162,5 +163,6 @@ NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON(Packet *p) { re NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CONSOLE(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CONSOLE); } NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_NAMES(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_NAMES); } NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_CMD_LOGGING(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_CMD_LOGGING); } +NetworkRecvStatus NetworkAdminSocketHandler::Receive_SERVER_RCON_END(Packet *p) { return this->ReceiveInvalidPacket(ADMIN_PACKET_SERVER_RCON_END); } #endif /* ENABLE_NETWORK */ diff --git a/src/network/core/tcp_admin.h b/src/network/core/tcp_admin.h index 932c3af42a..d642deb4c7 100644 --- a/src/network/core/tcp_admin.h +++ b/src/network/core/tcp_admin.h @@ -60,6 +60,7 @@ enum PacketAdminType { ADMIN_PACKET_SERVER_CMD_NAMES, ///< The server sends out the names of the DoCommands to the admins. ADMIN_PACKET_SERVER_CMD_LOGGING, ///< The server gives the admin copies of incoming command packets. ADMIN_PACKET_SERVER_GAMESCRIPT, ///< The server gives the admin information from the GameScript in JSON. + ADMIN_PACKET_SERVER_RCON_END, ///< The server indicates that the remote console command has completed. INVALID_ADMIN_PACKET = 0xFF, ///< An invalid marker for admin packets. }; @@ -454,6 +455,14 @@ protected: */ virtual NetworkRecvStatus Receive_SERVER_CMD_LOGGING(Packet *p); + /** + * Notify the admin connection that the rcon command has finished. + * string The command as requested by the admin connection. + * @param p The packet that was just received. + * @return The state the network should have. + */ + virtual NetworkRecvStatus Receive_SERVER_RCON_END(Packet *p); + NetworkRecvStatus HandlePacket(Packet *p); public: NetworkRecvStatus CloseConnection(bool error = true); diff --git a/src/network/network_admin.cpp b/src/network/network_admin.cpp index a78f0c8695..93cfe28076 100644 --- a/src/network/network_admin.cpp +++ b/src/network/network_admin.cpp @@ -480,6 +480,20 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::SendChat(NetworkAction action return NETWORK_RECV_STATUS_OKAY; } +/** + * Send a notification indicating the rcon command has completed. + * @param command The original command sent. + */ +NetworkRecvStatus ServerNetworkAdminSocketHandler::SendRconEnd(const char *command) +{ + Packet *p = new Packet(ADMIN_PACKET_SERVER_RCON_END); + + p->Send_string(command); + this->SendPacket(p); + + return NETWORK_RECV_STATUS_OKAY; +} + /** * Send the reply of an rcon command. * @param colour The colour of the text. @@ -509,7 +523,7 @@ NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_RCON(Packet *p) _redirect_console_to_admin = this->index; IConsoleCmdExec(command); _redirect_console_to_admin = INVALID_ADMIN_ID; - return NETWORK_RECV_STATUS_OKAY; + return this->SendRconEnd(command); } NetworkRecvStatus ServerNetworkAdminSocketHandler::Receive_ADMIN_GAMESCRIPT(Packet *p) diff --git a/src/network/network_admin.h b/src/network/network_admin.h index c8241cabf5..8348e741b5 100644 --- a/src/network/network_admin.h +++ b/src/network/network_admin.h @@ -69,6 +69,7 @@ public: NetworkRecvStatus SendGameScript(const char *json); NetworkRecvStatus SendCmdNames(); NetworkRecvStatus SendCmdLogging(ClientID client_id, const CommandPacket *cp); + NetworkRecvStatus SendRconEnd(const char *command); static void Send(); static void AcceptConnection(SOCKET s, const NetworkAddress &address);