diff --git a/src/d2dbs/d2ladder.cpp b/src/d2dbs/d2ladder.cpp index 8efcd75..0540c2e 100644 --- a/src/d2dbs/d2ladder.cpp +++ b/src/d2dbs/d2ladder.cpp @@ -304,15 +304,22 @@ namespace pvpgn { d2ladder_change_count = 0; d2ladder_maxtype = 0; - d2ladder_ladder_file = (char*)xmalloc(std::strlen(d2dbs_prefs_get_ladder_dir()) + 1 + - std::strlen(LADDER_FILE_PREFIX) + 1 + std::strlen(CLIENTTAG_DIABLO2DV) + 1 + 10); - d2ladder_backup_file = (char*)xmalloc(std::strlen(d2dbs_prefs_get_ladder_dir()) + 1 + - std::strlen(LADDER_BACKUP_PREFIX) + 1 + std::strlen(CLIENTTAG_DIABLO2DV) + 1 + 10); - std::sprintf(d2ladder_ladder_file, "%s/%s.%s", d2dbs_prefs_get_ladder_dir(), \ - LADDER_FILE_PREFIX, CLIENTTAG_DIABLO2DV); - std::sprintf(d2ladder_backup_file, "%s/%s.%s", d2dbs_prefs_get_ladder_dir(), \ - LADDER_BACKUP_PREFIX, CLIENTTAG_DIABLO2DV); + try + { + std::size_t d2ladder_ladder_file_len = fmt::formatted_size("{}/{}.{}", d2dbs_prefs_get_ladder_dir(), LADDER_FILE_PREFIX, CLIENTTAG_DIABLO2DV) + 1; + d2ladder_ladder_file = static_cast<char*>(xmalloc(d2ladder_ladder_file_len)); + fmt::format_to_n(std::back_inserter(d2ladder_ladder_file), d2ladder_ladder_file_len, "{}/{}.{}", d2dbs_prefs_get_ladder_dir(), LADDER_FILE_PREFIX, CLIENTTAG_DIABLO2DV); + + std::size_t d2ladder_backup_file_len = fmt::formatted_size("{}/{}.{}", d2dbs_prefs_get_ladder_dir(), LADDER_BACKUP_PREFIX, CLIENTTAG_DIABLO2DV) + 1; + d2ladder_backup_file = static_cast<char*>(xmalloc(d2ladder_backup_file_len)); + fmt::format_to_n(std::back_inserter(d2ladder_backup_file), d2ladder_backup_file_len, "{}/{}.{}", d2dbs_prefs_get_ladder_dir(), LADDER_BACKUP_PREFIX, CLIENTTAG_DIABLO2DV); + } + catch (const std::exception& e) + { + eventlog(eventlog_level_error, __FUNCTION__, "error initializing d2ladder_ladder_file and d2ladder_backup_file ({})", e.what()); + return -1; + } if (d2ladderlist_init() < 0) { return -1; diff --git a/src/d2dbs/dbspacket.cpp b/src/d2dbs/dbspacket.cpp index 3ee566a..0eb80a0 100644 --- a/src/d2dbs/dbspacket.cpp +++ b/src/d2dbs/dbspacket.cpp @@ -23,6 +23,9 @@ #include <cerrno> #include <cstring> #include <ctime> +#include <string> + +#include <fmt/format.h> #ifdef HAVE_SYS_TYPES_H # include <sys/types.h> @@ -73,9 +76,6 @@ namespace pvpgn static unsigned int dbs_packet_savedata_charsave(t_d2dbs_connection* conn, char * AccountName, char * CharName, char * data, unsigned int datalen) { - char filename[MAX_PATH]; - char savefile[MAX_PATH]; - char bakfile[MAX_PATH]; std::FILE * fd; int checksum_header; int checksum_calc; @@ -94,8 +94,8 @@ namespace pvpgn } - std::sprintf(filename, "%s/.%s.tmp", d2dbs_prefs_get_charsave_dir(), CharName); - fd = std::fopen(filename, "wb"); + std::string filename = fmt::format("{}/.{}.tmp", d2dbs_prefs_get_charsave_dir(), CharName); + fd = std::fopen(filename.c_str(), "wb"); if (!fd) { eventlog(eventlog_level_error, __FUNCTION__, "open() failed : {}", filename); return 0; @@ -118,12 +118,12 @@ namespace pvpgn } std::fclose(fd); - std::sprintf(bakfile, "%s/%s", prefs_get_charsave_bak_dir(), CharName); - std::sprintf(savefile, "%s/%s", d2dbs_prefs_get_charsave_dir(), CharName); - if (p_rename(savefile, bakfile) == -1) { + std::string bakfile = fmt::format("{}/{}", prefs_get_charsave_bak_dir(), CharName); + std::string savefile = fmt::format("{}/{}", d2dbs_prefs_get_charsave_dir(), CharName); + if (p_rename(savefile.c_str(), bakfile.c_str()) == -1) { eventlog(eventlog_level_warn, __FUNCTION__, "error std::rename {} to {}", savefile, bakfile); } - if (p_rename(filename, savefile) == -1) { + if (p_rename(filename.c_str(), savefile.c_str()) == -1) { eventlog(eventlog_level_error, __FUNCTION__, "error std::rename {} to {}", filename, savefile); return 0; } @@ -133,20 +133,16 @@ namespace pvpgn static unsigned int dbs_packet_savedata_charinfo(t_d2dbs_connection* conn, char * AccountName, char * CharName, char * data, unsigned int datalen) { - char savefile[MAX_PATH]; - char bakfile[MAX_PATH]; - char filepath[MAX_PATH]; - char filename[MAX_PATH]; std::FILE * fd; struct stat statbuf; strtolower(AccountName); strtolower(CharName); - std::sprintf(filepath, "%s/%s", prefs_get_charinfo_bak_dir(), AccountName); - if (stat(filepath, &statbuf) == -1) + std::string filepath = fmt::format("{}/{}", prefs_get_charinfo_bak_dir(), AccountName); + if (stat(filepath.c_str(), &statbuf) == -1) { - if (p_mkdir(filepath, S_IRWXU | S_IRWXG | S_IRWXO) == 0) + if (p_mkdir(filepath.c_str(), S_IRWXU | S_IRWXG | S_IRWXO) == 0) { eventlog(eventlog_level_info, __FUNCTION__, "created charinfo directory: {}", filepath); } @@ -158,8 +154,8 @@ namespace pvpgn } - std::sprintf(filename, "%s/%s/.%s.tmp", d2dbs_prefs_get_charinfo_dir(), AccountName, CharName); - fd = std::fopen(filename, "wb"); + std::string filename = fmt::format("{}/{}/.{}.tmp", d2dbs_prefs_get_charinfo_dir(), AccountName, CharName); + fd = std::fopen(filename.c_str(), "wb"); if (!fd) { eventlog(eventlog_level_error, __FUNCTION__, "open() failed : {}", filename); return 0; @@ -182,12 +178,12 @@ namespace pvpgn } std::fclose(fd); - std::sprintf(bakfile, "%s/%s/%s", prefs_get_charinfo_bak_dir(), AccountName, CharName); - std::sprintf(savefile, "%s/%s/%s", d2dbs_prefs_get_charinfo_dir(), AccountName, CharName); - if (p_rename(savefile, bakfile) == -1) { + std::string bakfile = fmt::format("{}/{}/{}", prefs_get_charinfo_bak_dir(), AccountName, CharName); + std::string savefile = fmt::format("{}/{}/{}", d2dbs_prefs_get_charinfo_dir(), AccountName, CharName); + if (p_rename(savefile.c_str(), bakfile.c_str()) == -1) { eventlog(eventlog_level_info, __FUNCTION__, "error std::rename {} to {}", savefile, bakfile); } - if (p_rename(filename, savefile) == -1) { + if (p_rename(filename.c_str(), savefile.c_str()) == -1) { eventlog(eventlog_level_error, __FUNCTION__, "error std::rename {} to {}", filename, savefile); return 0; } @@ -197,24 +193,22 @@ namespace pvpgn static unsigned int dbs_packet_getdata_charsave(t_d2dbs_connection* conn, char * AccountName, char * CharName, char * data, long bufsize) { - char filename[MAX_PATH]; - char filename_d2closed[MAX_PATH]; std::FILE * fd; strtolower(AccountName); strtolower(CharName); - std::sprintf(filename, "%s/%s", d2dbs_prefs_get_charsave_dir(), CharName); - std::sprintf(filename_d2closed, "%s/%s.d2s", d2dbs_prefs_get_charsave_dir(), CharName); - if ((access(filename, F_OK) < 0) && (access(filename_d2closed, F_OK) == 0)) + std::string filename = fmt::format("{}/{}", d2dbs_prefs_get_charsave_dir(), CharName); + std::string filename_d2closed = fmt::format("{}/{}.d2s", d2dbs_prefs_get_charsave_dir(), CharName); + if ((access(filename.c_str(), F_OK) < 0) && (access(filename_d2closed.c_str(), F_OK) == 0)) { - if (std::rename(filename_d2closed, filename) != 0) + if (std::rename(filename_d2closed.c_str(), filename.c_str()) != 0) { eventlog(eventlog_level_error, __FUNCTION__, "failed to rename file \"{}\" to \"{}\"", filename_d2closed, filename); return 0; } } - fd = std::fopen(filename, "rb"); + fd = std::fopen(filename.c_str(), "rb"); if (!fd) { eventlog(eventlog_level_error, __FUNCTION__, "open() failed : {}", filename); return 0; @@ -257,14 +251,13 @@ namespace pvpgn static unsigned int dbs_packet_getdata_charinfo(t_d2dbs_connection* conn, char * AccountName, char * CharName, char * data, unsigned int bufsize) { - char filename[MAX_PATH]; std::FILE * fd; strtolower(AccountName); strtolower(CharName); - std::sprintf(filename, "%s/%s/%s", d2dbs_prefs_get_charinfo_dir(), AccountName, CharName); - fd = std::fopen(filename, "rb"); + std::string filename = fmt::format("{}/{}/{}", d2dbs_prefs_get_charinfo_dir(), AccountName, CharName); + fd = std::fopen(filename.c_str(), "rb"); if (!fd) { eventlog(eventlog_level_error, __FUNCTION__, "open() failed : {}", filename); return 0;