#ifndef __XRDOFSEVS_H__
#define __XRDOFSEVS_H__
/******************************************************************************/
/* */
/* X r d O f s E v s . h h */
/* */
/* (c) 2005 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. */
/* Based on code developed by Derek Feichtinger, CERN. */
/******************************************************************************/
#include
#include "XrdSys/XrdSysPthread.hh"
class XrdOfsEvsMsg;
class XrdOucEnv;
class XrdOucProg;
class XrdSysError;
/******************************************************************************/
/* X r d O f s E v s I n f o */
/******************************************************************************/
class XrdOfsEvsInfo
{
public:
enum evArg {evTID=0, evLFN1, evCGI1, evLFN2, evCGI2, evFMODE, evFSIZE, evARGS};
inline long long FSize() {return theFSize;}
inline mode_t FMode() {return theFMode;}
inline void Set(evArg aNum, const char *aVal) {Arg[aNum] = aVal;}
inline const char *Val(evArg aNum) {return Arg[aNum];}
XrdOfsEvsInfo(const char *tid,
const char *lfn1, const char *cgi1="", XrdOucEnv *env1=0,
mode_t mode=0, long long fsize=0,
const char *lfn2="$LFN2", const char *cgi2="", XrdOucEnv *env2=0)
{Arg[evTID] = tid;
Arg[evLFN1] = lfn1;
Arg[evCGI1] = (cgi1 ? cgi1 : ""); Env1 = env1;
Arg[evLFN2] = (lfn2 ? lfn2 : "$LFN2");
Arg[evCGI2] = (cgi2 ? cgi2 : ""); Env2 = env2;
theFMode = mode; theFSize = fsize;
}
~XrdOfsEvsInfo() {}
private:
const char *Arg[evARGS];
XrdOucEnv *Env1;
XrdOucEnv *Env2;
long long theFSize;
mode_t theFMode;
};
/******************************************************************************/
/* X r d O f s E v s F o r m a t */
/******************************************************************************/
class XrdOfsEvsFormat
{
public:
enum evFlags {Null = 0, freeFmt = 1, cvtMode = 2, cvtFSize = 4};
const char *Format;
evFlags Flags;
XrdOfsEvsInfo::evArg Args[XrdOfsEvsInfo::evARGS];
int SNP(XrdOfsEvsInfo &Info, char *buff, int blen)
{return snprintf(buff,blen,Format, Info.Val(Args[0]),
Info.Val(Args[1]), Info.Val(Args[2]),
Info.Val(Args[3]), Info.Val(Args[4]),
Info.Val(Args[5]), Info.Val(Args[6]));
}
void Def(evFlags theFlags, const char *Fmt, ...);
void Set(evFlags theFlags, const char *Fmt, int *fullArgs)
{if (Format && Flags & freeFmt) free((char *)Format);
Format = Fmt; Flags = theFlags;
memcpy(Args, fullArgs, sizeof(Args));
}
XrdOfsEvsFormat() : Format(0), Flags(Null) {}
~XrdOfsEvsFormat() {}
};
/******************************************************************************/
/* X r d O f s E v s */
/******************************************************************************/
class XrdOfsEvs
{
public:
enum Event {All = 0x7fffff00, None = 0x00000000,
Chmod = 0x00000100, Closer = 0x00000201,
Closew = 0x00000402, Close = 0x00000600,
Create = 0x00000803, Fwrite = 0x00001004,
Mkdir = 0x00002005, Mv = 0x00004006,
Openr = 0x00008007, Openw = 0x00010008,
Open = 0x00018000, Rm = 0x00020009,
Rmdir = 0x0004000a, Trunc = 0x0008000b,
nCount = 12,
Mask = 0X000000ff, enMask = 0x7fffff00
};
static const int minMsgSize = 1360; // (16+320+1024)
static const int maxMsgSize = 2384; // (16+320+1024+1024);
int Enabled(Event theEvents) {return theEvents & enEvents;}
int maxSmsg() {return maxMin;}
int maxLmsg() {return maxMax;}
void Notify(Event eNum, XrdOfsEvsInfo &Info);
static int Parse(XrdSysError &Eroute, Event eNum, char *mText);
const char *Prog() {return theTarget;}
void sendEvents(void);
int Start(XrdSysError *eobj);
XrdOfsEvs(Event theEvents, const char *Target, int minq=90, int maxq=10);
~XrdOfsEvs();
private:
const char *eName(int eNum);
int Feed(const char *data, int dlen);
XrdOfsEvsMsg *getMsg(int bigmsg);
void retMsg(XrdOfsEvsMsg *tp);
static XrdOfsEvsFormat MsgFmt[XrdOfsEvs::nCount];
pthread_t tid;
char *theTarget;
Event enEvents;
XrdSysError *eDest;
XrdOucProg *theProg;
XrdSysMutex qMut;
XrdSysSemaphore qSem;
XrdOfsEvsMsg *msgFirst;
XrdOfsEvsMsg *msgLast;
XrdSysMutex fMut;
XrdOfsEvsMsg *msgFreeMax;
XrdOfsEvsMsg *msgFreeMin;
int endIT;
int msgFD;
int numMax;
int maxMax;
int numMin;
int maxMin;
};
#endif