00001 #ifndef __XRDCnsLogRec_H_
00002 #define __XRDCnsLogRec_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <stddef.h>
00034 #include <stdio.h>
00035 #include <string.h>
00036 #include <time.h>
00037 #include <sys/param.h>
00038 #include <sys/types.h>
00039
00040 #include "XrdSys/XrdSysPlatform.hh"
00041 #include "XrdSys/XrdSysPthread.hh"
00042
00043 class XrdCnsLogRec
00044 {
00045 public:
00046
00047 static const int maxClients = 4;
00048
00049 struct Ctl
00050 {short dataLen;
00051 short lfn1Len;
00052 short lfn2Len;
00053 short Mode;
00054 char Done[maxClients];
00055 int Rsvd;
00056 long long Size;
00057 };
00058
00059 struct Arg
00060 {char Type;
00061 char Mode[3];
00062 char SorT[12];
00063 char Mount;
00064 char Space;
00065 char Rsvd[6];
00066 char lfn[MAXPATHLEN*2+3];
00067 };
00068
00069 struct LogRec
00070 {struct Ctl Hdr;
00071 struct Arg Data;
00072 };
00073
00074 static const int OffDone = offsetof(LogRec, Hdr.Done);
00075 static const int FixDLen = offsetof(Arg, lfn);
00076 static const int MinSize = sizeof(Ctl);
00077 static const int MaxSize = sizeof(Arg);
00078 static const long tBase = 1248126834L;
00079
00080 static const char lrClosew = 't';
00081 static const char lrCreate = 'c';
00082 static const char lrEOL = 'E';
00083 static const char lrInvD = 'I';
00084 static const char lrInvF = 'i';
00085 static const char lrMkdir = 'd';
00086 static const char lrMount = 'M';
00087 static const char lrMv = 'm';
00088 static const char lrRm = 'r';
00089 static const char lrRmdir = 'D';
00090 static const char lrSpace = 'S';
00091 static const char lrTOD = 'T';
00092
00093 static const char *IArg;
00094 static const char *iArg;
00095
00096 static XrdCnsLogRec *Alloc();
00097
00098 inline const char *Data() {return (const char *)&Rec.Data;}
00099
00100 inline int DLen() {return Rec.Hdr.dataLen;}
00101
00102 inline int Done(int iPos) {return Rec.Hdr.Done[iPos];}
00103
00104 static XrdCnsLogRec *Get(char &lrType);
00105
00106 inline const char *Lfn1() {return Rec.Data.lfn;}
00107
00108 inline const char *Lfn1(int &Len) {Len=Rec.Hdr.lfn1Len; return Rec.Data.lfn;}
00109
00110 inline const char *Lfn2() {return Rec.Data.lfn+Rec.Hdr.lfn1Len+1;}
00111
00112 inline mode_t Mode() {return static_cast<mode_t>(Rec.Hdr.Mode);}
00113
00114 void Queue();
00115
00116 void Recycle();
00117
00118 inline char *Record() {return (char *)&Rec;}
00119
00120
00121
00122 int setData(const char *dP1, const char *dP2=0);
00123
00124 void setDone(int iPos, char Val=1) {Rec.Hdr.Done[iPos] = Val;}
00125
00126 int setLen() {if (Rec.Hdr.lfn1Len)
00127 {Rec.Hdr.dataLen = FixDLen+Rec.Hdr.lfn1Len+1;
00128 if (Rec.Hdr.lfn2Len)
00129 Rec.Hdr.dataLen += Rec.Hdr.lfn2Len+1;
00130 } else Rec.Hdr.dataLen = 0;
00131 return static_cast<int>(Rec.Hdr.dataLen);
00132 }
00133
00134 inline int setLfn1(const char *lfn)
00135 {int n;
00136 n = strlcpy(Rec.Data.lfn, lfn, MAXPATHLEN+1);
00137 if (n > MAXPATHLEN) return 0;
00138 Rec.Hdr.lfn1Len = n;
00139 return n;
00140 }
00141
00142 inline int setLfn2(const char *lfn)
00143 {int n;
00144 setSize(static_cast<long long>(Rec.Hdr.lfn1Len));
00145 n = strlcpy(Rec.Data.lfn + Rec.Hdr.lfn1Len + 1,
00146 lfn, MAXPATHLEN+1);
00147 if (n > MAXPATHLEN) return 0;
00148 Rec.Hdr.lfn2Len = n;
00149 return n;
00150 }
00151
00152 inline void setMode(mode_t Mode) {char mBuff[8];
00153 Rec.Hdr.Mode = Mode;
00154 snprintf(mBuff,sizeof(mBuff),"%03o",
00155 511 & static_cast<int>(Mode));
00156 memcpy(Rec.Data.Mode, mBuff,
00157 sizeof(Rec.Data.Mode));
00158 }
00159
00160 inline void setMount(char mCode) {Rec.Data.Mount = mCode;}
00161
00162 inline void setSize(long long Size) {char tBuff[24];
00163 Rec.Hdr.Size = Size;
00164 snprintf(tBuff, sizeof(tBuff),
00165 "%12lld",
00166 (Size > 0 ? Size & 0x7fffffffffLL
00167 : Size));
00168 memcpy(Rec.Data.SorT, tBuff,
00169 sizeof(Rec.Data.SorT));
00170 }
00171
00172 inline void setSpace(char sCode) {Rec.Data.Space = sCode;}
00173
00174 inline void setTime(long TOD=time(0)){char tBuff[24];
00175 snprintf(tBuff, sizeof(tBuff),
00176 "%12ld", TOD-tBase);
00177 memcpy(Rec.Data.SorT, tBuff,
00178 sizeof(Rec.Data.SorT));
00179 }
00180
00181 inline void setType(const char evt) {Rec.Data.Type = evt;}
00182
00183 int setType(const char *evt);
00184
00185 inline long long Size() {return Rec.Hdr.Size;}
00186
00187 inline char Space(){return Rec.Data.Space;}
00188
00189 inline int L1sz() {return Rec.Hdr.lfn1Len;}
00190
00191 inline int L2sz() {return Rec.Hdr.lfn2Len;}
00192
00193 char Type() {return Rec.Data.Type;}
00194
00195 XrdCnsLogRec(const char rType=0) : Next(0)
00196 {memset(&Rec, 0, sizeof(Rec.Hdr));
00197 memset(&Rec.Data,' ', FixDLen);
00198 Rec.Data.Type = rType;
00199 if (rType == lrEOL || rType == lrTOD)
00200 {setTime();
00201 Rec.Hdr.dataLen=FixDLen;
00202 if (rType == lrTOD)
00203 {Rec.Data.lfn[0] = ' ';
00204 Rec.Data.lfn[1] = '\0';
00205 Rec.Hdr.lfn1Len = 1;
00206 }
00207 }
00208 }
00209 ~XrdCnsLogRec() {}
00210
00211 private:
00212
00213 static XrdSysSemaphore qSem;
00214 static XrdSysMutex qMutex;
00215 static XrdSysMutex fMutex;
00216 static XrdCnsLogRec *freeRec;
00217 static XrdCnsLogRec *frstRec;
00218 static XrdCnsLogRec *lastRec;
00219 static int Running;
00220
00221 XrdCnsLogRec *Next;
00222 LogRec Rec;
00223 };
00224 #endif