summaryrefslogtreecommitdiffstats
path: root/src/base/paths.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/paths.cc')
-rw-r--r--src/base/paths.cc130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/base/paths.cc b/src/base/paths.cc
new file mode 100644
index 0000000..ca53a07
--- /dev/null
+++ b/src/base/paths.cc
@@ -0,0 +1,130 @@
+/**
+ * Copyright (c) 2021, Timothy Stack
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * * Neither the name of Timothy Stack nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#ifdef __CYGWIN__
+# include <iostream>
+# include <sstream>
+#endif
+
+#include "fmt/format.h"
+#include "paths.hh"
+
+namespace lnav {
+namespace paths {
+
+#ifdef __CYGWIN__
+char*
+windows_to_unix_file_path(char* input)
+{
+ if (input == nullptr) {
+ return nullptr;
+ }
+ std::string file_path;
+ file_path.assign(input);
+
+ // Replace the slashes
+ std::replace(file_path.begin(),
+ file_path.end(),
+ WINDOWS_FILE_PATH_SEPARATOR,
+ UNIX_FILE_PATH_SEPARATOR);
+
+ // Convert the drive letter to lowercase
+ std::transform(
+ file_path.begin(),
+ file_path.begin() + 1,
+ file_path.begin(),
+ [](unsigned char character) { return std::tolower(character); });
+
+ // Remove the colon
+ const auto drive_letter = file_path.substr(0, 1);
+ const auto remaining_path = file_path.substr(2, file_path.size() - 2);
+ file_path = drive_letter + remaining_path;
+
+ std::stringstream stringstream;
+ stringstream << "/cygdrive/";
+ stringstream << file_path;
+
+ return const_cast<char*>(stringstream.str().c_str());
+}
+#endif
+
+ghc::filesystem::path
+dotlnav()
+{
+#ifdef __CYGWIN__
+ auto home_env = windows_to_unix_file_path(getenv("APPDATA"));
+#else
+ auto home_env = getenv("HOME");
+#endif
+ auto xdg_config_home = getenv("XDG_CONFIG_HOME");
+
+ if (home_env != nullptr) {
+ auto home_path = ghc::filesystem::path(home_env);
+
+ if (ghc::filesystem::is_directory(home_path)) {
+ auto home_lnav = home_path / ".lnav";
+
+ if (ghc::filesystem::is_directory(home_lnav)) {
+ return home_lnav;
+ }
+
+ if (xdg_config_home != nullptr) {
+ auto xdg_path = ghc::filesystem::path(xdg_config_home);
+
+ if (ghc::filesystem::is_directory(xdg_path)) {
+ return xdg_path / "lnav";
+ }
+ }
+
+ auto home_config = home_path / ".config";
+
+ if (ghc::filesystem::is_directory(home_config)) {
+ return home_config / "lnav";
+ }
+
+ return home_lnav;
+ }
+ }
+
+ return ghc::filesystem::current_path();
+}
+
+ghc::filesystem::path
+workdir()
+{
+ auto subdir_name = fmt::format(FMT_STRING("lnav-user-{}-work"), getuid());
+ auto tmp_path = ghc::filesystem::temp_directory_path();
+
+ return tmp_path / ghc::filesystem::path(subdir_name);
+}
+
+} // namespace paths
+} // namespace lnav