diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/console_cmds.cpp | 2 | ||||
-rw-r--r-- | src/network/core/tcp_http.cpp | 4 | ||||
-rw-r--r-- | src/network/network.cpp | 38 | ||||
-rw-r--r-- | src/network/network_func.h | 3 | ||||
-rw-r--r-- | src/openttd.cpp | 10 |
5 files changed, 40 insertions, 17 deletions
diff --git a/src/console_cmds.cpp b/src/console_cmds.cpp index cebf70198..b3819115c 100644 --- a/src/console_cmds.cpp +++ b/src/console_cmds.cpp @@ -916,7 +916,7 @@ DEF_CONSOLE_CMD(ConNetworkConnect) uint16 rport = NETWORK_DEFAULT_PORT; CompanyID join_as = COMPANY_NEW_COMPANY; - ParseConnectionString(&company, &port, ip); + ParseGameConnectionString(&company, &port, ip); IConsolePrintF(CC_DEFAULT, "Connecting to %s...", ip); if (company != nullptr) { diff --git a/src/network/core/tcp_http.cpp b/src/network/core/tcp_http.cpp index be5a2c39a..d88ea711d 100644 --- a/src/network/core/tcp_http.cpp +++ b/src/network/core/tcp_http.cpp @@ -203,10 +203,8 @@ int NetworkHTTPSocketHandler::HandleHeader() *url = '\0'; /* Fetch the hostname, and possible port number. */ - const char *company = nullptr; const char *port = nullptr; - ParseConnectionString(&company, &port, hname); - if (company != nullptr) return_error("[tcp/http] invalid hostname"); + ParseConnectionString(&port, hname); NetworkAddress address(hname, port == nullptr ? 80 : atoi(port)); diff --git a/src/network/network.cpp b/src/network/network.cpp index f4640191c..e0355ce2e 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -447,6 +447,36 @@ static void CheckPauseOnJoin() } /** + * Converts a string to ip/port + * Format: IP:port + * + * connection_string will be re-terminated to separate out the hostname, port will + * be set to the port strings given by the user, inside the memory area originally + * occupied by connection_string. + */ +void ParseConnectionString(const char **port, char *connection_string) +{ + bool ipv6 = (strchr(connection_string, ':') != strrchr(connection_string, ':')); + for (char *p = connection_string; *p != '\0'; p++) { + switch (*p) { + case '[': + ipv6 = true; + break; + + case ']': + ipv6 = false; + break; + + case ':': + if (ipv6) break; + *port = p + 1; + *p = '\0'; + break; + } + } +} + +/** * Converts a string to ip/port/company * Format: IP:port#company * @@ -454,11 +484,10 @@ static void CheckPauseOnJoin() * be set to the company and port strings given by the user, inside the memory area originally * occupied by connection_string. */ -void ParseConnectionString(const char **company, const char **port, char *connection_string) +void ParseGameConnectionString(const char **company, const char **port, char *connection_string) { bool ipv6 = (strchr(connection_string, ':') != strrchr(connection_string, ':')); - char *p; - for (p = connection_string; *p != '\0'; p++) { + for (char *p = connection_string; *p != '\0'; p++) { switch (*p) { case '[': ipv6 = true; @@ -592,7 +621,6 @@ void NetworkAddServer(const char *b) { if (*b != '\0') { const char *port = nullptr; - const char *company = nullptr; char host[NETWORK_HOSTNAME_LENGTH]; uint16 rport; @@ -601,7 +629,7 @@ void NetworkAddServer(const char *b) strecpy(_settings_client.network.connect_to_ip, b, lastof(_settings_client.network.connect_to_ip)); rport = NETWORK_DEFAULT_PORT; - ParseConnectionString(&company, &port, host); + ParseConnectionString(&port, host); if (port != nullptr) rport = atoi(port); NetworkUDPQueryServer(NetworkAddress(host, rport), true); diff --git a/src/network/network_func.h b/src/network/network_func.h index cbb89820c..d14dd290f 100644 --- a/src/network/network_func.h +++ b/src/network/network_func.h @@ -43,7 +43,8 @@ void NetworkReboot(); void NetworkDisconnect(bool blocking = false, bool close_admins = true); void NetworkGameLoop(); void NetworkBackgroundLoop(); -void ParseConnectionString(const char **company, const char **port, char *connection_string); +void ParseConnectionString(const char **port, char *connection_string); +void ParseGameConnectionString(const char **company, const char **port, char *connection_string); void NetworkStartDebugLog(NetworkAddress address); void NetworkPopulateCompanyStats(NetworkCompanyStats *stats); diff --git a/src/openttd.cpp b/src/openttd.cpp index ff6867c4b..b204ca5a2 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -478,7 +478,7 @@ struct AfterNewGRFScan : NewGRFScanCallback { uint16 rport = NETWORK_DEFAULT_PORT; CompanyID join_as = COMPANY_NEW_COMPANY; - ParseConnectionString(&company, &port, network_conn); + ParseGameConnectionString(&company, &port, network_conn); if (company != nullptr) { join_as = (CompanyID)atoi(company); @@ -584,11 +584,8 @@ int openttd_main(int argc, char *argv[]) dedicated = true; SetDebugString("net=6"); if (mgo.opt != nullptr) { - /* Use the existing method for parsing (openttd -n). - * However, we do ignore the #company part. */ - const char *temp = nullptr; const char *port = nullptr; - ParseConnectionString(&temp, &port, mgo.opt); + ParseConnectionString(&port, mgo.opt); if (!StrEmpty(mgo.opt)) scanner->dedicated_host = mgo.opt; if (port != nullptr) scanner->dedicated_port = atoi(port); } @@ -774,13 +771,12 @@ int openttd_main(int argc, char *argv[]) NetworkStartUp(); // initialize network-core if (debuglog_conn != nullptr && _network_available) { - const char *not_used = nullptr; const char *port = nullptr; uint16 rport; rport = NETWORK_DEFAULT_DEBUGLOG_PORT; - ParseConnectionString(¬_used, &port, debuglog_conn); + ParseConnectionString(&port, debuglog_conn); if (port != nullptr) rport = atoi(port); NetworkStartDebugLog(NetworkAddress(debuglog_conn, rport)); |