239 {
240#ifdef WIN32
241 m_fd = INVALID_HANDLE_VALUE;
242 std::wstring filename_wide;
243 try
244 {
245 filename_wide = string_tools::utf8_to_utf16(filename);
246 }
247 catch (const std::exception &e)
248 {
249 MERROR(
"Failed to convert path \"" << filename <<
"\" to UTF-16: " << e.what());
250 return;
251 }
252 m_fd = CreateFileW(filename_wide.c_str(), GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
253 if (m_fd != INVALID_HANDLE_VALUE)
254 {
255 OVERLAPPED ov;
256 memset(&ov, 0, sizeof(ov));
257 if (!LockFileEx(m_fd, LOCKFILE_FAIL_IMMEDIATELY | LOCKFILE_EXCLUSIVE_LOCK, 0, 1, 0, &ov))
258 {
259 MERROR(
"Failed to lock " << filename <<
": " << std::error_code(GetLastError(), std::system_category()));
260 CloseHandle(m_fd);
261 m_fd = INVALID_HANDLE_VALUE;
262 }
263 }
264 else
265 {
266 MERROR(
"Failed to open " << filename <<
": " << std::error_code(GetLastError(), std::system_category()));
267 }
268#else
269 m_fd = open(filename.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0666);
270 if (m_fd != -1)
271 {
272 if (flock_exnb(m_fd) == -1)
273 {
274 MERROR(
"Failed to lock " << filename <<
": " << std::strerror(errno));
275 close(m_fd);
276 m_fd = -1;
277 }
278 }
279 else
280 {
281 MERROR(
"Failed to open " << filename <<
": " << std::strerror(errno));
282 }
283#endif
284 }