28 #include <XrdCl/XrdClFileSystem.hh>
29 #include <XrdCl/XrdClXRootDResponses.hh>
30 #include <XrdSys/XrdSysDNS.hh>
36 TSystem* ROOT_Plugin_TNetXNGSystem(
const char *url, Bool_t owner) {
37 return new TNetXNGSystem(url, owner);
41 ClassImp(TNetXNGSystem);
43 THashList TNetXNGSystem::fgAddrFQDN;
44 TMutex TNetXNGSystem::fgAddrMutex;
48 struct DirectoryInfo {
50 XrdCl::DirectoryList *fDirList;
51 XrdCl::DirectoryList::Iterator *fDirListIter;
54 DirectoryInfo(
const char *dir) : fUrl(new XrdCl::URL(dir)), fDirList(0), fDirListIter(0) {}
68 TNetXNGSystem::TNetXNGSystem(Bool_t ) :
69 TSystem(
"-root",
"Net file Helper System"), fUrl(0), fFileSystem(0)
82 TNetXNGSystem::TNetXNGSystem(
const char *url, Bool_t ) :
83 TSystem(
"-root",
"Net file Helper System")
85 using namespace XrdCl;
89 fUrl =
new URL(std::string(url));
90 fFileSystem =
new FileSystem(fUrl->GetURL());
96 TNetXNGSystem::~TNetXNGSystem()
109 void* TNetXNGSystem::OpenDirectory(
const char *dir)
111 using namespace XrdCl;
113 DirectoryInfo *dirInfo =
new DirectoryInfo(dir);
114 fDirPtrs.insert( (
void*)dirInfo );
115 return (
void *) dirInfo;
124 Int_t TNetXNGSystem::MakeDirectory(
const char *dir)
126 using namespace XrdCl;
128 XRootDStatus st = fFileSystem->MkDir(url.GetPath(), MkDirFlags::MakePath,
131 Error(
"MakeDirectory",
"%s", st.GetErrorMessage().c_str());
143 void TNetXNGSystem::FreeDirectory(
void *dirp)
145 fDirPtrs.erase( dirp );
146 delete (DirectoryInfo *) dirp;
155 const char* TNetXNGSystem::GetDirEntry(
void *dirp)
157 using namespace XrdCl;
158 DirectoryInfo *dirInfo = (DirectoryInfo *) dirp;
160 if (!dirInfo->fDirList) {
161 XRootDStatus st = fFileSystem->DirList(dirInfo->fUrl->GetPath(),
162 DirListFlags::Locate,
165 Error(
"GetDirEntry",
"%s", st.GetErrorMessage().c_str());
168 dirInfo->fDirListIter =
new DirectoryList::Iterator(dirInfo->fDirList->Begin());
171 if (*(dirInfo->fDirListIter) != dirInfo->fDirList->End()) {
172 const char *filename = (**(dirInfo->fDirListIter))->GetName().c_str();
173 (*(dirInfo->fDirListIter))++;
188 Int_t TNetXNGSystem::GetPathInfo(
const char *path, FileStat_t &buf)
190 using namespace XrdCl;
193 XRootDStatus st = fFileSystem->Stat(target.GetPath(), info);
198 Info(
"GetPathInfo",
"Stat error: %s", st.GetErrorMessage().c_str());
206 if (info->TestFlags(StatInfo::Offline)) {
207 buf.fMode = kS_IFOFF;
209 std::stringstream sstr(info->GetId());
213 buf.fDev = (
id >> 32);
214 buf.fIno = (
id & 0x00000000FFFFFFFF);
218 buf.fSize = info->GetSize();
219 buf.fMtime = info->GetModTime();
221 if (info->TestFlags(StatInfo::XBitSet))
222 buf.fMode = (kS_IFREG | kS_IXUSR | kS_IXGRP | kS_IXOTH);
223 if (info->GetFlags() == 0) buf.fMode = kS_IFREG;
224 if (info->TestFlags(StatInfo::IsDir)) buf.fMode = kS_IFDIR;
225 if (info->TestFlags(StatInfo::Other)) buf.fMode = kS_IFSOCK;
226 if (info->TestFlags(StatInfo::IsReadable)) buf.fMode |= kS_IRUSR;
227 if (info->TestFlags(StatInfo::IsWritable)) buf.fMode |= kS_IWUSR;
242 Bool_t TNetXNGSystem::ConsistentWith(
const char *path,
void *dirptr)
244 using namespace XrdCl;
251 Info(
"ConsistentWith",
"Protocol: '%s' (%s), Username: '%s' (%s), "
252 "Password: '%s' (%s), Hostname: '%s' (%s), Port: %d (%d)",
253 fUrl->GetProtocol().c_str(), url.GetProtocol().c_str(),
254 fUrl->GetUserName().c_str(), url.GetUserName().c_str(),
255 fUrl->GetPassword().c_str(), url.GetPassword().c_str(),
256 fUrl->GetHostName().c_str(), url.GetHostName().c_str(),
257 fUrl->GetPort(), url.GetPort());
260 if( fUrl->GetProtocol() == url.GetProtocol() &&
261 fUrl->GetUserName() == url.GetUserName() &&
262 fUrl->GetPassword() == url.GetPassword() &&
263 fUrl->GetHostName() == url.GetHostName() &&
264 fUrl->GetPort() == url.GetPort())
269 return fDirPtrs.find( dirptr ) != fDirPtrs.end();
280 int TNetXNGSystem::Unlink(
const char *path)
282 using namespace XrdCl;
287 XRootDStatus st = fFileSystem->Stat(url.GetPath(), info);
289 Error(
"Unlink",
"%s", st.GetErrorMessage().c_str());
293 if (info->TestFlags(StatInfo::IsDir))
294 st = fFileSystem->RmDir(url.GetPath());
296 st = fFileSystem->Rm(url.GetPath());
300 Error(
"Unlink",
"%s", st.GetErrorMessage().c_str());
313 Bool_t TNetXNGSystem::IsPathLocal(
const char *path)
315 return TSystem::IsPathLocal(path);
326 Int_t TNetXNGSystem::Locate(
const char *path, TString &endurl)
328 using namespace XrdCl;
329 LocationInfo *info = 0;
333 XRootDStatus st = fFileSystem->Locate(pathUrl.GetPath(), OpenFlags::None,
336 Error(
"Locate",
"%s", st.GetErrorMessage().c_str());
342 URL locUrl(info->Begin()->GetAddress());
343 TString loc = locUrl.GetHostName();
347 R__LOCKGUARD(&fgAddrMutex);
353 if (fgAddrFQDN.GetSize() <= 0 ||
354 !(hn =
dynamic_cast<TNamed *
>(fgAddrFQDN.FindObject(loc)))) {
355 char *addr[1] = {0}, *name[1] = {0};
356 int naddr = XrdSysDNS::getAddrName(loc.Data(), 1, addr, name);
358 hn =
new TNamed(loc.Data(), name[0]);
360 hn =
new TNamed(loc, loc);
366 Info(
"Locate",
"caching host name: %s", hn->GetTitle());
370 res.SetHost(hn->GetTitle());
371 res.SetPort(locUrl.GetPort());
372 endurl = res.GetUrl();
385 Int_t TNetXNGSystem::Stage(
const char* path, UChar_t priority)
387 TList *files =
new TList();
388 files->Add((TObject *)
new TUrl(path));
389 return Stage((TCollection *) files, priority);
400 Int_t TNetXNGSystem::Stage(TCollection *files, UChar_t priority)
402 using namespace XrdCl;
403 std::vector<std::string> fileList;
407 while ((
object = (TObject *) it.Next())) {
409 TString path = TFileStager::GetPathName(
object);
411 Warning(
"Stage",
"object is of unexpected type %s - ignoring",
412 object->ClassName());
416 fileList.push_back(std::string(URL(path.Data()).GetPath()));
420 XRootDStatus st = fFileSystem->Prepare(fileList, PrepareFlags::Stage,
421 (uint8_t) priority, response);
423 Error(
"Stage",
"%s", st.GetErrorMessage().c_str());