diff --git a/cli/cli.cc b/cli/cli.cc index d6a6f4999..0888f40cc 100644 --- a/cli/cli.cc +++ b/cli/cli.cc @@ -30,23 +30,25 @@ using namespace libtransmission::Values; #define SPEED_K_STR "kB/s" -static auto constexpr LineWidth = int{ 80 }; +namespace +{ +auto constexpr LineWidth = int{ 80 }; -static char constexpr MyConfigName[] = "transmission"; -static char constexpr MyReadableName[] = "transmission-cli"; -static char constexpr Usage +char constexpr MyConfigName[] = "transmission"; +char constexpr MyReadableName[] = "transmission-cli"; +char constexpr Usage [] = "A fast and easy BitTorrent client\n" "\n" "Usage: transmission-cli [options] "; -static bool showVersion = false; -static bool verify = false; -static sig_atomic_t gotsig = false; -static sig_atomic_t manualUpdate = false; +bool showVersion = false; +bool verify = false; +sig_atomic_t gotsig = false; +sig_atomic_t manualUpdate = false; -static char const* torrentPath = nullptr; +char const* torrentPath = nullptr; -static auto constexpr Options = std::array{ +auto constexpr Options = std::array{ { { 'b', "blocklist", "Enable peer blocklists", "b", false, nullptr }, { 'B', "no-blocklist", "Disable peer blocklists", "B", false, nullptr }, { 'd', "downlimit", "Set max download speed in " SPEED_K_STR, "d", true, "" }, @@ -76,11 +78,11 @@ static auto constexpr Options = std::array{ { 0, nullptr, nullptr, nullptr, false, nullptr } } }; -static int parseCommandLine(tr_variant*, int argc, char const** argv); +int parseCommandLine(tr_variant*, int argc, char const** argv); -static void sigHandler(int signal); +void sigHandler(int signal); -static std::string tr_strlratio(double ratio) +[[nodiscard]] std::string tr_strlratio(double ratio) { if (static_cast(ratio) == TR_RATIO_NA) { @@ -105,16 +107,16 @@ static std::string tr_strlratio(double ratio) return fmt::format(FMT_STRING("{:.0f}"), ratio); } -static bool waitingOnWeb; +bool waitingOnWeb; -static void onTorrentFileDownloaded(tr_web::FetchResponse const& response) +void onTorrentFileDownloaded(tr_web::FetchResponse const& response) { auto* ctor = static_cast(response.user_data); tr_ctorSetMetainfo(ctor, std::data(response.body), std::size(response.body), nullptr); waitingOnWeb = false; } -static std::string getStatusStr(tr_stat const* st) +[[nodiscard]] std::string getStatusStr(tr_stat const* st) { if (st->activity == TR_STATUS_CHECK_WAIT) { @@ -155,7 +157,7 @@ static std::string getStatusStr(tr_stat const* st) return ""; } -static std::string getConfigDir(int argc, char const** argv) +[[nodiscard]] std::string getConfigDir(int argc, char const** argv) { int c; char const* my_optarg; @@ -175,6 +177,133 @@ static std::string getConfigDir(int argc, char const** argv) return tr_getDefaultConfigDir(MyConfigName); } +// --- + +int parseCommandLine(tr_variant* d, int argc, char const** argv) +{ + int c; + char const* my_optarg; + + while ((c = tr_getopt(Usage, argc, argv, std::data(Options), &my_optarg)) != TR_OPT_DONE) + { + switch (c) + { + case 'b': + tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, true); + break; + + case 'B': + tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, false); + break; + + case 'd': + tr_variantDictAddInt(d, TR_KEY_speed_limit_down, atoi(my_optarg)); + tr_variantDictAddBool(d, TR_KEY_speed_limit_down_enabled, true); + break; + + case 'D': + tr_variantDictAddBool(d, TR_KEY_speed_limit_down_enabled, false); + break; + + case 'f': + tr_variantDictAddStr(d, TR_KEY_script_torrent_done_filename, my_optarg); + tr_variantDictAddBool(d, TR_KEY_script_torrent_done_enabled, true); + break; + + case 'g': /* handled above */ + break; + + case 'm': + tr_variantDictAddBool(d, TR_KEY_port_forwarding_enabled, true); + break; + + case 'M': + tr_variantDictAddBool(d, TR_KEY_port_forwarding_enabled, false); + break; + + case 'p': + tr_variantDictAddInt(d, TR_KEY_peer_port, atoi(my_optarg)); + break; + + case 't': + tr_variantDictAddStr(d, TR_KEY_peer_socket_tos, my_optarg); + break; + + case 'u': + tr_variantDictAddInt(d, TR_KEY_speed_limit_up, atoi(my_optarg)); + tr_variantDictAddBool(d, TR_KEY_speed_limit_up_enabled, true); + break; + + case 'U': + tr_variantDictAddBool(d, TR_KEY_speed_limit_up_enabled, false); + break; + + case 'v': + verify = true; + break; + + case 'V': + showVersion = true; + break; + + case 'w': + tr_variantDictAddStr(d, TR_KEY_download_dir, my_optarg); + break; + + case 910: + tr_variantDictAddInt(d, TR_KEY_encryption, TR_ENCRYPTION_REQUIRED); + break; + + case 911: + tr_variantDictAddInt(d, TR_KEY_encryption, TR_ENCRYPTION_PREFERRED); + break; + + case 912: + tr_variantDictAddInt(d, TR_KEY_encryption, TR_CLEAR_PREFERRED); + break; + + case 500: + tr_variantDictAddBool(d, TR_KEY_sequentialDownload, true); + break; + + case TR_OPT_UNK: + if (torrentPath == nullptr) + { + torrentPath = my_optarg; + } + + break; + + default: + return 1; + } + } + + return 0; +} + +void sigHandler(int signal) +{ + switch (signal) + { + case SIGINT: + gotsig = true; + break; + +#ifndef _WIN32 + + case SIGHUP: + manualUpdate = true; + break; + +#endif + + default: + break; + } +} +} // namespace + int tr_main(int argc, char* argv[]) { auto const init_mgr = tr_lib_init(); @@ -335,132 +464,3 @@ int tr_main(int argc, char* argv[]) tr_sessionClose(h); return EXIT_SUCCESS; } - -/*** -**** -**** -***/ - -static int parseCommandLine(tr_variant* d, int argc, char const** argv) -{ - int c; - char const* my_optarg; - - while ((c = tr_getopt(Usage, argc, argv, std::data(Options), &my_optarg)) != TR_OPT_DONE) - { - switch (c) - { - case 'b': - tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, true); - break; - - case 'B': - tr_variantDictAddBool(d, TR_KEY_blocklist_enabled, false); - break; - - case 'd': - tr_variantDictAddInt(d, TR_KEY_speed_limit_down, atoi(my_optarg)); - tr_variantDictAddBool(d, TR_KEY_speed_limit_down_enabled, true); - break; - - case 'D': - tr_variantDictAddBool(d, TR_KEY_speed_limit_down_enabled, false); - break; - - case 'f': - tr_variantDictAddStr(d, TR_KEY_script_torrent_done_filename, my_optarg); - tr_variantDictAddBool(d, TR_KEY_script_torrent_done_enabled, true); - break; - - case 'g': /* handled above */ - break; - - case 'm': - tr_variantDictAddBool(d, TR_KEY_port_forwarding_enabled, true); - break; - - case 'M': - tr_variantDictAddBool(d, TR_KEY_port_forwarding_enabled, false); - break; - - case 'p': - tr_variantDictAddInt(d, TR_KEY_peer_port, atoi(my_optarg)); - break; - - case 't': - tr_variantDictAddStr(d, TR_KEY_peer_socket_tos, my_optarg); - break; - - case 'u': - tr_variantDictAddInt(d, TR_KEY_speed_limit_up, atoi(my_optarg)); - tr_variantDictAddBool(d, TR_KEY_speed_limit_up_enabled, true); - break; - - case 'U': - tr_variantDictAddBool(d, TR_KEY_speed_limit_up_enabled, false); - break; - - case 'v': - verify = true; - break; - - case 'V': - showVersion = true; - break; - - case 'w': - tr_variantDictAddStr(d, TR_KEY_download_dir, my_optarg); - break; - - case 910: - tr_variantDictAddInt(d, TR_KEY_encryption, TR_ENCRYPTION_REQUIRED); - break; - - case 911: - tr_variantDictAddInt(d, TR_KEY_encryption, TR_ENCRYPTION_PREFERRED); - break; - - case 912: - tr_variantDictAddInt(d, TR_KEY_encryption, TR_CLEAR_PREFERRED); - break; - - case 500: - tr_variantDictAddBool(d, TR_KEY_sequentialDownload, true); - break; - - case TR_OPT_UNK: - if (torrentPath == nullptr) - { - torrentPath = my_optarg; - } - - break; - - default: - return 1; - } - } - - return 0; -} - -static void sigHandler(int signal) -{ - switch (signal) - { - case SIGINT: - gotsig = true; - break; - -#ifndef _WIN32 - - case SIGHUP: - manualUpdate = true; - break; - -#endif - - default: - break; - } -} diff --git a/daemon/daemon-win32.cc b/daemon/daemon-win32.cc index 0b7caf284..4ddddb8b9 100644 --- a/daemon/daemon-win32.cc +++ b/daemon/daemon-win32.cc @@ -23,24 +23,26 @@ #define SERVICE_CONTROL_PRESHUTDOWN 0x0000000F #endif -static LPCWSTR const service_name = L"TransmissionDaemon"; +namespace +{ +LPCWSTR constexpr service_name = L"TransmissionDaemon"; // If we can get rid of this global variable... static tr_daemon* daemon; // ...these becomes a good candidates for being converted to 'class tr_daemon' members. -static SERVICE_STATUS_HANDLE status_handle = nullptr; -static DWORD current_state = SERVICE_STOPPED; -static HANDLE service_thread = nullptr; -static HANDLE service_stop_thread = nullptr; +SERVICE_STATUS_HANDLE status_handle = nullptr; +DWORD current_state = SERVICE_STOPPED; +HANDLE service_thread = nullptr; +HANDLE service_stop_thread = nullptr; -static void set_system_error(tr_error& error, DWORD code, char const* message) +void set_system_error(tr_error& error, DWORD code, char const* message) { auto const system_message = tr_win32_format_message(code); error.set(code, fmt::format(FMT_STRING("{:s} ({:#08x}): {:s})"), message, code, system_message)); } -static void do_log_system_error(char const* file, int line, tr_log_level level, DWORD code, char const* message) +void do_log_system_error(char const* file, int line, tr_log_level level, DWORD code, char const* message) { auto const system_message = tr_win32_format_message(code); tr_logAddMessage(file, line, level, fmt::format("{} ({:#x}): {}", message, code, system_message), "tr_daemon"); @@ -57,13 +59,13 @@ static void do_log_system_error(char const* file, int line, tr_log_level level, } \ } while (0) -static BOOL WINAPI handle_console_ctrl(DWORD /*control_type*/) +BOOL WINAPI handle_console_ctrl(DWORD /*control_type*/) { daemon->stop(); return TRUE; } -static void update_service_status( +void update_service_status( DWORD new_state, DWORD win32_exit_code, DWORD service_specific_exit_code, @@ -91,7 +93,7 @@ static void update_service_status( } } -static unsigned int __stdcall service_stop_thread_main(void* param) +unsigned int __stdcall service_stop_thread_main(void* param) { daemon->stop(); @@ -107,7 +109,7 @@ static unsigned int __stdcall service_stop_thread_main(void* param) return 0; } -static void stop_service(void) +void stop_service(void) { if (service_stop_thread != nullptr) { @@ -128,7 +130,7 @@ static void stop_service(void) } } -static DWORD WINAPI handle_service_ctrl(DWORD control_code, DWORD /*event_type*/, LPVOID /*event_data*/, LPVOID /*context*/) +DWORD WINAPI handle_service_ctrl(DWORD control_code, DWORD /*event_type*/, LPVOID /*event_data*/, LPVOID /*context*/) { switch (control_code) { @@ -150,12 +152,12 @@ static DWORD WINAPI handle_service_ctrl(DWORD control_code, DWORD /*event_type*/ return ERROR_CALL_NOT_IMPLEMENTED; } -static unsigned int __stdcall service_thread_main(void* /*context*/) +unsigned int __stdcall service_thread_main(void* /*context*/) { return daemon->start(false); } -static VOID WINAPI service_main(DWORD /*argc*/, LPWSTR* /*argv*/) +VOID WINAPI service_main(DWORD /*argc*/, LPWSTR* /*argv*/) { status_handle = RegisterServiceCtrlHandlerExW(service_name, &handle_service_ctrl, nullptr); @@ -199,6 +201,7 @@ static VOID WINAPI service_main(DWORD /*argc*/, LPWSTR* /*argv*/) update_service_status(SERVICE_STOPPED, NO_ERROR, exit_code, 0, 0); } +} // namespace bool tr_daemon::setup_signals([[maybe_unused]] struct event*& sig_ev) { diff --git a/daemon/daemon.cc b/daemon/daemon.cc index 8eaa44fcf..73ad54e34 100644 --- a/daemon/daemon.cc +++ b/daemon/daemon.cc @@ -63,21 +63,21 @@ struct tr_torrent; using namespace std::literals; using libtransmission::Watchdir; -static char constexpr MyName[] = "transmission-daemon"; -static char constexpr Usage[] = "Transmission " LONG_VERSION_STRING - " https://transmissionbt.com/\n" - "A fast and easy BitTorrent client\n" - "\n" - "transmission-daemon is a headless Transmission session that can be\n" - "controlled via transmission-qt, transmission-remote, or its web interface.\n" - "\n" - "Usage: transmission-daemon [options]"; +namespace +{ +char constexpr MyName[] = "transmission-daemon"; +char constexpr Usage[] = "Transmission " LONG_VERSION_STRING + " https://transmissionbt.com/\n" + "A fast and easy BitTorrent client\n" + "\n" + "transmission-daemon is a headless Transmission session that can be\n" + "controlled via transmission-qt, transmission-remote, or its web interface.\n" + "\n" + "Usage: transmission-daemon [options]"; -/*** -**** Config File -***/ +// --- Config File -static auto constexpr Options = std::array{ +auto constexpr Options = std::array{ { { 'a', "allowed", "Allowed IP addresses. (Default: " TR_DEFAULT_RPC_WHITELIST ")", "a", true, "" }, { 'b', "blocklist", "Enable peer blocklists", "b", false, nullptr }, { 'B', "no-blocklist", "Disable peer blocklists", "B", false, nullptr }, @@ -145,39 +145,7 @@ static auto constexpr Options = std::array{ { 0, nullptr, nullptr, nullptr, false, nullptr } } }; -bool tr_daemon::reopen_log_file(char const* filename) -{ - auto error = tr_error{}; - tr_sys_file_t const old_log_file = logfile_; - tr_sys_file_t const new_log_file = tr_sys_file_open( - filename, - TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_APPEND, - 0666, - &error); - - if (new_log_file == TR_BAD_SYS_FILE) - { - auto const errmsg = fmt::format( - "Couldn't open '{path}': {error} ({error_code})", - fmt::arg("path", filename), - fmt::arg("error", error.message()), - fmt::arg("error_code", error.code())); - fmt::print(stderr, "{:s}\n", errmsg); - return false; - } - - logfile_ = new_log_file; - logfile_flush_ = tr_sys_file_flush_possible(logfile_); - - if (old_log_file != TR_BAD_SYS_FILE) - { - tr_sys_file_close(old_log_file); - } - - return true; -} - -static std::string getConfigDir(int argc, char const* const* argv) +[[nodiscard]] std::string getConfigDir(int argc, char const* const* argv) { int c; char const* optstr; @@ -196,7 +164,7 @@ static std::string getConfigDir(int argc, char const* const* argv) return tr_getDefaultConfigDir(MyName); } -static auto onFileAdded(tr_session* session, std::string_view dirname, std::string_view basename) +auto onFileAdded(tr_session* session, std::string_view dirname, std::string_view basename) { auto const lowercase = tr_strlower(basename); auto const is_torrent = tr_strv_ends_with(lowercase, ".torrent"sv); @@ -281,7 +249,7 @@ static auto onFileAdded(tr_session* session, std::string_view dirname, std::stri return Watchdir::Action::Done; } -static char const* levelName(tr_log_level level) +[[nodiscard]] constexpr char const* levelName(tr_log_level level) { switch (level) { @@ -300,7 +268,7 @@ static char const* levelName(tr_log_level level) } } -static void printMessage( +void printMessage( tr_sys_file_t file, tr_log_level level, std::string_view name, @@ -362,7 +330,7 @@ static void printMessage( #endif } -static void pumpLogMessages(tr_sys_file_t file, bool flush) +void pumpLogMessages(tr_sys_file_t file, bool flush) { tr_log_message* list = tr_logGetQueue(); @@ -379,6 +347,53 @@ static void pumpLogMessages(tr_sys_file_t file, bool flush) tr_logFreeQueue(list); } +void periodic_update(evutil_socket_t /*fd*/, short /*what*/, void* arg) +{ + static_cast(arg)->periodic_update(); +} + +tr_rpc_callback_status on_rpc_callback(tr_session* /*session*/, tr_rpc_callback_type type, tr_torrent* /*tor*/, void* arg) +{ + if (type == TR_RPC_SESSION_CLOSE) + { + static_cast(arg)->stop(); + } + return TR_RPC_OK; +} +} // namespace + +bool tr_daemon::reopen_log_file(char const* filename) +{ + auto error = tr_error{}; + tr_sys_file_t const old_log_file = logfile_; + tr_sys_file_t const new_log_file = tr_sys_file_open( + filename, + TR_SYS_FILE_WRITE | TR_SYS_FILE_CREATE | TR_SYS_FILE_APPEND, + 0666, + &error); + + if (new_log_file == TR_BAD_SYS_FILE) + { + auto const errmsg = fmt::format( + "Couldn't open '{path}': {error} ({error_code})", + fmt::arg("path", filename), + fmt::arg("error", error.message()), + fmt::arg("error_code", error.code())); + fmt::print(stderr, "{:s}\n", errmsg); + return false; + } + + logfile_ = new_log_file; + logfile_flush_ = tr_sys_file_flush_possible(logfile_); + + if (old_log_file != TR_BAD_SYS_FILE) + { + tr_sys_file_close(old_log_file); + } + + return true; +} + void tr_daemon::report_status(void) { double const up = tr_sessionGetRawSpeed_KBps(my_session_, TR_UP); @@ -400,24 +415,6 @@ void tr_daemon::periodic_update(void) report_status(); } -static void periodic_update(evutil_socket_t /*fd*/, short /*what*/, void* arg) -{ - static_cast(arg)->periodic_update(); -} - -static tr_rpc_callback_status on_rpc_callback( - tr_session* /*session*/, - tr_rpc_callback_type type, - tr_torrent* /*tor*/, - void* arg) -{ - if (type == TR_RPC_SESSION_CLOSE) - { - static_cast(arg)->stop(); - } - return TR_RPC_OK; -} - bool tr_daemon::parse_args(int argc, char const* const* argv, bool* dump_settings, bool* foreground, int* exit_code) { int c; diff --git a/gtk/Prefs.cc b/gtk/Prefs.cc index 07bbf4230..de362d645 100644 --- a/gtk/Prefs.cc +++ b/gtk/Prefs.cc @@ -25,13 +25,9 @@ void gtr_pref_init(std::string_view config_dir) gl_confdir = config_dir; } -/*** -**** -**** Preferences -**** -***/ - -[[nodiscard]] static std::string get_default_download_dir() +namespace +{ +[[nodiscard]] std::string get_default_download_dir() { if (auto dir = Glib::get_user_special_dir(TR_GLIB_USER_DIRECTORY(DOWNLOAD)); !std::empty(dir)) { @@ -50,7 +46,7 @@ void gtr_pref_init(std::string_view config_dir) * This is where we initialize the preferences file with the default values. * If you add a new preferences key, you /must/ add a default value here. */ -[[nodiscard]] static tr_variant get_default_app_settings() +[[nodiscard]] tr_variant get_default_app_settings() { auto const dir = get_default_download_dir(); @@ -88,7 +84,7 @@ void gtr_pref_init(std::string_view config_dir) return tr_variant{ std::move(map) }; } -static void ensure_sound_cmd_is_a_list(tr_variant* dict) +void ensure_sound_cmd_is_a_list(tr_variant* dict) { tr_quark const key = TR_KEY_torrent_complete_sound_command; tr_variant* list = nullptr; @@ -106,7 +102,7 @@ static void ensure_sound_cmd_is_a_list(tr_variant* dict) tr_variantListAddStr(list, "transmission torrent downloaded"sv); } -static tr_variant& getPrefs() +tr_variant& getPrefs() { static auto settings = tr_variant{}; @@ -119,10 +115,7 @@ static tr_variant& getPrefs() return settings; } - -/*** -**** -***/ +} // namespace tr_variant& gtr_pref_get_all() { @@ -153,9 +146,7 @@ void gtr_pref_double_set(tr_quark const key, double value) tr_variantDictAddReal(&getPrefs(), key, value); } -/*** -**** -***/ +// --- bool gtr_pref_flag_get(tr_quark const key) { @@ -169,9 +160,7 @@ void gtr_pref_flag_set(tr_quark const key, bool value) tr_variantDictAddBool(&getPrefs(), key, value); } -/*** -**** -***/ +// --- std::vector gtr_pref_strv_get(tr_quark const key) { @@ -207,9 +196,7 @@ void gtr_pref_string_set(tr_quark const key, std::string_view value) tr_variantDictAddStr(&getPrefs(), key, value); } -/*** -**** -***/ +// --- void gtr_pref_save(tr_session* session) { diff --git a/libtransmission/crypto-utils-mbedtls.cc b/libtransmission/crypto-utils-mbedtls.cc index c19486ad1..80ea9af82 100644 --- a/libtransmission/crypto-utils-mbedtls.cc +++ b/libtransmission/crypto-utils-mbedtls.cc @@ -25,9 +25,9 @@ #define TR_CRYPTO_X509_FALLBACK #include "libtransmission/crypto-utils-fallback.cc" // NOLINT(bugprone-suspicious-include) -// --- - -static void log_mbedtls_error(int error_code, char const* file, int line) +namespace +{ +void log_mbedtls_error(int error_code, char const* file, int line) { if (tr_logLevelIsActive(TR_LOG_ERROR)) { @@ -48,7 +48,7 @@ static void log_mbedtls_error(int error_code, char const* file, int line) #define log_error(error_code) log_mbedtls_error((error_code), __FILE__, __LINE__) -static bool check_mbedtls_result(int result, int expected_result, char const* file, int line) +bool check_mbedtls_result(int result, int expected_result, char const* file, int line) { bool const ret = result == expected_result; @@ -65,14 +65,14 @@ static bool check_mbedtls_result(int result, int expected_result, char const* fi // --- -static int my_rand(void* /*context*/, unsigned char* buffer, size_t buffer_size) +int my_rand(void* /*context*/, unsigned char* buffer, size_t buffer_size) { // since we're initializing tr_rand_buffer()'s rng, we can't use tr_rand_buffer() here tr_rand_buffer_std(buffer, buffer_size); return 0; } -static mbedtls_ctr_drbg_context* get_rng() +mbedtls_ctr_drbg_context* get_rng() { static mbedtls_ctr_drbg_context rng; static bool rng_initialized = false; @@ -97,13 +97,10 @@ static mbedtls_ctr_drbg_context* get_rng() return &rng; } -static std::recursive_mutex rng_mutex_; +std::recursive_mutex rng_mutex_; // --- -namespace -{ - class Sha1Impl final : public tr_sha1 { public: diff --git a/libtransmission/crypto-utils-wolfssl.cc b/libtransmission/crypto-utils-wolfssl.cc index 69bebe051..a5554bbbb 100644 --- a/libtransmission/crypto-utils-wolfssl.cc +++ b/libtransmission/crypto-utils-wolfssl.cc @@ -31,9 +31,9 @@ using TR_WC_RNG = RNG; #define TR_CRYPTO_X509_FALLBACK #include "crypto-utils-fallback.cc" // NOLINT(bugprone-suspicious-include) -// --- - -static void log_wolfssl_error(int error_code, char const* file, int line) +namespace +{ +void log_wolfssl_error(int error_code, char const* file, int line) { if (tr_logLevelIsActive(TR_LOG_ERROR)) { @@ -49,7 +49,7 @@ static void log_wolfssl_error(int error_code, char const* file, int line) } } -static bool check_wolfssl_result(int result, char const* file, int line) +bool check_wolfssl_result(int result, char const* file, int line) { bool const ret = result == 0; @@ -65,7 +65,7 @@ static bool check_wolfssl_result(int result, char const* file, int line) // --- -static TR_WC_RNG* get_rng() +TR_WC_RNG* get_rng() { static TR_WC_RNG rng; static bool rng_initialized = false; @@ -83,13 +83,10 @@ static TR_WC_RNG* get_rng() return &rng; } -static std::mutex rng_mutex_; +std::mutex rng_mutex_; // --- -namespace -{ - class Sha1Impl final : public tr_sha1 { public: diff --git a/libtransmission/file-win32.cc b/libtransmission/file-win32.cc index 66397732e..24c8cf1ff 100644 --- a/libtransmission/file-win32.cc +++ b/libtransmission/file-win32.cc @@ -43,10 +43,12 @@ struct tr_sys_dir_win32 std::string utf8_name; }; -static auto constexpr NativeLocalPathPrefix = L"\\\\?\\"sv; -static auto constexpr NativeUncPathPrefix = L"\\\\?\\UNC\\"sv; +namespace +{ +auto constexpr NativeLocalPathPrefix = L"\\\\?\\"sv; +auto constexpr NativeUncPathPrefix = L"\\\\?\\UNC\\"sv; -static void set_system_error(tr_error* error, DWORD code) +void set_system_error(tr_error* error, DWORD code) { if (error != nullptr) { @@ -55,7 +57,7 @@ static void set_system_error(tr_error* error, DWORD code) } } -static void set_system_error_if_file_found(tr_error* error, DWORD code) +void set_system_error_if_file_found(tr_error* error, DWORD code) { if (code != ERROR_FILE_NOT_FOUND && code != ERROR_PATH_NOT_FOUND && code != ERROR_NO_MORE_FILES) { @@ -63,7 +65,7 @@ static void set_system_error_if_file_found(tr_error* error, DWORD code) } } -static constexpr time_t filetime_to_unix_time(FILETIME const& t) +constexpr time_t filetime_to_unix_time(FILETIME const& t) { uint64_t tmp = 0; tmp |= t.dwHighDateTime; @@ -75,7 +77,7 @@ static constexpr time_t filetime_to_unix_time(FILETIME const& t) return tmp / 1000000UL; } -static constexpr auto stat_to_sys_path_info(DWORD attributes, DWORD size_low, DWORD size_high, FILETIME const& mtime) +constexpr auto stat_to_sys_path_info(DWORD attributes, DWORD size_low, DWORD size_high, FILETIME const& mtime) { auto info = tr_sys_path_info{}; @@ -101,19 +103,19 @@ static constexpr auto stat_to_sys_path_info(DWORD attributes, DWORD size_low, DW return info; } -static auto constexpr Slashes = "\\/"sv; +auto constexpr Slashes = "\\/"sv; -static constexpr bool is_slash(char c) +constexpr bool is_slash(char c) { return tr_strv_contains(Slashes, c); } -static constexpr bool is_unc_path(std::string_view path) +constexpr bool is_unc_path(std::string_view path) { return std::size(path) >= 2 && is_slash(path[0]) && path[1] == path[0]; } -static bool is_valid_path(std::string_view path) +bool is_valid_path(std::string_view path) { if (is_unc_path(path)) { @@ -140,11 +142,6 @@ static bool is_valid_path(std::string_view path) return path.find_first_of("<>:\"|?*"sv) == path.npos; } -namespace -{ -namespace path_to_native_path_helpers -{ - auto path_to_fixed_native_path(std::string_view path) { auto wide_path = tr_win32_utf8_to_native(path); @@ -168,15 +165,10 @@ auto path_to_fixed_native_path(std::string_view path) return wide_path; } -} // namespace path_to_native_path_helpers -} // namespace - /* Extending maximum path length limit up to ~32K. See "Naming Files, Paths, and Namespaces" https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247.aspx for more info */ -static auto path_to_native_path(std::string_view path) +auto path_to_native_path(std::string_view path) { - using namespace path_to_native_path_helpers; - if (is_unc_path(path)) { // UNC path: "\\server\share" -> "\\?\UNC\server\share" @@ -197,7 +189,7 @@ static auto path_to_native_path(std::string_view path) return path_to_fixed_native_path(path); } -static std::string native_path_to_path(std::wstring_view wide_path) +std::string native_path_to_path(std::wstring_view wide_path) { if (std::empty(wide_path)) { @@ -221,7 +213,7 @@ static std::string native_path_to_path(std::wstring_view wide_path) return tr_win32_native_to_utf8(wide_path); } -static tr_sys_file_t open_file(std::string_view path, DWORD access, DWORD disposition, DWORD flags, tr_error* error) +tr_sys_file_t open_file(std::string_view path, DWORD access, DWORD disposition, DWORD flags, tr_error* error) { tr_sys_file_t ret = TR_BAD_SYS_FILE; @@ -245,7 +237,7 @@ static tr_sys_file_t open_file(std::string_view path, DWORD access, DWORD dispos return ret; } -static bool create_dir(std::string_view path, int flags, int /*permissions*/, bool okay_if_exists, tr_error* error) +bool create_dir(std::string_view path, int flags, int /*permissions*/, bool okay_if_exists, tr_error* error) { bool ret; DWORD error_code = ERROR_SUCCESS; @@ -290,7 +282,7 @@ static bool create_dir(std::string_view path, int flags, int /*permissions*/, bo return ret; } -static void create_temp_path( +void create_temp_path( char* path_template, void (*callback)(char const* path, void* param, tr_error* error), void* callback_param, @@ -339,6 +331,72 @@ static void create_temp_path( } } +std::optional tr_sys_file_get_info_(tr_sys_file_t handle, tr_error* error) +{ + TR_ASSERT(handle != TR_BAD_SYS_FILE); + + auto attributes = BY_HANDLE_FILE_INFORMATION{}; + if (GetFileInformationByHandle(handle, &attributes)) + { + return stat_to_sys_path_info( + attributes.dwFileAttributes, + attributes.nFileSizeLow, + attributes.nFileSizeHigh, + attributes.ftLastWriteTime); + } + + set_system_error(error, GetLastError()); + return {}; +} + +std::optional get_file_info(char const* path, tr_error* error) +{ + auto const wpath = path_to_native_path(path); + if (std::empty(wpath)) + { + set_system_error_if_file_found(error, GetLastError()); + return {}; + } + + auto const handle = CreateFileW(wpath.c_str(), 0, 0, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr); + if (handle == INVALID_HANDLE_VALUE) + { + set_system_error_if_file_found(error, GetLastError()); + return {}; + } + + // TODO: Use GetFileInformationByHandleEx on >= Server 2012 + auto info = BY_HANDLE_FILE_INFORMATION{}; + if (!GetFileInformationByHandle(handle, &info)) + { + set_system_error_if_file_found(error, GetLastError()); + CloseHandle(handle); + return {}; + } + + CloseHandle(handle); + return info; +} + +void file_open_temp_callback(char const* path, void* param, tr_error* error) +{ + auto* const result = static_cast(param); + + TR_ASSERT(result != nullptr); + + *result = open_file(path, GENERIC_READ | GENERIC_WRITE, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY, error); +} + +void dir_create_temp_callback(char const* path, void* param, tr_error* error) +{ + auto* const result = static_cast(param); + + TR_ASSERT(result != nullptr); + + *result = create_dir(path, 0, 0, false, error); +} +} // namespace + bool tr_sys_path_exists(char const* path, tr_error* error) { TR_ASSERT(path != nullptr); @@ -377,24 +435,6 @@ bool tr_sys_path_exists(char const* path, tr_error* error) return ret; } -static std::optional tr_sys_file_get_info_(tr_sys_file_t handle, tr_error* error) -{ - TR_ASSERT(handle != TR_BAD_SYS_FILE); - - auto attributes = BY_HANDLE_FILE_INFORMATION{}; - if (GetFileInformationByHandle(handle, &attributes)) - { - return stat_to_sys_path_info( - attributes.dwFileAttributes, - attributes.nFileSizeLow, - attributes.nFileSizeHigh, - attributes.ftLastWriteTime); - } - - set_system_error(error, GetLastError()); - return {}; -} - std::optional tr_sys_path_get_info(std::string_view path, int flags, tr_error* error) { if (auto const wide_path = path_to_native_path(path); std::empty(wide_path)) @@ -449,35 +489,6 @@ bool tr_sys_path_is_relative(std::string_view path) return true; } -static std::optional get_file_info(char const* path, tr_error* error) -{ - auto const wpath = path_to_native_path(path); - if (std::empty(wpath)) - { - set_system_error_if_file_found(error, GetLastError()); - return {}; - } - - auto const handle = CreateFileW(wpath.c_str(), 0, 0, nullptr, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, nullptr); - if (handle == INVALID_HANDLE_VALUE) - { - set_system_error_if_file_found(error, GetLastError()); - return {}; - } - - // TODO: Use GetFileInformationByHandleEx on >= Server 2012 - auto info = BY_HANDLE_FILE_INFORMATION{}; - if (!GetFileInformationByHandle(handle, &info)) - { - set_system_error_if_file_found(error, GetLastError()); - CloseHandle(handle); - return {}; - } - - CloseHandle(handle); - return info; -} - bool tr_sys_path_is_same(char const* path1, char const* path2, tr_error* error) { TR_ASSERT(path1 != nullptr); @@ -899,15 +910,6 @@ tr_sys_file_t tr_sys_file_open(char const* path, int flags, int /*permissions*/, return ret; } -static void file_open_temp_callback(char const* path, void* param, tr_error* error) -{ - auto* const result = static_cast(param); - - TR_ASSERT(result != nullptr); - - *result = open_file(path, GENERIC_READ | GENERIC_WRITE, CREATE_NEW, FILE_ATTRIBUTE_TEMPORARY, error); -} - tr_sys_file_t tr_sys_file_open_temp(char* path_template, tr_error* error) { TR_ASSERT(path_template != nullptr); @@ -1207,15 +1209,6 @@ bool tr_sys_dir_create(char const* path, int flags, int permissions, tr_error* e return create_dir(path, flags, permissions, true, error); } -static void dir_create_temp_callback(char const* path, void* param, tr_error* error) -{ - auto* const result = static_cast(param); - - TR_ASSERT(result != nullptr); - - *result = create_dir(path, 0, 0, false, error); -} - bool tr_sys_dir_create_temp(char* path_template, tr_error* error) { TR_ASSERT(path_template != nullptr); diff --git a/libtransmission/net.cc b/libtransmission/net.cc index 25255ed66..b29203447 100644 --- a/libtransmission/net.cc +++ b/libtransmission/net.cc @@ -175,7 +175,9 @@ void tr_netSetCongestionControl([[maybe_unused]] tr_socket_t s, [[maybe_unused]] #endif } -static tr_socket_t createSocket(int domain, int type) +namespace +{ +tr_socket_t createSocket(int domain, int type) { auto const sockfd = socket(domain, type, 0); if (sockfd == TR_BAD_SOCKET) @@ -220,6 +222,7 @@ static tr_socket_t createSocket(int domain, int type) return sockfd; } +} // namespace tr_peer_socket tr_netOpenPeerSocket(tr_session* session, tr_socket_address const& socket_address, bool client_is_seed) { @@ -299,7 +302,9 @@ tr_peer_socket tr_netOpenPeerSocket(tr_session* session, tr_socket_address const return ret; } -static tr_socket_t tr_netBindTCPImpl(tr_address const& addr, tr_port port, bool suppress_msgs, int* err_out) +namespace +{ +tr_socket_t tr_netBindTCPImpl(tr_address const& addr, tr_port port, bool suppress_msgs, int* err_out) { TR_ASSERT(addr.is_valid()); @@ -387,6 +392,7 @@ static tr_socket_t tr_netBindTCPImpl(tr_address const& addr, tr_port port, bool return fd; } +} // namespace tr_socket_t tr_netBindTCP(tr_address const& addr, tr_port port, bool suppress_msgs) { diff --git a/libtransmission/web.cc b/libtransmission/web.cc index e600af3a2..3fecd1597 100644 --- a/libtransmission/web.cc +++ b/libtransmission/web.cc @@ -106,10 +106,9 @@ struct EasyDeleter using easy_unique_ptr = std::unique_ptr; } // namespace curl_helpers -} // namespace #ifdef _WIN32 -static CURLcode ssl_context_func(CURL* /*curl*/, void* ssl_ctx, void* /*user_data*/) +CURLcode ssl_context_func(CURL* /*curl*/, void* ssl_ctx, void* /*user_data*/) { auto const cert_store = tr_ssl_get_x509_store(ssl_ctx); if (cert_store == nullptr) @@ -162,6 +161,7 @@ static CURLcode ssl_context_func(CURL* /*curl*/, void* ssl_ctx, void* /*user_dat return CURLE_OK; } #endif +} // namespace // --- diff --git a/qt/DetailsDialog.cc b/qt/DetailsDialog.cc index f8a7de331..46ca48c05 100644 --- a/qt/DetailsDialog.cc +++ b/qt/DetailsDialog.cc @@ -53,9 +53,7 @@ class Prefs; class Session; -/**** -***** -****/ +// --- namespace { @@ -92,10 +90,20 @@ private: QTimer timer_; }; -} // namespace - -namespace +constexpr tr_quark priorityKey(int priority) { + switch (priority) + { + case TR_PRI_LOW: + return TR_KEY_priority_low; + + case TR_PRI_HIGH: + return TR_KEY_priority_high; + + default: + return TR_KEY_priority_normal; + } +} int constexpr DebounceIntervalMSec = 100; int constexpr RefreshIntervalMSec = 4000; @@ -124,44 +132,9 @@ int measureViewItem(QTreeWidget const* view, int column, QString const& text) return std::max(item_width, header_width); } -QString collateAddress(QString const& address) -{ - auto collated = QString{}; - - if (auto ip_address = QHostAddress{}; ip_address.setAddress(address)) - { - if (ip_address.protocol() == QAbstractSocket::IPv4Protocol) - { - quint32 const ipv4_address = ip_address.toIPv4Address(); - collated = QStringLiteral("1-") + QString::fromUtf8(QByteArray::number(ipv4_address, 16).rightJustified(8, '0')); - } - else if (ip_address.protocol() == QAbstractSocket::IPv6Protocol) - { - Q_IPV6ADDR const ipv6_address = ip_address.toIPv6Address(); - QByteArray tmp(16, '\0'); - - for (int i = 0; i < 16; ++i) - { - tmp[i] = ipv6_address[i]; - } - - collated = QStringLiteral("2-") + QString::fromUtf8(tmp.toHex()); - } - } - - if (collated.isEmpty()) - { - collated = QStringLiteral("3-") + address.toLower(); - } - - return collated; -} - } // namespace -/*** -**** -***/ +// --- class PeerItem : public QTreeWidgetItem { @@ -233,11 +206,43 @@ private: return collated_address_; } + + [[nodiscard]] static QString collateAddress(QString const& address) + { + auto collated = QString{}; + + if (auto ip_address = QHostAddress{}; ip_address.setAddress(address)) + { + if (ip_address.protocol() == QAbstractSocket::IPv4Protocol) + { + quint32 const ipv4_address = ip_address.toIPv4Address(); + collated = QStringLiteral("1-") + + QString::fromUtf8(QByteArray::number(ipv4_address, 16).rightJustified(8, '0')); + } + else if (ip_address.protocol() == QAbstractSocket::IPv6Protocol) + { + Q_IPV6ADDR const ipv6_address = ip_address.toIPv6Address(); + QByteArray tmp(16, '\0'); + + for (int i = 0; i < 16; ++i) + { + tmp[i] = ipv6_address[i]; + } + + collated = QStringLiteral("2-") + QString::fromUtf8(tmp.toHex()); + } + } + + if (collated.isEmpty()) + { + collated = QStringLiteral("3-") + address.toLower(); + } + + return collated; + } }; -/*** -**** -***/ +// --- // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) int DetailsDialog::prev_tab_index_ = 0; @@ -328,9 +333,7 @@ void DetailsDialog::refreshPref(int key) } } -/*** -**** -***/ +// --- void DetailsDialog::refreshModel() { @@ -1317,9 +1320,7 @@ void DetailsDialog::setEnabled(bool enabled) ui_.tabs->setEnabled(enabled); } -/*** -**** -***/ +// --- void DetailsDialog::initInfoTab() { @@ -1336,9 +1337,7 @@ void DetailsDialog::initInfoTab() cr->update(); } -/*** -**** -***/ +// --- void DetailsDialog::onShowTrackerScrapesToggled(bool val) { @@ -1572,9 +1571,7 @@ void DetailsDialog::initOptionsTab() connect(ui_.singleUpSpin, &QSpinBox::editingFinished, this, &DetailsDialog::onSpinBoxEditingFinished); } -/*** -**** -***/ +// --- void DetailsDialog::initTrackerTab() { @@ -1616,9 +1613,7 @@ void DetailsDialog::initTrackerTab() onTrackerSelectionChanged(); } -/*** -**** -***/ +// --- void DetailsDialog::initPeersTab() { @@ -1635,9 +1630,7 @@ void DetailsDialog::initPeersTab() ui_.peersView->setColumnWidth(COL_ADDRESS, measureViewItem(ui_.peersView, COL_ADDRESS, QStringLiteral("888.888.888.888"))); } -/*** -**** -***/ +// --- void DetailsDialog::initFilesTab() const { @@ -1647,21 +1640,6 @@ void DetailsDialog::initFilesTab() const connect(ui_.filesView, &FileTreeView::wantedChanged, this, &DetailsDialog::onFileWantedChanged); } -static constexpr tr_quark priorityKey(int priority) -{ - switch (priority) - { - case TR_PRI_LOW: - return TR_KEY_priority_low; - - case TR_PRI_HIGH: - return TR_KEY_priority_high; - - default: - return TR_KEY_priority_normal; - } -} - void DetailsDialog::onFilePriorityChanged(file_indices_t const& indices, int priority) { torrentSet(priorityKey(priority), std::vector{ std::begin(indices), std::end(indices) }); diff --git a/qt/PrefsDialog.cc b/qt/PrefsDialog.cc index d86c1d3c4..0be94f1f0 100644 --- a/qt/PrefsDialog.cc +++ b/qt/PrefsDialog.cc @@ -149,6 +149,25 @@ QString qtDayName(int day) } } +[[nodiscard]] bool isDescendantOf(QObject const* descendant, QObject const* ancestor) +{ + if (ancestor == nullptr) + { + return false; + } + + while (descendant != nullptr) + { + if (descendant == ancestor) + { + return true; + } + + descendant = descendant->parent(); + } + + return false; +} } // namespace bool PrefsDialog::updateWidgetValue(QWidget* widget, int pref_key) const @@ -234,24 +253,6 @@ void PrefsDialog::linkWidgetToPref(QWidget* widget, int pref_key) } } -static bool isDescendantOf(QObject const* descendant, QObject const* ancestor) -{ - if (ancestor == nullptr) - { - return false; - } - while (descendant != nullptr) - { - if (descendant == ancestor) - { - return true; - } - - descendant = descendant->parent(); - } - return false; -} - void PrefsDialog::focusChanged(QWidget* old, QWidget* cur) { // We don't want to change the preference every time there's a keystroke @@ -334,9 +335,7 @@ void PrefsDialog::pathChanged(QString const& path) } } -/*** -**** -***/ +// --- void PrefsDialog::initRemoteTab() { @@ -356,9 +355,7 @@ void PrefsDialog::initRemoteTab() connect(ui_.openWebClientButton, &QAbstractButton::clicked, &session_, &Session::launchWebInterface); } -/*** -**** -***/ +// --- void PrefsDialog::altSpeedDaysEdited(int i) { @@ -416,9 +413,7 @@ void PrefsDialog::initSpeedTab() connect(ui_.altSpeedLimitDaysCombo, qOverload(&QComboBox::activated), this, &PrefsDialog::altSpeedDaysEdited); } -/*** -**** -***/ +// --- void PrefsDialog::initDesktopTab() { @@ -429,9 +424,7 @@ void PrefsDialog::initDesktopTab() linkWidgetToPref(ui_.playSoundOnTorrentCompletedCheck, Prefs::COMPLETE_SOUND_ENABLED); } -/*** -**** -***/ +// --- void PrefsDialog::onPortTested(bool isOpen) { @@ -473,9 +466,7 @@ void PrefsDialog::initNetworkTab() connect(&session_, &Session::portTested, this, &PrefsDialog::onPortTested); } -/*** -**** -***/ +// --- void PrefsDialog::onBlocklistDialogDestroyed(QObject* o) { @@ -540,9 +531,7 @@ void PrefsDialog::initPrivacyTab() updateBlocklistLabel(); } -/*** -**** -***/ +// --- void PrefsDialog::onIdleLimitChanged() { @@ -656,9 +645,7 @@ void PrefsDialog::updateSeedingWidgetsLocality() ui_.doneSeedingScriptStack->setFixedHeight(ui_.doneSeedingScriptStack->currentWidget()->sizeHint().height()); } -/*** -**** -***/ +// --- PrefsDialog::PrefsDialog(Session& session, Prefs& prefs, QWidget* parent) : BaseDialog{ parent } @@ -719,9 +706,7 @@ void PrefsDialog::setPref(int key, QVariant const& v) refreshPref(key); } -/*** -**** -***/ +// --- void PrefsDialog::sessionUpdated() { diff --git a/utils/edit.cc b/utils/edit.cc index e8773c8cb..ccacfc4e8 100644 --- a/utils/edit.cc +++ b/utils/edit.cc @@ -20,8 +20,10 @@ #include #include -static char constexpr MyName[] = "transmission-edit"; -static char constexpr Usage[] = "Usage: transmission-edit [options] torrent-file(s)"; +namespace +{ +char constexpr MyName[] = "transmission-edit"; +char constexpr Usage[] = "Usage: transmission-edit [options] torrent-file(s)"; struct app_options { @@ -33,7 +35,7 @@ struct app_options bool show_version = false; }; -static auto constexpr Options = std::array{ +auto constexpr Options = std::array{ { { 'a', "add", "Add a tracker's announce URL", "a", true, "" }, { 'd', "delete", "Delete a tracker's announce URL", "d", true, "" }, { 'r', "replace", "Search and replace a substring in the announce URLs", "r", true, " " }, @@ -42,7 +44,7 @@ static auto constexpr Options = std::array{ { 0, nullptr, nullptr, nullptr, false, nullptr } } }; -static int parseCommandLine(app_options& opts, int argc, char const* const* argv) +int parseCommandLine(app_options& opts, int argc, char const* const* argv) { int c; char const* optarg; @@ -91,7 +93,7 @@ static int parseCommandLine(app_options& opts, int argc, char const* const* argv return 0; } -static bool removeURL(tr_variant* metainfo, std::string_view url) +bool removeURL(tr_variant* metainfo, std::string_view url) { auto sv = std::string_view{}; tr_variant* announce_list; @@ -164,7 +166,7 @@ static bool removeURL(tr_variant* metainfo, std::string_view url) return changed; } -static std::string replaceSubstr(std::string_view str, std::string_view oldval, std::string_view newval) +[[nodisard]] auto replaceSubstr(std::string_view str, std::string_view oldval, std::string_view newval) { auto ret = std::string{}; @@ -183,7 +185,7 @@ static std::string replaceSubstr(std::string_view str, std::string_view oldval, return ret; } -static bool replaceURL(tr_variant* metainfo, std::string_view oldval, std::string_view newval) +bool replaceURL(tr_variant* metainfo, std::string_view oldval, std::string_view newval) { auto sv = std::string_view{}; tr_variant* announce_list; @@ -228,7 +230,7 @@ static bool replaceURL(tr_variant* metainfo, std::string_view oldval, std::strin return changed; } -static bool announce_list_has_url(tr_variant* announce_list, char const* url) +[[nodiscard]] bool announce_list_has_url(tr_variant* announce_list, char const* url) { int tierCount = 0; tr_variant* tier; @@ -254,7 +256,7 @@ static bool announce_list_has_url(tr_variant* announce_list, char const* url) return false; } -static bool addURL(tr_variant* metainfo, char const* url) +bool addURL(tr_variant* metainfo, char const* url) { auto announce = std::string_view{}; tr_variant* announce_list = nullptr; @@ -298,7 +300,7 @@ static bool addURL(tr_variant* metainfo, char const* url) return changed; } -static bool setSource(tr_variant* metainfo, char const* source_value) +bool setSource(tr_variant* metainfo, char const* source_value) { auto current_source = std::string_view{}; bool const had_source = tr_variantDictFindStrView(metainfo, TR_KEY_source, ¤t_source); @@ -319,6 +321,7 @@ static bool setSource(tr_variant* metainfo, char const* source_value) return changed; } +} // namespace int tr_main(int argc, char* argv[]) { diff --git a/utils/remote.cc b/utils/remote.cc index d5ce1b160..13cefcb0c 100644 --- a/utils/remote.cc +++ b/utils/remote.cc @@ -46,24 +46,26 @@ using namespace libtransmission::Values; #define SPEED_K_STR "kB/s" #define MEM_M_STR "MiB" -static auto constexpr DefaultPort = int{ TR_DEFAULT_RPC_PORT }; -static char constexpr DefaultHost[] = "localhost"; -static char constexpr DefaultUrl[] = TR_DEFAULT_RPC_URL_STR "rpc/"; +namespace +{ +auto constexpr DefaultPort = int{ TR_DEFAULT_RPC_PORT }; +char constexpr DefaultHost[] = "localhost"; +char constexpr DefaultUrl[] = TR_DEFAULT_RPC_URL_STR "rpc/"; -static char constexpr MyName[] = "transmission-remote"; -static char constexpr Usage[] = "transmission-remote " LONG_VERSION_STRING - "\n" - "A fast and easy BitTorrent client\n" - "https://transmissionbt.com/\n" - "\n" - "Usage: transmission-remote [host] [options]\n" - " transmission-remote [port] [options]\n" - " transmission-remote [host:port] [options]\n" - " transmission-remote [http(s?)://host:port/transmission/] [options]\n" - "\n" - "See the man page for detailed explanations and many examples."; +char constexpr MyName[] = "transmission-remote"; +char constexpr Usage[] = "transmission-remote " LONG_VERSION_STRING + "\n" + "A fast and easy BitTorrent client\n" + "https://transmissionbt.com/\n" + "\n" + "Usage: transmission-remote [host] [options]\n" + " transmission-remote [port] [options]\n" + " transmission-remote [host:port] [options]\n" + " transmission-remote [http(s?)://host:port/transmission/] [options]\n" + "\n" + "See the man page for detailed explanations and many examples."; -static auto constexpr Arguments = TR_KEY_arguments; +auto constexpr Arguments = TR_KEY_arguments; struct RemoteConfig { @@ -79,13 +81,9 @@ struct RemoteConfig bool use_ssl = false; }; -/*** -**** -**** Display Utilities -**** -***/ +// --- Display Utilities -static std::string etaToString(int64_t eta) +[[nodiscard]] std::string etaToString(int64_t eta) { if (eta < 0) { @@ -125,7 +123,7 @@ static std::string etaToString(int64_t eta) return "∞"; } -static std::string tr_strltime(time_t seconds) +[[nodiscard]] auto tr_strltime(time_t seconds) { if (seconds < 0) { @@ -166,22 +164,22 @@ static std::string tr_strltime(time_t seconds) return fmt::format(FMT_STRING("{:s} ({:s})"), tmpstr, totstr); } -static std::string strlpercent(double x) +[[nodiscard]] auto strlpercent(double x) { return tr_strpercent(x); } -static std::string strlratio2(double ratio) +[[nodiscard]] auto strlratio2(double ratio) { return tr_strratio(ratio, "Inf"); } -static std::string strlratio(int64_t numerator, int64_t denominator) +[[nodiscard]] auto strlratio(int64_t numerator, int64_t denominator) { return strlratio2(tr_getRatio(numerator, denominator)); } -static std::string strlsize(int64_t bytes) +[[nodiscard]] auto strlsize(int64_t bytes) { if (bytes < 0) { @@ -212,13 +210,9 @@ enum TAG_TRACKERS }; -/*** -**** -**** Command-Line Arguments -**** -***/ +// --- Command-Line Arguments -static auto constexpr Options = std::array{ +auto constexpr Options = std::array{ { { 'a', "add", "Add torrent files by filename or URL", "a", false, nullptr }, { 970, "alt-speed", "Use the alternate Limits", "as", false, nullptr }, { 971, "no-alt-speed", "Don't use the alternate Limits", "AS", false, nullptr }, @@ -350,12 +344,12 @@ static auto constexpr Options = std::array{ { 0, nullptr, nullptr, nullptr, false, nullptr } } }; -static void showUsage(void) +void showUsage() { tr_getopt_usage(MyName, Usage, std::data(Options)); } -static long numarg(char const* arg) +[[nodiscard]] auto numarg(char const* arg) { char* end = nullptr; long const num = strtol(arg, &end, 10); @@ -390,7 +384,7 @@ enum MODE_GROUP_GET = (1 << 15) }; -static int getOptMode(int val) +[[nodiscard]] int getOptMode(int val) { switch (val) { @@ -542,7 +536,7 @@ static int getOptMode(int val) } } -static std::string getEncodedMetainfo(char const* filename) +[[nodiscard]] std::string getEncodedMetainfo(char const* filename) { if (auto contents = std::vector{}; tr_sys_path_exists(filename) && tr_file_read(filename, contents)) { @@ -552,7 +546,7 @@ static std::string getEncodedMetainfo(char const* filename) return {}; } -static void addIdArg(tr_variant* args, std::string_view id_str, std::string_view fallback = "") +void addIdArg(tr_variant* args, std::string_view id_str, std::string_view fallback = "") { if (std::empty(id_str)) { @@ -593,12 +587,12 @@ static void addIdArg(tr_variant* args, std::string_view id_str, std::string_view } } -static void addIdArg(tr_variant* args, RemoteConfig const& config, std::string_view fallback = "") +void addIdArg(tr_variant* args, RemoteConfig const& config, std::string_view fallback = "") { return addIdArg(args, config.torrent_ids, fallback); } -static void addTime(tr_variant* args, tr_quark const key, char const* arg) +void addTime(tr_variant* args, tr_quark const key, char const* arg) { int time = 0; bool success = false; @@ -627,7 +621,7 @@ static void addTime(tr_variant* args, tr_quark const key, char const* arg) } } -static void addDays(tr_variant* args, tr_quark const key, char const* arg) +void addDays(tr_variant* args, tr_quark const key, char const* arg) { int days = 0; @@ -659,7 +653,7 @@ static void addDays(tr_variant* args, tr_quark const key, char const* arg) } } -static void addLabels(tr_variant* args, std::string_view comma_delimited_labels) +void addLabels(tr_variant* args, std::string_view comma_delimited_labels) { tr_variant* labels; if (!tr_variantDictFindList(args, TR_KEY_labels, &labels)) @@ -674,7 +668,7 @@ static void addLabels(tr_variant* args, std::string_view comma_delimited_labels) } } -static void setGroup(tr_variant* args, std::string_view group) +void setGroup(tr_variant* args, std::string_view group) { tr_variantDictAddStrView(args, TR_KEY_group, group); } @@ -703,14 +697,14 @@ static void setGroup(tr_variant* args, std::string_view group) return files; } -static auto constexpr FilesKeys = std::array{ +auto constexpr FilesKeys = std::array{ TR_KEY_files, TR_KEY_name, TR_KEY_priorities, TR_KEY_wanted, }; -static auto constexpr DetailsKeys = std::array{ +auto constexpr DetailsKeys = std::array{ TR_KEY_activityDate, TR_KEY_addedDate, TR_KEY_bandwidthPriority, @@ -766,7 +760,7 @@ static auto constexpr DetailsKeys = std::array{ TR_KEY_webseedsSendingToUs, }; -static auto constexpr ListKeys = std::array{ +auto constexpr ListKeys = std::array{ TR_KEY_addedDate, TR_KEY_error, TR_KEY_errorString, @@ -784,7 +778,7 @@ static auto constexpr ListKeys = std::array{ TR_KEY_uploadRatio, }; -static size_t writeFunc(void* ptr, size_t size, size_t nmemb, void* vbuf) +[[nodiscard]] size_t writeFunc(void* ptr, size_t size, size_t nmemb, void* vbuf) { auto* const buf = static_cast(vbuf); size_t const byteCount = size * nmemb; @@ -793,7 +787,7 @@ static size_t writeFunc(void* ptr, size_t size, size_t nmemb, void* vbuf) } /* look for a session id in the header in case the server gives back a 409 */ -static size_t parseResponseHeader(void* ptr, size_t size, size_t nmemb, void* vconfig) +[[nodiscard]] size_t parseResponseHeader(void* ptr, size_t size, size_t nmemb, void* vconfig) { auto& config = *static_cast(vconfig); auto const* const line = static_cast(ptr); @@ -817,7 +811,7 @@ static size_t parseResponseHeader(void* ptr, size_t size, size_t nmemb, void* vc return line_len; } -static long getTimeoutSecs(std::string_view req) +[[nodiscard]] long getTimeoutSecs(std::string_view req) { if (req.find("\"method\":\"blocklist-update\""sv) != std::string_view::npos) { @@ -827,7 +821,7 @@ static long getTimeoutSecs(std::string_view req) return 60L; /* default value */ } -static std::string getStatusString(tr_variant* t) +[[nodiscard]] std::string getStatusString(tr_variant* t) { auto from_us = int64_t{}; auto status = int64_t{}; @@ -893,20 +887,20 @@ static std::string getStatusString(tr_variant* t) } } -static auto constexpr bandwidth_priority_names = std::array{ +auto constexpr bandwidth_priority_names = std::array{ "Low"sv, "Normal"sv, "High"sv, "Invalid"sv, }; -static char* format_date(char* buf, size_t buflen, time_t now) +char* format_date(char* buf, size_t buflen, time_t now) { *fmt::format_to_n(buf, buflen - 1, "{:%a %b %d %T %Y}", fmt::localtime(now)).out = '\0'; return buf; } -static void printDetails(tr_variant* top) +void printDetails(tr_variant* top) { tr_variant* args; tr_variant* torrents; @@ -1238,7 +1232,7 @@ static void printDetails(tr_variant* top) } } -static void printFileList(tr_variant* top) +void printFileList(tr_variant* top) { tr_variant* args; tr_variant* torrents; @@ -1308,7 +1302,7 @@ static void printFileList(tr_variant* top) } } -static void printPeersImpl(tr_variant* peers) +void printPeersImpl(tr_variant* peers) { printf("%-40s %-12s %-5s %-6s %-6s %s\n", "Address", "Flags", "Done", "Down", "Up", "Client"); @@ -1341,7 +1335,7 @@ static void printPeersImpl(tr_variant* peers) } } -static void printPeers(tr_variant* top) +void printPeers(tr_variant* top) { tr_variant* args; tr_variant* torrents; @@ -1366,7 +1360,7 @@ static void printPeers(tr_variant* top) } } -static void printPiecesImpl(std::string_view raw, size_t piece_count) +void printPiecesImpl(std::string_view raw, size_t piece_count) { auto const str = tr_base64_decode(raw); fmt::print(" "); @@ -1391,7 +1385,7 @@ static void printPiecesImpl(std::string_view raw, size_t piece_count) fmt::print("\n"); } -static void printPieces(tr_variant* top) +void printPieces(tr_variant* top) { tr_variant* args; tr_variant* torrents; @@ -1419,7 +1413,7 @@ static void printPieces(tr_variant* top) } } -static void printPortTest(tr_variant* top) +void printPortTest(tr_variant* top) { tr_variant* args; @@ -1434,7 +1428,7 @@ static void printPortTest(tr_variant* top) } } -static void printTorrentList(tr_variant* top) +void printTorrentList(tr_variant* top) { tr_variant* args; tr_variant* list; @@ -1534,7 +1528,7 @@ static void printTorrentList(tr_variant* top) } } -static void printTrackersImpl(tr_variant* trackerStats) +void printTrackersImpl(tr_variant* trackerStats) { for (size_t i = 0, n = tr_variantListSize(trackerStats); i < n; ++i) { @@ -1684,7 +1678,7 @@ static void printTrackersImpl(tr_variant* trackerStats) } } -static void printTrackers(tr_variant* top) +void printTrackers(tr_variant* top) { tr_variant* args; tr_variant* torrents; @@ -1709,7 +1703,7 @@ static void printTrackers(tr_variant* top) } } -static void printSession(tr_variant* top) +void printSession(tr_variant* top) { tr_variant* args; @@ -1939,7 +1933,7 @@ static void printSession(tr_variant* top) } } -static void printSessionStats(tr_variant* top) +void printSessionStats(tr_variant* top) { tr_variant* args; tr_variant* d; @@ -1975,7 +1969,7 @@ static void printSessionStats(tr_variant* top) } } -static void printGroups(tr_variant* top) +void printGroups(tr_variant* top) { tr_variant* args; tr_variant* groups; @@ -2009,7 +2003,7 @@ static void printGroups(tr_variant* top) } } -static void filterIds(tr_variant* top, RemoteConfig& config) +void filterIds(tr_variant* top, RemoteConfig& config) { tr_variant* args; tr_variant* list; @@ -2130,7 +2124,8 @@ static void filterIds(tr_variant* top, RemoteConfig& config) } } } -static int processResponse(char const* rpcurl, std::string_view response, RemoteConfig& config) + +int processResponse(char const* rpcurl, std::string_view response, RemoteConfig& config) { auto status = int{ EXIT_SUCCESS }; @@ -2251,7 +2246,7 @@ static int processResponse(char const* rpcurl, std::string_view response, Remote return status; } -static CURL* tr_curl_easy_init(struct evbuffer* writebuf, RemoteConfig& config) +CURL* tr_curl_easy_init(struct evbuffer* writebuf, RemoteConfig& config) { CURL* curl = curl_easy_init(); (void)curl_easy_setopt(curl, CURLOPT_USERAGENT, fmt::format(FMT_STRING("{:s}/{:s}"), MyName, LONG_VERSION_STRING).c_str()); @@ -2304,7 +2299,7 @@ static CURL* tr_curl_easy_init(struct evbuffer* writebuf, RemoteConfig& config) return curl; } -static void tr_curl_easy_cleanup(CURL* curl) +void tr_curl_easy_cleanup(CURL* curl) { struct curl_slist* custom_headers = nullptr; curl_easy_getinfo(curl, CURLINFO_PRIVATE, &custom_headers); @@ -2317,7 +2312,7 @@ static void tr_curl_easy_cleanup(CURL* curl) } } -static int flush(char const* rpcurl, tr_variant* benc, RemoteConfig& config) +int flush(char const* rpcurl, tr_variant* benc, RemoteConfig& config) { auto const json = tr_variant_serde::json().compact().to_string(*benc); auto const scheme = config.use_ssl ? "https"sv : "http"sv; @@ -2384,7 +2379,7 @@ static int flush(char const* rpcurl, tr_variant* benc, RemoteConfig& config) return status; } -static tr_variant* ensure_sset(tr_variant& sset) +tr_variant* ensure_sset(tr_variant& sset) { if (sset.has_value()) { @@ -2396,7 +2391,7 @@ static tr_variant* ensure_sset(tr_variant& sset) return tr_variantDictAddDict(&sset, Arguments, 0); } -static tr_variant* ensure_tset(tr_variant& tset) +tr_variant* ensure_tset(tr_variant& tset) { if (tset.has_value()) { @@ -2408,7 +2403,7 @@ static tr_variant* ensure_tset(tr_variant& tset) return tr_variantDictAddDict(&tset, Arguments, 1); } -static int processArgs(char const* rpcurl, int argc, char const* const* argv, RemoteConfig& config) +int processArgs(char const* rpcurl, int argc, char const* const* argv, RemoteConfig& config) { int status = EXIT_SUCCESS; char const* optarg; @@ -3221,7 +3216,7 @@ static int processArgs(char const* rpcurl, int argc, char const* const* argv, Re return status; } -static bool parsePortString(char const* s, int* port) +bool parsePortString(char const* s, int* port) { int const errno_stack = errno; errno = 0; @@ -3239,13 +3234,7 @@ static bool parsePortString(char const* s, int* port) } /* [host:port] or [host] or [port] or [http(s?)://host:port/transmission/] */ -static void getHostAndPortAndRpcUrl( - int* argc, - char** argv, - std::string* host, - int* port, - std::string* rpcurl, - RemoteConfig& config) +void getHostAndPortAndRpcUrl(int* argc, char** argv, std::string* host, int* port, std::string* rpcurl, RemoteConfig& config) { if (*argv[1] == '-') { @@ -3300,6 +3289,7 @@ static void getHostAndPortAndRpcUrl( argv[i] = argv[i + 1]; } } +} // namespace int tr_main(int argc, char* argv[]) { @@ -3327,7 +3317,7 @@ int tr_main(int argc, char* argv[]) if (std::empty(rpcurl)) { - rpcurl = fmt::format(FMT_STRING("{:s}:{:d}{:s}"), host, port, DefaultUrl); + rpcurl = fmt::format("{:s}:{:d}{:s}", host, port, DefaultUrl); } return processArgs(rpcurl.c_str(), argc, (char const* const*)argv, config);