X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fmastersrv%2Fmaster.c;h=183d7454a8d2dc3601ddd2e3b2b9a9f1a1936e04;hb=48b4e4111d5f86af9a0f968f5ef7cf76b3ce538b;hp=6573cc62337cd76c634b40626bf940ee069b2775;hpb=45395d68172f014b5eb33677db89e47b5555ed0d;p=d2df-sdl.git diff --git a/src/mastersrv/master.c b/src/mastersrv/master.c index 6573cc6..183d745 100644 --- a/src/mastersrv/master.c +++ b/src/mastersrv/master.c @@ -1,3 +1,18 @@ +/* Copyright (C) Doom 2D: Forever Developers + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License ONLY. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include @@ -349,11 +364,11 @@ static inline void sv_remove(server_t *sv) { // drop the associated peer, if any if (sv->peer && sv->peer->state == ENET_PEER_STATE_CONNECTED && sv->peer->data == sv) { sv->peer->data = NULL; - sv->peer = NULL; enet_peer_reset(sv->peer); } sv->host = 0; sv->port = 0; + sv->peer = NULL; --num_servers; } } @@ -407,6 +422,14 @@ static inline server_t *sv_find_or_add(const enet_uint32 host, const enet_uint32 return empty; } +static inline void sv_clear_peer(ENetPeer *peer) { + server_t *sv = peer->data; + if (sv) { + sv->peer = NULL; + peer->data = NULL; + } +} + /* ban list functions */ static inline time_t ban_get_time(const int cnt) { @@ -594,7 +617,7 @@ static void ban_add(const enet_uint32 host, const char *reason) { static inline void ban_peer(ENetPeer *peer, const char *reason) { if (peer) { ban_add(peer->address.host, reason); - peer->data = NULL; + sv_clear_peer(peer); enet_peer_reset(peer); } } @@ -668,9 +691,12 @@ static bool handle_msg(const enet_uint8 msgid, ENetPeer *peer) { // check if we're updating from a new peer if (sv->peer != peer) { // if there was an old one, kill it - if (sv->peer) - enet_peer_reset(peer); + if (sv->peer) { + sv->peer->data = NULL; + enet_peer_reset(sv->peer); + } sv->peer = peer; + peer->data = sv; } u_log(LOG_NOTE, "updated server #%d:", sv - servers); u_printsv(sv); @@ -721,7 +747,7 @@ static bool handle_msg(const enet_uint8 msgid, ENetPeer *peer) { } sv_remove_by_addr(peer->address.host, tmpsv.port); // this peer can be disconnected pretty much immediately since he has no servers left, tell him to fuck off - peer->data = NULL; + sv_clear_peer(peer); enet_peer_disconnect_later(peer, 0); return true; @@ -771,6 +797,7 @@ static bool handle_msg(const enet_uint8 msgid, ENetPeer *peer) { // enet_host_flush(ms_host); // this peer can be disconnected pretty much immediately after receiving the server list, tell him to fuck off + sv_clear_peer(peer); enet_peer_disconnect_later(peer, 0); u_log(LOG_NOTE, "sent server list to %s:%d (ver %s)", u_iptostr(peer->address.host), peer->address.port, clientver[0] ? clientver : ""); @@ -913,7 +940,7 @@ int main(int argc, char **argv) { enet_uint8 msgid = 0; ENetEvent event; while (running) { - while (enet_host_service(ms_host, &event, 500) > 0) { + while (enet_host_service(ms_host, &event, 10) > 0) { const time_t now = time(NULL); const bool filtered = !event.peer || (ms_spam_cap && spam_filter(event.peer, now)); @@ -946,7 +973,7 @@ int main(int argc, char **argv) { break; case ENET_EVENT_TYPE_DISCONNECT: - event.peer->data = NULL; + // u_log(LOG_NOTE, "%s:%d disconnected", u_iptostr(event.peer->address.host), event.peer->address.port); break; @@ -955,7 +982,7 @@ int main(int argc, char **argv) { } } else if (event.peer) { // u_log(LOG_WARN, "filtered event %d from %s", event.type, u_iptostr(event.peer->address.host)); - event.peer->data = NULL; + sv_clear_peer(event.peer); enet_peer_reset(event.peer); }