/******************************************************************************/ /* */ /* X r d S y s F A t t r . c c */ /* */ /* (c) 2014 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 "XrdSys/XrdSysError.hh" #include "XrdSys/XrdSysFAttr.hh" /******************************************************************************/ /* P l a t f o r m D e p e n d e n c i e s */ /******************************************************************************/ #ifndef ENOATTR #define ENOATTR ENODATA #endif /******************************************************************************/ /* S t a t i c O b j e c t s */ /******************************************************************************/ namespace { XrdSysFAttr dfltXAttr; } // The following global symbol always points to the native implementation // XrdSysXAttr &XrdSysXAttrNative= dfltXAttr; // The following global symbol always points to the active implementation // XrdSysXAttr *XrdSysXAttrActive= &dfltXAttr; XrdSysXAttr *XrdSysFAttr::Xat = &dfltXAttr; /******************************************************************************/ /* X r d S y s F A t t r I m p l e m e n t a t i o n */ /******************************************************************************/ #if defined(__FreeBSD__) #include "XrdSys/XrdSysFAttrBsd.icc" #elif defined(__linux__) #include "XrdSys/XrdSysFAttrLnx.icc" #elif defined(__APPLE__) #include "XrdSys/XrdSysFAttrMac.icc" #elif defined(__solaris__) #include "XrdSys/XrdSysFAttrSun.icc" #else int XrdSysFAttr::Del(const char *Aname, const char *Path) {return -ENOTSUP;} int XrdSysFAttr::Del(const char *Aname, int fd) {return -ENOTSUP;} int XrdSysFAttr::Get(const char *Aname, void *Aval, int Avsz, const char *Path) {return -ENOTSUP;} int XrdSysFAttr::Get(const char *Aname, void *Aval, int Avsz, int fd) {return -ENOTSUP;} int XrdSysFAttr::Set(const char *Aname, const void *Aval, int Avsz, const char *Path, int isNew) {return -ENOTSUP;} int XrdSysFAttr::Set(const char *Aname, const void *Aval, int Avsz, int fd, int isNew) {return -ENOTSUP;} int XrdSysFAttr::Set(XrdSysError *erp) {return 0;} #endif /******************************************************************************/ /* D i a g n o s e */ /******************************************************************************/ int XrdSysFAttr::Diagnose(const char *Op, const char *Var, const char *Path, int ec) { char buff[512]; // Screen out common case // if (ec == ENOATTR || ec == ENOENT) return -ENOENT; // Format message insert and print if we can actually say anything // if (Say) {snprintf(buff, sizeof(buff), "%s attr %s from", Op, Var); Say->Emsg("FAttr", ec, buff, Path); } // Return negative code // return -ec; } /******************************************************************************/ /* F r e e */ /******************************************************************************/ void XrdSysFAttr::Free(XrdSysFAttr::AList *aLP) { AList *aNP; // Free all teh structs using free as they were allocated using malloc() // while(aLP) {aNP = aLP->Next; free(aLP); aLP = aNP;} } /******************************************************************************/ /* g e t E n t */ /******************************************************************************/ XrdSysFAttr::AList *XrdSysFAttr::getEnt(const char *Path, int fd, const char *Aname, XrdSysFAttr::AList *aP, int *msP) { AList *aNew; int sz = 0, n = strlen(Aname); // Get the data size of this attribute if so wanted // if (!n || (msP && !(sz = Get(Aname, 0, 0, Path, fd)))) return 0; // Allocate a new dynamic struct // if (!(aNew = (AList *)malloc(sizeof(AList) + n))) return 0; // Initialize the structure // aNew->Next = aP; aNew->Vlen = sz; aNew->Nlen = n; strcpy(aNew->Name, Aname); // Gauranteed to fit // All done // if (msP && *msP < sz) *msP = sz; return aNew; } /******************************************************************************/ /* S e t P l u g i n */ /******************************************************************************/ void XrdSysFAttr::SetPlugin(XrdSysXAttr *xaP) { if (Xat && Xat != &dfltXAttr) delete Xat; XrdSysXAttrActive = Xat = xaP; }