cmFileLockResult.cxx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmFileLockResult.h"
  4. #include <errno.h>
  5. #include <string.h>
  6. #define WINMSG_BUF_LEN (1024)
  7. cmFileLockResult cmFileLockResult::MakeOk()
  8. {
  9. return cmFileLockResult(OK, 0);
  10. }
  11. cmFileLockResult cmFileLockResult::MakeSystem()
  12. {
  13. #if defined(_WIN32)
  14. const Error lastError = GetLastError();
  15. #else
  16. const Error lastError = errno;
  17. #endif
  18. return cmFileLockResult(SYSTEM, lastError);
  19. }
  20. cmFileLockResult cmFileLockResult::MakeTimeout()
  21. {
  22. return cmFileLockResult(TIMEOUT, 0);
  23. }
  24. cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
  25. {
  26. return cmFileLockResult(ALREADY_LOCKED, 0);
  27. }
  28. cmFileLockResult cmFileLockResult::MakeInternal()
  29. {
  30. return cmFileLockResult(INTERNAL, 0);
  31. }
  32. cmFileLockResult cmFileLockResult::MakeNoFunction()
  33. {
  34. return cmFileLockResult(NO_FUNCTION, 0);
  35. }
  36. bool cmFileLockResult::IsOk() const
  37. {
  38. return this->Type == OK;
  39. }
  40. std::string cmFileLockResult::GetOutputMessage() const
  41. {
  42. switch (this->Type) {
  43. case OK:
  44. return "0";
  45. case SYSTEM:
  46. #if defined(_WIN32)
  47. {
  48. char winmsg[WINMSG_BUF_LEN];
  49. DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS;
  50. if (FormatMessageA(flags, NULL, this->ErrorValue,
  51. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  52. (LPSTR)winmsg, WINMSG_BUF_LEN, NULL)) {
  53. const std::string message = winmsg;
  54. return message;
  55. } else {
  56. return "Internal error (FormatMessageA failed)";
  57. }
  58. }
  59. #else
  60. return strerror(this->ErrorValue);
  61. #endif
  62. case TIMEOUT:
  63. return "Timeout reached";
  64. case ALREADY_LOCKED:
  65. return "File already locked";
  66. case NO_FUNCTION:
  67. return "'GUARD FUNCTION' not used in function definition";
  68. case INTERNAL:
  69. default:
  70. return "Internal error";
  71. }
  72. }
  73. cmFileLockResult::cmFileLockResult(ErrorType typeValue, Error errorValue)
  74. : Type(typeValue)
  75. , ErrorValue(errorValue)
  76. {
  77. }