/******************************************************************************/
/* */
/* X r d O f s T P C I n f o . c c */
/* */
/* (c) 2012 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 "XrdNet/XrdNetAddr.hh"
#include "XrdOfs/XrdOfsStats.hh"
#include "XrdOfs/XrdOfsTPCInfo.hh"
#include "XrdOss/XrdOss.hh"
#include "XrdOuc/XrdOucErrInfo.hh"
#include "XrdSfs/XrdSfsInterface.hh"
#include "XrdSys/XrdSysError.hh"
/******************************************************************************/
/* G l o b a l O b j e c t s */
/******************************************************************************/
extern XrdSysError OfsEroute;
extern XrdOfsStats OfsStats;
extern XrdOss *XrdOfsOss;
namespace XrdOfsTPCParms
{
extern bool autoRM;
}
/******************************************************************************/
/* D e s t r u c t o r */
/******************************************************************************/
XrdOfsTPCInfo::~XrdOfsTPCInfo()
{
// Check if we should remove the file
//
if (isDST && !isAOK && XrdOfsTPCParms::autoRM && Lfn)
XrdOfsOss->Unlink(Lfn);
// Delete all appendages
//
if (Key) {free(Key); Key = 0;}
if (Org) {free(Org); Org = 0;}
if (Lfn) {free(Lfn); Lfn = 0;}
if (Dst) {free(Dst); Dst = 0;}
if (Spr) {free(Spr); Spr = 0;}
if (Tpr) {free(Tpr); Tpr = 0;}
if (Cks) {free(Cks); Cks = 0;}
if (Crd) {free(Crd); Crd = 0; Csz = 0;}
if (cbP) delete cbP;
}
/******************************************************************************/
/* F a i l */
/******************************************************************************/
int XrdOfsTPCInfo::Fail(XrdOucErrInfo *eRR, const char *eMsg, int eCode)
{
char Buff[2048];
// Format the error message
//
snprintf(Buff, sizeof(Buff), "Unable to copy %s; %s", Lfn, eMsg);
// Print it out if debugging is enabled
//
#ifndef NODEBUG
OfsEroute.Emsg("TPC", Org, Buff);
#endif
// Place the error message in the error object and return
//
if (eRR) eRR->setErrInfo(eCode, Buff);
OfsStats.Add(OfsStats.Data.numTPCerrs);
return SFS_ERROR;
}
/******************************************************************************/
/* M a t c h */
/******************************************************************************/
int XrdOfsTPCInfo::Match(const char *cKey, const char *cOrg,
const char *xLfn, const char *xDst)
{
if (cKey) {if (!Key || strcmp(Key, cKey)) return 0;}
else if (Key) return 0;
if (cOrg) {if (!Org || strcmp(Org, cOrg)) return 0;}
else if (Org) return 0;
if (xLfn) {if (!Lfn || strcmp(Lfn, xLfn)) return 0;}
else if (Lfn) return 0;
if (xDst) {if (!Dst || strcmp(Dst, xDst)) return 0;}
else if (Dst) return 0;
return 1;
}
/******************************************************************************/
/* R e p l y */
/******************************************************************************/
void XrdOfsTPCInfo:: Reply(int rC, int eC, const char *eMsg, XrdSysMutex *mP)
{
XrdOucCallBack *myCB = cbP;
// Clear pointer to call back prior to unlocking any locks
//
cbP = 0;
// Make sure a reply is valid here (i.e. client is in waitresop). If not,
// then we need to scuttle the whole shebang (must be done with a lock).
//
if (inWtR)
{inWtR = false;
if (mP) mP->UnLock();
if (myCB) myCB->Reply(rC, eC, eMsg, Lfn);
} else if (mP) mP->UnLock();
delete myCB;
}
/******************************************************************************/
/* S e t */
/******************************************************************************/
const char *XrdOfsTPCInfo::Set(const char *cKey, const char *cOrg,
const char *xLfn, const char *xDst,
const char *xCks)
{
const char *etext;
// Set the key
//
if (Key) free(Key);
Key = (cKey ? strdup(cKey) : 0);
// Set the origin
//
if (Org) free(Org);
Org = (cOrg ? strdup(cOrg) : 0);
// Set the lfn
//
if (Lfn) free(Lfn);
Lfn = (xLfn ? strdup(xLfn) : 0);
// Set optional dst
//
if (Dst) {free(Dst); Dst = 0;}
if (xDst)
{XrdNetAddr dAddr;
if (!(etext = dAddr.Set(xDst,0)))
Dst = strdup(dAddr.Name("0.0.0.0",&etext));
if (etext) return etext;
}
// Set the cks
//
if (Cks) free(Cks);
Cks = (xCks ? strdup(xCks) : 0);
// All done
//
return 0;
}
/******************************************************************************/
/* S e t C B */
/******************************************************************************/
int XrdOfsTPCInfo::SetCB(XrdOucErrInfo *eRR)
{
if (cbP) delete cbP;
cbP = new XrdOucCallBack();
if ((cbP->Init(eRR))) return 0;
delete cbP; cbP = 0;
return Fail(eRR, "tpc callback logic error", EPROTO);
}