/******************************************************************************/
/* */
/* X r d O s s S I g p f s T . c c */
/* */
/* (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. */
/******************************************************************************/
#include
#include
#include
#include
#include
#include
#include "XrdVersion.hh"
#include "XrdOss/XrdOss.hh"
#include "XrdOss/XrdOssStatInfo.hh"
#include "XrdOuc/XrdOucEnv.hh"
#include "XrdSys/XrdSysError.hh"
//------------------------------------------------------------------------------
//! This file defines a default plug-in that can be used to handle stat()
//! calls for GPFS backed with a tape system. Valid parameters that can be
//! passed to XrdOssStatInfoInit are:
//!
//! := cmsd | frm_xfrd | frm_purged | xrootd
//! := manager | peer | proxy | server | supervisor
//! := stat[.[.]]={all | online[:eperm]}[&]
//!
//! where: applies the specification only to programs named . If
//! is not specified, the parametr applies to all programs.
//! applies the specification only to programs named
//! running with the role . If is not specified, the
//! parameter applies to all 's regardless of their role.
//! In all cases, the most restrictive specification applies.
//! all allows stat() to return info for online and offline files.
//! online allows stat() to return info for online files only. When
//! when stat() encounters an offline file it returns ENOENT.
//! However, specifying "online:eperm" return EPERM instead.
//------------------------------------------------------------------------------
extern "C"
{
/******************************************************************************/
/* X r d O s s S t a t I n f o R e s O n l y */
/******************************************************************************/
//------------------------------------------------------------------------------
//! This global variable is set by XrdOssStatInfoInit to indicate whether we
//! will allow access to all files or only disk resident files. By default,
//! only disk resident files are allowed to be handled via stat(). The value
//! is the errno to be returned when we trip over a non-resident file.
//------------------------------------------------------------------------------
int XrdOssStatInfoResOnly = ENOENT;
/******************************************************************************/
/* X r d O s s S t a t I n f o */
/******************************************************************************/
int XrdOssStatInfo(const char *path, struct stat *buff,
int opts, XrdOucEnv *envP)
{
// Do a regular stat and if it fails return immediately
//
if (stat(path, buff)) return -1;
// Check if this is an online file, return success
//
if (buff->st_size == 0 || buff->st_blocks) return 0;
// If caller only wants resident files, then return ENOENT. If we are
// restricting the caller to residdent only files, return the proper errno.
// Otherwise, we indicate the file actually exists.
//
if (opts & XRDOSS_resonly) errno = ENOENT;
else errno = XrdOssStatInfoResOnly;
return (errno ? -1 : 0);
}
/******************************************************************************/
/* X r d O s s S t a t I n f o P a r m */
/******************************************************************************/
int XrdOssStatInfoParm(XrdSysError &eDest, const char *var, const char *val)
{
if (!strcmp(val, "all")) return 0;
else if (!strcmp(val, "online")) return ENOENT;
else if (!strcmp(val, "online:eperm")) return EPERM;
eDest.Say("Config", " Invalid statlib parameter, '",var,"=",val,"'.");
return -1;
}
/******************************************************************************/
/* X r d O s s S t a t I n f o I n i t */
/******************************************************************************/
//------------------------------------------------------------------------------
//! The following function is invoked by the plugin manager to obtain the
//! function that is to be used for stat() calls. Valid parameters are:
//!
//! := cmsd | frm_xfrd | frm_purged | xrootd
//! := manager | peer | proxy | server | supervisor
//! := stat[.[.]]={online|all}[&]
//------------------------------------------------------------------------------
XrdOssStatInfo_t XrdOssStatInfoInit(XrdOss *native_oss,
XrdSysLogger *Logger,
const char *config_fn,
const char *parms)
{
const char *myProg = getenv("XRDPROG");
const char *myRole = getenv("XRDROLE");
const char *xWhat = " only online ";
XrdSysError Say(Logger, "");
XrdOucEnv myEnv(parms);
char zRole[16], vChk[512], *val;
int offLine = 0;
// Readjust the role to be backwards compatible
//
if (myRole)
{ if (!strncmp("proxy", myRole, 5))
{strcpy(zRole, "proxy"); myRole = zRole;}
else if (!strncmp("meta", myRole, 4))
{strcpy(zRole, "manager"); myRole = zRole;}
}
// Check for global parms first
//
strcpy(vChk, "stat");
if ((val = myEnv.Get(vChk))
&& (offLine = XrdOssStatInfoParm(Say, vChk, val)) < 0) return 0;
// Check for program specific variable
//
if (myProg)
{strcat(vChk, "."); strcat(vChk, myProg);
if ((val = myEnv.Get(vChk))
&& (offLine = XrdOssStatInfoParm(Say, vChk, val)) < 0) return 0;
}
// Check for role specific variable
//
if (myProg && myRole)
{strcat(vChk, "."); strcat(vChk, myRole);
if ((val = myEnv.Get(vChk))
&& (offLine = XrdOssStatInfoParm(Say, vChk, val)) < 0) return 0;
}
// Now set the global variable indicate whether we will only allow online
// files or all files (i.e. online and offline).
//
XrdOssStatInfoResOnly = offLine;
// Record in the log what stat will stat
//
if (myProg) strncpy(vChk, " for ", 6);
else *vChk = 0;
if (!XrdOssStatInfoResOnly) xWhat = " all ";
Say.Say("Config", " stat() allows", xWhat, "files", vChk);
// Return the stat function
//
return (XrdOssStatInfo_t)XrdOssStatInfo;
}
};
/******************************************************************************/
/* V e r s i o n I n f o r m a t i o n */
/******************************************************************************/
XrdVERSIONINFO(XrdOssStatInfoInit,Stat-GPFS+TAPE);