/******************************************************************************/ /* */ /* X r d C n s D a e m o n . c c */ /* */ /* (c) 2007 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 #include #include "Xrd/XrdTrace.hh" #include "XrdSys/XrdSysError.hh" #include "XrdSys/XrdSysHeaders.hh" #include "XrdOuc/XrdOucStream.hh" #include "XrdCns/XrdCnsDaemon.hh" #include "XrdCns/XrdCnsLogRec.hh" /******************************************************************************/ /* G l o b a l O b j e c t s */ /******************************************************************************/ namespace XrdCns { extern XrdSysError MLog; extern XrdOucTrace XrdTrace; XrdCnsDaemon XrdCnsd; } using namespace XrdCns; /******************************************************************************/ /* g e t E v e n t s */ /******************************************************************************/ void XrdCnsDaemon::getEvents(XrdOucStream &Events, const char *Who) { const char *Miss = 0, *TraceID = "getEvents"; long long Size; mode_t Mode; const char *eP; char *tp, *etp; XrdCnsLogRec *evP = 0; // Each ofs request comes in as: // {closew | create | mkdir | // mv | rm | rmdir } // while((tp = Events.GetLine()) && *tp) {TRACE(DEBUG, "Event: '" <setType(eP)) Miss = "eventid"; else {switch(evP->Type()) {case XrdCnsLogRec::lrClosew: if (!(tp=getLFN(Events))) {Miss = "lfn"; break;} evP->setLfn1(tp); if (!(tp=Events.GetToken())) {Miss = "size"; break;} Size = strtoll(tp, &etp, 10); if (*etp) {Miss = "size"; break;} evP->setSize(Size); break; case XrdCnsLogRec::lrMkdir: case XrdCnsLogRec::lrCreate: if (evP->Type() == XrdCnsLogRec::lrMkdir) evP->setSize(-1); if (!(tp=Events.GetToken())) {Miss = "mode"; break;} Mode = strtol(tp, &etp, 8); if (*etp) {Miss = "mode"; break;} evP->setMode(Mode); if (!(tp=getLFN(Events))) {Miss = "lfn"; break;} evP->setLfn1(tp); break; case XrdCnsLogRec::lrMv: if (!(tp=getLFN(Events))) {Miss = "lfn1"; break;} evP->setLfn1(tp); if (!(tp=getLFN(Events))) {Miss = "lfn2"; break;} evP->setLfn2(tp); break; default: // rm | rmdir if (!(tp=getLFN(Events))) {Miss = "lfn"; break;} evP->setLfn1(tp); break; } } } if (Miss) {MLog.Emsg("doEvents", Miss, "missing in event", eP); if (evP) evP->Recycle(); Miss = 0; continue; } evP->Queue(); } // If we exit then we lost the connection // MLog.Emsg("doEvents", "Lost event connection to", Who, "!"); } /******************************************************************************/ /* g e t L F N */ /******************************************************************************/ char *XrdCnsDaemon::getLFN(XrdOucStream &Events) { char *tP, *cgiP; // Obtain the lfn but discard any CGI information that has been mistakenly // passed. Some people recall the old documentation, sigh. // if ((tP=Events.GetToken()) && (cgiP = index(tP, '?'))) *cgiP = '\0'; return tP; }