#include "TString.h"
#include "TEnv.h"
#include "TSocket.h"
#include "TUrl.h"
#include "TVirtualMutex.h"
#include "TXNetFile.h"
#include "TXNetSystem.h"
#include "TROOT.h"
#include "XrdClient/XrdClientAdmin.hh"
#include "XrdClient/XrdClientConn.hh"
#include "XrdClient/XrdClientEnv.hh"
#include "XProtocol/XProtocol.hh"
ClassImp(TXNetSystem);
Bool_t TXNetSystem::fgInitDone = kFALSE;
Bool_t TXNetSystem::fgRootdBC = kTRUE;
TXNetSystem::TXNetSystem(Bool_t owner) : TNetSystem(owner)
{
SetTitle("(x)rootd system administration");
fClientAdmin = 0;
fIsXRootd = kFALSE;
fDir = "";
fDirp = 0;
fDirListValid = kFALSE;
}
TXNetSystem::TXNetSystem(const char *url, Bool_t owner) : TNetSystem(owner)
{
SetTitle("(x)rootd system administration");
fIsRootd = kFALSE;
fIsXRootd = kFALSE;
fDir = "";
fDirp = 0;
fDirListValid = kFALSE;
EnvPutInt(NAME_DEBUG, gEnv->GetValue("XNet.Debug", -1));
if (!fgInitDone)
InitXrdClient();
TNetSystem::InitRemoteEntity(url);
TString dummy = url;
dummy += "/dummy";
fClientAdmin = new XrdClientAdmin(dummy);
if (!fClientAdmin) {
Error("TXNetSystem","fatal error: new object creation failed.");
gSystem->Abort();
}
if (fClientAdmin->Connect()) {
fIsXRootd = kTRUE;
} else {
if (fgRootdBC) {
Bool_t isRootd =
(fClientAdmin->GetClientConn()->GetServerType() == XrdClientConn::kSTRootd);
Int_t sd = fClientAdmin->GetClientConn()->GetOpenSockFD();
if (isRootd && sd > -1) {
TSocket *s = new TSocket(sd);
R__LOCKGUARD2(gROOTMutex);
gROOT->GetListOfSockets()->Remove(s);
s->SetOption(kNoBlock, 0);
Int_t rproto = TXNetFile::GetRootdProtocol(s);
if (rproto < 0) {
Error("TXNetSystem", "getting protocol of the rootd server");
return;
}
s->SetRemoteProtocol(rproto);
TUrl uut((fClientAdmin->GetClientConn()
->GetCurrentUrl()).GetUrl().c_str());
TString uu;
TXNetFile::FormUrl(uut,uu);
if (gDebug > 2)
Info("TXNetSystem"," url: %s",uu.Data());
s->SetUrl(uu.Data());
s->SetService("rootd");
s->SetServType(TSocket::kROOTD);
if (rproto > 13) {
TNetSystem::Create(uu, s);
} else {
TNetSystem::Create(uu);
}
fIsRootd = kTRUE;
} else {
Error("TXNetSystem", "some severe error occurred while opening"
" the connection at %s - exit", url);
return;
}
} else {
Error("TXNetSystem",
"while opening the connection at %s - exit", url);
return;
}
}
return;
}
TXNetSystem::~TXNetSystem()
{
#ifndef WIN32
if (fIsXRootd && fClientAdmin)
delete fClientAdmin;
#endif
}
void TXNetSystem::InitXrdClient()
{
TXNetFile::SetEnv();
fgInitDone = kTRUE;
if (gEnv->GetValue("XNet.PrintTAG",0) == 1)
Info("TXNetFile","(C) 2005 SLAC TXNetSystem (eXtended TNetSystem) %s",
gROOT->GetVersion());
}
void TXNetSystem::SaveEndPointUrl()
{
if (fClientAdmin->GetClientConn()) {
XrdClientUrlInfo eurl = fClientAdmin->GetClientConn()->GetCurrentUrl();
TNetSystem::InitRemoteEntity(eurl.GetUrl().c_str());
}
}
void* TXNetSystem::OpenDirectory(const char* dir)
{
if (fIsXRootd) {
fDir = TUrl(dir).GetFile();
fDirp = (void*)&fDir;
vecString dirs;
vecBool existDirs;
XrdOucString s(fDir.Data());
dirs.Push_back(s);
fClientAdmin->ExistDirs(dirs,existDirs);
SaveEndPointUrl();
if (existDirs.GetSize()>0 && existDirs[0])
return fDirp;
return 0;
}
if (gDebug > 1)
Info("OpenDirectory", "calling TNetSystem::OpenDirectory");
return TNetSystem::OpenDirectory(dir);
}
void TXNetSystem::FreeDirectory(void *dirp)
{
if (fIsXRootd) {
if (dirp != fDirp) {
Error("FreeDirectory","invalid directory pointer (%p, %p)", dirp, fDirp);
return;
}
fDir = "";
fDirp = 0;
fDirListValid = kFALSE;
return;
}
if (gDebug > 1)
Info("FreeDirectory","calling TNetSystem::FreeDirectory");
return TNetSystem::FreeDirectory(dirp);
}
Int_t TXNetSystem::MakeDirectory(const char* dir)
{
if (fIsXRootd) {
Bool_t ok = fClientAdmin->Mkdir(TUrl(dir).GetFile(),7,5,5);
SaveEndPointUrl();
return (ok ? 0 : -1);
}
if (gDebug > 1) Info("MakeDirectory","Calling TNetSystem::MakeDirectory");
return TNetSystem::MakeDirectory(dir);
}
const char* TXNetSystem::GetDirEntry(void *dirp)
{
if (fIsXRootd) {
if (dirp != fDirp) {
Error("GetDirEntry","invalid directory pointer");
return 0;
}
if (!fDirListValid) {
Bool_t ok = fClientAdmin->DirList(fDir,fDirList);
SaveEndPointUrl();
if (ok)
fDirListValid = kTRUE;
else
return 0;
}
if (fDirList.GetSize() > 0)
return fDirList.Pop_back().c_str();
return 0;
}
if (gDebug > 1) Info("GetDirEntry","Calling TNetSystem::GetDirEntry");
return TNetSystem::GetDirEntry(dirp);
}
Int_t TXNetSystem::GetPathInfo(const char* path, FileStat_t &buf)
{
if (fIsXRootd) {
Long_t id;
Long64_t size;
Long_t flags;
Long_t modtime;
TString edir = TUrl(path).GetFile();
Bool_t ok = fClientAdmin->Stat(edir,id,size,flags,modtime);
SaveEndPointUrl();
ok &= !(flags & kXR_offline);
if (ok) {
buf.fDev = (id >> 24);
buf.fIno = (id && 0x00FFFFFF);
buf.fUid = -1;
buf.fGid = -1;
buf.fSize = size;
buf.fMtime = modtime;
if (flags == 0) buf.fMode = kS_IFREG;
if (flags & kXR_xset) buf.fMode = (kS_IFREG|kS_IXUSR|kS_IXGRP|kS_IXOTH);
if (flags & kXR_isDir) buf.fMode = kS_IFDIR;
if (flags & kXR_other) buf.fMode = kS_IFSOCK;
if (flags & kXR_readable) buf.fMode |= kS_IRUSR;
if (flags & kXR_writable) buf.fMode |= kS_IWUSR;
buf.fIsLink = 0;
return 0;
}
return 1;
}
if (gDebug > 1)
Info("GetPathInfo","Calling TNetSystem::GetPathInfo");
return TNetSystem::GetPathInfo(path,buf);
}
Bool_t TXNetSystem::ConsistentWith(const char *path, void *dirptr)
{
if (gDebug > 1)
Info("ConsistenWith",
"Calling TNetSystem::ConsistenWith for path: %s, dir: %p", path, dirptr);
SaveEndPointUrl();
return TNetSystem::ConsistentWith(path,dirptr);
}
Bool_t TXNetSystem::AccessPathName(const char *path, EAccessMode mode)
{
if (fIsXRootd) {
FileStat_t buf;
if (GetPathInfo(path, buf) == 0)
if (buf.fMode != kS_IFSOCK)
return kFALSE;
return kTRUE;
}
if (gDebug > 1)
Info("AccessPathName", "calling TNetSystem::AccessPathName");
return TNetSystem::AccessPathName(path,mode);
}
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.