| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying | |
| file LICENSE.rst or https://cmake.org/licensing for details. */ | |
| #include "cmFileLockResult.h" | |
| #include <cerrno> | |
| #include <cstring> | |
| #ifdef _WIN32 | |
| # include <windows.h> | |
| #endif | |
| cmFileLockResult cmFileLockResult::MakeOk() | |
| { | |
| return { OK, 0 }; | |
| } | |
| cmFileLockResult cmFileLockResult::MakeSystem() | |
| { | |
| #if defined(_WIN32) | |
| Error const lastError = GetLastError(); | |
| #else | |
| Error const lastError = errno; | |
| #endif | |
| return { SYSTEM, lastError }; | |
| } | |
| cmFileLockResult cmFileLockResult::MakeTimeout() | |
| { | |
| return { TIMEOUT, 0 }; | |
| } | |
| cmFileLockResult cmFileLockResult::MakeAlreadyLocked() | |
| { | |
| return { ALREADY_LOCKED, 0 }; | |
| } | |
| cmFileLockResult cmFileLockResult::MakeInternal() | |
| { | |
| return { INTERNAL, 0 }; | |
| } | |
| cmFileLockResult cmFileLockResult::MakeNoFunction() | |
| { | |
| return { NO_FUNCTION, 0 }; | |
| } | |
| bool cmFileLockResult::IsOk() const | |
| { | |
| return this->Type == OK; | |
| } | |
| std::string cmFileLockResult::GetOutputMessage() const | |
| { | |
| switch (this->Type) { | |
| case OK: | |
| return "0"; | |
| case SYSTEM: | |
| #if defined(_WIN32) | |
| { | |
| # define WINMSG_BUF_LEN (1024) | |
| char winmsg[WINMSG_BUF_LEN]; | |
| DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS; | |
| if (FormatMessageA(flags, nullptr, this->ErrorValue, | |
| MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), | |
| (LPSTR)winmsg, WINMSG_BUF_LEN, nullptr)) { | |
| std::string const message = winmsg; | |
| return message; | |
| } else { | |
| return "Internal error (FormatMessageA failed)"; | |
| } | |
| } | |
| #else | |
| return strerror(this->ErrorValue); | |
| #endif | |
| case TIMEOUT: | |
| return "Timeout reached"; | |
| case ALREADY_LOCKED: | |
| return "File already locked"; | |
| case NO_FUNCTION: | |
| return "'GUARD FUNCTION' not used in function definition"; | |
| case INTERNAL: | |
| default: | |
| return "Internal error"; | |
| } | |
| } | |
| cmFileLockResult::cmFileLockResult(ErrorType typeValue, Error errorValue) | |
| : Type(typeValue) | |
| , ErrorValue(errorValue) | |
| { | |
| } |