From 79b8442dbc7751d064d792530e5511be9b40cddf Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 12 Jan 2023 22:08:14 -0800 Subject: [PATCH] FHU: Add helpers for symlink checking --- FEXHeaderUtils/FEXHeaderUtils/SymlinkChecks.h | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 FEXHeaderUtils/FEXHeaderUtils/SymlinkChecks.h diff --git a/FEXHeaderUtils/FEXHeaderUtils/SymlinkChecks.h b/FEXHeaderUtils/FEXHeaderUtils/SymlinkChecks.h new file mode 100644 index 000000000..4540ad697 --- /dev/null +++ b/FEXHeaderUtils/FEXHeaderUtils/SymlinkChecks.h @@ -0,0 +1,28 @@ +#pragma once +#include +#include +#include +#include +#include + +namespace FHU::Symlinks { +// Checks to see if a filepath is a symlink. +inline bool IsSymlink(const std::string &Filename) { + struct stat Buffer{}; + int Result = lstat(Filename.c_str(), &Buffer); + return Result == 0 && S_ISLNK(Buffer.st_mode); +} + +// Resolves a symlink path. +// Doesn't handle recursive symlinks. +// Doesn't append null terminator character. +// Returns a string_view of the resolved path, or an empty view on error. +inline std::string_view ResolveSymlink(const std::string &Filename, std::span ResultBuffer) { + ssize_t Result = readlink(Filename.c_str(), ResultBuffer.data(), ResultBuffer.size()); + if (Result == -1) { + return {}; + } + + return std::string_view(ResultBuffer.data(), Result); +} +}