| 24 | static std::mutex s_ini_load_save_mutex; |
| 25 | |
| 26 | static std::FILE* GetTemporaryFile(std::string* temporary_filename, const std::string& original_filename, |
| 27 | const char* mode, Error* error) |
| 28 | { |
| 29 | temporary_filename->clear(); |
| 30 | temporary_filename->reserve(original_filename.length() + 8); |
| 31 | temporary_filename->append(original_filename); |
| 32 | |
| 33 | #ifdef _WIN32 |
| 34 | temporary_filename->append(".XXXXXXX"); |
| 35 | const errno_t err = _mktemp_s(temporary_filename->data(), temporary_filename->length() + 1); |
| 36 | if (err != 0) |
| 37 | { |
| 38 | Error::SetErrno(error, "_mktemp_s() failed: ", err); |
| 39 | return nullptr; |
| 40 | } |
| 41 | |
| 42 | return FileSystem::OpenCFile(temporary_filename->c_str(), mode, error); |
| 43 | #else |
| 44 | temporary_filename->append(".XXXXXX"); |
| 45 | const int fd = mkstemp(temporary_filename->data()); |
| 46 | if (fd < 0) |
| 47 | { |
| 48 | Error::SetErrno(error, "mkstemp() failed: ", errno); |
| 49 | return nullptr; |
| 50 | } |
| 51 | |
| 52 | std::FILE* fp = fdopen(fd, mode); |
| 53 | if (!fp) |
| 54 | { |
| 55 | Error::SetErrno(error, "mkstemp() failed: ", errno); |
| 56 | close(fd); |
| 57 | return nullptr; |
| 58 | } |
| 59 | |
| 60 | return fp; |
| 61 | #endif |
| 62 | } |
| 63 | |
| 64 | INISettingsInterface::INISettingsInterface(std::string filename) |
| 65 | : m_filename(std::move(filename)) |