00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 const char *XrdCnsDaemonCVSID = "$Id: XrdCnsDaemon.cc 35287 2010-09-14 21:19:35Z ganis $";
00014
00015 #include <errno.h>
00016 #include <unistd.h>
00017 #include <fcntl.h>
00018 #include <string.h>
00019 #include <stdio.h>
00020 #include <sys/types.h>
00021 #include <sys/stat.h>
00022 #include <sys/uio.h>
00023
00024 #include "Xrd/XrdTrace.hh"
00025
00026 #include "XrdSys/XrdSysError.hh"
00027 #include "XrdSys/XrdSysHeaders.hh"
00028
00029 #include "XrdOuc/XrdOucStream.hh"
00030 #include "XrdCns/XrdCnsDaemon.hh"
00031 #include "XrdCns/XrdCnsLogRec.hh"
00032
00033
00034
00035
00036
00037 namespace XrdCns
00038 {
00039 extern XrdSysError MLog;
00040
00041 extern XrdOucTrace XrdTrace;
00042
00043 XrdCnsDaemon XrdCnsd;
00044 }
00045
00046 using namespace XrdCns;
00047
00048
00049
00050
00051
00052 void XrdCnsDaemon::getEvents(XrdOucStream &Events, const char *Who)
00053 {
00054 const char *Miss = 0, *TraceID = "getEvents";
00055 long long Size;
00056 mode_t Mode;
00057 const char *eP;
00058 char *tp, *etp;
00059 XrdCnsLogRec *evP = 0;
00060
00061
00062
00063
00064
00065 while((tp = Events.GetLine()) && *tp)
00066 {TRACE(DEBUG, "Event: '" <<tp <<"'");
00067 eP = "?";
00068 if (!(tp = Events.GetToken())) Miss = "traceid";
00069 else {evP = XrdCnsLogRec::Alloc();
00070 if (!(eP = Events.GetToken())
00071 || !evP->setType(eP)) Miss = "eventid";
00072 else {switch(evP->Type())
00073 {case XrdCnsLogRec::lrClosew:
00074 if (!(tp=getLFN(Events))) {Miss = "lfn"; break;}
00075 evP->setLfn1(tp);
00076 if (!(tp=Events.GetToken())) {Miss = "size"; break;}
00077 Size = strtoll(tp, &etp, 10);
00078 if (*etp) {Miss = "size"; break;}
00079 evP->setSize(Size);
00080 break;
00081 case XrdCnsLogRec::lrMkdir:
00082 evP->setSize(-1);
00083 case XrdCnsLogRec::lrCreate:
00084 if (!(tp=Events.GetToken())) {Miss = "mode"; break;}
00085 Mode = strtol(tp, &etp, 8);
00086 if (*etp) {Miss = "mode"; break;}
00087 evP->setMode(Mode);
00088 if (!(tp=getLFN(Events))) {Miss = "lfn"; break;}
00089 evP->setLfn1(tp);
00090 break;
00091 case XrdCnsLogRec::lrMv:
00092 if (!(tp=getLFN(Events))) {Miss = "lfn1"; break;}
00093 evP->setLfn1(tp);
00094 if (!(tp=getLFN(Events))) {Miss = "lfn2"; break;}
00095 evP->setLfn2(tp);
00096 break;
00097 default:
00098 if (!(tp=getLFN(Events))) {Miss = "lfn"; break;}
00099 evP->setLfn1(tp);
00100 break;
00101 }
00102 } }
00103
00104 if (Miss) {MLog.Emsg("doEvents", Miss, "missing in event", eP);
00105 if (evP) evP->Recycle();
00106 Miss = 0;
00107 continue;
00108 }
00109
00110 evP->Queue();
00111 }
00112
00113
00114
00115 MLog.Emsg("doEvents", "Lost event connection to", Who, "!");
00116 }
00117
00118
00119
00120
00121
00122 char *XrdCnsDaemon::getLFN(XrdOucStream &Events)
00123 {
00124 char *tP, *cgiP;
00125
00126
00127
00128
00129 if ((tP=Events.GetToken()) && (cgiP = index(tP, '?'))) *cgiP = '\0';
00130 return tP;
00131 }