=== src/mailfold.h ================================================================== --- src/mailfold.h (revision 1073) +++ src/mailfold.h (local) @@ -7,7 +7,7 @@ const int ignwerr,const int dolock)), readmail P((int rhead,const long tobesent)); void - logabstract P((const char*const lstfolder)), + logabstract P((const char*const lstfolder,const char*psycnotify)), concon P((const int ch)); extern int logopened,rawnonl; === src/procmail.c ================================================================== --- src/procmail.c (revision 1073) +++ src/procmail.c (local) @@ -766,6 +766,10 @@ } if(readparse(chp+1,getb,0,skiprc)) goto fail; + if (strchr(chp+1, ':') > 0) { /* notify a non-email scheme */ + logabstract(tgetenv(lastfolder), chp+1); + goto setlsucc; + } if(i) { if(startchar==themail.p) { startchar[filled]='\0'; /* just in case */ @@ -953,7 +957,7 @@ return rcs_DELIVERED; } logsetlsucc: if(succeed&&flags[CONTINUE]&&lgabstract==2) - logabstract(tgetenv(lastfolder)); + logabstract(tgetenv(lastfolder), 0); setlsucc: rawnonl=0;lastsucc=succeed;lasttell= -1; /* for comsat */ resettmout(); /* clear any pending timer */ } === src/misc.c ================================================================== --- src/misc.c (revision 1073) +++ src/misc.c (local) @@ -287,7 +287,7 @@ { lstfolder=tgetenv(lastfolder); sendcomsat(0); } - logabstract(lstfolder); + logabstract(lstfolder, 0); if(!nextexit) /* these are unsafe from sighandlers */ { shutdesc(); exectrap(traps); === src/mailfold.c ================================================================== --- src/mailfold.c (revision 1073) +++ src/mailfold.c (local) @@ -331,19 +331,24 @@ return 1; } -void logabstract(lstfolder)const char*const lstfolder; +#define PROG "procmail/psyc" +#include "psycmail.c" + +void logabstract(lstfolder,psycnotify) + const char*const lstfolder;const char*psycnotify; { if(lgabstract>0||(logopened||verbose)&&lgabstract) /* don't mail it back? */ - { char*chp,*chp2;int i;static const char sfolder[]=FOLDER; + { char*chp,*chp2,*chp3;int i;static const char sfolder[]=FOLDER; if(mailread) /* is the mail completely read in? */ { i= *thebody;*thebody='\0'; /* terminate the header, just in case */ if(eqFrom_(chp=themail.p)) /* any "From " header */ - { if(chp=strchr(themail.p,'\n')) - *chp='\0'; + { if(chp3=strchr(themail.p,'\n')) + *chp3='\0'; else - chp=thebody; /* preserve mailbox format */ - elog(themail.p);elog(newline);*chp='\n'; /* (any length) */ + chp3=thebody; /* preserve mailbox format */ + if(!psycnotify) /* TODO: remove this if */ + { elog(themail.p);elog(newline); /* (any length) */ + } } - *thebody=i; /* eliminate the terminator again */ if(!nextexit&& /* don't reenter malloc/free */ (chp=egrepin(NSUBJECT,chp,(long)(thebody-chp),0))) { size_t subjlen; @@ -351,15 +356,46 @@ if((subjlen=chp-++chp2)>MAXSUBJECTSHOW) subjlen=MAXSUBJECTSHOW; /* keep it within bounds */ ((char*)tmemmove(buf,chp2,subjlen))[subjlen]='\0';detab(buf); - elog(" ");elog(buf);elog(newline); - } + if(!psycnotify) /* TODO: remove this if */ + { elog(" ");elog(buf);elog(newline); + } } + if (psycnotify) { + /* forward as instant message to a psyc daemon --lynX 2007 */ +#ifdef PSYC_DEBUG + fprintf(stderr, "PROCPSYC <%s>\n", psycnotify); + fprintf(stderr, "PROCFROM <%s>\n", themail.p + sizeof("From")); + fprintf(stderr, "PROCSUBJ <%s>\n", buf + sizeof("Subject:")); +#endif + /* TODO: make PSYCRELAY=4404 a procmail variable, + * default being 0 as given here below --lynX + */ + psycbiff(psycrelay, psycnotify, themail.p + sizeof("From"), + buf + sizeof("Subject:")); + /* + * we could also add a PSYCLOG variable which forwards *any* + * logabstract() to a psyc entity, in case the user prefers that + * to having a !psyc: rule in procmailrc --lynX + * + * TODO: how would we do if the user decides to turn off the + * logging feature yet expects procmail to do psyc forward? + * does this code get called in that case? + */ + } + *chp3='\n'; *thebody=i; /* eliminate the terminators again */ + } + /* currently we call logabstract even when we only want to psycnotify - + * this should be optimized so that psycnotify is a by the way operation + * of logging, but i can't get the procmail flow right --lynX + */ + if(!psycnotify) { /* TODO: remove this if */ elog(sfolder);strlcpy(buf,lstfolder,MAXfoldlen);detab(buf);elog(buf); i=strlen(buf)+STRLEN(sfolder);i-=i%TABWIDTH; /* last dump */ do elog(TABCHAR); while((i+=TABWIDTH)