#ifndef _XRDOSSSTATINFO_H #define _XRDOSSSTATINFO_H /******************************************************************************/ /* */ /* X r d O s s S t a t I n f o . h h */ /* */ /* (c) 2013 by the Board of Trustees of the Leland Stanford, Jr., University */ /* All Rights Reserved */ /* Produced by Andrew Hanushevsky for Stanford University under contract */ /* DE-AC02-76-SFO0515 with the Department of Energy */ /* */ /* This file is part of the XRootD software suite. */ /* */ /* XRootD is free software: you can redistribute it and/or modify it under */ /* the terms of the GNU Lesser General Public License as published by the */ /* Free Software Foundation, either version 3 of the License, or (at your */ /* option) any later version. */ /* */ /* XRootD is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */ /* License for more details. */ /* */ /* You should have received a copy of the GNU Lesser General Public License */ /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */ /* COPYING (GPL license). If not, see . */ /* */ /* The copyright holder's institutional names and contributor's names may not */ /* be used to endorse or promote products derived from this software without */ /* specific prior written permission of the institution or contributor. */ /******************************************************************************/ class XrdOss; class XrdOucEnv; class XrdSysLogger; struct stat; namespace XrdOssStatEvent { static const int FileAdded = 1; //!< Path has been added static const int PendAdded = 2; //!< Path has been added in pending mode static const int FileRemoved = 0; //!< Path has been removed } //------------------------------------------------------------------------------ //! This file defines the alternate stat() function that can be used as a //! replacement for the normal system stat() call that is used to determine the //! file attributes, including whether the file exists or not. It is loaded as //! a plug-in via the XrdOssStatInfoInit() function residing in the shared //! library pecified by the 'oss.statlib' directive. The returned function is //! preferentially used by the XrdOssSys::Stat() method. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //! Get file information. //! //! @param path -> the file path whose stat information is wanted. //! @param buff -> to the stat structure that is to be filled in with //! stat information the same way that stat() would have, //! @param opts A combination of XRDOSS_xxxx options. See XrdOss.hh. //! @param envP -> environment pointer which includes CGI information. //! This pointer is nil if no special environment exists. //! @param lfn -> the corresponding logical file name. This is only //! passed for version 2 calls (see XrdOssStatInfoInit2). //! //! @return Success: zero with the stat structure filled in. //! @return Failure: a -1 with errno set to the correct err number value. //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //! Set file information. //! //! When the arevents option is specified in the oss.statlib directive and the //! executable is the cmsd running in server mode, then the StatInfo function is //! also used to relay add/remove file requests send by the companion xrootd to //! the cmsd. The parameters then are as follows: //! //! @param path -> the file path whose whose stat information changed. //! @param buff -> Nil; this indicates that stat information is being set. //! @param opts One of the following options: //! XrdOssStatEvent::FileAdded, //! XrdOssStatEvent::PendAdded, //! XrdOssStatEvent::FileRemoved. //! @param envP -> Nil //! @param lfn -> the logical file name whose stat information changed. //! //! @return The return value should be zero but is not currently inspected. //------------------------------------------------------------------------------ typedef int (*XrdOssStatInfo_t) (const char *path, struct stat *buff, int opts, XrdOucEnv *envP); typedef int (*XrdOssStatInfo2_t)(const char *path, struct stat *buff, int opts, XrdOucEnv *envP, const char *lfn); /******************************************************************************/ /* X r d O s s S t a t I n f o I n s t a n t i a t o r */ /******************************************************************************/ //------------------------------------------------------------------------------ //! Get the address of the appropriate XrdOssStatInfo function. //! //! @param native_oss -> object that implements the storage system. //! @param Logger -> The message routing object to be used in conjunction //! with an XrdSysError object for error messages. //! @param config_fn -> The name of the config file. //! @param parms -> Any parameters specified after the path on the //! oss.statlib directive. If there are no parameters, the //! pointer may be zero. //! //! @return Success: address of the XrdOssStatInfo function to be used //! for stat() calls by the underlying storage system. //! Failure: Null pointer which causes initialization to fail. //! //! Additionally, two special envars may be queried to determine the context: //! //! getenv("XRDPROG") Indicates which program is loading the library: //! "cmsd", "frm_purged", "frm_xfrd", or "xrootd" //! Any other value, inclduing a nil pointer, indicates //! a non-standard program is doing the load. //! //! getenv("XRDROLE") Is the role of the program. The envar is set only when //! XRDPROG is set to "cmsd" or "xrootd". Valid roles are: //! "manager", "supervisor", "server", "proxy", or "peer". //! //! The function creator must be declared as an extern "C" function in the //! plug-in shared library as follows: //------------------------------------------------------------------------------ /*! @code {.cpp} extern "C" XrdOssStatInfo_t XrdOssStatInfoInit(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms); @endcode An alternate entry point may be defined in lieu of the previous entry point. This normally identified by a version option in the configuration file (e.g. oss.statlib -2 \). It differs in that an extra parameter is passed and if returns a function that accepts an extra parameter. @param envP - Pointer to the environment containing implementation specific information. @code {.cpp} extern "C" XrdOssStatInfo2_t XrdOssStatInfoInit2(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP); @endcode */ //------------------------------------------------------------------------------ //! Declare compilation version. //! //! Additionally, you *must* declare the xrootd version you used to compile //! your plug-in. Include the code shown below at file level in your source. //------------------------------------------------------------------------------ /*! #include "XrdVersion.hh" XrdVERSIONINFO(XrdOssStatInfoInit,); where \ is a 1- to 15-character unquoted name identifying your plugin. */ //------------------------------------------------------------------------------ //! The typedef that describes the XRdOssStatInfoInit external. //------------------------------------------------------------------------------ typedef XrdOssStatInfo_t (*XrdOssStatInfoInit_t)(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms); typedef XrdOssStatInfo2_t (*XrdOssStatInfoInit2_t)(XrdOss *native_oss, XrdSysLogger *Logger, const char *config_fn, const char *parms, XrdOucEnv *envP); #endif