109 while((theVal = va_arg(ap,
int)) >= 0)
125 theTarget = strdup(Target);
128 maxMin = minq; maxMax = maxq;
129 msgFirst = msgLast = msgFreeMax = msgFreeMin = 0;
216 while ((tp = msgFirst)) {msgFirst = tp->
next;
delete tp;}
217 if (theTarget) free(theTarget);
218 if (msgFD >= 0)
close(msgFD);
219 if (theProg)
delete theProg;
225 while ((tp = msgFreeMax)) {msgFreeMax = tp->
next;
delete tp;}
226 while ((tp = msgFreeMin)) {msgFreeMin = tp->
next;
delete tp;}
236 static int warnings = 0;
239 char modebuff[8], sizebuff[16];
245 if (eNum < 0 || eNum >=
nCount)
return;
251 {sprintf(modebuff,
"%o",
static_cast<int>((
Info.FMode() &
S_IAMB)));
255 {sprintf(sizebuff,
"%lld",
Info.FSize());
261 if (!(tp = getMsg(isBig)))
262 {
if ((++warnings & 0xff) == 1)
263 {eDest->
Emsg(
"Notify",
"Ran out of message objects;", eName(eNum),
264 "event notification not sent.");
277 if (msgLast) {msgLast->
next = tp; msgLast = tp;}
278 else msgFirst = msgLast = tp;
289 static struct valVar {
const char *vname;
303 int numvars =
sizeof(Vars)/
sizeof(
struct valVar);
304 char parms[1024], *pP = parms;
306 char varbuff[16], *bVar, *eVar;
313 while(*mText && pP < pE)
314 {
if (*mText ==
'\\' && *(mText+1) ==
'$')
315 {*pP++ =
'$'; mText += 2;
continue;}
316 else if (*mText !=
'$') {*pP++ = *mText++;
continue;}
318 if (*mText ==
'{') {eVar = index(mText,
'}'); j = 1;}
319 else if (*mText ==
'[') {eVar = index(mText,
']'); j = 1;}
320 else {eVar = bVar;
while(isalpha(*eVar)) eVar++; j = 0;}
322 if (i < 1 || i >= (
int)
sizeof(varbuff))
323 {Eroute.
Emsg(
"Parse",
"Invalid notifymsg variable starting at",mText);
326 strncpy(varbuff, bVar, i); varbuff[i] =
'\0';
327 for (i = 0; i < numvars; i++)
328 if (!strcmp(varbuff, Vars[i].vname))
break;
330 {Eroute.
Emsg(
"Parse",
"Unknown notifymsg variable -",varbuff);
334 {Eroute.
Say(
"Parse",
"Too many notifymsg variables");
return 1;}
335 strcpy(pP,
"%s"); pP += 2;
336 Args[aNum++] = Vars[i].vnum;
344 {Eroute.
Emsg(
"Parse",
"notifymsg text too long");
return 1;}
346 {Eroute.
Emsg(
"Parse",
"notifymsg text not specified");
return 1;}
352 MsgFmt[eNum].
Set(ArgOpts, strdup(parms), Args);
366 const char *theData[2] = {0,0};
367 int theDlen[2] = {0,0};
377 if ((tp = msgFirst) && !(msgFirst = tp->
next)) msgLast = 0;
380 {
if (!theProg) Feed(tp->
text, tp->
tlen);
381 else {theData[0] = tp->
text; theDlen[0] = tp->
tlen;
382 theProg->
Feed(theData, theDlen);
404 if (*theTarget ==
'>')
408 msgFD = msgSock->
Detach();
415 if (theProg)
return 0;
420 if (theProg->
Setup(theTarget, eobj))
return -1;
421 if ((rc = theProg->
Start()))
422 {eobj->
Emsg(
"Evs", rc,
"start event collector");
return -1;}
428 0,
"Event notification sender")))
429 {eobj->
Emsg(
"Evs", rc,
"create event notification thread");
445 const char *XrdOfsEvs::eName(
int eNum)
447 static const char *eventName[] = {
"Chmod",
"closer",
"closew",
"create",
448 "fwrite",
"mkdir",
"mv",
"openr",
449 "opnw",
"rm",
"rmdir",
"trunc"};
451 eNum = (eNum &
Mask);
452 return (eNum < 0 || eNum >=
nCount ?
"?" : eventName[eNum]);
459 int XrdOfsEvs::Feed(
const char *data,
int dlen)
465 do { retc =
write(msgFD, (
const void *)data, (
size_t)dlen);}
466 while (retc < 0 && errno == EINTR);
468 {eDest->
Emsg(
"EvsFeed", errno,
"write to event socket", theTarget);
493 if ((tp = msgFreeMax)) msgFreeMax = tp->
next;
495 else if ((tp = msgFreeMin)) msgFreeMin = tp->
next;
500 if (!tp && (numMax + numMin) < (maxMax + maxMin))
501 {
if ((tp =
new XrdOfsEvsMsg((
char *)malloc(msz), bigmsg)))
502 {
if (!(tp->
text)) {
delete tp; tp = 0;}
503 else if (bigmsg) numMax++;
528 if (numMax > maxMax) {
delete tp; numMax--;}
529 else {tp->
next = msgFreeMax; msgFreeMax = tp;}
531 if (numMin > maxMin) {
delete tp; numMin--;}
532 else {tp->
next = msgFreeMin; msgFreeMin = tp;}
void * XrdOfsEvsSend(void *pp)
ssize_t write(int fildes, const void *buf, size_t nbyte)
static XrdNetSocket * Create(XrdSysError *Say, const char *path, const char *fn, mode_t mode, int isudp=0)
XrdOfsEvsMsg(char *tval=0, int big=0)
static int Parse(XrdSysError &Eroute, Event eNum, char *mText)
XrdOfsEvs(Event theEvents, const char *Target, int minq=90, int maxq=10)
static const int maxMsgSize
int Start(XrdSysError *eobj)
static const int minMsgSize
void Notify(Event eNum, XrdOfsEvsInfo &Info)
int Feed(const char *data[], const int dlen[])
int Setup(const char *prog, XrdSysError *errP=0, int(*Proc)(XrdOucStream *, char **, int)=0)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
void Say(const char *text1, const char *text2=0, const char *txt3=0, const char *text4=0, const char *text5=0, const char *txt6=0)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
static int Kill(pthread_t tid)