refactor: remove varargs code in tr_sys_file (#2354)
This commit is contained in:
parent
c832f3c18c
commit
88f9704eed
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdarg>
|
||||
#include <cstring> /* 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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
#include <algorithm>
|
||||
#include <cctype>
|
||||
#include <cinttypes>
|
||||
#include <cstdarg>
|
||||
#include <cstddef>
|
||||
#include <ctime>
|
||||
#include <optional>
|
||||
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"));
|
||||
|
|
Loading…
Reference in New Issue