StandardPaths.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2023, Linus Groh <linusg@serenityos.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <AK/DeprecatedString.h>
  8. #include <AK/LexicalPath.h>
  9. #include <AK/Platform.h>
  10. #include <AK/String.h>
  11. #include <AK/StringBuilder.h>
  12. #include <LibCore/SessionManagement.h>
  13. #include <LibCore/StandardPaths.h>
  14. #include <pwd.h>
  15. #include <stdlib.h>
  16. #include <unistd.h>
  17. #if defined(AK_OS_HAIKU)
  18. # include <FindDirectory.h>
  19. #endif
  20. namespace Core {
  21. DeprecatedString StandardPaths::home_directory()
  22. {
  23. if (auto* home_env = getenv("HOME"))
  24. return LexicalPath::canonicalized_path(home_env);
  25. auto* pwd = getpwuid(getuid());
  26. DeprecatedString path = pwd ? pwd->pw_dir : "/";
  27. endpwent();
  28. return LexicalPath::canonicalized_path(path);
  29. }
  30. DeprecatedString StandardPaths::desktop_directory()
  31. {
  32. StringBuilder builder;
  33. builder.append(home_directory());
  34. builder.append("/Desktop"sv);
  35. return LexicalPath::canonicalized_path(builder.to_deprecated_string());
  36. }
  37. DeprecatedString StandardPaths::documents_directory()
  38. {
  39. StringBuilder builder;
  40. builder.append(home_directory());
  41. builder.append("/Documents"sv);
  42. return LexicalPath::canonicalized_path(builder.to_deprecated_string());
  43. }
  44. DeprecatedString StandardPaths::downloads_directory()
  45. {
  46. StringBuilder builder;
  47. builder.append(home_directory());
  48. builder.append("/Downloads"sv);
  49. return LexicalPath::canonicalized_path(builder.to_deprecated_string());
  50. }
  51. DeprecatedString StandardPaths::config_directory()
  52. {
  53. if (auto* config_directory = getenv("XDG_CONFIG_HOME"))
  54. return LexicalPath::canonicalized_path(config_directory);
  55. StringBuilder builder;
  56. builder.append(home_directory());
  57. #if defined(AK_OS_MACOS)
  58. builder.append("/Library/Preferences"sv);
  59. #elif defined(AK_OS_HAIKU)
  60. builder.append("/config/settings"sv);
  61. #else
  62. builder.append("/.config"sv);
  63. #endif
  64. return LexicalPath::canonicalized_path(builder.to_deprecated_string());
  65. }
  66. DeprecatedString StandardPaths::data_directory()
  67. {
  68. if (auto* data_directory = getenv("XDG_DATA_HOME"))
  69. return LexicalPath::canonicalized_path(data_directory);
  70. StringBuilder builder;
  71. builder.append(home_directory());
  72. #if defined(AK_OS_SERENITY)
  73. builder.append("/.data"sv);
  74. #elif defined(AK_OS_MACOS)
  75. builder.append("/Library/Application Support"sv);
  76. #elif defined(AK_OS_HAIKU)
  77. builder.append("/config/non-packaged/data"sv);
  78. #else
  79. builder.append("/.local/share"sv);
  80. #endif
  81. return LexicalPath::canonicalized_path(builder.to_deprecated_string());
  82. }
  83. ErrorOr<DeprecatedString> StandardPaths::runtime_directory()
  84. {
  85. if (auto* data_directory = getenv("XDG_RUNTIME_DIR"))
  86. return LexicalPath::canonicalized_path(data_directory);
  87. StringBuilder builder;
  88. #if defined(AK_OS_SERENITY)
  89. auto sid = TRY(Core::SessionManagement::root_session_id());
  90. builder.appendff("/tmp/session/{}", sid);
  91. #elif defined(AK_OS_MACOS)
  92. builder.append(home_directory());
  93. builder.append("/Library/Application Support"sv);
  94. #elif defined(AK_OS_HAIKU)
  95. builder.append("/boot/system/var/shared_memory"sv);
  96. #else
  97. auto uid = getuid();
  98. builder.appendff("/run/user/{}", uid);
  99. #endif
  100. return LexicalPath::canonicalized_path(builder.to_deprecated_string());
  101. }
  102. DeprecatedString StandardPaths::tempfile_directory()
  103. {
  104. return "/tmp";
  105. }
  106. ErrorOr<Vector<String>> StandardPaths::font_directories()
  107. {
  108. #if defined(AK_OS_HAIKU)
  109. Vector<String> paths_vector;
  110. char** paths;
  111. size_t paths_count;
  112. if (find_paths(B_FIND_PATH_FONTS_DIRECTORY, NULL, &paths, &paths_count) == B_OK) {
  113. for (size_t i = 0; i < paths_count; ++i) {
  114. StringBuilder builder;
  115. builder.append(paths[i], strlen(paths[i]));
  116. paths_vector.append(TRY(builder.to_string()));
  117. }
  118. }
  119. return paths_vector;
  120. #else
  121. return Vector { {
  122. # if defined(AK_OS_SERENITY)
  123. "/res/fonts"_string,
  124. # elif defined(AK_OS_MACOS)
  125. "/System/Library/Fonts"_string,
  126. "/Library/Fonts"_string,
  127. TRY(String::formatted("{}/Library/Fonts"sv, home_directory())),
  128. # else
  129. "/usr/share/fonts"_string,
  130. "/usr/local/share/fonts"_string,
  131. TRY(String::formatted("{}/.local/share/fonts"sv, home_directory())),
  132. # endif
  133. } };
  134. #endif
  135. }
  136. }