wesnoth-cvs-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Wesnoth-cvs-commits] wesnoth/src server/server.cpp network.cpp


From: David White
Subject: [Wesnoth-cvs-commits] wesnoth/src server/server.cpp network.cpp
Date: Sun, 03 Jul 2005 12:19:49 -0400

CVSROOT:        /cvsroot/wesnoth
Module name:    wesnoth
Branch:         
Changes by:     David White <address@hidden>    05/07/03 16:19:49

Modified files:
        src/server     : server.cpp 
        src            : network.cpp 

Log message:
        made wesnothd support redirection of clients; fixed logging up a little

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/server/server.cpp.diff?tr1=1.81&tr2=1.82&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/src/network.cpp.diff?tr1=1.65&tr2=1.66&r1=text&r2=text

Patches:
Index: wesnoth/src/network.cpp
diff -u wesnoth/src/network.cpp:1.65 wesnoth/src/network.cpp:1.66
--- wesnoth/src/network.cpp:1.65        Fri Jun 10 22:34:17 2005
+++ wesnoth/src/network.cpp     Sun Jul  3 16:19:49 2005
@@ -96,7 +96,7 @@
        if(sock) {
                for(connection_map::const_iterator i = connections.begin(); i 
!= connections.end(); ++i) {
                        if(i->second.sock == sock) {
-                               throw network::error(_("Socket 
error"),i->first);
+                               throw network::error(_("Client 
disconnected"),i->first);
                        }
                }
        }
Index: wesnoth/src/server/server.cpp
diff -u wesnoth/src/server/server.cpp:1.81 wesnoth/src/server/server.cpp:1.82
--- wesnoth/src/server/server.cpp:1.81  Sat Jun 11 12:29:31 2005
+++ wesnoth/src/server/server.cpp       Sun Jul  3 16:19:49 2005
@@ -9,9 +9,11 @@
 
 #include "SDL.h"
 
-#include "game.hpp"
+#include "game.hpp"
+#include "filesystem.hpp"
 #include "input_stream.hpp"
-#include "metrics.hpp"
+#include "metrics.hpp"
+#include "serialization/parser.hpp"
 #include "player.hpp"
 
 #include <algorithm>
@@ -69,7 +71,7 @@
 class server
 {
 public:
-       server(int port, input_stream& input);
+       server(int port, input_stream& input, const config& cfg);
        void run();
 private:
        void process_data(network::connection sock, config& data, config& 
gamelist);
@@ -87,7 +89,8 @@
 
        const network::manager net_manager_;
        const network::server_manager server_;
-
+
+       config version_query_response_;
        config login_response_;
        config join_lobby_response_;
 
@@ -106,17 +109,42 @@
 
        input_stream& input_;
 
-       metrics metrics_;
+       metrics metrics_;
+
+       const config& cfg_;
+
+       std::set<std::string> accepted_versions_;
+       std::map<std::string,config> redirected_versions_; 
 
        bool is_ip_banned(const std::string& ip);
        std::string ban_ip(const std::string& mask);
        std::vector<std::string> bans_;
 };
 
-server::server(int port, input_stream& input) : net_manager_(5), 
server_(port), not_logged_in_(players_), lobby_players_(players_), 
last_stats_(time(NULL)), input_(input)
-{
-       login_response_.add_child("mustlogin");
-       login_response_["version"] = game_config::version;
+server::server(int port, input_stream& input, const config& cfg) : 
net_manager_(5), server_(port),
+    not_logged_in_(players_), lobby_players_(players_), 
last_stats_(time(NULL)), input_(input), cfg_(cfg)
+{
+       version_query_response_.add_child("version");
+
+       login_response_.add_child("mustlogin");
+
+       const std::string& versions = cfg_["versions_accepted"];
+       if(versions.empty() == false) {
+               const std::vector<std::string> accepted(utils::split(versions));
+               for(std::vector<std::string>::const_iterator i = 
accepted.begin(); i != accepted.end(); ++i) {
+                       accepted_versions_.insert(*i);
+               }
+       } else {
+               accepted_versions_.insert(game_config::version);
+       }
+
+       const config::child_list& redirects = cfg_.get_children("redirect");
+       for(config::child_list::const_iterator i = redirects.begin(); i != 
redirects.end(); ++i) {
+               const std::vector<std::string> 
versions(utils::split((**i)["version"]));
+               for(std::vector<std::string>::const_iterator j = 
versions.begin(); j != versions.end(); ++j) {
+                       redirected_versions_[*j] = **i;
+               }
+       }
 
        join_lobby_response_.add_child("join_lobby");
 }
@@ -287,7 +315,7 @@
                                network::send_data(construct_error("You are 
banned."),sock);
                                network::disconnect(sock);
                        } else if(sock) {
-                               network::send_data(login_response_,sock);
+                               
network::send_data(version_query_response_,sock);
                                not_logged_in_.add_player(sock);
                        }
 
@@ -363,7 +391,43 @@
 }
 
 void server::process_login(const network::connection sock, const config& data, 
config& gamelist)
-{
+{
+       //see if client is sending their version number
+       const config* const version = data.child("version");
+       if(version != NULL) {
+               const std::string& version_str = (*version)["version"];
+
+               if(accepted_versions_.count(version_str)) {
+                       std::cerr << "player joined using accepted version " << 
version_str << ": telling them to log in\n";
+                       network::send_data(login_response_,sock);
+               } else {
+                       const std::map<std::string,config>::const_iterator i = 
redirected_versions_.find(version_str);
+                       if(i != redirected_versions_.end()) {
+                               std::cerr << "player joined using version " << 
version_str << ": redirecting them to "
+                                         << i->second["host"] << ":" << 
i->second["port"] << "\n";
+                               config response;
+                               response.add_child("redirect",i->second);
+                               network::send_data(response,sock);
+                       } else {
+                               std::cerr << "player joined using unknown 
version " << version_str << ": rejecting them\n";
+                               config response;
+                               if(accepted_versions_.empty() == false) {
+                                       response["version"] = 
*accepted_versions_.begin();
+                               } else if(redirected_versions_.empty() == 
false) {
+                                       response["version"] = 
redirected_versions_.begin()->first;
+                               } else {
+                                       std::cerr << "this server doesn't 
accept any versions at all\n";
+                                       response["version"] = "null";
+                               }
+
+                               network::send_data(response,sock);
+                       }
+               }
+               
+               return;
+       }
+
+
        const config* const login = data.child("login");
 
        //client must send a login first.
@@ -887,7 +951,9 @@
 {
        int port = 15000;
 
-       network::set_default_send_size(4096);
+       network::set_default_send_size(4096);
+
+       config configuration;
 
 #ifndef FIFODIR
 # define FIFODIR "/var/run/wesnothd"
@@ -899,8 +965,21 @@
                if(val.empty()) {
                        continue;
                }
-
-               if((val == "--max_packet_size" || val == "-m") && arg+1 != 
argc) {
+
+               if((val == "--config" || val == "-c") && arg+1 != argc) {
+                       scoped_istream stream = istream_file(argv[++arg]);
+
+                       std::string errors;
+                       try {
+                               read(configuration,*stream,&errors);
+                               if(errors.empty() == false) {
+                                       std::cerr << "WARNING: errors reading 
configuration file: " << errors << "\n";
+                               }
+                       } catch(config::error& e) {
+                               std::cerr << "ERROR: could not read 
configuration file: '" << e.message << "'\n";
+                               return -1;
+                       }
+               } else if((val == "--max_packet_size" || val == "-m") && arg+1 
!= argc) {
                        
network::set_default_send_size(size_t(atoi(argv[++arg])));
                }
                else if((val == "--port" || val == "-p") && arg+1 != argc) {
@@ -944,7 +1023,7 @@
        input_stream input(fifo_path);
 
        try {
-               server(port,input).run();
+               server(port,input,configuration).run();
        } catch(network::error& e) {
                std::cerr << "caught network error while server was running. 
aborting.: " << e.message << "\n";
                return -1;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]