/******************************************************************************/
/* */
/* X r d P o s i x M a p . 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 "XProtocol/XProtocol.hh"
#include "XrdPosix/XrdPosixMap.hh"
#include "XrdSfs/XrdSfsFlags.hh"
#include "XrdSys/XrdSysHeaders.hh"
/******************************************************************************/
/* S t a t i c M e m b e r s */
/******************************************************************************/
bool XrdPosixMap::Debug = false;
/******************************************************************************/
/* F l a g s 2 M o d e */
/******************************************************************************/
mode_t XrdPosixMap::Flags2Mode(dev_t *rdv, uint32_t flags)
{
mode_t newflags = 0;
// Map the xroot flags to unix flags
//
if (flags & XrdCl::StatInfo::XBitSet) newflags |= S_IXUSR;
if (flags & XrdCl::StatInfo::IsReadable) newflags |= S_IRUSR;
if (flags & XrdCl::StatInfo::IsWritable) newflags |= S_IWUSR;
if (flags & XrdCl::StatInfo::Other) newflags |= S_IFBLK;
else if (flags & XrdCl::StatInfo::IsDir) newflags |= S_IFDIR;
else newflags |= S_IFREG;
if (flags & XrdCl::StatInfo::POSCPending) newflags |= XRDSFS_POSCPEND;
if (rdv)
{*rdv = 0;
if (flags & XrdCl::StatInfo::Offline) *rdv |= XRDSFS_OFFLINE;
if (flags & XrdCl::StatInfo::BackUpExists) *rdv |= XRDSFS_HASBKUP;
}
return newflags;
}
/******************************************************************************/
/* Private: m a p C o d e */
/******************************************************************************/
int XrdPosixMap::mapCode(int rc)
{
switch(rc)
{case XrdCl::errRetry: return EAGAIN;
case XrdCl::errInvalidOp: return EOPNOTSUPP;
case XrdCl::errInvalidArgs: return EINVAL;
case XrdCl::errConfig: return ENOEXEC;
case XrdCl::errInProgress: return EINPROGRESS;
case XrdCl::errNotSupported: return ENOTSUP;
case XrdCl::errInvalidAddr: return EHOSTUNREACH;
case XrdCl::errSocketTimeout: return ETIMEDOUT;
case XrdCl::errSocketDisconnected: return ENOTCONN;
case XrdCl::errStreamDisconnect: return ECONNRESET;
case XrdCl::errConnectionError: return ECONNREFUSED;
case XrdCl::errHandShakeFailed: return EPROTO;
case XrdCl::errLoginFailed: return ECONNABORTED;
case XrdCl::errAuthFailed: return EACCES;
case XrdCl::errQueryNotSupported: return ENOTSUP;
case XrdCl::errOperationExpired: return ESTALE;
case XrdCl::errNoMoreFreeSIDs: return ENOSR;
// case XrdCl::errInvalidRedirectURL: return ?????;
case XrdCl::errInvalidResponse: return EBADMSG;
case XrdCl::errNotFound: return EIDRM;
case XrdCl::errCheckSumError: return EILSEQ;
case XrdCl::errRedirectLimit: return ELOOP;
default: break;
}
return ENOMSG;
}
/******************************************************************************/
/* M o d e 2 A c c e s s */
/******************************************************************************/
XrdCl::Access::Mode XrdPosixMap::Mode2Access(mode_t mode)
{ XrdCl::Access::Mode XMode = XrdCl::Access::None;
// Map the mode
//
if (mode & S_IRUSR) XMode |= XrdCl::Access::UR;
if (mode & S_IWUSR) XMode |= XrdCl::Access::UW;
if (mode & S_IXUSR) XMode |= XrdCl::Access::UX;
if (mode & S_IRGRP) XMode |= XrdCl::Access::GR;
if (mode & S_IWGRP) XMode |= XrdCl::Access::GW;
if (mode & S_IXGRP) XMode |= XrdCl::Access::GX;
if (mode & S_IROTH) XMode |= XrdCl::Access::OR;
if (mode & S_IXOTH) XMode |= XrdCl::Access::OX;
return XMode;
}
/******************************************************************************/
/* R e s u l t */
/******************************************************************************/
int XrdPosixMap::Result(const XrdCl::XRootDStatus &Status)
{
std::string eText;
int eNum;
// If all went well, return success
//
if (Status.IsOK()) return 0;
// If this is an xrootd error then get the xrootd generated error
//
if (Status.code == XrdCl::errErrorResponse)
{eText = Status.GetErrorMessage();
eNum = XProtocol::toErrno(Status.errNo);
} else {
eText = Status.ToStr();
eNum = (Status.errNo ? Status.errNo : mapCode(Status.code));
}
// Trace this if need be (we supress this for as we really need more info to
// make this messae useful like the opteration and path).
//
// if (eNum != ENOENT && !eText.empty() && Debug)
// cerr <<"XrdPosix: " <