XRootD
XrdOfs Class Reference

#include <XrdOfs.hh>

+ Inheritance diagram for XrdOfs:
+ Collaboration diagram for XrdOfs:

Classes

struct  fwdOpt
 

Public Types

enum  {
  Authorize = 0x0001 ,
  XAttrPlug = 0x0002 ,
  isPeer = 0x0050 ,
  isProxy = 0x0020 ,
  isManager = 0x0040 ,
  isServer = 0x0080 ,
  isSuper = 0x00C0 ,
  isMeta = 0x0100 ,
  haveRole = 0x01F0 ,
  Forwarding = 0x1000 ,
  ThirdPC = 0x2000 ,
  SubCluster = 0x4000 ,
  RdrTPC = 0x8000
}
 
- Public Types inherited from XrdSfsFileSystem
enum  csFunc {
  csCalc = 0 ,
  csGet ,
  csSize
}
 
enum  gpfFunc {
  gpfCancel =0 ,
  gpfGet ,
  gpfPut
}
 

Public Member Functions

 XrdOfs ()
 
virtual ~XrdOfs ()
 
int chksum (csFunc Func, const char *csName, const char *Path, XrdOucErrInfo &out_error, const XrdSecEntity *client=0, const char *opaque=0)
 
int chmod (const char *Name, XrdSfsMode Mode, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
 
void Config_Cluster (XrdOss *)
 
void Config_Display (XrdSysError &)
 
virtual int Configure (XrdSysError &)
 
virtual int Configure (XrdSysError &, XrdOucEnv *)
 
void Connect (const XrdSecEntity *client=0)
 
void Disc (const XrdSecEntity *client=0)
 
int exists (const char *fileName, XrdSfsFileExistence &exists_flag, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
 
int FAttr (XrdSfsFACtl *faReq, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)
 
int fsctl (const int cmd, const char *args, XrdOucErrInfo &out_error, const XrdSecEntity *client=0)
 
int FSctl (const int cmd, XrdSfsFSctl &args, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)
 
int getStats (char *buff, int blen)
 
const char * getVersion ()
 
int mkdir (const char *dirName, XrdSfsMode Mode, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
 
XrdSfsDirectorynewDir (char *user=0, int MonID=0)
 
XrdSfsDirectorynewDir (XrdOucErrInfo &eInfo)
 
XrdSfsFilenewFile (char *user=0, int MonID=0)
 
XrdSfsFilenewFile (XrdOucErrInfo &eInfo)
 
int prepare (XrdSfsPrep &pargs, XrdOucErrInfo &out_error, const XrdSecEntity *client=0)
 
int rem (const char *path, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *info=0)
 
int remdir (const char *dirName, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *info=0)
 
int rename (const char *oldFileName, const char *newFileName, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *infoO=0, const char *infoN=0)
 
int stat (const char *Name, mode_t &mode, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
 
int stat (const char *Name, struct stat *buf, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
 
int truncate (const char *Name, XrdSfsFileOffset fileOffset, XrdOucErrInfo &out_error, const XrdSecEntity *client=0, const char *opaque=0)
 
- Public Member Functions inherited from XrdSfsFileSystem
 XrdSfsFileSystem ()
 Constructor and Destructor. More...
 
virtual ~XrdSfsFileSystem ()
 
virtual void EnvInfo (XrdOucEnv *envP)
 
uint64_t Features ()
 
virtual int getChkPSize ()
 
virtual int gpFile (gpfFunc &gpAct, XrdSfsGPFile &gpReq, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)
 

Public Attributes

char * ConfigFN
 
mode_t dMask [2]
 
mode_t fMask [2]
 
struct fwdOpt fwdCHMOD
 
struct fwdOpt fwdMKDIR
 
struct fwdOpt fwdMKPATH
 
struct fwdOpt fwdMV
 
struct fwdOpt fwdRM
 
struct fwdOpt fwdRMDIR
 
struct fwdOpt fwdTRUNC
 
XrdNetIFmyIF
 
int myPort
 
int Options
 
char * tpcRdrHost [2]
 
int tpcRdrPort [2]
 

Static Public Attributes

static int MaxDelay = 60
 
static int OSSDelay = 30
 

Protected Member Functions

virtual int ConfigXeq (char *var, XrdOucStream &, XrdSysError &)
 
const char * Split (const char *Args, const char **Opq, char *Path, int Plen)
 
int Stall (XrdOucErrInfo &, int, const char *)
 
void Unpersist (XrdOfsHandle *hP, int xcev=1)
 
char * WaitTime (int, char *, int)
 

Static Protected Member Functions

static int Emsg (const char *, XrdOucErrInfo &, int, const char *x, const char *y="")
 
static int Emsg (const char *, XrdOucErrInfo &, int, const char *x, XrdOfsHandle *hP)
 
static int fsError (XrdOucErrInfo &myError, int rc)
 

Protected Attributes

XrdOfsEvr evrObject
 
XrdCmsClientFinder
 
- Protected Attributes inherited from XrdSfsFileSystem
uint64_t FeatureSet
 Adjust features at initialization. More...
 

Friends

class XrdOfsDirectory
 
class XrdOfsFile
 

Detailed Description

Definition at line 235 of file XrdOfs.hh.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
Authorize 
XAttrPlug 
isPeer 
isProxy 
isManager 
isServer 
isSuper 
isMeta 
haveRole 
Forwarding 
ThirdPC 
SubCluster 
RdrTPC 

Definition at line 364 of file XrdOfs.hh.

364  {Authorize = 0x0001, // Authorization wanted
365  XAttrPlug = 0x0002, // Extended Attribute Plugin
366  isPeer = 0x0050, // Role peer
367  isProxy = 0x0020, // Role proxy
368  isManager = 0x0040, // Role manager
369  isServer = 0x0080, // Role server
370  isSuper = 0x00C0, // Role supervisor
371  isMeta = 0x0100, // Role meta + above
372  haveRole = 0x01F0, // A role is present
373  Forwarding= 0x1000, // Fowarding wanted
374  ThirdPC = 0x2000, // This party copy wanted
375  SubCluster= 0x4000, // all.subcluster directive encountered
376  RdrTPC = 0x8000
377  }; // These are set in Options below
@ isProxy
Definition: XrdOfs.hh:367
@ haveRole
Definition: XrdOfs.hh:372
@ RdrTPC
Definition: XrdOfs.hh:376
@ ThirdPC
Definition: XrdOfs.hh:374
@ isMeta
Definition: XrdOfs.hh:371
@ SubCluster
Definition: XrdOfs.hh:375
@ isManager
Definition: XrdOfs.hh:368
@ isPeer
Definition: XrdOfs.hh:366
@ XAttrPlug
Definition: XrdOfs.hh:365
@ isSuper
Definition: XrdOfs.hh:370
@ isServer
Definition: XrdOfs.hh:369
@ Authorize
Definition: XrdOfs.hh:364
@ Forwarding
Definition: XrdOfs.hh:373

Constructor & Destructor Documentation

◆ XrdOfs()

XrdOfs::XrdOfs ( )

Definition at line 169 of file XrdOfs.cc.

169  : dMask{0000,0775}, fMask{0000,0775}, // Legacy
171 {
172  const char *bp;
173 
174 // Establish defaults
175 //
176  ofsConfig = 0;
177  FSctl_PC = 0;
178  FSctl_PI = 0;
179  Authorization = 0;
180  Finder = 0;
181  Balancer = 0;
182  evsObject = 0;
183  ossRPList = 0;
184  myRole = strdup("server");
185  OssIsProxy = 0;
186  ossRW =' ';
187  ossFeatures = 0;
188 
189 // Obtain port number we will be using. Note that the constructor must occur
190 // after the port number is known (i.e., this cannot be a global static).
191 //
192  myPort = (bp = getenv("XRDPORT")) ? strtol(bp, (char **)NULL, 10) : 0;
193 
194 // Defaults for POSC
195 //
196  poscQ = 0;
197  poscLog = 0;
198  poscHold= 10*60;
199  poscAuto= 0;
200  poscSync= 1;
201 
202 // Set the configuration file name and dummy handle
203 //
204  ConfigFN = 0;
205  XrdOfsHandle::Alloc(&dummyHandle);
206 
207 // Set checksum pointers
208 //
209  Cks = 0;
210  CksPfn = true;
211  CksRdr = true;
212 
213 // Prepare handling
214 //
215  prepHandler = 0;
216  prepAuth = true;
217 
218 // Eextended attribute limits
219 //
220  usxMaxNsz = kXR_faMaxNlen;
221  usxMaxVsz = kXR_faMaxVlen;
222 
223 // Other options
224 //
225  DirRdr = false;
226  reProxy = false;
227  OssHasPGrw= false;
228 }
@ kXR_faMaxVlen
Definition: XProtocol.hh:282
@ kXR_faMaxNlen
Definition: XProtocol.hh:281
static int Alloc(const char *thePath, int Opts, XrdOfsHandle **Handle)
mode_t dMask[2]
Definition: XrdOfs.hh:384
int myPort
Definition: XrdOfs.hh:380
XrdCmsClient * Finder
Definition: XrdOfs.hh:429
mode_t fMask[2]
Definition: XrdOfs.hh:385
char * ConfigFN
Definition: XrdOfs.hh:420
int tpcRdrPort[2]
Definition: XrdOfs.hh:390
char * tpcRdrHost[2]
Definition: XrdOfs.hh:389

References XrdOfsHandle::Alloc(), ConfigFN, Finder, kXR_faMaxNlen, kXR_faMaxVlen, and myPort.

+ Here is the call graph for this function:

◆ ~XrdOfs()

virtual XrdOfs::~XrdOfs ( )
inlinevirtual

Definition at line 356 of file XrdOfs.hh.

356 {} // Too complicate to delete :-)

Member Function Documentation

◆ chksum()

int XrdOfs::chksum ( csFunc  Func,
const char *  csName,
const char *  Path,
XrdOucErrInfo out_error,
const XrdSecEntity client = 0,
const char *  opaque = 0 
)
virtual

Reimplemented from XrdSfsFileSystem.

Definition at line 1783 of file XrdOfs.cc.

1803 {
1804  EPNAME("chksum");
1805  XrdOucEnv cksEnv(opaque,0,client);
1806  XrdCksData cksData;
1807  const char *tident = einfo.getErrUser();
1808  char buff[MAXPATHLEN+8];
1809  int rc;
1810 
1811 // Check if we support checksumming
1812 //
1813  if (!Cks)
1814  {einfo.setErrInfo(ENOTSUP, "Checksums are not supported.");
1815  return SFS_ERROR;
1816  }
1817 
1818 // A csSize request is issued usually once to verify everything is working. We
1819 // take this opportunity to also verify the checksum name.
1820 //
1821  rc = cksData.Set(csName);
1822  if (!rc || Func == XrdSfsFileSystem::csSize)
1823  {if (rc && (rc = Cks->Size(csName)))
1824  {einfo.setErrCode(rc); return SFS_OK;}
1825  strcpy(buff, csName); strcat(buff, " checksum not supported.");
1826  einfo.setErrInfo(ENOTSUP, buff);
1827  return SFS_ERROR;
1828  }
1829 
1830 // Everything else requires a path
1831 //
1832  if (!Path)
1833  {strcpy(buff, csName);
1834  strcat(buff, " checksum path not specified.");
1835  einfo.setErrInfo(EINVAL, buff);
1836  return SFS_ERROR;
1837  }
1838 
1839 // Apply security, as needed
1840 //
1841  XTRACE(stat, Path, csName);
1842  AUTHORIZE(client,&cksEnv,AOP_Stat,"checksum",Path,einfo);
1843 
1844 // If we are a menager then we need to redirect the client to where the file is
1845 //
1846  if (CksRdr && Finder && Finder->isRemote()
1847  && (rc = Finder->Locate(einfo, Path, SFS_O_RDONLY, &cksEnv)))
1848  return fsError(einfo, rc);
1849 
1850 // At this point we need to convert the lfn to a pfn
1851 //
1852  if (CksPfn && !(Path = XrdOfsOss->Lfn2Pfn(Path, buff, MAXPATHLEN, rc)))
1853  return Emsg(epname, einfo, rc, "checksum", Path);
1854 
1855 // Originally we only passed he env pointer for proxy servers. Due to popular
1856 // demand, we always pass the env as it points to the SecEntity object unless
1857 // we don't have it then we pass the caller's environment.
1858 //
1859  if (Func == XrdSfsFileSystem::csGet || Func == XrdSfsFileSystem::csCalc)
1860  {if (client) cksData.envP = &cksEnv;
1861  else cksData.envP = (einfo.getEnv() ? einfo.getEnv() : &cksEnv);
1862  }
1863 
1864 // Now determine what to do
1865 //
1866  if (Func == XrdSfsFileSystem::csCalc) rc = Cks->Calc(Path, cksData);
1867  else if (Func == XrdSfsFileSystem::csGet) rc = Cks->Get( Path, cksData);
1868  else {einfo.setErrInfo(EINVAL, "Invalid checksum function.");
1869  return SFS_ERROR;
1870  }
1871 
1872 // See if all went well
1873 //
1874 #ifdef ENOATTR
1875  if (rc >= 0 || rc == -ENOATTR || rc == -ESTALE || rc == -ESRCH)
1876 #else
1877  if (rc >= 0 || rc == -ENODATA || rc == -ESTALE || rc == -ESRCH)
1878 #endif
1879  {if (rc >= 0) {cksData.Get(buff, MAXPATHLEN); rc = 0;}
1880  else {*buff = 0; rc = -rc;}
1881  einfo.setErrInfo(rc, buff);
1882  return SFS_OK;
1883  }
1884 
1885 // We failed
1886 //
1887  return Emsg(epname, einfo, rc, "checksum", Path);
1888 }
#define ENOATTR
Definition: XProtocol.hh:1342
@ AOP_Stat
exists(), stat()
#define tident
#define EPNAME(x)
Definition: XrdBwmTrace.hh:56
#define XTRACE(act, target, x)
Definition: XrdBwmTrace.hh:49
#define ENODATA
Definition: XrdOfsChkPnt.cc:48
#define AUTHORIZE(usr, env, optype, action, pathp, edata)
XrdOss * XrdOfsOss
Definition: XrdOfs.cc:163
XrdOucString Path
#define SFS_ERROR
#define SFS_O_RDONLY
#define SFS_OK
int Set(const char *csName)
Definition: XrdCksData.hh:81
int Get(char *Buff, int Blen)
Definition: XrdCksData.hh:69
virtual int Get(const char *Xfn, XrdCksData &Cks)=0
virtual int Size(const char *Name=0)=0
virtual int Calc(const char *Xfn, XrdCksData &Cks, int doSet=1)=0
virtual int isRemote()
virtual int Locate(XrdOucErrInfo &Resp, const char *path, int flags, XrdOucEnv *Info=0)=0
static int Emsg(const char *, XrdOucErrInfo &, int, const char *x, XrdOfsHandle *hP)
Definition: XrdOfs.cc:2513
static int fsError(XrdOucErrInfo &myError, int rc)
Definition: XrdOfs.cc:2628
int stat(const char *Name, struct stat *buf, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
Definition: XrdOfs.cc:2361
virtual int Lfn2Pfn(const char *Path, char *buff, int blen)
Definition: XrdOss.hh:873

References AOP_Stat, AUTHORIZE, XrdCks::Calc(), XrdSfsFileSystem::csCalc, XrdSfsFileSystem::csGet, XrdSfsFileSystem::csSize, Emsg(), ENOATTR, ENODATA, EPNAME, Finder, fsError(), XrdCksData::Get(), XrdCks::Get(), XrdOucErrInfo::getEnv(), XrdOucErrInfo::getErrUser(), XrdCmsClient::isRemote(), XrdOss::Lfn2Pfn(), XrdCmsClient::Locate(), Path, XrdCksData::Set(), XrdOucErrInfo::setErrCode(), XrdOucErrInfo::setErrInfo(), SFS_ERROR, SFS_O_RDONLY, SFS_OK, XrdCks::Size(), stat(), tident, XrdOfsOss, and XTRACE.

+ Here is the call graph for this function:

◆ chmod()

int XrdOfs::chmod ( const char *  path,
XrdSfsMode  mode,
XrdOucErrInfo eInfo,
const XrdSecEntity client,
const char *  opaque = 0 
)
virtual

Change file mode settings.

Parameters
path- Pointer to the path of the file in question.
mode- The new file mode setting.
eInfo- The object where error info or results are to be returned.
client- Client's identify (see common description).
opaque- Path's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT or SFS_STALL

Implements XrdSfsFileSystem.

Definition at line 1894 of file XrdOfs.cc.

1909 {
1910  EPNAME("chmod");
1911  static const int locFlags = SFS_O_RDWR|SFS_O_META;
1912  struct stat Stat;
1913  mode_t acc_mode = Mode & S_IAMB;
1914  const char *tident = einfo.getErrUser();
1915  XrdOucEnv chmod_Env(info,0,client);
1916  int retc;
1917  XTRACE(chmod, path, "");
1918 
1919 // Apply security, as needed
1920 //
1921  AUTHORIZE(client,&chmod_Env,AOP_Chmod,"chmod",path,einfo);
1922 
1923 // Find out where we should chmod this file
1924 //
1925  if (Finder && Finder->isRemote())
1926  {if (fwdCHMOD.Cmd)
1927  {char buff[8];
1928  sprintf(buff, "%o", static_cast<int>(acc_mode));
1929  if (Forward(retc,einfo,fwdCHMOD,path,buff,&chmod_Env)) return retc;
1930  }
1931  else if ((retc = Finder->Locate(einfo, path, locFlags, &chmod_Env)))
1932  return fsError(einfo, retc);
1933  }
1934 
1935 // We need to adjust the mode based on whether this is a file or directory.
1936 //
1937  if ((retc = XrdOfsOss->Stat(path, &Stat, 0, &chmod_Env)))
1938  return XrdOfsFS->Emsg(epname, einfo, retc, "change", path);
1939  if (S_ISDIR(Stat.st_mode)) acc_mode = (acc_mode | dMask[0]) & dMask[1];
1940  else acc_mode = (acc_mode | fMask[0]) & fMask[1];
1941 
1942 // Check if we should generate an event
1943 //
1944  if (evsObject && evsObject->Enabled(XrdOfsEvs::Chmod))
1945  {XrdOfsEvsInfo evInfo(tident, path, info, &chmod_Env, acc_mode);
1946  evsObject->Notify(XrdOfsEvs::Chmod, evInfo);
1947  }
1948 
1949 // Now try to find the file or directory
1950 //
1951  if (!(retc = XrdOfsOss->Chmod(path, acc_mode, &chmod_Env))) return SFS_OK;
1952 
1953 // An error occurred, return the error info
1954 //
1955  return XrdOfsFS->Emsg(epname, einfo, retc, "change", path);
1956 }
@ AOP_Chmod
chmod()
struct stat Stat
Definition: XrdCks.cc:49
#define S_IAMB
Definition: XrdConfig.cc:159
XrdOfs * XrdOfsFS
Definition: XrdOfsFS.cc:47
int Mode
#define SFS_O_META
#define SFS_O_RDWR
void Notify(Event eNum, XrdOfsEvsInfo &Info)
Definition: XrdOfsEvs.cc:234
int Enabled(Event theEvents)
Definition: XrdOfsEvs.hh:139
int chmod(const char *Name, XrdSfsMode Mode, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
Definition: XrdOfs.cc:1894
struct fwdOpt fwdCHMOD
Definition: XrdOfs.hh:409
virtual int Chmod(const char *path, mode_t mode, XrdOucEnv *envP=0)=0
virtual int Stat(const char *path, struct stat *buff, int opts=0, XrdOucEnv *envP=0)=0
const char * Cmd
Definition: XrdOfs.hh:399

References AOP_Chmod, AUTHORIZE, XrdOfsEvs::Chmod, XrdOss::Chmod(), XrdOfs::fwdOpt::Cmd, dMask, Emsg(), XrdOfsEvs::Enabled(), EPNAME, Finder, fMask, fsError(), fwdCHMOD, XrdOucErrInfo::getErrUser(), XrdCmsClient::isRemote(), XrdCmsClient::Locate(), Mode, XrdOfsEvs::Notify(), S_IAMB, SFS_O_META, SFS_O_RDWR, SFS_OK, Stat, stat(), XrdOss::Stat(), tident, XrdOfsFS, XrdOfsOss, and XTRACE.

+ Here is the call graph for this function:

◆ Config_Cluster()

void XrdOfs::Config_Cluster ( XrdOss )

◆ Config_Display()

void XrdOfs::Config_Display ( XrdSysError Eroute)

Definition at line 413 of file XrdOfsConfig.cc.

414 {
415  const char *cloc, *pval;
416  char buff[8192], fwbuff[512], *bp;
417  int i;
418 
419  if (!ConfigFN || !ConfigFN[0]) cloc = "default";
420  else cloc = ConfigFN;
421  if (!poscQ) pval = "off";
422  else pval = (poscAuto ? "auto" : "manual");
423 
424  snprintf(buff, sizeof(buff), "Config effective %s ofs configuration:\n"
425  " all.role %s\n"
426  "%s"
427  " ofs.maxdelay %d\n"
428  " ofs.persist %s hold %d%s%s\n"
429  " ofs.trace %x",
430  cloc, myRole,
431  (Options & Authorize ? " ofs.authorize\n" : ""),
432  MaxDelay,
433  pval, poscHold, (poscLog ? " logdir " : ""),
434  (poscLog ? poscLog : ""), OfsTrace.What);
435 
436  Eroute.Say(buff);
437  ofsConfig->Display();
438 
439  if (Options & Forwarding)
440  {*fwbuff = 0;
441  if (ConfigDispFwd(buff, fwdCHMOD))
442  {Eroute.Say(buff); strcat(fwbuff, " ch");}
443  if (ConfigDispFwd(buff, fwdMKDIR))
444  {Eroute.Say(buff); strcat(fwbuff, " mk");}
445  if (ConfigDispFwd(buff, fwdMV))
446  {Eroute.Say(buff); strcat(fwbuff, " mv");}
447  if (ConfigDispFwd(buff, fwdRM))
448  {Eroute.Say(buff); strcat(fwbuff, " rm");}
449  if (ConfigDispFwd(buff, fwdRMDIR))
450  {Eroute.Say(buff); strcat(fwbuff, " rd");}
451  if (ConfigDispFwd(buff, fwdTRUNC))
452  {Eroute.Say(buff); strcat(fwbuff, " tr");}
453  if (*fwbuff) XrdOucEnv::Export("XRDOFS_FWD", fwbuff);
454  }
455 
456  if (evsObject)
457  {bp = buff;
458  setBuff(" ofs.notify ", 18); // 1234567890
459  if (evsObject->Enabled(XrdOfsEvs::Chmod)) setBuff("chmod ", 6);
460  if (evsObject->Enabled(XrdOfsEvs::Closer)) setBuff("closer ", 7);
461  if (evsObject->Enabled(XrdOfsEvs::Closew)) setBuff("closew ", 7);
462  if (evsObject->Enabled(XrdOfsEvs::Create)) setBuff("create ", 7);
463  if (evsObject->Enabled(XrdOfsEvs::Mkdir)) setBuff("mkdir ", 6);
464  if (evsObject->Enabled(XrdOfsEvs::Mv)) setBuff("mv ", 3);
465  if (evsObject->Enabled(XrdOfsEvs::Openr)) setBuff("openr ", 6);
466  if (evsObject->Enabled(XrdOfsEvs::Openw)) setBuff("openw ", 6);
467  if (evsObject->Enabled(XrdOfsEvs::Rm)) setBuff("rm ", 3);
468  if (evsObject->Enabled(XrdOfsEvs::Rmdir)) setBuff("rmdir ", 6);
469  if (evsObject->Enabled(XrdOfsEvs::Trunc)) setBuff("trunc ", 6);
470  if (evsObject->Enabled(XrdOfsEvs::Fwrite)) setBuff("fwrite ", 7);
471  setBuff("msgs ", 5);
472  i=sprintf(fwbuff,"%d %d ",evsObject->maxSmsg(),evsObject->maxLmsg());
473  setBuff(fwbuff, i);
474  cloc = evsObject->Prog();
475  if (*cloc != '>') setBuff("|",1);
476  setBuff(cloc, strlen(cloc));
477  setBuff("\0", 1);
478  Eroute.Say(buff);
479  }
480 }
#define setBuff(x, y)
XrdSysTrace OfsTrace
void Display()
Display configuration settings.
int maxSmsg()
Definition: XrdOfsEvs.hh:141
int maxLmsg()
Definition: XrdOfsEvs.hh:142
const char * Prog()
Definition: XrdOfsEvs.hh:148
struct fwdOpt fwdTRUNC
Definition: XrdOfs.hh:415
struct fwdOpt fwdRMDIR
Definition: XrdOfs.hh:414
int Options
Definition: XrdOfs.hh:379
struct fwdOpt fwdMKDIR
Definition: XrdOfs.hh:410
static int MaxDelay
Definition: XrdOfs.hh:417
struct fwdOpt fwdMV
Definition: XrdOfs.hh:412
struct fwdOpt fwdRM
Definition: XrdOfs.hh:413
static int Export(const char *Var, const char *Val)
Definition: XrdOucEnv.cc:188
void Say(const char *text1, const char *text2=0, const char *txt3=0, const char *text4=0, const char *text5=0, const char *txt6=0)
Definition: XrdSysError.cc:141

References Authorize, XrdOfsEvs::Chmod, XrdOfsEvs::Closer, XrdOfsEvs::Closew, ConfigFN, XrdOfsEvs::Create, XrdOfsConfigPI::Display(), XrdOfsEvs::Enabled(), XrdOucEnv::Export(), Forwarding, fwdCHMOD, fwdMKDIR, fwdMV, fwdRM, fwdRMDIR, fwdTRUNC, XrdOfsEvs::Fwrite, MaxDelay, XrdOfsEvs::maxLmsg(), XrdOfsEvs::maxSmsg(), XrdOfsEvs::Mkdir, XrdOfsEvs::Mv, OfsTrace, XrdOfsEvs::Openr, XrdOfsEvs::Openw, Options, XrdOfsEvs::Prog(), XrdOfsEvs::Rm, XrdOfsEvs::Rmdir, XrdSysError::Say(), setBuff, XrdOfsEvs::Trunc, and XrdSysTrace::What.

Referenced by Configure().

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

◆ Configure() [1/2]

int XrdOfs::Configure ( XrdSysError Eroute)
virtual

Definition at line 140 of file XrdOfsConfig.cc.

140 {return Configure(Eroute, 0);}
virtual int Configure(XrdSysError &)

Referenced by XrdSfsGetDefaultFileSystem().

+ Here is the caller graph for this function:

◆ Configure() [2/2]

int XrdOfs::Configure ( XrdSysError Eroute,
XrdOucEnv EnvInfo 
)
virtual

Definition at line 142 of file XrdOfsConfig.cc.

142  {
143 /*
144  Function: Establish default values using a configuration file.
145 
146  Input: None.
147 
148  Output: 0 upon success or !0 otherwise.
149 */
150  char *var;
151  const char *tmp;
152  int cfgFD, retc, NoGo = 0;
153  XrdOucEnv myEnv;
154  XrdOucStream Config(&Eroute, getenv("XRDINSTANCE"), &myEnv, "=====> ");
155 
156 // Print warm-up message
157 //
158  Eroute.Say("++++++ File system initialization started.");
159 
160 // Start off with no POSC log. Note that XrdSfsGetDefaultFileSystem nakes sure
161 // that we are configured only once.
162 //
163  poscLog = NULL;
164 
165 // Establish the network interface that the caller must provide
166 //
167  if (!EnvInfo || !(myIF = (XrdNetIF *)EnvInfo->GetPtr("XrdNetIF*")))
168  {Eroute.Emsg("Finder", "Network i/f undefined; unable to self-locate.");
169  NoGo = 1;
170  }
171  ofsSchedP = (XrdScheduler *)EnvInfo->GetPtr("XrdScheduler*");
172 
173 // Preset all variables with common defaults
174 //
175  Options = 0;
176  if (getenv("XRDDEBUG")) OfsTrace.What = TRACE_MOST | TRACE_debug;
177 
178 // Allocate a our plugin configurator
179 //
180  ofsConfig = XrdOfsConfigPI::New(ConfigFN, &Config, &Eroute, 0, this);
181 
182 // If there is no config file, return with the defaults sets.
183 //
184  if( !ConfigFN || !*ConfigFN)
185  Eroute.Emsg("Config", "Configuration file not specified.");
186  else {
187  // Try to open the configuration file.
188  //
189  if ( (cfgFD = open(ConfigFN, O_RDONLY, 0)) < 0)
190  return Eroute.Emsg("Config", errno, "open config file",
191  ConfigFN);
192  Config.Attach(cfgFD);
193  static const char *cvec[] = {"*** ofs plugin config:",0};
194  Config.Capture(cvec);
195 
196  // Now start reading records until eof.
197  //
198  while((var = Config.GetMyFirstWord()))
199  {if (!strncmp(var, "ofs.", 4)
200  || !strcmp(var, "all.role")
201  || !strcmp(var, "all.subcluster"))
202  {if (ConfigXeq(var+4,Config,Eroute)) {Config.Echo();NoGo=1;}}
203  else if (!strcmp(var, "oss.defaults")
204  || !strcmp(var, "all.export"))
205  {xexp(Config, Eroute, *var == 'a');
206  Config.noEcho();
207  }
208  }
209 
210  // Now check if any errors occurred during file i/o
211  //
212  if ((retc = Config.LastError()))
213  NoGo = Eroute.Emsg("Config", -retc, "read config file",
214  ConfigFN);
215  Config.Close();
216  }
217 
218 // If no exports were specified, the default is that we are writable
219 //
220  if (ossRW == ' ') ossRW = 'w';
221 
222 // Adjust the umask to correspond to the maximum mode allowed
223 //
224  mode_t uMask = 0777 & (~(dMask[1] | fMask[1]));
225  umask(uMask);
226 
227 // Export our role if we actually have one
228 //
229  if (myRole) XrdOucEnv::Export("XRDROLE", myRole);
230 
231 // Set the redirect option for other layers
232 //
233  if (Options & isManager)
234  XrdOucEnv::Export("XRDREDIRECT", (Options & isMeta ? "M" : "R"));
235  else XrdOucEnv::Export("XRDREDIRECT", "0");
236 
237 // If we are a proxy, then figure out where the prosy storge system resides
238 //
239  if ((Options & isProxy) && !(Options & isManager))
240  {char buff[2048], *bp, *libofs = getenv("XRDOFSLIB");
241  if (!libofs) bp = buff;
242  else {strcpy(buff, libofs); bp = buff+strlen(buff)-1;
243  while(bp != buff && *(bp-1) != '/') bp--;
244  }
245  strcpy(bp, "libXrdPss.so");
246  ofsConfig->Default(XrdOfsConfigPI::theOssLib, buff, 0);
247  ofsConfig->Default(XrdOfsConfigPI::theCksLib, buff, 0);
248  }
249 
250 // Configure third party copy but only if we are not a manager. Phase 1 needs
251 // to be done before we load the plugins as they may need this info.
252 //
253  if ((Options & ThirdPC) && !(Options & isManager))
254  NoGo |= ConfigTPC(Eroute, EnvInfo);
255 
256 // We need to do pre-initialization for event recording as the oss needs some
257 // environmental information from that initialization to initialize the frm,
258 // should it need to be used. We will do full evr initialization after the oss
259 // and the finder are initialized. A bit messy in the current plug-in world.
260 //
261  if (!(Options & isManager) && !evrObject.Init(&Eroute)) NoGo = 1;
262 
263 // Determine whether we should load authorization
264 //
265  int piOpts = XrdOfsConfigPI::allXXXLib;
266  if (!(Options & Authorize)) piOpts &= ~XrdOfsConfigPI::theAutLib;
267 
268 // We need to export plugins to other protocols which means we need to
269 // record them in the outmost environment. So get it.
270 //
271  XrdOucEnv *xrdEnv = 0;
272  if (EnvInfo) xrdEnv = (XrdOucEnv*)EnvInfo->GetPtr("xrdEnv*");
273 
274 // Now load all of the required plugins
275 //
276  if (!ofsConfig->Load(piOpts, EnvInfo)) NoGo = 1;
277  else {ofsConfig->Plugin(XrdOfsOss);
278  ossFeatures = XrdOfsOss->Features();
279  if (ossFeatures & XRDOSS_HASNOSF) FeatureSet |= XrdSfs::hasNOSF;
280  if (ossFeatures & XRDOSS_HASCACH) FeatureSet |= XrdSfs::hasCACH;
281  if (ossFeatures & XRDOSS_HASNAIO) FeatureSet |= XrdSfs::hasNAIO;
282  if (xrdEnv) xrdEnv->PutPtr("XrdOss*", XrdOfsOss);
283  ofsConfig->Plugin(Cks);
284  CksPfn = !ofsConfig->OssCks();
285  CksRdr = !ofsConfig->LclCks();
286  if (ofsConfig->Plugin(prepHandler))
287  {prepAuth = ofsConfig->PrepAuth();
289  }
290  if (Options & Authorize)
291  {ofsConfig->Plugin(Authorization);
292  XrdOfsTPC::Init(Authorization);
293  if (xrdEnv) xrdEnv->PutPtr("XrdAccAuthorize*",Authorization);
295  }
296  }
297 
298 // If a cache has been configured then that cache may want to interact with
299 // the cache-specific FSctl() operation. We check if a plugin was provided.
300 //
301  if (ossFeatures & XRDOSS_HASCACH)
302  FSctl_PC = (XrdOfsFSctl_PI*)EnvInfo->GetPtr("XrdFSCtl_PC*");
303 
304 // Configure third party copy phase 2, but only if we are not a manager.
305 //
306  if ((Options & ThirdPC) && !(Options & isManager)) NoGo |= ConfigTPC(Eroute);
307 
308 // Extract out the export list should it have been supplied by the oss plugin
309 //
310  ossRPList = (XrdOucPListAnchor *)EnvInfo->GetPtr("XrdOssRPList*");
311 
312 // Initialize redirection. We type te herald here to minimize confusion
313 //
314  if (Options & haveRole)
315  {Eroute.Say("++++++ Configuring ", myRole, " role. . .");
316  if (ConfigRedir(Eroute, EnvInfo))
317  {Eroute.Emsg("Config", "Unable to create cluster management client.");
318  NoGo = 1;
319  }
320  }
321 
322 // Initialize the FSctl plugin if we have one. Note that we needed to defer
323 // until now because we needed to configure the cms plugin first (see above).
324 //
325  if (ofsConfig->Plugin(FSctl_PI) && !ofsConfig->ConfigCtl(Finder, EnvInfo))
326  {Eroute.Emsg("Config", "Unable to configure FSctl plugin.");
327  NoGo = 1;
328  }
329 
330 // Initialize the cache FSctl handler if we have one. The same deferal applies.
331 //
332  if (FSctl_PC)
333  {struct XrdOfsFSctl_PI::Plugins thePI = {Authorization, Finder,
335  XrdOucEnv pcEnv;
336  pcEnv.PutPtr("XrdOfsHandle*", dummyHandle);
337  if (!FSctl_PC->Configure(ConfigFN, 0, &pcEnv, thePI))
338  {Eroute.Emsg("Config", "Unable to configure cache FSctl handler.");
339  NoGo = 1;
340  }
341  }
342 
343 // Initialize th Evr object if we are an actual server
344 //
345  if (!(Options & isManager) && !evrObject.Init(Balancer)) NoGo = 1;
346 
347 // Turn off forwarding if we are not a pure remote redirector or a peer
348 //
349  if (Options & Forwarding)
350  {const char *why = 0;
351  if (!(Options & Authorize)) why = "authorization not enabled";
352  else if (!(Options & isPeer) && (Options & (isServer | isProxy)))
353  why = "not a pure manager";
354  if (why)
355  {Eroute.Say("Config warning: forwarding turned off; ", why);
356  Options &= ~(Forwarding);
359  fwdTRUNC.Reset();
360  }
361  }
362 
363 // If we need to send notifications, initialize the interface
364 //
365  if (!NoGo && evsObject) NoGo = evsObject->Start(&Eroute);
366 
367 // If the OSS plugin is really a proxy. If it is, it will export its origin.
368 // We also suppress translating lfn to pfn (usually done via osslib +cksio).
369 // Note: consulting the ENVAR below is historic and remains for compatibility
370 // Otherwise we can configure checkpointing if we are a data server.
371 //
372  if (ossFeatures & XRDOSS_HASPRXY || getenv("XRDXROOTD_PROXY"))
373  {OssIsProxy = 1;
374  CksPfn = false;
376  } else if (!(Options & isManager) && !XrdOfsConfigCP::Init()) NoGo = 1;
377 
378 // Indicate wheter oss implements pgrw or it has to be simulated
379 //
380  OssHasPGrw = (ossFeatures & XRDOSS_HASPGRW) != 0;
381 
382 // If POSC processing is enabled (as by default) do it. Warning! This must be
383 // the last item in the configuration list as we need a working filesystem.
384 // Note that in proxy mode we always disable posc!
385 //
386  if (OssIsProxy || getenv("XRDXROOTD_NOPOSC"))
387  {if (poscAuto != -1 && !NoGo)
388  Eroute.Say("Config POSC has been disabled by the osslib plugin.");
389  } else if (poscAuto != -1 && !NoGo) NoGo |= ConfigPosc(Eroute);
390 
391 // Setup statistical monitoring
392 //
393  OfsStats.setRole(myRole);
394 
395 // Display final configuration
396 //
397  if (!NoGo) Config_Display(Eroute);
398  delete ofsConfig; ofsConfig = 0;
399 
400 // All done
401 //
402  tmp = (NoGo ? " initialization failed." : " initialization completed.");
403  Eroute.Say("------ File system ", myRole, tmp);
404  return NoGo;
405 }
#define TRACE_debug
Definition: XrdBwmTrace.hh:78
XrdScheduler * ofsSchedP
Definition: XrdOfsConfig.cc:95
XrdOss * XrdOfsOss
Definition: XrdOfs.cc:163
XrdOfsStats OfsStats
Definition: XrdOfs.cc:113
XrdOfs * XrdOfsFS
Definition: XrdOfsFS.cc:47
#define TRACE_MOST
Definition: XrdOfsTrace.hh:71
#define XRDOSS_HASCACH
Definition: XrdOss.hh:479
#define XRDOSS_HASPRXY
Definition: XrdOss.hh:477
#define XRDOSS_HASNOSF
Definition: XrdOss.hh:478
#define XRDOSS_HASPGRW
Definition: XrdOss.hh:475
#define XRDOSS_HASNAIO
Definition: XrdOss.hh:480
int open(const char *path, int oflag,...)
static bool Init()
bool ConfigCtl(XrdCmsClient *cmscP, XrdOucEnv *envP=0)
void Default(TheLib what, const char *lpath, const char *lparm=0)
bool Plugin(XrdAccAuthorize *&piP)
Get Authorization plugin.
static XrdOfsConfigPI * New(const char *cfn, XrdOucStream *cfgP, XrdSysError *errP, XrdVersionInfo *verP=0, XrdSfsFileSystem *sfsP=0)
bool Load(int what, XrdOucEnv *envP=0)
@ theOssLib
Oss plugin.
@ allXXXLib
All plugins (Load() only)
@ theCksLib
Checksum manager plugin.
int Init(XrdSysError *eObj)
Definition: XrdOfsEvr.cc:132
int Start(XrdSysError *eobj)
Definition: XrdOfsEvs.cc:394
virtual bool Configure(const char *CfgFN, const char *Parms, XrdOucEnv *envP, const Plugins &plugs)
The Plugins struct is used to pass plugin pointers to configure.
void setRole(const char *theRole)
Definition: XrdOfsStats.hh:68
static void Init()
Definition: XrdOfsTPC.cc:414
XrdOfsEvr evrObject
Definition: XrdOfs.hh:428
struct fwdOpt fwdMKPATH
Definition: XrdOfs.hh:411
void Config_Display(XrdSysError &)
XrdNetIF * myIF
Definition: XrdOfs.hh:394
virtual int ConfigXeq(char *var, XrdOucStream &, XrdSysError &)
virtual uint64_t Features()
Definition: XrdOss.cc:60
void PutPtr(const char *varname, void *value)
Definition: XrdOucEnv.cc:316
virtual void EnvInfo(XrdOucEnv *envP)
uint64_t FeatureSet
Adjust features at initialization.
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
Definition: XrdSysError.cc:95
XrdCmsConfig Config
static const uint64_t hasAUTZ
Feature: Authorization.
Definition: XrdSfsFlags.hh:44
static const uint64_t hasPRP2
Feature: Prepare Handler Version 2 (different calling conventions)
Definition: XrdSfsFlags.hh:62
static const uint64_t hasCACH
Feature: Implements a data cache.
Definition: XrdSfsFlags.hh:74
static const uint64_t hasNOSF
Feature: Supports no sendfile.
Definition: XrdSfsFlags.hh:71
static const uint64_t hasNAIO
Feature: Supports no async I/O.
Definition: XrdSfsFlags.hh:77
static const uint64_t hasPRXY
Feature: Proxy Server.
Definition: XrdSfsFlags.hh:65
void Reset()
Definition: XrdOfs.hh:402

References XrdOfsConfigPI::allXXXLib, Authorize, XrdCms::Config, Config_Display(), XrdOfsConfigPI::ConfigCtl(), ConfigFN, XrdOfsFSctl_PI::Configure(), ConfigXeq(), XrdOfsConfigPI::Default(), dMask, XrdSysError::Emsg(), XrdSfsFileSystem::EnvInfo(), evrObject, XrdOucEnv::Export(), XrdOss::Features(), XrdSfsFileSystem::FeatureSet, Finder, fMask, Forwarding, fwdCHMOD, fwdMKDIR, fwdMKPATH, fwdMV, fwdRM, fwdRMDIR, fwdTRUNC, XrdSfs::hasAUTZ, XrdSfs::hasCACH, XrdSfs::hasNAIO, XrdSfs::hasNOSF, XrdSfs::hasPRP2, XrdSfs::hasPRXY, haveRole, XrdOfsConfigCP::Init(), XrdOfsTPC::Init(), XrdOfsEvr::Init(), isManager, isMeta, isPeer, isProxy, isServer, XrdOfsConfigPI::LclCks(), XrdOfsConfigPI::Load(), myIF, XrdOfsConfigPI::New(), ofsSchedP, OfsStats, OfsTrace, open(), Options, XrdOfsConfigPI::OssCks(), XrdOfsConfigPI::Plugin(), XrdOfsConfigPI::PrepAuth(), XrdOucEnv::PutPtr(), XrdOfs::fwdOpt::Reset(), XrdSysError::Say(), XrdOfsStats::setRole(), XrdOfsEvs::Start(), XrdOfsConfigPI::theCksLib, XrdOfsConfigPI::theOssLib, ThirdPC, TRACE_debug, TRACE_MOST, XrdSysTrace::What, XrdOfsFS, XrdOfsOss, XRDOSS_HASCACH, XRDOSS_HASNAIO, XRDOSS_HASNOSF, XRDOSS_HASPGRW, and XRDOSS_HASPRXY.

+ Here is the call graph for this function:

◆ ConfigXeq()

int XrdOfs::ConfigXeq ( char *  var,
XrdOucStream Config,
XrdSysError Eroute 
)
protectedvirtual

Definition at line 798 of file XrdOfsConfig.cc.

800 {
801  char *val, vBuff[64];
802 
803  // Now assign the appropriate global variable
804  //
805  TS_Bit("authorize", Options, Authorize);
806  TS_XPI("authlib", theAutLib);
807  TS_XPI("ckslib", theCksLib);
808  TS_Xeq("cksrdsz", xcrds);
809  TS_XPI("cmslib", theCmsLib);
810  TS_Xeq("crmode", xcrm);
811  TS_XPI("ctllib", theCtlLib);
812  TS_Xeq("dirlist", xdirl);
813  TS_Xeq("forward", xforward);
814  TS_Xeq("maxdelay", xmaxd);
815  TS_Xeq("notify", xnot);
816  TS_Xeq("notifymsg", xnmsg);
817  TS_XPI("osslib", theOssLib);
818  TS_Xeq("persist", xpers);
819  TS_XPI("preplib", thePrpLib);
820  TS_Xeq("role", xrole);
821  TS_Xeq("tpc", xtpc);
822  TS_Xeq("trace", xtrace);
823  TS_Xeq("xattr", xatr);
824  TS_XPI("xattrlib", theAtrLib);
825 
826  // Process miscellaneous directives handled elsemwhere
827  //
828  if (!strcmp("chkpnt", var)) return (XrdOfsConfigCP::Parse(Config) ? 0 : 1);
829 
830  // Screen out the subcluster directive (we need to track that)
831  //
832  TS_Bit("subcluster",Options,SubCluster);
833 
834  // Get the actual value for simple directives
835  //
836  strlcpy(vBuff, var, sizeof(vBuff)); var = vBuff;
837  if (!(val = Config.GetWord()))
838  {Eroute.Emsg("Config", "value not specified for", var); return 1;}
839 
840  // No match found, complain.
841  //
842  Eroute.Say("Config warning: ignoring unknown directive '",var,"'.");
843  Config.Echo();
844  return 0;
845 }
#define TS_Bit(x, m, v)
#define TS_XPI(x, m)
#define TS_Xeq(x, m)
size_t strlcpy(char *dst, const char *src, size_t sz)
static bool Parse(XrdOucStream &Config)

References Authorize, XrdCms::Config, XrdSysError::Emsg(), Options, XrdOfsConfigCP::Parse(), XrdSysError::Say(), strlcpy(), SubCluster, TS_Bit, TS_Xeq, and TS_XPI.

Referenced by Configure().

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

◆ Connect()

void XrdOfs::Connect ( const XrdSecEntity client = 0)
virtual

Notify filesystem that a client has connected.

Parameters
client- Client's identify (see common description).

Reimplemented from XrdSfsFileSystem.

Definition at line 1962 of file XrdOfs.cc.

1963 {
1964  XrdOucEnv myEnv(0, 0, client);
1965 
1966 // Pass this call along
1967 //
1968  XrdOfsOss->Connect(myEnv);
1969 }
virtual void Connect(XrdOucEnv &env)
Definition: XrdOss.cc:42

References XrdOss::Connect(), and XrdOfsOss.

+ Here is the call graph for this function:

◆ Disc()

void XrdOfs::Disc ( const XrdSecEntity client = 0)
virtual

Notify filesystem that a client has disconnected.

Parameters
client- Client's identify (see common description).

Reimplemented from XrdSfsFileSystem.

Definition at line 1975 of file XrdOfs.cc.

1976 {
1977  XrdOucEnv myEnv(0, 0, client);
1978 
1979 // Pass this call along
1980 //
1981  XrdOfsOss->Disc(myEnv);
1982 }
virtual void Disc(XrdOucEnv &env)
Definition: XrdOss.cc:48

References XrdOss::Disc(), and XrdOfsOss.

+ Here is the call graph for this function:

◆ Emsg() [1/2]

int XrdOfs::Emsg ( const char *  pfx,
XrdOucErrInfo einfo,
int  ecode,
const char *  x,
const char *  y = "" 
)
staticprotected

Definition at line 2541 of file XrdOfs.cc.

2546 {
2547  char buffer[MAXPATHLEN+80];
2548 
2549 // If the error is EBUSY then we just need to stall the client. This is
2550 // a hack in order to provide for proxy support
2551 //
2552 // The hack unfotunately is now beinng triggered for reads and writes when
2553 // it was never so before (presumably due to client changes). So do not
2554 // apply the hack for these operations. This gets a better fix in R 6.0
2555 //
2556 if (strcmp("read", op) && strcmp("readv", op) && strcmp("pgRead", op) &&
2557  strcmp("write",op) && strcmp("pgwrite",op)) {
2558  if (ecode < 0) ecode = -ecode;
2559  if (ecode == EBUSY) return 5; // A hack for proxy support
2560 
2561 // Check for timeout conditions that require a client delay
2562 //
2563  if (ecode == ETIMEDOUT) return OSSDelay;
2564  }
2565 
2566 // Format the error message
2567 //
2568  XrdOucERoute::Format(buffer, sizeof(buffer), ecode, op, target);
2569 
2570 // Print it out if debugging is enabled
2571 //
2572 #ifndef NODEBUG
2573  OfsEroute.Emsg(pfx, einfo.getErrUser(), buffer);
2574 #endif
2575 
2576 // Place the error message in the error object and return
2577 //
2578  einfo.setErrInfo(ecode, buffer);
2579  return SFS_ERROR;
2580 }
XrdSysError OfsEroute(0)
static int OSSDelay
Definition: XrdOfs.hh:418
static int Format(char *buff, int blen, int ecode, const char *etxt1, const char *etxt2=0)
Definition: XrdOucERoute.cc:44
int setErrInfo(int code, const char *emsg)
const char * getErrUser()

References XrdSysError::Emsg(), XrdOucERoute::Format(), XrdOucErrInfo::getErrUser(), OfsEroute, OSSDelay, XrdOucErrInfo::setErrInfo(), and SFS_ERROR.

+ Here is the call graph for this function:

◆ Emsg() [2/2]

int XrdOfs::Emsg ( const char *  pfx,
XrdOucErrInfo einfo,
int  ecode,
const char *  x,
XrdOfsHandle hP 
)
staticprotected

Definition at line 2513 of file XrdOfs.cc.

2518 {
2519  int rc;
2520 
2521 // First issue the error message so if we have to unpersist it makes sense
2522 //
2523  if ((rc = Emsg(pfx, einfo, ecode, op, hP->Name())) != SFS_ERROR) return rc;
2524 
2525 // If this is a POSC file then we need to unpersist it. Note that we are always
2526 // called with the handle **unlocked**
2527 //
2528  if (hP->isRW == XrdOfsHandle::opPC)
2529  {hP->Lock();
2530  XrdOfsFS->Unpersist(hP);
2531  hP->UnLock();
2532  }
2533 
2534 // Now return the error
2535 //
2536  return SFS_ERROR;
2537 }
static const int opPC
const char * Name()
void Unpersist(XrdOfsHandle *hP, int xcev=1)
Definition: XrdOfs.cc:2738

References XrdOfsHandle::isRW, XrdOfsHandle::Lock(), XrdOfsHandle::Name(), XrdOfsHandle::opPC, SFS_ERROR, XrdOfsHandle::UnLock(), Unpersist(), and XrdOfsFS.

Referenced by XrdOfsDirectory::autoStat(), XrdOfsFile::checkpoint(), chksum(), chmod(), XrdOfsDirectory::close(), XrdOfsFile::close(), exists(), FAttr(), fsctl(), FSctl(), mkdir(), XrdOfsDirectory::nextEntry(), XrdOfsDirectory::open(), XrdOfsFile::open(), XrdOfsFile::pgRead(), XrdOfsFile::pgWrite(), XrdOfsFile::read(), XrdOfsFile::readv(), rename(), stat(), XrdOfsFile::stat(), XrdOfsFile::sync(), truncate(), XrdOfsFile::truncate(), and XrdOfsFile::write().

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

◆ exists()

int XrdOfs::exists ( const char *  path,
XrdSfsFileExistence eFlag,
XrdOucErrInfo eInfo,
const XrdSecEntity client,
const char *  opaque = 0 
)
virtual

Return directory/file existence information (short stat).

Parameters
path- Pointer to the path of the file/directory in question.
eFlag- Where the results are to be returned.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
opaque- Path's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, SFS_STALL, or SFS_STARTED When SFS_OK is returned, eFlag must be properly set, as follows: XrdSfsFileExistNo - path does not exist XrdSfsFileExistIsFile - path refers to an online file XrdSfsFileExistIsDirectory - path refers to an online directory XrdSfsFileExistIsOffline - path refers to an offline file XrdSfsFileExistIsOther - path is neither a file nor directory

Implements XrdSfsFileSystem.

Definition at line 1988 of file XrdOfs.cc.

2010 {
2011  EPNAME("exists");
2012  struct stat fstat;
2013  int retc;
2014  const char *tident = einfo.getErrUser();
2015  XrdOucEnv stat_Env(info,0,client);
2016  XTRACE(exists, path, "");
2017 
2018 // Apply security, as needed
2019 //
2020  AUTHORIZE(client,&stat_Env,AOP_Stat,"locate",path,einfo);
2021 
2022 // Find out where we should stat this file
2023 //
2024  if (Finder && Finder->isRemote()
2025  && (retc = Finder->Locate(einfo, path, SFS_O_RDONLY, &stat_Env)))
2026  return fsError(einfo, retc);
2027 
2028 // Now try to find the file or directory
2029 //
2030  retc = XrdOfsOss->Stat(path, &fstat, 0, &stat_Env);
2031  if (!retc)
2032  { if (S_ISDIR(fstat.st_mode)) file_exists=XrdSfsFileExistIsDirectory;
2033  else if (S_ISREG(fstat.st_mode)) file_exists=XrdSfsFileExistIsFile;
2034  else file_exists=XrdSfsFileExistNo;
2035  return SFS_OK;
2036  }
2037  if (retc == -ENOENT)
2038  {file_exists=XrdSfsFileExistNo;
2039  return SFS_OK;
2040  }
2041 
2042 // An error occurred, return the error info
2043 //
2044  return XrdOfsFS->Emsg(epname, einfo, retc, "locate", path);
2045 }
int fstat(int fildes, struct stat *buf)
@ XrdSfsFileExistIsFile
@ XrdSfsFileExistNo
@ XrdSfsFileExistIsDirectory
int exists(const char *fileName, XrdSfsFileExistence &exists_flag, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
Definition: XrdOfs.cc:1988

References AOP_Stat, AUTHORIZE, Emsg(), EPNAME, Finder, fsError(), fstat(), XrdOucErrInfo::getErrUser(), XrdCmsClient::isRemote(), XrdCmsClient::Locate(), SFS_O_RDONLY, SFS_OK, stat(), XrdOss::Stat(), tident, XrdOfsFS, XrdOfsOss, XrdSfsFileExistIsDirectory, XrdSfsFileExistIsFile, XrdSfsFileExistNo, and XTRACE.

Referenced by rename().

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

◆ FAttr()

int XrdOfs::FAttr ( XrdSfsFACtl faReq,
XrdOucErrInfo eInfo,
const XrdSecEntity client = 0 
)
virtual

Perform a filesystem extended attribute function.

Parameters
faReq- pointer to the request object (see XrdSfsFAttr.hh). If the pointer is nill, simply return whether or not extended attributes are supported.
eInfo- The object where error info or results are to be returned.
client- Client's identify (see common description).
Returns
SFS_OK a null response is sent.
SFS_DATA error.code length of the data to be sent. error.message contains the data to be sent.
SFS_STARTED Operation started result will be returned via callback. o/w one of SFS_ERROR, SFS_REDIRECT, or SFS_STALL.

Reimplemented from XrdSfsFileSystem.

Definition at line 195 of file XrdOfsFAttr.cc.

198 {
199  EPNAME("FAttr");
200  const char *tident = einfo.getErrUser();
201  char pfnbuff[MAXPATHLEN+8];
202  const char *accType;
203  long long xOpts;
204 
205  struct faArgs {const char *name; int fArg; Access_Operation aop;};
206 
207  static faArgs faTab[] = {{ "del fattr", SFS_O_RDWR, AOP_Update}, // del
208  { "get fattr", 0, AOP_Read}, // get
209  {"list fattr", 0, AOP_Read}, // list
210  { "set fattr", SFS_O_RDWR, AOP_Update} // set
211  };
212  static const int faNum = sizeof(faTab)/sizeof(struct faArgs);
213 
214  int rc;
215 
216 // Check if we need only return support information
217 //
218  if (!faReq)
219  {XrdOucEnv *envP = einfo.getEnv();
220  ZTRACE(fsctl, "FAttr req=info");
221  if (!envP || !usxMaxNsz)
222  {einfo.setErrInfo(ENOTSUP, "Not supported.");
223  return SFS_ERROR;
224  }
225  envP->PutInt("usxMaxNsz", usxMaxNsz);
226  envP->PutInt("usxMaxVsz", usxMaxVsz);
227  return SFS_OK;
228  }
229 
230 // Setup for to perform attribute functions
231 //
232  XrdSfsFACtl &faCtl = *faReq;
233  XrdOucEnv FAttr_Env(faCtl.pcgi,0,client);
234 
235 // Make sure request code is valid (we also set some options)
236 //
237  if (faCtl.rqst > faNum)
238  return Emsg(epname, einfo, EINVAL, "process fattrs", faCtl.path);
239  accType = faTab[faCtl.rqst].name;
240 
241 // Trace this call
242 //
243  ZTRACE(fsctl, "FAttr " <<accType <<' ' <<faCtl.path);
244 
245 // Extract the export options if we can
246 //
247  xOpts = (ossRPList ? ossRPList->Find(faCtl.path) : 0);
248 
249 // Perform authrorization and redirection if required
250 //
251  if (faCtl.opts & XrdSfsFACtl::accChk)
252  {int luFlag = faTab[faCtl.rqst].fArg;
253  Access_Operation aOP = faTab[faCtl.rqst].aop;
254 
255  AUTHORIZE(client, 0, aOP, accType ,faCtl.path, einfo);
256 
257  if (Finder && Finder->isRemote()
258  && (rc = Finder->Locate(einfo, faCtl.path, luFlag, &FAttr_Env)))
259  return fsError(einfo, rc);
260 
261  if (aOP == AOP_Update && xOpts & XRDEXP_NOTRW)
262  return Emsg(epname, einfo, EROFS, accType, faCtl.path);
263  }
264 
265 // If this is a proxy server then hand this request to the storage system
266 // as it will need to be executed elsewhere.
267 //
268  if (OssIsProxy)
269  {faCtl.envP = &FAttr_Env;
270  rc = XrdOfsOss->FSctl(XRDOSS_FSCTLFA, 0, (const char *)&faCtl);
271  if (rc) return XrdOfsFS->Emsg(epname, einfo, rc, accType, faCtl.path);
272  return SFS_OK;
273  }
274 
275 // Make sure we can use xattrs on the path
276 //
277  if (xOpts & XRDEXP_NOXATTR)
278  return XrdOfsFS->Emsg(epname, einfo, EPERM, accType, faCtl.path);
279 
280 // Convert the lfn to a pfn for actual calls to the attribute processor
281 //
282  faCtl.pfnP = XrdOfsOss->Lfn2Pfn(faCtl.path, pfnbuff, sizeof(pfnbuff), rc);
283  if (!faCtl.pfnP) return XrdOfsFS->Emsg(epname,einfo,rc,accType,faCtl.path);
284 
285 // Fan out for processing this on the local file system
286 //
287  switch(faCtl.rqst)
288  {case XrdSfsFACtl::faDel:
289  return ctlFADel(faCtl, FAttr_Env, einfo);
290  break;
291  case XrdSfsFACtl::faGet:
292  return ctlFAGet(faCtl, FAttr_Env, einfo);
293  break;
294  case XrdSfsFACtl::faLst:
295  return ctlFALst(faCtl, FAttr_Env, einfo);
296  break;
297  case XrdSfsFACtl::faSet:
298  return ctlFASet(faCtl, FAttr_Env, einfo);
299  break;
300  default: break;
301  }
302 
303 // The request code is not one we understand
304 //
305  return XrdOfsFS->Emsg(epname, einfo, EINVAL, "process fattrs", faCtl.path);
306 }
Access_Operation
The following are supported operations.
@ AOP_Update
open() r/w or append
@ AOP_Read
open() r/o, prepare()
#define ZTRACE(act, x)
Definition: XrdBwmTrace.hh:52
XrdOss * XrdOfsOss
Definition: XrdOfs.cc:163
XrdOfs * XrdOfsFS
Definition: XrdOfsFS.cc:47
#define XRDOSS_FSCTLFA
Definition: XrdOss.hh:492
#define XRDEXP_NOTRW
Definition: XrdOucExport.hh:45
#define XRDEXP_NOXATTR
Definition: XrdOucExport.hh:64
int fsctl(const int cmd, const char *args, XrdOucErrInfo &out_error, const XrdSecEntity *client=0)
Definition: XrdOfsFSctl.cc:93
virtual int FSctl(int cmd, int alen, const char *args, char **resp=0)
Definition: XrdOss.cc:66
void PutInt(const char *varname, long value)
Definition: XrdOucEnv.cc:268
unsigned long long Find(const char *pathname)
Definition: XrdOucPList.hh:112
XrdOucEnv * envP
Definition: XrdPss.cc:109
const char * path
The file path to act on (logical)
Definition: XrdSfsFAttr.hh:74
unsigned char rqst
Type of file attribute request (see below)
Definition: XrdSfsFAttr.hh:82
const char * pcgi
Opaque information (null if none)
Definition: XrdSfsFAttr.hh:75
static const int accChk
Perform access check.
Definition: XrdSfsFAttr.hh:87
XrdOucEnv * envP
Optional environmental information.
Definition: XrdSfsFAttr.hh:78
unsigned char opts
Request options (see below)
Definition: XrdSfsFAttr.hh:83

References XrdSfsFACtl::accChk, AOP_Read, AOP_Update, AUTHORIZE, Emsg(), XrdProxy::envP, XrdSfsFACtl::envP, EPNAME, XrdSfsFACtl::faDel, XrdSfsFACtl::faGet, XrdSfsFACtl::faLst, XrdSfsFACtl::faSet, XrdOucPListAnchor::Find(), Finder, fsctl(), XrdOss::FSctl(), fsError(), XrdOucErrInfo::getEnv(), XrdOucErrInfo::getErrUser(), XrdCmsClient::isRemote(), XrdOss::Lfn2Pfn(), XrdCmsClient::Locate(), XrdSfsFACtl::opts, XrdSfsFACtl::path, XrdSfsFACtl::pcgi, XrdSfsFACtl::pfnP, XrdOucEnv::PutInt(), XrdSfsFACtl::rqst, XrdOucErrInfo::setErrInfo(), SFS_ERROR, SFS_O_RDWR, SFS_OK, tident, XRDEXP_NOTRW, XRDEXP_NOXATTR, XrdOfsFS, XrdOfsOss, XRDOSS_FSCTLFA, and ZTRACE.

+ Here is the call graph for this function:

◆ fsctl()

int XrdOfs::fsctl ( const int  cmd,
const char *  args,
XrdOucErrInfo eInfo,
const XrdSecEntity client = 0 
)
virtual

Perform a filesystem control operation (version 1)

Parameters
cmd- The operation to be performed: SFS_FSCTL_LOCATE Locate a file or file servers SFS_FSCTL_STATCC Return cluster config status SFS_FSCTL_STATFS Return physical filesystem information SFS_FSCTL_STATLS Return logical filesystem information SFS_FSCTL_STATXA Return extended attributes
args- Arguments specific to cmd. SFS_FSCTL_LOCATE args points to the path to be located "" path is the first exported path "*" return all current servers "*&zwj;/" return servers exporting path o/w return servers having the path SFS_FSCTL_STATFS Path in the filesystem in question. SFS_FSCTL_STATLS Path in the filesystem in question. SFS_FSCTL_STATXA Path of the file whose xattr is wanted.
eInfo- The object where error info or results are to be returned.
client- Client's identify (see common description).
Returns
SFS_OK a null response is sent.
SFS_DATA error.code length of the data to be sent. error.message contains the data to be sent.
SFS_STARTED Operation started result will be returned via callback. Valid only for for SFS_FSCTL_LOCATE, SFS_FSCTL_STATFS, and SFS_FSCTL_STATXA o/w one of SFS_ERROR, SFS_REDIRECT, or SFS_STALL.

Implements XrdSfsFileSystem.

Definition at line 93 of file XrdOfsFSctl.cc.

114 {
115  EPNAME("fsctl");
116  static int PrivTab[] = {XrdAccPriv_Delete, XrdAccPriv_Insert,
120  static char PrivLet[] = {'d', 'i',
121  'k', 'l',
122  'n', 'r',
123  'w'};
124  static const int PrivNum = sizeof(PrivLet);
125 
126  int retc, i, blen, privs, opcode = cmd & SFS_FSCTL_CMD;
127  const char *tident = einfo.getErrUser();
128  char *bP, *cP;
129 
130 // Process the LOCATE request
131 //
132  if (opcode == SFS_FSCTL_LOCATE)
133  {static const int locMask = (SFS_O_FORCE|SFS_O_NOWAIT|SFS_O_RESET|
135  struct stat fstat;
136  char pbuff[1024], rType[3];
137  const char *Resp[2] = {rType, pbuff};
138  const char *locArg, *opq, *Path = Split(args,&opq,pbuff,sizeof(pbuff));
139  XrdNetIF::ifType ifType;
140  int Resp1Len;
141  int find_flag = SFS_O_LOCATE | (cmd & locMask);
142  XrdOucEnv loc_Env(opq ? opq+1 : 0,0,client);
143 
144  ZTRACE(fsctl, "locate args=" <<(args ? args : "''"));
145 
146  if (cmd & SFS_O_TRUNC) locArg = (char *)"*";
147  else { if (*Path == '*') {locArg = Path; Path++;}
148  else locArg = Path;
149  AUTHORIZE(client,&loc_Env,AOP_Stat,"locate",Path,einfo);
150  }
151  if (Finder && Finder->isRemote()
152  && (retc = Finder->Locate(einfo, locArg, find_flag, &loc_Env)))
153  return fsError(einfo, retc);
154 
155  if (cmd & SFS_O_TRUNC) {rType[0] = 'S'; rType[1] = ossRW;}
156  else {if ((retc = XrdOfsOss->Stat(Path, &fstat, 0, &loc_Env)))
157  return XrdOfsFS->Emsg(epname, einfo, retc, "locate", Path);
158  rType[0] = ((fstat.st_mode & S_IFBLK) == S_IFBLK ? 's' : 'S');
159  rType[1] = (fstat.st_mode & S_IWUSR ? 'w' : 'r');
160  }
161  rType[2] = '\0';
162 
163  ifType = XrdNetIF::GetIFType((einfo.getUCap() & XrdOucEI::uIPv4) != 0,
164  (einfo.getUCap() & XrdOucEI::uIPv64) != 0,
165  (einfo.getUCap() & XrdOucEI::uPrip) != 0);
166  bool retHN = (cmd & SFS_O_HNAME) != 0;
167  if ((Resp1Len = myIF->GetDest(pbuff, sizeof(pbuff), ifType, retHN)))
168  {einfo.setErrInfo(Resp1Len+3, (const char **)Resp, 2);
169  return SFS_DATA;
170  }
171  return Emsg(epname, einfo, ENETUNREACH, "locate", Path);
172  }
173 
174 // Process the STATFS request
175 //
176  if (opcode == SFS_FSCTL_STATFS)
177  {char pbuff[1024];
178  const char *opq, *Path = Split(args, &opq, pbuff, sizeof(pbuff));
179  XrdOucEnv fs_Env(opq ? opq+1 : 0,0,client);
180  ZTRACE(fsctl, "statfs args=" <<(args ? args : "''"));
181  AUTHORIZE(client,&fs_Env,AOP_Stat,"statfs",Path,einfo);
182  if (Finder && Finder->isRemote()
183  && (retc = Finder->Space(einfo, Path, &fs_Env)))
184  return fsError(einfo, retc);
185  bP = einfo.getMsgBuff(blen);
186  if ((retc = XrdOfsOss->StatFS(Path, bP, blen, &fs_Env)))
187  return XrdOfsFS->Emsg(epname, einfo, retc, "statfs", args);
188  einfo.setErrCode(blen+1);
189  return SFS_DATA;
190  }
191 
192 // Process the STATLS request
193 //
194  if (opcode == SFS_FSCTL_STATLS)
195  {char pbuff[1024];
196  const char *opq, *Path = Split(args, &opq, pbuff, sizeof(pbuff));
197  XrdOucEnv statls_Env(opq ? opq+1 : 0,0,client);
198  ZTRACE(fsctl, "statls args=" <<(args ? args : "''"));
199  AUTHORIZE(client,&statls_Env,AOP_Stat,"statfs",Path,einfo);
200  if (Finder && Finder->isRemote())
201  {statls_Env.Put("cms.qvfs", "1");
202  if ((retc = Finder->Space(einfo, Path, &statls_Env)))
203  {if (retc == SFS_DATA) retc = Reformat(einfo);
204  return fsError(einfo, retc);
205  }
206  }
207  bP = einfo.getMsgBuff(blen);
208  if ((retc = XrdOfsOss->StatLS(statls_Env, Path, bP, blen)))
209  return XrdOfsFS->Emsg(epname, einfo, retc, "statls", Path);
210  einfo.setErrCode(blen+1);
211  return SFS_DATA;
212  }
213 
214 // Process the STATXA request
215 //
216  if (opcode == SFS_FSCTL_STATXA)
217  {char pbuff[1024];
218  const char *opq, *Path = Split(args, &opq, pbuff, sizeof(pbuff));
219  XrdOucEnv xa_Env(opq ? opq+1 : 0,0,client);
220  ZTRACE(fsctl, "statxa args=" <<(args ? args : "''"));
221  AUTHORIZE(client,&xa_Env,AOP_Stat,"statxa",Path,einfo);
222  if (Finder && Finder->isRemote()
223  && (retc = Finder->Locate(einfo,Path,SFS_O_RDONLY|SFS_O_STAT,&xa_Env)))
224  return fsError(einfo, retc);
225  bP = einfo.getMsgBuff(blen);
226  if ((retc = XrdOfsOss->StatXA(Path, bP, blen, &xa_Env)))
227  return XrdOfsFS->Emsg(epname, einfo, retc, "statxa", Path);
228  if (!client || !XrdOfsFS->Authorization) privs = XrdAccPriv_All;
229  else privs = XrdOfsFS->Authorization->Access(client, Path, AOP_Any);
230  cP = bP + blen; strcpy(cP, "&ofs.ap="); cP += 8;
231  if (privs == XrdAccPriv_All) *cP++ = 'a';
232  else {for (i = 0; i < PrivNum; i++)
233  if (PrivTab[i] & privs) *cP++ = PrivLet[i];
234  if (cP == (bP + blen + 1)) *cP++ = '?';
235  }
236  *cP++ = '\0';
237  einfo.setErrCode(cP-bP+1);
238  return SFS_DATA;
239  }
240 
241 // Process the STATCC request (this should always succeed)
242 //
243  if (opcode == SFS_FSCTL_STATCC)
244  {static const int lcc_flag = SFS_O_LOCATE | SFS_O_LOCAL;
245  XrdOucEnv lcc_Env(0,0,client);
246  ZTRACE(fsctl, "statcc args=" <<(args ? args : "''"));
247  if (Finder) retc = Finder ->Locate(einfo,".",lcc_flag,&lcc_Env);
248  else if (Balancer) retc = Balancer->Locate(einfo,".",lcc_flag,&lcc_Env);
249  else retc = SFS_ERROR;
250  if (retc != SFS_DATA) einfo.setErrInfo(5, "none|");
251  return fsError(einfo, SFS_DATA);
252  }
253 
254 // Operation is not supported
255 //
256  return XrdOfsFS->Emsg(epname, einfo, ENOTSUP, "fsctl", args);
257 }
@ AOP_Any
Special for getting privs.
@ XrdAccPriv_Insert
Definition: XrdAccPrivs.hh:44
@ XrdAccPriv_Lookup
Definition: XrdAccPrivs.hh:47
@ XrdAccPriv_Rename
Definition: XrdAccPrivs.hh:48
@ XrdAccPriv_All
Definition: XrdAccPrivs.hh:39
@ XrdAccPriv_Read
Definition: XrdAccPrivs.hh:49
@ XrdAccPriv_Lock
Definition: XrdAccPrivs.hh:45
@ XrdAccPriv_Write
Definition: XrdAccPrivs.hh:51
@ XrdAccPriv_Delete
Definition: XrdAccPrivs.hh:43
XrdOss * XrdOfsOss
Definition: XrdOfs.cc:163
XrdOfs * XrdOfsFS
Definition: XrdOfsFS.cc:47
#define SFS_O_HNAME
#define SFS_DATA
#define SFS_O_RESET
#define SFS_O_DIRLIST
#define SFS_FSCTL_STATFS
#define SFS_O_STAT
#define SFS_O_FORCE
#define SFS_FSCTL_CMD
#define SFS_FSCTL_STATLS
#define SFS_FSCTL_STATCC
#define SFS_O_LOCATE
#define SFS_FSCTL_STATXA
#define SFS_FSCTL_LOCATE
#define SFS_O_RAWIO
#define SFS_O_LOCAL
#define SFS_O_NOWAIT
#define SFS_O_TRUNC
virtual XrdAccPrivs Access(const XrdSecEntity *Entity, const char *path, const Access_Operation oper, XrdOucEnv *Env=0)=0
virtual int Space(XrdOucErrInfo &Resp, const char *path, XrdOucEnv *Info=0)=0
static ifType GetIFType(bool conIPv4, bool hasIP64, bool pvtIP)
Definition: XrdNetIF.hh:250
int GetDest(char *dest, int dlen, ifType ifT=PublicV6, bool prefn=false)
Definition: XrdNetIF.cc:389
ifType
The enum that is used to index into ifData to get appropriate interface.
Definition: XrdNetIF.hh:65
const char * Split(const char *Args, const char **Opq, char *Path, int Plen)
Definition: XrdOfs.cc:2685
virtual int StatLS(XrdOucEnv &env, const char *path, char *buff, int &blen)
Definition: XrdOss.cc:97
virtual int StatXA(const char *path, char *buff, int &blen, XrdOucEnv *envP=0)
Definition: XrdOss.cc:127
virtual int StatFS(const char *path, char *buff, int &blen, XrdOucEnv *envP=0)
Definition: XrdOss.cc:87
static const int uIPv64
ucap: Supports only IPv4 info
static const int uIPv4
ucap: Supports read redirects
static const int uPrip

References XrdAccAuthorize::Access(), AOP_Any, AOP_Stat, AUTHORIZE, Emsg(), EPNAME, Finder, fsError(), fstat(), XrdNetIF::GetDest(), XrdOucErrInfo::getErrUser(), XrdNetIF::GetIFType(), XrdOucErrInfo::getMsgBuff(), XrdOucErrInfo::getUCap(), XrdCmsClient::isRemote(), XrdCmsClient::Locate(), myIF, Path, XrdOucEnv::Put(), XrdOucErrInfo::setErrCode(), XrdOucErrInfo::setErrInfo(), SFS_DATA, SFS_ERROR, SFS_FSCTL_CMD, SFS_FSCTL_LOCATE, SFS_FSCTL_STATCC, SFS_FSCTL_STATFS, SFS_FSCTL_STATLS, SFS_FSCTL_STATXA, SFS_O_DIRLIST, SFS_O_FORCE, SFS_O_HNAME, SFS_O_LOCAL, SFS_O_LOCATE, SFS_O_NOWAIT, SFS_O_RAWIO, SFS_O_RDONLY, SFS_O_RESET, SFS_O_STAT, SFS_O_TRUNC, XrdCmsClient::Space(), Split(), stat(), XrdOss::Stat(), XrdOss::StatFS(), XrdOss::StatLS(), XrdOss::StatXA(), tident, XrdOucEI::uIPv4, XrdOucEI::uIPv64, XrdOucEI::uPrip, XrdAccPriv_All, XrdAccPriv_Delete, XrdAccPriv_Insert, XrdAccPriv_Lock, XrdAccPriv_Lookup, XrdAccPriv_Read, XrdAccPriv_Rename, XrdAccPriv_Write, XrdOfsFS, XrdOfsOss, and ZTRACE.

Referenced by FAttr().

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

◆ FSctl()

int XrdOfs::FSctl ( const int  cmd,
XrdSfsFSctl args,
XrdOucErrInfo eInfo,
const XrdSecEntity client = 0 
)
virtual

Perform a filesystem control operation (version 2)

Parameters
cmd- The operation to be performed: SFS_FSCTL_PLUGIN Return Implementation Dependent Data v1 SFS_FSCTL_PLUGIO Return Implementation Dependent Data v2
args- Arguments specific to cmd. SFS_FSCTL_PLUGIN path and opaque information. SFS_FSCTL_PLUGIO Unscreened argument string.
eInfo- The object where error info or results are to be returned.
client- Client's identify (see common description).
Returns
SFS_OK a null response is sent. SFS_DATA error.code length of the data to be sent. error.message contains the data to be sent. o/w one of SFS_ERROR, SFS_REDIRECT, or SFS_STALL.

Reimplemented from XrdSfsFileSystem.

Definition at line 263 of file XrdOfsFSctl.cc.

267 {
268  EPNAME("FSctl");
269 
270 // If this is the cache-specfic we need to do a lot more work. Otherwise this
271 // is a simple case of wheter we have a plug-in for this or not.
272 //
273  if (cmd == SFS_FSCTL_PLUGXC)
274  {if (FSctl_PC)
275  {if (args.Arg2Len == -2)
276  {XrdOucEnv pc_Env(args.ArgP[1] ? args.ArgP[1] : 0, 0, client);
277  AUTHORIZE(client,&pc_Env,AOP_Read,"FSctl",args.ArgP[0],eInfo);
278  }
279  return FSctl_PC->FSctl(cmd, args, eInfo, client);
280  }
281  }
282  else if (FSctl_PI) return FSctl_PI->FSctl(cmd, args, eInfo, client);
283 
284 // Operation is not supported
285 //
286  return XrdOfsFS->Emsg("FSctl", eInfo, ENOTSUP, "FSctl", "");
287 }
int Arg2Len
Length or -count of args in extension.
#define SFS_FSCTL_PLUGXC
virtual int FSctl(const int cmd, int alen, const char *args, XrdSfsFile &file, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)=0

References AOP_Read, XrdSfsFSctl::Arg2Len, AUTHORIZE, Emsg(), EPNAME, XrdOfsFSctl_PI::FSctl(), SFS_FSCTL_PLUGXC, and XrdOfsFS.

Referenced by XrdOfsFile::fctl().

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

◆ fsError()

int XrdOfs::fsError ( XrdOucErrInfo myError,
int  rc 
)
staticprotected

Definition at line 2628 of file XrdOfs.cc.

2629 {
2630 
2631 // Screen the error code (update statistics w/o a lock for speed!)
2632 //
2633  if (rc == SFS_REDIRECT) {OfsStats.Data.numRedirect++; return SFS_REDIRECT;}
2634  if (rc == SFS_STARTED) {OfsStats.Data.numStarted++; return SFS_STARTED; }
2635  if (rc > 0) {OfsStats.Data.numDelays++; return rc; }
2636  if (rc == SFS_DATA) {OfsStats.Data.numReplies++; return SFS_DATA; }
2637  {OfsStats.Data.numErrors++; return SFS_ERROR; }
2638 }
XrdOfsStats OfsStats
Definition: XrdOfs.cc:113
#define SFS_REDIRECT
#define SFS_STARTED
struct XrdOfsStats::StatsData Data

References XrdOfsStats::Data, XrdOfsStats::StatsData::numDelays, XrdOfsStats::StatsData::numErrors, XrdOfsStats::StatsData::numRedirect, XrdOfsStats::StatsData::numReplies, XrdOfsStats::StatsData::numStarted, OfsStats, SFS_DATA, SFS_ERROR, SFS_REDIRECT, and SFS_STARTED.

Referenced by chksum(), chmod(), exists(), FAttr(), fsctl(), mkdir(), XrdOfsDirectory::open(), XrdOfsFile::open(), prepare(), rename(), stat(), and truncate().

+ Here is the caller graph for this function:

◆ getStats()

int XrdOfs::getStats ( char *  buff,
int  blen 
)
virtual

Return statistical information.

Parameters
buff- Pointer to the buffer where results are to be returned. Statistics should be in standard XML format. If buff is nil then only maximum size information is wanted.
blen- The length available in buff.
Returns
Number of bytes placed in buff. When buff is nil, the maximum number of bytes that could have been placed in buff.

Implements XrdSfsFileSystem.

Definition at line 2051 of file XrdOfs.cc.

2052 {
2053  int n;
2054 
2055 // See if the size just wanted
2056 //
2057  if (!buff) return OfsStats.Report(0,0) + XrdOfsOss->Stats(0,0);
2058 
2059 // Report ofs info followed by the oss info
2060 //
2061  n = OfsStats.Report(buff, blen);
2062  buff += n; blen -= n;
2063  n += XrdOfsOss->Stats(buff, blen);
2064 
2065 // All done
2066 //
2067  return n;
2068 }
int Report(char *Buff, int Blen)
Definition: XrdOfsStats.cc:38
virtual int Stats(char *buff, int blen)
Definition: XrdOss.hh:707

References OfsStats, XrdOfsStats::Report(), XrdOss::Stats(), and XrdOfsOss.

+ Here is the call graph for this function:

◆ getVersion()

const char * XrdOfs::getVersion ( )
virtual

Get version string.

Returns
The version string. Normally this is the XrdVERSION value.

Implements XrdSfsFileSystem.

Definition at line 134 of file XrdOfsConfig.cc.

134 {return XrdVERSION;}

◆ mkdir()

int XrdOfs::mkdir ( const char *  path,
XrdSfsMode  mode,
XrdOucErrInfo eInfo,
const XrdSecEntity client,
const char *  opaque = 0 
)
virtual

Create a directory.

Parameters
path- Pointer to the path of the directory to be created.
mode- The directory mode setting.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
opaque- Path's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, or SFS_STALL

Implements XrdSfsFileSystem.

Definition at line 2074 of file XrdOfs.cc.

2092 {
2093  EPNAME("mkdir");
2094  static const int LocOpts = SFS_O_RDWR | SFS_O_CREAT | SFS_O_META;
2095  mode_t acc_mode = (Mode | dMask[0]) & dMask[1];
2096  int retc, mkpath = Mode & SFS_O_MKPTH;
2097  const char *tident = einfo.getErrUser();
2098  XrdOucEnv mkdir_Env(info,0,client);
2099  XTRACE(mkdir, path, "");
2100 
2101 // Apply security, as needed
2102 //
2103  AUTHORIZE(client,&mkdir_Env,AOP_Mkdir,"mkdir",path,einfo);
2104 
2105 // Find out where we should remove this file
2106 //
2107  if (Finder && Finder->isRemote())
2108  {if (fwdMKDIR.Cmd)
2109  {char buff[8];
2110  sprintf(buff, "%o", static_cast<int>(acc_mode));
2111  if (Forward(retc, einfo, (mkpath ? fwdMKPATH:fwdMKDIR),
2112  path, buff, &mkdir_Env)) return retc;
2113  }
2114  else if ((retc = Finder->Locate(einfo,path,LocOpts,&mkdir_Env)))
2115  return fsError(einfo, retc);
2116  }
2117 
2118 // Perform the actual operation
2119 //
2120  if ((retc = XrdOfsOss->Mkdir(path, acc_mode, mkpath, &mkdir_Env)))
2121  return XrdOfsFS->Emsg(epname, einfo, retc, "mkdir", path);
2122 
2123 // Check if we should generate an event
2124 //
2125  if (evsObject && evsObject->Enabled(XrdOfsEvs::Mkdir))
2126  {XrdOfsEvsInfo evInfo(tident, path, info, &mkdir_Env, acc_mode);
2127  evsObject->Notify(XrdOfsEvs::Mkdir, evInfo);
2128  }
2129 
2130 // If we have a redirector, tell it that we now have this path
2131 //
2132  if (Balancer)
2133  {if (!mkpath) Balancer->Added(path);
2134  else {char *slash, *myPath = strdup(path);
2135  do {Balancer->Added(myPath);
2136  if ((slash = rindex(myPath, '/'))) *slash = 0;
2137  } while(slash && slash != myPath);
2138  free(myPath);
2139  }
2140  }
2141 
2142  return SFS_OK;
2143 }
@ AOP_Mkdir
mkdir()
#define SFS_O_MKPTH
#define SFS_O_CREAT
virtual void Added(const char *path, int Pend=0)
int mkdir(const char *dirName, XrdSfsMode Mode, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *opaque=0)
Definition: XrdOfs.cc:2074
virtual int Mkdir(const char *path, mode_t mode, int mkpath=0, XrdOucEnv *envP=0)=0

References XrdCmsClient::Added(), AOP_Mkdir, AUTHORIZE, XrdOfs::fwdOpt::Cmd, dMask, Emsg(), XrdOfsEvs::Enabled(), EPNAME, Finder, fsError(), fwdMKDIR, fwdMKPATH, XrdOucErrInfo::getErrUser(), XrdCmsClient::isRemote(), XrdCmsClient::Locate(), XrdOfsEvs::Mkdir, XrdOss::Mkdir(), Mode, XrdOfsEvs::Notify(), SFS_O_CREAT, SFS_O_META, SFS_O_MKPTH, SFS_O_RDWR, SFS_OK, tident, XrdOfsFS, XrdOfsOss, and XTRACE.

+ Here is the call graph for this function:

◆ newDir() [1/2]

XrdSfsDirectory* XrdOfs::newDir ( char *  user = 0,
int  MonID = 0 
)
inlinevirtual

Obtain a new director object to be used for future directory requests.

Parameters
user- Text identifying the client responsible for this call. The pointer may be null if identification is missing.
MonID- The monitoring identifier assigned to this and all future requests using the returned object.
Returns
pointer- Pointer to an XrdSfsDirectory object.
nil - Insufficient memory to allocate an object.

Implements XrdSfsFileSystem.

Definition at line 244 of file XrdOfs.hh.

245  {return new XrdOfsDirFull(user, MonID);}

◆ newDir() [2/2]

XrdSfsDirectory* XrdOfs::newDir ( XrdOucErrInfo eInfo)
inlinevirtual

Obtain a new wrapped directory object to be used for future requests.

Parameters
eInfo- Reference to the error object to be used by the new directory object. Note that an implementation is supplied for compatibility purposes but it returns a nil pointer which is considered to be a failure. You must supply an implementation for this to work correctly.
Returns
pointer- Pointer to an XrdSfsDirectory object.
nil - Insufficient memory to allocate an object.

Reimplemented from XrdSfsFileSystem.

Definition at line 247 of file XrdOfs.hh.

248  {return new XrdOfsDirectory(eInfo, eInfo.getErrUser());}
friend class XrdOfsDirectory
Definition: XrdOfs.hh:237

References XrdOucErrInfo::getErrUser(), and XrdOfsDirectory.

+ Here is the call graph for this function:

◆ newFile() [1/2]

XrdSfsFile* XrdOfs::newFile ( char *  user = 0,
int  MonID = 0 
)
inlinevirtual

Obtain a new file object to be used for a future file requests.

Parameters
user- Text identifying the client responsible for this call. The pointer may be null if identification is missing.
MonID- The monitoring identifier assigned to this and all future requests using the returned object.
Returns
pointer- Pointer to an XrdSfsFile object.
nil - Insufficient memory to allocate an object.

Implements XrdSfsFileSystem.

Definition at line 250 of file XrdOfs.hh.

251  {return new XrdOfsFileFull(user, MonID);}

◆ newFile() [2/2]

XrdSfsFile* XrdOfs::newFile ( XrdOucErrInfo eInfo)
inlinevirtual

Obtain a new wrapped file object to be used for a future requests.

Parameters
eInfo- Reference to the error object to be used by the new file object. Note that an implementation is supplied for compatibility purposes but it returns a nil pointer which is considered to be a failure. You must supply an implementation for this to work correctly.
Returns
pointer- Pointer to an XrdSfsFile object.
nil - Insufficient memory to allocate an object.

Reimplemented from XrdSfsFileSystem.

Definition at line 253 of file XrdOfs.hh.

254  {return new XrdOfsFile(eInfo, eInfo.getErrUser());}
friend class XrdOfsFile
Definition: XrdOfs.hh:238

References XrdOucErrInfo::getErrUser(), and XrdOfsFile.

+ Here is the call graph for this function:

◆ prepare()

int XrdOfs::prepare ( XrdSfsPrep pargs,
XrdOucErrInfo eInfo,
const XrdSecEntity client = 0 
)
virtual

Prepare a file for future processing.

Parameters
pargs- The preapre arguments.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, or SFS_STALL

Implements XrdSfsFileSystem.

Definition at line 2149 of file XrdOfs.cc.

2152 {
2153  EPNAME("prepare");
2154  XrdOucEnv prep_Env(0,0,client);
2155  XrdOucTList *tp = pargs.paths;
2156  int retc;
2157 
2158 // Run through the paths to make sure client can read each one unless we aren't
2159 // supposed to apply authorization.
2160 //
2161  if (prepAuth)
2162  while(tp)
2163  {AUTHORIZE(client,0,AOP_Read,"prepare",tp->text,out_error);
2164  tp = tp->next;
2165  }
2166 
2167 // If there is a prepare plugin, invoke it and return the result.
2168 //
2169  if (prepHandler)
2170  {if (pargs.opts & Prep_QUERY)
2171  return prepHandler->query(pargs, out_error, client);
2172  if (pargs.opts & Prep_CANCEL)
2173  return prepHandler->cancel(pargs, out_error, client);
2174 
2175  return prepHandler->begin(pargs, out_error, client);
2176  }
2177 
2178 // If we have a finder object, use it to prepare the paths. Otherwise,
2179 // ignore this prepare request (we may change this in the future).
2180 //
2181  if (XrdOfsFS->Finder
2182  && (retc = XrdOfsFS->Finder->Prepare(out_error, pargs, &prep_Env)))
2183  return fsError(out_error, retc);
2184  return 0;
2185 }
#define Prep_CANCEL
#define Prep_QUERY
XrdOucTList * paths
List of paths.
int opts
Prep_xxx.
virtual int Prepare(XrdOucErrInfo &Resp, XrdSfsPrep &pargs, XrdOucEnv *Info=0)
virtual int cancel(XrdSfsPrep &pargs, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)=0
virtual int begin(XrdSfsPrep &pargs, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)=0
virtual int query(XrdSfsPrep &pargs, XrdOucErrInfo &eInfo, const XrdSecEntity *client=0)=0
XrdOucTList * next
Definition: XrdOucTList.hh:45
char * text
Definition: XrdOucTList.hh:46

References AOP_Read, AUTHORIZE, XrdOfsPrepare::begin(), XrdOfsPrepare::cancel(), EPNAME, Finder, fsError(), XrdOucTList::next, XrdSfsPrep::opts, XrdSfsPrep::paths, Prep_CANCEL, Prep_QUERY, XrdCmsClient::Prepare(), XrdOfsPrepare::query(), XrdOucTList::text, and XrdOfsFS.

+ Here is the call graph for this function:

◆ rem()

int XrdOfs::rem ( const char *  path,
XrdOucErrInfo eInfo,
const XrdSecEntity client,
const char *  opaque = 0 
)
inlinevirtual

Remove a file.

Parameters
path- Pointer to the path of the file to be removed.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
opaque- Path's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, or SFS_STALL

Implements XrdSfsFileSystem.

Definition at line 309 of file XrdOfs.hh.

313  {return remove('f', path, out_error, client, info);}

◆ remdir()

int XrdOfs::remdir ( const char *  path,
XrdOucErrInfo eInfo,
const XrdSecEntity client,
const char *  opaque = 0 
)
inlinevirtual

Remove a directory.

Parameters
path- Pointer to the path of the directory to be removed.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
opaque- Path's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, or SFS_STALL

Implements XrdSfsFileSystem.

Definition at line 315 of file XrdOfs.hh.

319  {return remove('d',dirName,out_error,client,info);}

◆ rename()

int XrdOfs::rename ( const char *  oPath,
const char *  nPath,
XrdOucErrInfo eInfo,
const XrdSecEntity client,
const char *  opaqueO = 0,
const char *  opaqueN = 0 
)
virtual

Rename a file or directory.

Parameters
oPath- Pointer to the path to be renamed.
nPath- Pointer to the path oPath is to have.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
opaqueO- oPath's CGI information (see common description).
opaqueN- nPath's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, or SFS_STALL

Implements XrdSfsFileSystem.

Definition at line 2257 of file XrdOfs.cc.

2275 {
2276  EPNAME("rename");
2277  static const int LocOpts = SFS_O_RDWR|SFS_O_META;
2278  int retc;
2279  const char *tident = einfo.getErrUser();
2280  XrdOucEnv old_Env(infoO,0,client);
2281  XrdOucEnv new_Env(infoN,0,client);
2282  XTRACE(rename, new_name, "old fn=" <<old_name <<" new ");
2283 
2284 // Apply security, as needed
2285 //
2286  AUTHORIZE(client, &old_Env, AOP_Rename, "renaming", old_name, einfo);
2287 
2288 // The above authorization may mutate the XrdSecEntity by putting a mapped name
2289 // into the extended attributes. This mapped name will affect the subsequent
2290 // authorization check below, giving the client access that may not be permitted.
2291 // Hence, we delete this attribute to reset the object back to "pristine" state.
2292 // If there was a way to make a copy of the XrdSecEntity, we could avoid this
2293 // hack-y reach inside the extended attributes.
2294  if (client) client->eaAPI->Add("request.name", "", true);
2295 
2296 // If we do not have full-blown insert authorization, we'll need to test for
2297 // destination existence
2298  bool cannot_overwrite = false;
2299  if (client && XrdOfsFS->Authorization &&
2300  !XrdOfsFS->Authorization->Access(client, new_name, AOP_Insert, &new_Env))
2301  {cannot_overwrite = true;
2302  AUTHORIZE(client, &new_Env, AOP_Excl_Insert, "renaming to (no overwrite)", new_name, einfo);
2303  }
2304 
2305 // Find out where we should rename this file
2306 //
2307  if (Finder && Finder->isRemote())
2308  {if (fwdMV.Cmd)
2309  {if (Forward(retc,einfo,fwdMV,old_name,new_name,&old_Env,&new_Env))
2310  return retc;
2311  }
2312  else if ((retc = Finder->Locate(einfo, old_name, LocOpts, &old_Env)))
2313  return fsError(einfo, retc);
2314  }
2315 
2316 // Check if we should generate an event
2317 //
2318  if (evsObject && evsObject->Enabled(XrdOfsEvs::Mv))
2319  {XrdOfsEvsInfo evInfo(tident, old_name, infoO, &old_Env, 0, 0,
2320  new_name, infoN, &new_Env);
2321  evsObject->Notify(XrdOfsEvs::Mv, evInfo);
2322  }
2323 
2324 // If we cannot overwrite, we must test for existence first. This will test whether
2325 // we will destroy data in the rename (without actually destroying data).
2326 // Note there's an obvious race condition here; it was seen as the lesser-of-evils
2327 // compared to creating an exclusive file and potentially leaking it in the event
2328 // of a crash.
2329 //
2330  if (cannot_overwrite)
2331  {XrdSfsFileExistence exists_flag;
2332  if (SFS_OK != exists(new_name, exists_flag, einfo, client, infoN))
2333  {// File existence check itself failed; we can't prove that data won't
2334  // be overwritten so we return an error.
2335  return fsError(einfo, -einfo.getErrInfo());
2336  }
2337  if (exists_flag != XrdSfsFileExistNo)
2338  {// EPERM mimics the error code set by Linux when you invoke rename()
2339  // but cannot overwrite the destination file.
2340  einfo.setErrInfo(EPERM, "Overwrite of existing data not permitted");
2341  return fsError(einfo, -EPERM);
2342  }
2343  }
2344 
2345 // Perform actual rename operation
2346 //
2347  if ((retc = XrdOfsOss->Rename(old_name, new_name, &old_Env, &new_Env)))
2348  {return XrdOfsFS->Emsg(epname, einfo, retc, "rename", old_name);
2349  }
2350  XrdOfsHandle::Hide(old_name);
2351  if (Balancer) {Balancer->Removed(old_name);
2352  Balancer->Added(new_name);
2353  }
2354  return SFS_OK;
2355 }
@ AOP_Rename
mv() for source
@ AOP_Insert
mv() for target
@ AOP_Excl_Insert
mv() where destination doesn't exist.
XrdSfsFileExistence
virtual void Removed(const char *path)
static void Hide(const char *thePath)
int rename(const char *oldFileName, const char *newFileName, XrdOucErrInfo &out_error, const XrdSecEntity *client, const char *infoO=0, const char *infoN=0)
Definition: XrdOfs.cc:2257
virtual int Rename(const char *oPath, const char *nPath, XrdOucEnv *oEnvP=0, XrdOucEnv *nEnvP=0)=0
bool Add(XrdSecAttr &attr)
XrdSecEntityAttr * eaAPI
non-const API to attributes
Definition: XrdSecEntity.hh:92

References XrdAccAuthorize::Access(), XrdSecEntityAttr::Add(), XrdCmsClient::Added(), AOP_Excl_Insert, AOP_Insert, AOP_Rename, AUTHORIZE, XrdOfs::fwdOpt::Cmd, XrdSecEntity::eaAPI, Emsg(), XrdOfsEvs::Enabled(), EPNAME, exists(), Finder, fsError(), fwdMV, XrdOucErrInfo::getErrInfo(), XrdOucErrInfo::getErrUser(), XrdOfsHandle::Hide(), XrdCmsClient::isRemote(), XrdCmsClient::Locate(), XrdOfsEvs::Mv, XrdOfsEvs::Notify(), XrdCmsClient::Removed(), XrdOss::Rename(), XrdOucErrInfo::setErrInfo(), SFS_O_META, SFS_O_RDWR, SFS_OK, tident, XrdOfsFS, XrdOfsOss, XrdSfsFileExistNo, and XTRACE.

+ Here is the call graph for this function:

◆ Split()

const char * XrdOfs::Split ( const char *  Args,
const char **  Opq,
char *  Path,
int  Plen 
)
protected

Definition at line 2685 of file XrdOfs.cc.

2687 {
2688  int xlen;
2689  *Opq = index(Args, '?');
2690  if (!(*Opq)) return Args;
2691  xlen = (*Opq)-Args;
2692  if (xlen >= Plen) xlen = Plen-1;
2693  strncpy(Path, Args, xlen);
2694  Path[xlen] = 0;
2695  return Path;
2696 }

References Path.

Referenced by fsctl().

+ Here is the caller graph for this function:

◆ Stall()

int XrdOfs::Stall ( XrdOucErrInfo einfo,
int  stime,
const char *  path 
)
protected

Definition at line 2702 of file XrdOfs.cc.

2705 {
2706  const char *msgfmt = "File %s is being %s; "
2707  "estimated time to completion %s";
2708  EPNAME("Stall")
2709 #ifndef NODEBUG
2710  const char *tident = "";
2711 #endif
2712  char Mbuff[2048], Tbuff[32];
2713  const char *What = "staged";
2714 
2715 // Check why the stall is occurring
2716 //
2717  if (stime < 0) {stime = 60; What = "created";}
2718 
2719 // Format the stall message
2720 //
2721  snprintf(Mbuff, sizeof(Mbuff)-1, msgfmt,
2722  Fname(path), What, WaitTime(stime, Tbuff, sizeof(Tbuff)));
2723  ZTRACE(delay, "Stall " <<stime <<": " <<Mbuff <<" for " <<path);
2724 
2725 // Place the error message in the error object and return
2726 //
2727  einfo.setErrInfo(0, Mbuff);
2728 
2729 // All done
2730 //
2731  return (stime > MaxDelay ? MaxDelay : stime);
2732 }
char * WaitTime(int, char *, int)
Definition: XrdOfs.cc:2781

References EPNAME, MaxDelay, XrdOucErrInfo::setErrInfo(), tident, WaitTime(), and ZTRACE.

Referenced by XrdOfsFile::open().

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

◆ stat() [1/2]

int XrdOfs::stat ( const char *  path,
mode_t &  mode,
XrdOucErrInfo eInfo,
const XrdSecEntity client,
const char *  opaque = 0 
)
virtual

Return mode information on a file or directory.

Parameters
path- Pointer to the path in question.
mode- Where full mode information is to be returned.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
opaque- path's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, SFS_STALL, or SFS_STARTED When SFS_OK is returned, mode must contain mode information. If the mode is -1 then it is taken as an offline file.

Implements XrdSfsFileSystem.

Definition at line 2403 of file XrdOfs.cc.

2421 {
2422  EPNAME("stat");
2423  struct stat buf;
2424  int retc;
2425  const char *tident = einfo.getErrUser();
2426  XrdOucEnv stat_Env(info,0,client);
2427  XTRACE(stat, path, "");
2428 
2429 // Apply security, as needed
2430 //
2431  AUTHORIZE(client,&stat_Env,AOP_Stat,"locate",path,einfo);
2432  mode = (mode_t)-1;
2433 
2434 // Find out where we should stat this file
2435 //
2436  if (Finder && Finder->isRemote()
2437  && (retc = Finder->Locate(einfo,path,SFS_O_NOWAIT|SFS_O_RDONLY|SFS_O_STAT,
2438  &stat_Env)))
2439  return fsError(einfo, retc);
2440 
2441 // Now try to find the file or directory
2442 //
2443  if (!(retc = XrdOfsOss->Stat(path, &buf, XRDOSS_resonly, &stat_Env)))
2444  mode=buf.st_mode;
2445  else if ((-ENOMSG) != retc)
2446  return XrdOfsFS->Emsg(epname, einfo, retc, "locate", path);
2447  return SFS_OK;
2448 }
#define XRDOSS_resonly
Definition: XrdOss.hh:486

References AOP_Stat, AUTHORIZE, Emsg(), EPNAME, Finder, fsError(), XrdOucErrInfo::getErrUser(), XrdCmsClient::isRemote(), XrdCmsClient::Locate(), SFS_O_NOWAIT, SFS_O_RDONLY, SFS_O_STAT, SFS_OK, stat(), XrdOss::Stat(), tident, XrdOfsFS, XrdOfsOss, XRDOSS_resonly, and XTRACE.

+ Here is the call graph for this function:

◆ stat() [2/2]

int XrdOfs::stat ( const char *  Name,
struct stat *  buf,
XrdOucErrInfo eInfo,
const XrdSecEntity client,
const char *  opaque = 0 
)
virtual

Return state information on a file or directory.

Parameters
Name- Pointer to the path in question.
buf- Pointer to the structure where info it to be returned.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
opaque- path's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, SFS_STALL, or SFS_STARTED When SFS_OK is returned, buf must contain stat information.

Implements XrdSfsFileSystem.

Definition at line 2361 of file XrdOfs.cc.

2377 {
2378  EPNAME("stat");
2379  int retc;
2380  const char *tident = einfo.getErrUser();
2381  XrdOucEnv stat_Env(info,0,client);
2382  XTRACE(stat, path, "");
2383 
2384 // Apply security, as needed
2385 //
2386  AUTHORIZE(client,&stat_Env,AOP_Stat,"locate",path,einfo);
2387 
2388 // Find out where we should stat this file
2389 //
2390  if (Finder && Finder->isRemote()
2391  && (retc = Finder->Locate(einfo, path, SFS_O_RDONLY|SFS_O_STAT, &stat_Env)))
2392  return fsError(einfo, retc);
2393 
2394 // Now try to find the file or directory
2395 //
2396  if ((retc = XrdOfsOss->Stat(path, buf, 0, &stat_Env)))
2397  return XrdOfsFS->Emsg(epname, einfo, retc, "locate", path);
2398  return SFS_OK;
2399 }

References AOP_Stat, AUTHORIZE, Emsg(), EPNAME, Finder, fsError(), XrdOucErrInfo::getErrUser(), XrdCmsClient::isRemote(), XrdCmsClient::Locate(), SFS_O_RDONLY, SFS_O_STAT, SFS_OK, XrdOss::Stat(), tident, XrdOfsFS, XrdOfsOss, and XTRACE.

Referenced by chksum(), chmod(), exists(), fsctl(), and stat().

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

◆ truncate()

int XrdOfs::truncate ( const char *  path,
XrdSfsFileOffset  fsize,
XrdOucErrInfo eInfo,
const XrdSecEntity client = 0,
const char *  opaque = 0 
)
virtual

Truncate a file.

Parameters
path- Pointer to the path of the file to be truncated.
fsize- The size that the file is to have.
eInfo- The object where error info is to be returned.
client- Client's identify (see common description).
opaque- path's CGI information (see common description).
Returns
One of SFS_OK, SFS_ERROR, SFS_REDIRECT, or SFS_STALL

Implements XrdSfsFileSystem.

Definition at line 2454 of file XrdOfs.cc.

2470 {
2471  EPNAME("truncate");
2472  const char *tident = einfo.getErrUser();
2473  XrdOucEnv trunc_Env(info,0,client);
2474  int retc;
2475  XTRACE(truncate, path, "");
2476 
2477 // Apply security, as needed
2478 //
2479  AUTHORIZE(client,&trunc_Env,AOP_Update,"truncate",path,einfo);
2480 
2481 // Find out where we should chmod this file
2482 //
2483  if (Finder && Finder->isRemote())
2484  {if (fwdTRUNC.Cmd)
2485  {char xSz[32];
2486  sprintf(xSz, "%lld", static_cast<long long>(Size));
2487  if (Forward(retc,einfo,fwdTRUNC,path,xSz,&trunc_Env)) return retc;
2488  }
2489  else if ((retc = Finder->Locate(einfo,path,SFS_O_RDWR,&trunc_Env)))
2490  return fsError(einfo, retc);
2491  }
2492 
2493 // Check if we should generate an event
2494 //
2495  if (evsObject && evsObject->Enabled(XrdOfsEvs::Trunc))
2496  {XrdOfsEvsInfo evInfo(tident, path, info, &trunc_Env, 0, Size);
2497  evsObject->Notify(XrdOfsEvs::Trunc, evInfo);
2498  }
2499 
2500 // Now try to find the file or directory
2501 //
2502  if (!(retc = XrdOfsOss->Truncate(path, Size, &trunc_Env))) return SFS_OK;
2503 
2504 // An error occurred, return the error info
2505 //
2506  return XrdOfsFS->Emsg(epname, einfo, retc, "trunc", path);
2507 }
int truncate(const char *Name, XrdSfsFileOffset fileOffset, XrdOucErrInfo &out_error, const XrdSecEntity *client=0, const char *opaque=0)
Definition: XrdOfs.cc:2454
virtual int Truncate(const char *path, unsigned long long fsize, XrdOucEnv *envP=0)=0

References AOP_Update, AUTHORIZE, XrdOfs::fwdOpt::Cmd, Emsg(), XrdOfsEvs::Enabled(), EPNAME, Finder, fsError(), fwdTRUNC, XrdOucErrInfo::getErrUser(), XrdCmsClient::isRemote(), XrdCmsClient::Locate(), XrdOfsEvs::Notify(), SFS_O_RDWR, SFS_OK, tident, XrdOfsEvs::Trunc, XrdOss::Truncate(), XrdOfsFS, XrdOfsOss, and XTRACE.

+ Here is the call graph for this function:

◆ Unpersist()

void XrdOfs::Unpersist ( XrdOfsHandle hP,
int  xcev = 1 
)
protected

Definition at line 2738 of file XrdOfs.cc.

2739 {
2740  EPNAME("Unpersist");
2741  const char *tident = oh->PoscUsr();
2742  int poscNum, retc;
2743  short theMode;
2744 
2745 // Trace the call
2746 //
2747  FTRACE(close, "use=0");
2748 
2749 // Generate a proper close event as one has not yet been generated
2750 //
2751  if (xcev && XrdOfsFS->evsObject && *tident != '?'
2752  && XrdOfsFS->evsObject->Enabled(XrdOfsEvs::Closew))
2753  {XrdOfsEvsInfo evInfo(tident, oh->Name());
2754  XrdOfsFS->evsObject->Notify(XrdOfsEvs::Closew, evInfo);
2755  }
2756 
2757 // Now generate a removal event
2758 //
2759  if (XrdOfsFS->Balancer) XrdOfsFS->Balancer->Removed(oh->Name());
2760  if (XrdOfsFS->evsObject && XrdOfsFS->evsObject->Enabled(XrdOfsEvs::Rm))
2761  {XrdOfsEvsInfo evInfo(tident, oh->Name());
2762  XrdOfsFS->evsObject->Notify(XrdOfsEvs::Rm, evInfo);
2763  }
2764 
2765 // Count this
2766 //
2768 
2769 // Now unpersist the file
2770 //
2771  OfsEroute.Emsg(epname, "Unpersisting", tident, oh->Name());
2772  if ((poscNum = oh->PoscGet(theMode))) poscQ->Del(oh->Name(), poscNum, 1);
2773  else if ((retc = XrdOfsOss->Unlink(oh->Name())))
2774  OfsEroute.Emsg(epname, retc, "unpersist", oh->Name());
2775 }
#define FTRACE(act, x)
Definition: XrdBwmTrace.hh:45
#define close(a)
Definition: XrdPosix.hh:43
int Del(const char *Lfn, int Offset, int Unlink=0)
Definition: XrdOfsPoscq.cc:159
void Add(int &Cntr)
Definition: XrdOfsStats.hh:62
virtual int Unlink(const char *path, int Opts=0, XrdOucEnv *envP=0)=0

References XrdOfsStats::Add(), close, XrdOfsEvs::Closew, XrdOfsStats::Data, XrdOfsPoscq::Del(), XrdSysError::Emsg(), XrdOfsEvs::Enabled(), EPNAME, FTRACE, XrdOfsHandle::Name(), XrdOfsEvs::Notify(), XrdOfsStats::StatsData::numUnpsist, OfsEroute, OfsStats, XrdOfsHandle::PoscGet(), XrdOfsHandle::PoscUsr(), XrdCmsClient::Removed(), XrdOfsEvs::Rm, tident, XrdOss::Unlink(), XrdOfsFS, and XrdOfsOss.

Referenced by XrdOfsFile::close(), and Emsg().

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

◆ WaitTime()

char * XrdOfs::WaitTime ( int  stime,
char *  buff,
int  blen 
)
protected

Definition at line 2781 of file XrdOfs.cc.

2782 {
2783  int hr, min, sec;
2784 
2785 // Compute hours, minutes, and seconds
2786 //
2787  min = stime / 60;
2788  sec = stime % 60;
2789  hr = min / 60;
2790  min = min % 60;
2791 
2792 // Now format the message based on time duration
2793 //
2794  if (!hr && !min)
2795  snprintf(buff,blen,"%d second%s",sec,(sec > 1 ? "s" : ""));
2796  else if (!hr)
2797  {if (sec > 10) min++;
2798  snprintf(buff,blen,"%d minute%s",min,(min > 1 ? "s" : ""));
2799  }
2800  else {if (hr == 1)
2801  if (min <= 30)
2802  snprintf(buff,blen,"%d minutes",min+60);
2803  else snprintf(buff,blen,"%d hour and %d minutes",hr,min);
2804  else {if (min > 30) hr++;
2805  snprintf(buff,blen,"%d hours",hr);
2806  }
2807  }
2808 
2809 // Complete the message
2810 //
2811  buff[blen-1] = '\0';
2812  return buff;
2813 }

Referenced by Stall().

+ Here is the caller graph for this function:

Friends And Related Function Documentation

◆ XrdOfsDirectory

friend class XrdOfsDirectory
friend

Definition at line 237 of file XrdOfs.hh.

Referenced by newDir().

◆ XrdOfsFile

friend class XrdOfsFile
friend

Definition at line 238 of file XrdOfs.hh.

Referenced by newFile().

Member Data Documentation

◆ ConfigFN

char* XrdOfs::ConfigFN

Definition at line 420 of file XrdOfs.hh.

Referenced by XrdOfs(), Config_Display(), Configure(), and XrdSfsGetDefaultFileSystem().

◆ dMask

mode_t XrdOfs::dMask[2]

Definition at line 384 of file XrdOfs.hh.

Referenced by chmod(), Configure(), and mkdir().

◆ evrObject

XrdOfsEvr XrdOfs::evrObject
protected

Definition at line 428 of file XrdOfs.hh.

Referenced by Configure(), and XrdOfsFile::open().

◆ Finder

◆ fMask

mode_t XrdOfs::fMask[2]

Definition at line 385 of file XrdOfs.hh.

Referenced by chmod(), Configure(), and XrdOfsFile::open().

◆ fwdCHMOD

struct fwdOpt XrdOfs::fwdCHMOD

Definition at line 394 of file XrdOfs.hh.

Referenced by chmod(), Config_Display(), and Configure().

◆ fwdMKDIR

struct fwdOpt XrdOfs::fwdMKDIR

Definition at line 394 of file XrdOfs.hh.

Referenced by Config_Display(), Configure(), and mkdir().

◆ fwdMKPATH

struct fwdOpt XrdOfs::fwdMKPATH

Definition at line 394 of file XrdOfs.hh.

Referenced by Configure(), and mkdir().

◆ fwdMV

struct fwdOpt XrdOfs::fwdMV

Definition at line 394 of file XrdOfs.hh.

Referenced by Config_Display(), Configure(), and rename().

◆ fwdRM

struct fwdOpt XrdOfs::fwdRM

Definition at line 394 of file XrdOfs.hh.

Referenced by Config_Display(), and Configure().

◆ fwdRMDIR

struct fwdOpt XrdOfs::fwdRMDIR

Definition at line 394 of file XrdOfs.hh.

Referenced by Config_Display(), and Configure().

◆ fwdTRUNC

struct fwdOpt XrdOfs::fwdTRUNC

Definition at line 394 of file XrdOfs.hh.

Referenced by Config_Display(), Configure(), and truncate().

◆ MaxDelay

int XrdOfs::MaxDelay = 60
static

Definition at line 417 of file XrdOfs.hh.

Referenced by Config_Display(), and Stall().

◆ myIF

XrdNetIF* XrdOfs::myIF

Definition at line 394 of file XrdOfs.hh.

Referenced by Configure(), and fsctl().

◆ myPort

int XrdOfs::myPort

Definition at line 380 of file XrdOfs.hh.

Referenced by XrdOfs().

◆ Options

int XrdOfs::Options

Definition at line 379 of file XrdOfs.hh.

Referenced by Config_Display(), Configure(), ConfigXeq(), and XrdOfsFile::open().

◆ OSSDelay

int XrdOfs::OSSDelay = 30
static

Definition at line 418 of file XrdOfs.hh.

Referenced by Emsg().

◆ tpcRdrHost

char* XrdOfs::tpcRdrHost[2]

Definition at line 389 of file XrdOfs.hh.

Referenced by XrdOfsFile::open().

◆ tpcRdrPort

int XrdOfs::tpcRdrPort[2]

Definition at line 390 of file XrdOfs.hh.

Referenced by XrdOfsFile::open().


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