00001 #ifndef __XRDOFSEVS_H__
00002 #define __XRDOFSEVS_H__
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <strings.h>
00017 #include "XrdSys/XrdSysPthread.hh"
00018
00019 class XrdOfsEvsMsg;
00020 class XrdOucEnv;
00021 class XrdOucProg;
00022 class XrdSysError;
00023
00024
00025
00026
00027
00028 class XrdOfsEvsInfo
00029 {
00030 public:
00031
00032 enum evArg {evTID=0, evLFN1, evCGI1, evLFN2, evCGI2, evFMODE, evFSIZE, evARGS};
00033
00034 inline long long FSize() {return theFSize;}
00035
00036 inline mode_t FMode() {return theFMode;}
00037
00038 inline void Set(evArg aNum, const char *aVal) {Arg[aNum] = aVal;}
00039
00040 inline const char *Val(evArg aNum) {return Arg[aNum];}
00041
00042 XrdOfsEvsInfo(const char *tid,
00043 const char *lfn1, const char *cgi1="", XrdOucEnv *env1=0,
00044 mode_t mode=0, long long fsize=0,
00045 const char *lfn2="$LFN2", const char *cgi2="", XrdOucEnv *env2=0)
00046 {Arg[evTID] = tid;
00047 Arg[evLFN1] = lfn1;
00048 Arg[evCGI1] = (cgi1 ? cgi1 : ""); Env1 = env1;
00049 Arg[evLFN2] = (lfn2 ? lfn2 : "$LFN2");
00050 Arg[evCGI2] = (cgi2 ? cgi2 : ""); Env2 = env2;
00051 theFMode = mode; theFSize = fsize;
00052 }
00053
00054 ~XrdOfsEvsInfo() {}
00055
00056 private:
00057
00058 const char *Arg[evARGS];
00059 XrdOucEnv *Env1;
00060 XrdOucEnv *Env2;
00061 long long theFSize;
00062 mode_t theFMode;
00063 };
00064
00065
00066
00067
00068
00069 class XrdOfsEvsFormat
00070 {
00071 public:
00072
00073 enum evFlags {Null = 0, freeFmt = 1, cvtMode = 2, cvtFSize = 4};
00074
00075 const char *Format;
00076 evFlags Flags;
00077 XrdOfsEvsInfo::evArg Args[XrdOfsEvsInfo::evARGS];
00078
00079 int SNP(XrdOfsEvsInfo &Info, char *buff, int blen)
00080 {return snprintf(buff,blen,Format, Info.Val(Args[0]),
00081 Info.Val(Args[1]), Info.Val(Args[2]),
00082 Info.Val(Args[3]), Info.Val(Args[4]),
00083 Info.Val(Args[5]), Info.Val(Args[6]));
00084 }
00085
00086 void Def(evFlags theFlags, const char *Fmt, ...);
00087
00088 void Set(evFlags theFlags, const char *Fmt, int *fullArgs)
00089 {if (Format && Flags & freeFmt) free((char *)Format);
00090 Format = Fmt; Flags = theFlags;
00091 memcpy(Args, fullArgs, sizeof(Args));
00092 }
00093
00094 XrdOfsEvsFormat() : Format(0), Flags(Null) {}
00095 ~XrdOfsEvsFormat() {}
00096 };
00097
00098
00099
00100
00101
00102 class XrdOfsEvs
00103 {
00104 public:
00105
00106 enum Event {All = 0x7fffff00, None = 0x00000000,
00107 Chmod = 0x00000100, Closer = 0x00000201,
00108 Closew = 0x00000402, Close = 0x00000600,
00109 Create = 0x00000803, Fwrite = 0x00001004,
00110 Mkdir = 0x00002005, Mv = 0x00004006,
00111 Openr = 0x00008007, Openw = 0x00010008,
00112 Open = 0x00018000, Rm = 0x00020009,
00113 Rmdir = 0x0004000a, Trunc = 0x0008000b,
00114 nCount = 12,
00115 Mask = 0X000000ff, enMask = 0x7fffff00
00116 };
00117
00118 static const int minMsgSize = 1360;
00119 static const int maxMsgSize = 2384;
00120
00121 int Enabled(Event theEvents) {return theEvents & enEvents;}
00122
00123 int maxSmsg() {return maxMin;}
00124 int maxLmsg() {return maxMax;}
00125
00126 void Notify(Event eNum, XrdOfsEvsInfo &Info);
00127
00128 static int Parse(XrdSysError &Eroute, Event eNum, char *mText);
00129
00130 const char *Prog() {return theTarget;}
00131
00132 void sendEvents(void);
00133
00134 int Start(XrdSysError *eobj);
00135
00136 XrdOfsEvs(Event theEvents, const char *Target, int minq=90, int maxq=10);
00137 ~XrdOfsEvs();
00138
00139 private:
00140 const char *eName(int eNum);
00141 int Feed(const char *data, int dlen);
00142 XrdOfsEvsMsg *getMsg(int bigmsg);
00143 void retMsg(XrdOfsEvsMsg *tp);
00144
00145 static XrdOfsEvsFormat MsgFmt[XrdOfsEvs::nCount];
00146
00147 pthread_t tid;
00148 char *theTarget;
00149 Event enEvents;
00150 XrdSysError *eDest;
00151 XrdOucProg *theProg;
00152 XrdSysMutex qMut;
00153 XrdSysSemaphore qSem;
00154 XrdOfsEvsMsg *msgFirst;
00155 XrdOfsEvsMsg *msgLast;
00156 XrdSysMutex fMut;
00157 XrdOfsEvsMsg *msgFreeMax;
00158 XrdOfsEvsMsg *msgFreeMin;
00159 int endIT;
00160 int msgFD;
00161 int numMax;
00162 int maxMax;
00163 int numMin;
00164 int maxMin;
00165 };
00166 #endif