From a292621b14db827595548463d9e521c59b4d1e4b Mon Sep 17 00:00:00 2001 From: Darkvater Date: Thu, 19 Jan 2006 15:58:57 +0000 Subject: [PATCH] (svn r3407) - Feature: Kick and ban now with IP numbers. --- console_cmds.c | 29 ++++++++++++++++++++--------- network.c | 15 +++++++++++++++ network_data.h | 1 + 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/console_cmds.c b/console_cmds.c index e8bd432e6e..6f7e7cb90b 100644 --- a/console_cmds.c +++ b/console_cmds.c @@ -365,26 +365,31 @@ DEF_CONSOLE_CMD(ConBan) uint32 index; if (argc == 0) { - IConsoleHelp("Ban a player from a network game. Usage: 'ban '"); + IConsoleHelp("Ban a player from a network game. Usage: 'ban '"); IConsoleHelp("For client-id's, see the command 'clients'"); return true; } if (argc != 2) return false; - index = atoi(argv[1]); + if (strchr(argv[1], '.') == NULL) { + index = atoi(argv[1]); + ci = NetworkFindClientFromIndex(index); + } else { + ci = NetworkFindClientFromIP(argv[1]); + index = (ci == NULL) ? 0 : ci->client_index; + } if (index == NETWORK_SERVER_INDEX) { IConsolePrint(_icolour_def, "Silly boy, you can not ban yourself!"); return true; } + if (index == 0) { IConsoleError("Invalid Client-ID"); return true; } - ci = NetworkFindClientInfoFromIndex(index); - if (ci != NULL) { uint i; /* Add user to ban-list */ @@ -407,7 +412,7 @@ DEF_CONSOLE_CMD(ConUnBan) uint i, index; if (argc == 0) { - IConsoleHelp("Unban a player from a network game. Usage: 'unban '"); + IConsoleHelp("Unban a player from a network game. Usage: 'unban '"); IConsoleHelp("For a list of banned IP's, see the command 'banlist'"); return true; } @@ -528,25 +533,31 @@ DEF_CONSOLE_CMD(ConKick) uint32 index; if (argc == 0) { - IConsoleHelp("Kick a player from a network game. Usage: 'kick '"); + IConsoleHelp("Kick a player from a network game. Usage: 'kick '"); IConsoleHelp("For client-id's, see the command 'clients'"); return true; } if (argc != 2) return false; - index = atoi(argv[1]); + if (strchr(argv[1], '.') == NULL) { + index = atoi(argv[1]); + ci = NetworkFindClientFromIndex(index); + } else { + ci = NetworkFindClientFromIP(argv[1]); + index = (ci == NULL) ? 0 : ci->client_index; + } + if (index == NETWORK_SERVER_INDEX) { IConsolePrint(_icolour_def, "Silly boy, you can not kick yourself!"); return true; } + if (index == 0) { IConsoleError("Invalid client-id"); return true; } - ci = NetworkFindClientInfoFromIndex(index); - if (ci != NULL) { SEND_COMMAND(PACKET_SERVER_ERROR)(NetworkFindClientStateFromIndex(index), NETWORK_ERROR_KICKED); } else diff --git a/network.c b/network.c index 0bee0b6dbb..d7e4cd32d0 100644 --- a/network.c +++ b/network.c @@ -65,6 +65,21 @@ NetworkClientInfo *NetworkFindClientInfoFromIndex(uint16 client_index) return NULL; } +/** Return the CI for a given IP + * @param ip IP of the client we are looking for. This must be in string-format + * @return return a pointer to the corresponding NetworkClientInfo struct or NULL on failure */ +NetworkClientInfo *NetworkFindClientInfoFromIP(const char *ip) +{ + NetworkClientInfo *ci; + uint32 ip_number = inet_addr(ip); + + for (ci = _network_client_info; ci != &_network_client_info[MAX_CLIENT_INFO]; ci++) { + if (ci->client_ip == ip_number) return ci; + } + + return NULL; +} + // Function that looks up the CS for a given client-index NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index) { diff --git a/network_data.h b/network_data.h index b4dea28b13..553680fc20 100644 --- a/network_data.h +++ b/network_data.h @@ -226,6 +226,7 @@ void NetworkGetClientName(char *clientname, size_t size, const NetworkClientStat uint NetworkCalculateLag(const NetworkClientState *cs); byte NetworkGetCurrentLanguageIndex(void); NetworkClientInfo *NetworkFindClientInfoFromIndex(uint16 client_index); +NetworkClientInfo *NetworkFindClientInfoFromIP(const char *ip); NetworkClientState *NetworkFindClientStateFromIndex(uint16 client_index); unsigned long NetworkResolveHost(const char *hostname);