diff --git a/daemon/daemon.cc b/daemon/daemon.cc index fccc69682..377d4f5e7 100644 --- a/daemon/daemon.cc +++ b/daemon/daemon.cc @@ -282,22 +282,10 @@ static void printMessage( char timestr[64]; tr_logGetTimeStr(timestr, sizeof(timestr)); - if (name != nullptr) - { - tr_sys_file_write_fmt( - file, - "[%s] %s %s (%s:%d)" TR_NATIVE_EOL_STR, - nullptr, - timestr, - name, - message, - filename, - line); - } - else - { - tr_sys_file_write_fmt(file, "[%s] %s (%s:%d)" TR_NATIVE_EOL_STR, nullptr, timestr, message, filename, line); - } + auto const out = name != nullptr ? + tr_strvJoin("["sv, timestr, "] "sv, name, " "sv, message, " ("sv, filename, ":"sv, std::to_string(line), ")"sv) : + tr_strvJoin("["sv, timestr, "] "sv, message, " ("sv, filename, ":"sv, std::to_string(line), ")"sv); + tr_sys_file_write_line(file, out, nullptr); } #ifdef HAVE_SYSLOG @@ -687,7 +675,8 @@ static int daemon_start(void* varg, [[maybe_unused]] bool foreground) if (fp != TR_BAD_SYS_FILE) { - tr_sys_file_write_fmt(fp, "%d", nullptr, (int)getpid()); + auto const out = std::to_string(getpid()); + tr_sys_file_write(fp, std::data(out), std::size(out), nullptr, nullptr); tr_sys_file_close(fp, nullptr); tr_logAddInfo("Saved pidfile \"%s\"", sz_pid_filename.c_str()); pidfile_created = true; diff --git a/libtransmission/announcer-http.cc b/libtransmission/announcer-http.cc index 648933be3..9d1a729ab 100644 --- a/libtransmission/announcer-http.cc +++ b/libtransmission/announcer-http.cc @@ -30,6 +30,8 @@ #define dbgmsg(name, ...) tr_logAddDeepNamed(name, __VA_ARGS__) +using namespace std::literals; + /**** ***** ***** ANNOUNCE @@ -210,9 +212,8 @@ static void on_announce_done( if (response_code != HTTP_OK) { - char const* fmt = _("Tracker gave HTTP response code %1$ld (%2$s)"); - char const* response_str = tr_webGetResponseStr(response_code); - response->errmsg = tr_strdup_printf(fmt, response_code, response_str); + auto const* const response_str = tr_webGetResponseStr(response_code); + response->errmsg = tr_strvJoin("Tracker HTTP response "sv, std::to_string(response_code), " ("sv, response_str, ")"sv); } else { diff --git a/libtransmission/file.cc b/libtransmission/file.cc index 319643378..ef839ccaf 100644 --- a/libtransmission/file.cc +++ b/libtransmission/file.cc @@ -7,7 +7,6 @@ */ #include -#include #include /* strlen() */ #include "transmission.h" @@ -97,28 +96,3 @@ bool tr_sys_file_write_line(tr_sys_file_t handle, std::string_view buffer, tr_er return ret; } - -bool tr_sys_file_write_fmt(tr_sys_file_t handle, char const* format, tr_error** error, ...) -{ - TR_ASSERT(handle != TR_BAD_SYS_FILE); - TR_ASSERT(format != nullptr); - - bool ret = false; - va_list args; - - va_start(args, error); - char* const buffer = tr_strdup_vprintf(format, args); - va_end(args); - - if (buffer != nullptr) - { - ret = tr_sys_file_write(handle, buffer, strlen(buffer), nullptr, error); - tr_free(buffer); - } - else - { - tr_error_set(error, 0, "Unable to format message."sv); - } - - return ret; -} diff --git a/libtransmission/file.h b/libtransmission/file.h index 0e1d5876a..470408933 100644 --- a/libtransmission/file.h +++ b/libtransmission/file.h @@ -586,25 +586,6 @@ bool tr_sys_file_read_line(tr_sys_file_t handle, char* buffer, size_t buffer_siz */ bool tr_sys_file_write_line(tr_sys_file_t handle, std::string_view buffer, struct tr_error** error); -/** - * @brief Portability wrapper for `fprintf()`. - * - * Special care should be taken when writing to one of standard output streams - * (@ref tr_std_sys_file_t) since no UTF-8 conversion is currently being made. - * - * Writing to other streams (files, pipes) also leaves data untouched, so it - * should already be in UTF-8 encoding, or whichever else you expect. - * - * @param[in] handle Valid file descriptor. - * @param[in] format String format to write. - * @param[out] error Pointer to error object. Optional, pass `nullptr` if you - * are not interested in error details. - * @param[in] ... Format arguments. - * - * @return `True` on success, `false` otherwise (with `error` set accordingly). - */ -bool tr_sys_file_write_fmt(tr_sys_file_t handle, char const* format, struct tr_error** error, ...) TR_GNUC_PRINTF(2, 4); - /* Directory-related wrappers */ /** diff --git a/libtransmission/log.cc b/libtransmission/log.cc index 1aaabd3e0..359477276 100644 --- a/libtransmission/log.cc +++ b/libtransmission/log.cc @@ -19,6 +19,8 @@ #include "tr-assert.h" #include "utils.h" +using namespace std::literals; + tr_log_level __tr_message_level = TR_LOG_ERROR; static bool myQueueEnabled = false; @@ -210,7 +212,8 @@ void tr_logAddMessage(char const* file, int line, tr_log_level level, char const if (buf_len < 0) { - goto FINISH; + errno = err; + return; } #ifdef _WIN32 @@ -269,19 +272,12 @@ void tr_logAddMessage(char const* file, int line, tr_log_level level, char const tr_logGetTimeStr(timestr, sizeof(timestr)); - if (name != nullptr) - { - tr_sys_file_write_fmt(fp, "[%s] %s: %s" TR_NATIVE_EOL_STR, nullptr, timestr, name, buf); - } - else - { - tr_sys_file_write_fmt(fp, "[%s] %s" TR_NATIVE_EOL_STR, nullptr, timestr, buf); - } - + auto const out = name != nullptr ? tr_strvJoin("["sv, timestr, "] "sv, name, ": "sv, buf) : + tr_strvJoin("["sv, timestr, "] "sv, buf); + tr_sys_file_write_line(fp, out, nullptr); tr_sys_file_flush(fp, nullptr); } } -FINISH: errno = err; } diff --git a/libtransmission/utils.cc b/libtransmission/utils.cc index b69f4e19a..04c21ab3c 100644 --- a/libtransmission/utils.cc +++ b/libtransmission/utils.cc @@ -574,17 +574,13 @@ char const* tr_strcasestr(char const* haystack, char const* needle) char* tr_strdup_printf(char const* fmt, ...) { + evbuffer* const buf = evbuffer_new(); + va_list ap; va_start(ap, fmt); - char* const ret = tr_strdup_vprintf(fmt, ap); + evbuffer_add_vprintf(buf, fmt, ap); va_end(ap); - return ret; -} -char* tr_strdup_vprintf(char const* fmt, va_list args) -{ - struct evbuffer* buf = evbuffer_new(); - evbuffer_add_vprintf(buf, fmt, args); return evbuffer_free_to_str(buf, nullptr); } diff --git a/libtransmission/utils.h b/libtransmission/utils.h index ef6eacb81..5d897decc 100644 --- a/libtransmission/utils.h +++ b/libtransmission/utils.h @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -235,7 +234,6 @@ std::string evbuffer_free_to_str(evbuffer* buf); * @return a newly-allocated string that can be freed with tr_free() */ char* tr_strdup_printf(char const* fmt, ...) TR_GNUC_MALLOC TR_GNUC_PRINTF(1, 2); -char* tr_strdup_vprintf(char const* fmt, va_list args) TR_GNUC_MALLOC TR_GNUC_PRINTF(1, 0); /** @brief Portability wrapper for strlcpy() that uses the system implementation if available */ size_t tr_strlcpy(void* dst, void const* src, size_t siz); diff --git a/tests/libtransmission/file-test.cc b/tests/libtransmission/file-test.cc index 088559cce..e4e64f6ea 100644 --- a/tests/libtransmission/file-test.cc +++ b/tests/libtransmission/file-test.cc @@ -1320,13 +1320,13 @@ TEST_F(FileTest, fileUtilities) EXPECT_EQ(nullptr, err); EXPECT_TRUE(tr_sys_file_write_line(fd, "qr", &err)); EXPECT_EQ(nullptr, err); - EXPECT_TRUE(tr_sys_file_write_fmt(fd, "s%cu\r\n", &err, 't')); + EXPECT_TRUE(tr_sys_file_write_line(fd, "stu", &err)); EXPECT_EQ(nullptr, err); EXPECT_TRUE(tr_sys_file_write_line(fd, "", &err)); EXPECT_EQ(nullptr, err); EXPECT_TRUE(tr_sys_file_write_line(fd, "", &err)); EXPECT_EQ(nullptr, err); - EXPECT_TRUE(tr_sys_file_write_fmt(fd, "v%sy%d", &err, "wx", 2)); + EXPECT_TRUE(tr_sys_file_write_line(fd, "vwxy2", &err)); EXPECT_EQ(nullptr, err); tr_sys_file_seek(fd, 0, TR_SEEK_SET, nullptr, nullptr); diff --git a/tests/libtransmission/utils-test.cc b/tests/libtransmission/utils-test.cc index 5b130efaa..180e97cfa 100644 --- a/tests/libtransmission/utils-test.cc +++ b/tests/libtransmission/utils-test.cc @@ -387,29 +387,6 @@ TEST_F(UtilsTest, truncd) #endif } -namespace -{ - -char* testStrdupPrintfValist(char const* fmt, ...) TR_GNUC_PRINTF(1, 2); - -char* testStrdupPrintfValist(char const* fmt, ...) -{ - va_list args; - va_start(args, fmt); - auto* ret = tr_strdup_vprintf(fmt, args); - va_end(args); - return ret; -} - -} // namespace - -TEST_F(UtilsTest, trStrdupVprintf) -{ - // NOLINTNEXTLINE(cert-dcl50-cpp) - auto s = makeString(testStrdupPrintfValist("\n-%s-%s-%s-\n", "\r", "\t", "\b")); - EXPECT_EQ("\n-\r-\t-\b-\n", s); -} - TEST_F(UtilsTest, trStrdupPrintfFmtS) { auto s = makeString(tr_strdup_printf("%s", "test"));