XRootD
XrdPosixAdmin Class Reference

#include <XrdPosixAdmin.hh>

+ Collaboration diagram for XrdPosixAdmin:

Public Member Functions

 XrdPosixAdmin (const char *path, XrdOucECMsg &ecm, std::mutex *ecmut)
 
 ~XrdPosixAdmin ()
 
XrdCl::URLFanOut (int &num)
 
bool isOK ()
 
int Query (XrdCl::QueryCode::Code reqCode, void *buff, int bsz)
 
bool Stat (mode_t *flags=0, time_t *mtime=0)
 
bool Stat (struct stat &Stat)
 

Public Attributes

XrdOucECMsgecMsg
 
std::mutex * ecMutex
 
XrdCl::URL Url
 
XrdCl::FileSystem Xrd
 

Detailed Description

Definition at line 49 of file XrdPosixAdmin.hh.

Constructor & Destructor Documentation

◆ XrdPosixAdmin()

XrdPosixAdmin::XrdPosixAdmin ( const char *  path,
XrdOucECMsg ecm,
std::mutex *  ecmut 
)
inline

Definition at line 73 of file XrdPosixAdmin.hh.

74  : Url((std::string)path), Xrd(Url), ecMutex(ecmut), ecMsg(ecm) {}
XrdCl::FileSystem Xrd
std::mutex * ecMutex
XrdOucECMsg & ecMsg
XrdCl::URL Url

◆ ~XrdPosixAdmin()

XrdPosixAdmin::~XrdPosixAdmin ( )
inline

Definition at line 75 of file XrdPosixAdmin.hh.

75 {}

Member Function Documentation

◆ FanOut()

XrdCl::URL * XrdPosixAdmin::FanOut ( int &  num)

Definition at line 46 of file XrdPosixAdmin.cc.

47 {
48  XrdCl::XRootDStatus xStatus;
49  XrdCl::LocationInfo *info = 0;
51  XrdCl::URL *uVec;
52  XrdNetAddr netLoc;
53  const char *hName;
54  unsigned long i;
55 
56 // Make sure admin is ok
57 //
58  if (!isOK()) return 0;
59 
60 // Issue the deep locate and verify that all went well
61 //
62  xStatus = Xrd.DeepLocate(Url.GetPathWithParams(),XrdCl::OpenFlags::None,info);
63  if (!xStatus.IsOK())
64  {if (ecMutex) ecMutex->lock();
65  num = XrdPosixMap::Result(xStatus, ecMsg, false);
66  if (ecMutex) ecMutex->unlock();
67  return 0;
68  }
69 
70 // Allocate an array large enough to hold this information
71 //
72  if (!(i = info->GetSize())) {delete info; return 0;}
73  if (i > std::numeric_limits<ptrdiff_t>::max() / sizeof(XrdCl::URL))
74  {delete info; return 0;}
75  uVec = new XrdCl::URL[i];
76 
77 // Now start filling out the array
78 //
79  num = 0;
80  for( it = info->Begin(); it != info->End(); ++it )
81  {if (!netLoc.Set(it->GetAddress().c_str()) && (hName = netLoc.Name()))
82  {std::string hString(hName);
83  uVec[num] = Url;
84  uVec[num].SetHostName(hString);
85  uVec[num].SetPort(netLoc.Port());
86  num++;
87  }
88  }
89 
90 // Make sure we can return something;
91 //
92  delete info;
93  if (!num) {delete [] uVec; return 0;}
94  return uVec;
95 }
Path location info.
uint32_t GetSize() const
Get number of locations.
Iterator Begin()
Get the location begin iterator.
LocationList::iterator Iterator
Iterator over locations.
Iterator End()
Get the location end iterator.
URL representation.
Definition: XrdClURL.hh:31
void SetPort(int port)
Definition: XrdClURL.hh:196
std::string GetPathWithParams() const
Get the path with params.
Definition: XrdClURL.cc:318
void SetHostName(const std::string &hostName)
Set the host name.
Definition: XrdClURL.hh:178
const char * Name(const char *eName=0, const char **eText=0)
int Port(int pNum=-1)
Definition: XrdNetAddr.cc:156
const char * Set(const char *hSpec, int pNum=PortInSpec)
Definition: XrdNetAddr.cc:216
static int Result(const XrdCl::XRootDStatus &Status, XrdOucECMsg &ecMsg, bool retneg1=false)
Definition: XrdPosixMap.cc:188
bool IsOK() const
We're fine.
Definition: XrdClStatus.hh:124

References XrdCl::LocationInfo::Begin(), ecMsg, ecMutex, XrdCl::LocationInfo::End(), XrdCl::URL::GetPathWithParams(), XrdCl::LocationInfo::GetSize(), isOK(), XrdCl::Status::IsOK(), XrdNetAddrInfo::Name(), XrdCl::OpenFlags::None, XrdNetAddr::Port(), XrdPosixMap::Result(), XrdNetAddr::Set(), XrdCl::URL::SetHostName(), XrdCl::URL::SetPort(), and Url.

Referenced by XrdFfsMisc_get_all_urls_real().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isOK()

bool XrdPosixAdmin::isOK ( )
inline

Definition at line 56 of file XrdPosixAdmin.hh.

56  {if (Url.IsValid()) return true;
57  if (ecMutex) ecMutex->lock();
58  ecMsg.Set(EINVAL, 0);
59  ecMsg.Msgf("PosixAdmin", "url '%s' is invalid",
60  Url.GetObfuscatedURL().c_str());
61  if (ecMutex) ecMutex->unlock();
62  errno = EINVAL; return false;
63  }
std::string GetObfuscatedURL() const
Get the URL with authz information obfuscated.
Definition: XrdClURL.cc:498
bool IsValid() const
Is the url valid.
Definition: XrdClURL.cc:452
void Set(int ecc, const char *ecm="")
Definition: XrdOucECMsg.hh:138
void Msgf(const char *pfx, const char *fmt,...)
Definition: XrdOucECMsg.cc:91

References ecMsg, ecMutex, XrdCl::URL::GetObfuscatedURL(), XrdCl::URL::IsValid(), XrdOucECMsg::Msgf(), XrdOucECMsg::Set(), and Url.

Referenced by FanOut(), XrdPosixXrootd::Mkdir(), Query(), XrdPosixXrootd::Rename(), XrdPosixXrootd::Rmdir(), XrdPosixXrootd::Stat(), Stat(), XrdPosixXrootd::Statvfs(), XrdPosixXrootd::Truncate(), XrdPosixXrootd::Unlink(), XrdFfsMisc_get_all_urls_real(), and XrdFfsMisc_get_current_url().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Query()

int XrdPosixAdmin::Query ( XrdCl::QueryCode::Code  reqCode,
void *  buff,
int  bsz 
)

Definition at line 101 of file XrdPosixAdmin.cc.

102 {
103  XrdCl::Buffer reqBuff, *rspBuff = 0;
104 
105 // Make sure we are OK
106 //
107  if (!isOK()) return -1;
108 
109 // Get argument
110 //
111  reqBuff.FromString(Url.GetPathWithParams());
112 
113 // Issue the query
114 //
115  auto st = Xrd.Query(reqCode, reqBuff, rspBuff);
116  int rc;
117  {
118  if (ecMutex) ecMutex->lock();
119  rc = XrdPosixMap::Result(st, ecMsg);
120  if (ecMutex) ecMutex->unlock();
121  }
122  if (!rc)
123  {uint32_t rspSz = rspBuff->GetSize();
124  char *rspbuff = rspBuff->GetBuffer();
125  if (rspbuff && rspSz)
126  {// if the string is null-terminated decrement the size
127  if ( !(rspbuff[rspSz - 1]) ) --rspSz;
128  if (bsz >= (int)rspSz + 1)
129  {strncpy((char *)buff, rspbuff, rspSz);
130  ((char*)buff)[rspSz] = 0; // make sure it is null-terminated
131  delete rspBuff;
132  return static_cast<int>(rspSz + 1);
133  } else
134  {if (ecMutex) ecMutex->lock();
135  ecMsg.SetErrno(ERANGE,0,"buffer to small to hold result");
136  if (ecMutex) ecMutex->unlock();
137  }
138  } else
139  {if (ecMutex) ecMutex->lock();
140  ecMsg.SetErrno(EFAULT,0,"Invalid return results");
141  if (ecMutex) ecMutex->unlock();
142  }
143  }
144 
145 // Return error
146 //
147  delete rspBuff;
148  return -1;
149 }
Binary blob representation.
Definition: XrdClBuffer.hh:34
void FromString(const std::string str)
Fill the buffer from a string.
Definition: XrdClBuffer.hh:205
const char * GetBuffer(uint32_t offset=0) const
Get the message buffer.
Definition: XrdClBuffer.hh:72
uint32_t GetSize() const
Get the size of the message.
Definition: XrdClBuffer.hh:132
int SetErrno(int ecc, int retval=-1, const char *alt=0)
Definition: XrdOucECMsg.cc:144

References ecMsg, ecMutex, XrdCl::Buffer::FromString(), XrdCl::Buffer::GetBuffer(), XrdCl::URL::GetPathWithParams(), XrdCl::Buffer::GetSize(), isOK(), XrdPosixMap::Result(), XrdOucECMsg::SetErrno(), and Url.

Referenced by XrdPosixXrootd::Getxattr(), XrdPosixXrootd::QueryChksum(), and XrdPosixXrootd::QueryOpaque().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Stat() [1/2]

bool XrdPosixAdmin::Stat ( mode_t *  flags = 0,
time_t *  mtime = 0 
)

Definition at line 155 of file XrdPosixAdmin.cc.

156 {
157  XrdCl::XRootDStatus xStatus;
158  XrdCl::StatInfo *sInfo = 0;
159 
160 // Make sure admin is ok
161 //
162  if (!isOK()) return false;
163 
164 // Issue the stat and verify that all went well
165 //
166  xStatus = Xrd.Stat(Url.GetPathWithParams(), sInfo);
167  if (!xStatus.IsOK())
168  {if (ecMutex) ecMutex->lock();
169  XrdPosixMap::Result(xStatus,ecMsg);
170  if (ecMutex) ecMutex->unlock();
171  delete sInfo;
172  return false;
173  }
174 
175 // Return wanted data
176 //
177  if (flags) *flags = XrdPosixMap::Flags2Mode(0, sInfo->GetFlags());
178  if (mtime) *mtime = static_cast<time_t>(sInfo->GetModTime());
179 
180 // Delete our status information and return final result
181 //
182  delete sInfo;
183  return true;
184 }
Object stat info.
uint32_t GetFlags() const
Get flags.
uint64_t GetModTime() const
Get modification time (in seconds since epoch)
static mode_t Flags2Mode(dev_t *rdv, uint32_t flags)
Definition: XrdPosixMap.cc:62

References ecMsg, ecMutex, XrdPosixMap::Flags2Mode(), XrdCl::StatInfo::GetFlags(), XrdCl::StatInfo::GetModTime(), XrdCl::URL::GetPathWithParams(), isOK(), XrdCl::Status::IsOK(), XrdPosixMap::Result(), and Url.

Referenced by XrdPosixXrootd::Access(), XrdPosixXrootd::Getxattr(), XrdPosixXrootd::QueryChksum(), XrdPosixXrootd::QueryOpaque(), XrdPosixXrootd::Stat(), Stat(), and XrdFfsMisc_get_current_url().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ Stat() [2/2]

bool XrdPosixAdmin::Stat ( struct stat Stat)

Definition at line 188 of file XrdPosixAdmin.cc.

189 {
190  XrdCl::XRootDStatus xStatus;
191  XrdCl::StatInfo *sInfo = 0;
192 
193 // Make sure admin is ok
194 //
195  if (!isOK()) return false;
196 
197 // Issue the stat and verify that all went well
198 //
199  xStatus = Xrd.Stat(Url.GetPathWithParams(), sInfo);
200  if (!xStatus.IsOK())
201  {if (ecMutex) ecMutex->lock();
202  XrdPosixMap::Result(xStatus,ecMsg);
203  if (ecMutex) ecMutex->unlock();
204  delete sInfo;
205  return false;
206  }
207 
208 // Return the data
209 //
210  Stat.st_size = static_cast<size_t>(sInfo->GetSize());
211  Stat.st_blocks = Stat.st_size/512 + Stat.st_size%512;
212  Stat.st_ino = static_cast<ino_t>(strtoll(sInfo->GetId().c_str(), 0, 10));
213 #if defined(__mips__) && _MIPS_SIM == _ABIO32
214  // Work around inconsistent type definitions on MIPS
215  // The st_rdev field in struct stat (which is 32 bits) is not type
216  // dev_t (which is 64 bits)
217  dev_t tmp_rdev = Stat.st_rdev;
218  Stat.st_mode = XrdPosixMap::Flags2Mode(&tmp_rdev, sInfo->GetFlags());
219  Stat.st_rdev = tmp_rdev;
220 #else
221  Stat.st_mode = XrdPosixMap::Flags2Mode(&Stat.st_rdev, sInfo->GetFlags());
222 #endif
223  Stat.st_mtime = static_cast<time_t>(sInfo->GetModTime());
224 
225  if (sInfo->ExtendedFormat())
226  {Stat.st_ctime = static_cast<time_t>(sInfo->GetChangeTime());
227  Stat.st_atime = static_cast<time_t>(sInfo->GetAccessTime());
228  } else {
229  Stat.st_ctime = Stat.st_mtime;
230  Stat.st_atime = time(0);
231  }
232 
233 // Delete our status information and return final result
234 //
235  delete sInfo;
236  return true;
237 }
uint64_t GetChangeTime() const
Get change time (in seconds since epoch)
uint64_t GetSize() const
Get size (in bytes)
bool ExtendedFormat() const
Has extended stat information.
const std::string & GetId() const
Get id.
uint64_t GetAccessTime() const
Get change time (in seconds since epoch)
bool Stat(mode_t *flags=0, time_t *mtime=0)

References ecMsg, ecMutex, XrdCl::StatInfo::ExtendedFormat(), XrdPosixMap::Flags2Mode(), XrdCl::StatInfo::GetAccessTime(), XrdCl::StatInfo::GetChangeTime(), XrdCl::StatInfo::GetFlags(), XrdCl::StatInfo::GetId(), XrdCl::StatInfo::GetModTime(), XrdCl::URL::GetPathWithParams(), XrdCl::StatInfo::GetSize(), isOK(), XrdCl::Status::IsOK(), XrdPosixMap::Result(), Stat(), and Url.

+ Here is the call graph for this function:

Member Data Documentation

◆ ecMsg

XrdOucECMsg& XrdPosixAdmin::ecMsg

Definition at line 78 of file XrdPosixAdmin.hh.

Referenced by FanOut(), isOK(), Query(), and Stat().

◆ ecMutex

std::mutex* XrdPosixAdmin::ecMutex

Definition at line 77 of file XrdPosixAdmin.hh.

Referenced by FanOut(), isOK(), Query(), and Stat().

◆ Url

◆ Xrd


The documentation for this class was generated from the following files: