From 861474e0cee5e90265e8b7ff81f232ad2b366ce1 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sat, 13 Nov 2021 23:23:19 -0600 Subject: [PATCH] refactor: tr session.tos (#2149) * refactor: make tr_session.tos string_view-friendly --- libtransmission/session.cc | 51 +++++++++++------------------ libtransmission/utils.h | 10 ++++++ tests/libtransmission/utils-test.cc | 11 +++++++ 3 files changed, 40 insertions(+), 32 deletions(-) diff --git a/libtransmission/session.cc b/libtransmission/session.cc index bcb7f2908..0aab5d809 100644 --- a/libtransmission/session.cc +++ b/libtransmission/session.cc @@ -256,58 +256,40 @@ tr_address const* tr_sessionGetPublicAddress(tr_session const* session, int tr_a **** ***/ -#ifdef TR_LIGHTWEIGHT -#define TR_DEFAULT_ENCRYPTION TR_CLEAR_PREFERRED -#else -#define TR_DEFAULT_ENCRYPTION TR_ENCRYPTION_PREFERRED -#endif - -static int parse_tos(char const* tos) +static int parse_tos(std::string_view tos_in) { - if (evutil_ascii_strcasecmp(tos, "") == 0) + auto tos = tr_strlower(tr_strvStrip(tos_in)); + + if (tos == ""sv || tos == "default"sv) { return 0; } - if (evutil_ascii_strcasecmp(tos, "default") == 0) - { - return 0; - } - - if (evutil_ascii_strcasecmp(tos, "lowcost") == 0) + if (tos == "lowcost"sv || tos == "mincost"sv) { return TR_IPTOS_LOWCOST; } - if (evutil_ascii_strcasecmp(tos, "mincost") == 0) - { - return TR_IPTOS_LOWCOST; - } - - if (evutil_ascii_strcasecmp(tos, "throughput") == 0) + if (tos == "throughput"sv) { return TR_IPTOS_THRUPUT; } - if (evutil_ascii_strcasecmp(tos, "reliability") == 0) + if (tos == "reliability"sv) { return TR_IPTOS_RELIABLE; } - if (evutil_ascii_strcasecmp(tos, "lowdelay") == 0) + if (tos == "lowdelay"sv) { return TR_IPTOS_LOWDELAY; } - char* p = nullptr; - int const value = strtol(tos, &p, 0); - return p == nullptr || p == tos ? 0 : value; + return std::stoi(tos); } -static char const* format_tos(int value) +static std::string format_tos(int value) { - static char buf[8]; - switch (value) { case 0: @@ -326,11 +308,16 @@ static char const* format_tos(int value) return "lowdelay"; default: - tr_snprintf(buf, 8, "%d", value); - return buf; + return std::to_string(value); } } +#ifdef TR_LIGHTWEIGHT +#define TR_DEFAULT_ENCRYPTION TR_CLEAR_PREFERRED +#else +#define TR_DEFAULT_ENCRYPTION TR_ENCRYPTION_PREFERRED +#endif + void tr_sessionGetDefaultSettings(tr_variant* d) { TR_ASSERT(tr_variantIsDict(d)); @@ -851,9 +838,9 @@ static void sessionSetImpl(void* vdata) tr_sessionSetEncryption(session, tr_encryption_mode(i)); } - if (tr_variantDictFindStr(settings, TR_KEY_peer_socket_tos, &strVal, nullptr)) + if (tr_variantDictFindStrView(settings, TR_KEY_peer_socket_tos, &sv)) { - session->peerSocketTOS = parse_tos(strVal); + session->peerSocketTOS = parse_tos(sv); } if (tr_variantDictFindStr(settings, TR_KEY_peer_congestion_algorithm, &strVal, nullptr)) diff --git a/libtransmission/utils.h b/libtransmission/utils.h index 1b77cfbd5..765e57adf 100644 --- a/libtransmission/utils.h +++ b/libtransmission/utils.h @@ -8,6 +8,8 @@ #pragma once +#include +#include #include #include #include @@ -251,6 +253,14 @@ char const* tr_memmem(char const* haystack, size_t haystack_len, char const* nee /** @brief Portability wrapper for strcasestr() that uses the system implementation if available */ char const* tr_strcasestr(char const* haystack, char const* needle); +template +std::string tr_strlower(T in) +{ + auto out = std::string{ in }; + std::for_each(std::begin(out), std::end(out), [](char& ch) { ch = std::tolower(ch); }); + return out; +} + /*** **** std::string_view utils ***/ diff --git a/tests/libtransmission/utils-test.cc b/tests/libtransmission/utils-test.cc index 7b09d8849..f593c8e1a 100644 --- a/tests/libtransmission/utils-test.cc +++ b/tests/libtransmission/utils-test.cc @@ -301,6 +301,17 @@ TEST_F(UtilsTest, lowerbound) } } +TEST_F(UtilsTest, trStrlower) +{ + EXPECT_EQ(""sv, tr_strlower(""sv)); + EXPECT_EQ("apple"sv, tr_strlower("APPLE"sv)); + EXPECT_EQ("apple"sv, tr_strlower("Apple"sv)); + EXPECT_EQ("apple"sv, tr_strlower("aPPLe"sv)); + EXPECT_EQ("apple"sv, tr_strlower("applE"sv)); + EXPECT_EQ("hello"sv, tr_strlower("HELLO"sv)); + EXPECT_EQ("hello"sv, tr_strlower("hello"sv)); +} + TEST_F(UtilsTest, trMemmem) { auto const haystack = std::string{ "abcabcabcabc" };