diff options
author | truelight <truelight@openttd.org> | 2005-01-02 12:03:43 +0000 |
---|---|---|
committer | truelight <truelight@openttd.org> | 2005-01-02 12:03:43 +0000 |
commit | a11f46fed48fa6606f2d84c8f96d79efbad83197 (patch) | |
tree | 9f7b9f8c971ff9369911613d44bb0367e7d30389 /network.c | |
parent | 5d065845453b47791afec27a373b9ff9728ead1e (diff) | |
download | openttd-a11f46fed48fa6606f2d84c8f96d79efbad83197.tar.xz |
(svn r1322) -Add: banning system (mostly tnx to guru3)
A server can ban people via ClientList
Both server and dedicated can do it via console:
'ban', 'unban', 'banlist'.
Diffstat (limited to 'network.c')
-rw-r--r-- | network.c | 44 |
1 files changed, 37 insertions, 7 deletions
@@ -219,7 +219,8 @@ static void NetworkClientError(byte res, NetworkClientState *cs) { default: errorno = NETWORK_ERROR_GENERAL; } // This means we fucked up and the server closed the connection - if (res != NETWORK_RECV_STATUS_SERVER_ERROR && res != NETWORK_RECV_STATUS_SERVER_FULL) { + if (res != NETWORK_RECV_STATUS_SERVER_ERROR && res != NETWORK_RECV_STATUS_SERVER_FULL && + res != NETWORK_RECV_STATUS_SERVER_BANNED) { SEND_COMMAND(PACKET_CLIENT_ERROR)(errorno); // Dequeue all commands before closing the socket @@ -615,6 +616,8 @@ static void NetworkAcceptClients(void) #else LONG sin_len; // for some reason we need a 'LONG' under MorphOS #endif + int i; + bool banned; // Should never ever happen.. is it possible?? assert(_listensocket != INVALID_SOCKET); @@ -639,6 +642,33 @@ static void NetworkAcceptClients(void) {int b = 1; setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char*)&b, sizeof(b));} #endif + /* Check if the client is banned */ + banned = false; + for (i = 0; i < lengthof(_network_ban_list); i++) { + if (_network_ban_list[i] == NULL) + continue; + + if (sin.sin_addr.s_addr == inet_addr(_network_ban_list[i])) { + Packet *p = NetworkSend_Init(PACKET_SERVER_BANNED); + + DEBUG(net, 1)("[NET] Banned ip tried to join (%s), refused", _network_ban_list[i]); + + p->buffer[0] = p->size & 0xFF; + p->buffer[1] = p->size >> 8; + + send(s, p->buffer, p->size, 0); + closesocket(s); + + free(p); + + banned = true; + break; + } + } + /* If this client is banned, continue with next client */ + if (banned) + continue; + cs = NetworkAllocClient(s); if (cs == NULL) { // no more clients allowed? @@ -844,15 +874,15 @@ void NetworkAddServer(const byte *b) * by the function that generates the config file. */ void NetworkRebuildHostList() { - int i=0; + int i = 0; NetworkGameList *item = _network_game_list; - while (item != NULL && i!=lengthof(_network_host_list)) { + while (item != NULL && i != lengthof(_network_host_list)) { if (item->manually) _network_host_list[i++] = strdup(item->info.hostname); item = item->next; } - for (; i<lengthof(_network_host_list); i++) { + for (; i < lengthof(_network_host_list); i++) { _network_host_list[i] = strdup(""); } } @@ -1262,10 +1292,10 @@ void NetworkStartUp(void) DEBUG(net, 3) ("[NET][Core] Starting network..."); #if defined(__MORPHOS__) || defined(__AMIGA__) - /* + /* * IMPORTANT NOTE: SocketBase needs to be initialized before we use _any_ * network related function, else: crash. - */ + */ { DEBUG(misc,3) ("[NET][Core] Loading bsd socket library"); if (!(SocketBase = OpenLibrary("bsdsocket.library", 4))) { @@ -1291,7 +1321,7 @@ void NetworkStartUp(void) #endif // __AMIGA__ } #endif // __MORPHOS__ / __AMIGA__ - + // Network is available _network_available = true; _network_dedicated = false; |