Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
InternalIOUtils.cxx
Go to the documentation of this file.
1#include "ROOT/InternalIOUtils.hxx"
2
3#include "ROOT/RConfig.hxx" // R__UNIX
4
5#ifdef R__UNIX
6
7#include <ROOT/RLogger.hxx>
8
10{
11 static ROOT::RLogChannel sLog("ROOT.Internal");
12 return sLog;
13}
14
15// getxattr
16#ifdef R__FBSD
17#include <sys/extattr.h>
18#else
19#include <sys/xattr.h>
20#endif
21
22#ifdef R__MACOSX
23/* On macOS getxattr takes two extra arguments that should be set to 0 */
24#define getxattr(path, name, value, size) getxattr(path, name, value, size, 0u, 0)
25#endif
26
27#ifdef R__FBSD
28#define getxattr(path, name, value, size) extattr_get_file(path, EXTATTR_NAMESPACE_USER, name, value, size)
29#endif
30
31#include "ROOT/StringUtils.hxx" // ROOT::StartsWith
32#include "TEnv.h" // TEnv::GetValue
33#endif
34
35std::optional<std::string>
36ROOT::Internal::GetXAttrVal([[maybe_unused]] std::string_view path, [[maybe_unused]] std::string_view xattr)
37{
38#ifdef R__UNIX
39 // First call to getxattr evaluates the length of the extended attribute value
40 if (auto len = getxattr(path.data(), xattr.data(), nullptr, 0); len >= 0) {
41 std::string xval(len, 0);
42 // Second call extracts the extended attribute value, checking it's of the correct length
43 if (getxattr(path.data(), xattr.data(), xval.data(), len) == len)
44 return xval;
45 }
46#endif
47 return std::nullopt;
48}
49
50std::optional<std::string> ROOT::Internal::GetEOSRedirectedXRootURL([[maybe_unused]] std::string_view inputPath)
51{
52#ifdef R__UNIX
53 if (inputPath.empty() || inputPath.back() == '/')
54 return std::nullopt;
55
56 if (gEnv->GetValue("TFile.CrossProtocolRedirects", 1) != 1)
57 return std::nullopt;
58
59 auto xurl = ROOT::Internal::GetXAttrVal(inputPath, "eos.url.xroot");
60 if (!xurl)
61 return std::nullopt;
62
63 auto baseName = inputPath.substr(inputPath.find_last_of("/") + 1);
64 // Sometimes the `getxattr` call may return an invalid URL due
65 // to the POSIX attribute not being yet completely filled by EOS.
66 if (!std::equal(baseName.crbegin(), baseName.crend(), xurl->crbegin())) {
68 << "Could not find path base name '" << baseName << "' in redirected URL '" << *xurl << "'.";
69 return std::nullopt;
70 }
71
72 // Ensure the redirected URL actually starts with the XRootD protocol string
73 if (ROOT::StartsWith(*xurl, "root://") || ROOT::StartsWith(*xurl, "xroot://") ||
74 ROOT::StartsWith(*xurl, "roots://") || ROOT::StartsWith(*xurl, "xroots://"))
75 return xurl;
76 else
78 << "Redirected URL '" << *xurl << "' does not begin with any valid XRootD protocol string.";
79
80#endif
81 return std::nullopt;
82}
#define R__LOG_WARNING(...)
Definition RLogger.hxx:357
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
R__EXTERN TEnv * gEnv
Definition TEnv.h:126
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
A log configuration for a channel, e.g.
Definition RLogger.hxx:97
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition TEnv.cxx:511
bool StartsWith(std::string_view string, std::string_view prefix)