1
0
Fork 0

Codechange: [Network] Use string_view for network compatability check

pull/9369/head
rubidium42 2021-06-13 23:41:15 +02:00 committed by rubidium42
parent 49dcf0c772
commit a8b3afb236
3 changed files with 16 additions and 14 deletions

View File

@ -38,7 +38,7 @@ NetworkServerGameInfo _network_game_info; ///< Information about our game.
* Get the network version string used by this build. * Get the network version string used by this build.
* The returned string is guaranteed to be at most NETWORK_REVISON_LENGTH bytes including '\0' terminator. * The returned string is guaranteed to be at most NETWORK_REVISON_LENGTH bytes including '\0' terminator.
*/ */
const char *GetNetworkRevisionString() std::string_view GetNetworkRevisionString()
{ {
static std::string network_revision; static std::string network_revision;
@ -65,17 +65,19 @@ const char *GetNetworkRevisionString()
Debug(net, 3, "Network revision name: {}", network_revision); Debug(net, 3, "Network revision name: {}", network_revision);
} }
return network_revision.c_str(); return network_revision;
} }
/** /**
* Extract the git hash from the revision string. * Extract the git hash from the revision string.
* @param revstr The revision string (formatted as DATE-BRANCH-GITHASH). * @param revision_string The revision string (formatted as DATE-BRANCH-GITHASH).
* @return The git has part of the revision. * @return The git has part of the revision.
*/ */
static const char *ExtractNetworkRevisionHash(const char *revstr) static std::string_view ExtractNetworkRevisionHash(std::string_view revision_string)
{ {
return strrchr(revstr, '-'); size_t index = revision_string.find_last_of('-');
if (index == std::string::npos) return {};
return revision_string.substr(index);
} }
/** /**
@ -83,18 +85,18 @@ static const char *ExtractNetworkRevisionHash(const char *revstr)
* First tries to match the full string, if that fails, attempts to compare just git hashes. * First tries to match the full string, if that fails, attempts to compare just git hashes.
* @param other the version string to compare to * @param other the version string to compare to
*/ */
bool IsNetworkCompatibleVersion(const char *other) bool IsNetworkCompatibleVersion(std::string_view other)
{ {
if (strncmp(GetNetworkRevisionString(), other, NETWORK_REVISION_LENGTH - 1) == 0) return true; if (GetNetworkRevisionString() == other) return true;
/* If this version is tagged, then the revision string must be a complete match, /* If this version is tagged, then the revision string must be a complete match,
* since there is no git hash suffix in it. * since there is no git hash suffix in it.
* This is needed to avoid situations like "1.9.0-beta1" comparing equal to "2.0.0-beta1". */ * This is needed to avoid situations like "1.9.0-beta1" comparing equal to "2.0.0-beta1". */
if (_openttd_revision_tagged) return false; if (_openttd_revision_tagged) return false;
const char *hash1 = ExtractNetworkRevisionHash(GetNetworkRevisionString()); std::string_view hash1 = ExtractNetworkRevisionHash(GetNetworkRevisionString());
const char *hash2 = ExtractNetworkRevisionHash(other); std::string_view hash2 = ExtractNetworkRevisionHash(other);
return hash1 != nullptr && hash2 != nullptr && strncmp(hash1, hash2, GITHASH_SUFFIX_LEN) == 0; return hash1 == hash2;
} }
/** /**
@ -103,7 +105,7 @@ bool IsNetworkCompatibleVersion(const char *other)
void CheckGameCompatibility(NetworkGameInfo &ngi) void CheckGameCompatibility(NetworkGameInfo &ngi)
{ {
/* Check if we are allowed on this server based on the revision-check. */ /* Check if we are allowed on this server based on the revision-check. */
ngi.version_compatible = IsNetworkCompatibleVersion(ngi.server_revision.c_str()); ngi.version_compatible = IsNetworkCompatibleVersion(ngi.server_revision);
ngi.compatible = ngi.version_compatible; ngi.compatible = ngi.version_compatible;
/* Check if we have all the GRFs on the client-system too. */ /* Check if we have all the GRFs on the client-system too. */

View File

@ -89,8 +89,8 @@ struct NetworkGameInfo : NetworkServerGameInfo {
extern NetworkServerGameInfo _network_game_info; extern NetworkServerGameInfo _network_game_info;
const char *GetNetworkRevisionString(); std::string_view GetNetworkRevisionString();
bool IsNetworkCompatibleVersion(const char *other); bool IsNetworkCompatibleVersion(std::string_view other);
void CheckGameCompatibility(NetworkGameInfo &ngi); void CheckGameCompatibility(NetworkGameInfo &ngi);
void FillStaticNetworkServerGameInfo(); void FillStaticNetworkServerGameInfo();

View File

@ -878,7 +878,7 @@ NetworkRecvStatus ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN(Packet *p)
uint32 newgrf_version = p->Recv_uint32(); uint32 newgrf_version = p->Recv_uint32();
/* Check if the client has revision control enabled */ /* Check if the client has revision control enabled */
if (!IsNetworkCompatibleVersion(client_revision.c_str()) || _openttd_newgrf_version != newgrf_version) { if (!IsNetworkCompatibleVersion(client_revision) || _openttd_newgrf_version != newgrf_version) {
/* Different revisions!! */ /* Different revisions!! */
return this->SendError(NETWORK_ERROR_WRONG_REVISION); return this->SendError(NETWORK_ERROR_WRONG_REVISION);
} }