#ifdef RCS
static char rcsid[]=
"$Id: comsat.c,v 1.5 2001/07/03 15:05:47 guenther Exp $";
#endif
#include "procmail.h"
#ifndef NO_COMSAT
#include "sublib.h"
#include "robust.h"
#include "shell.h"
#include "acommon.h"
#include "mailfold.h"
#include "misc.h"
#include "variables.h"
#include "network.h"
#include "comsat.h"
static int csvalid;
static struct sockaddr_in csaddr;
static char*cslastf,*cslgname;
void setlfcs(folder)const char*folder;
{ char*new,*old;
if(strchr(dirsep,*folder))
new=tstrdup(folder);
else
{ const char*md=tgetenv(maildir);
size_t len=strlen(md)+2+strlen(folder);
new=malloc(len);
strcpy(new,md);
strlcat(new,MCDIRSEP_,len);
strlcat(new,folder,len);
}
onguard();
old=cslastf;
cslastf=new;
offguard();
if(old)
free(old);
}
void setlgcs(name)const char*name;
{ char*new,*old;
new=tstrdup(name);
onguard();
old=cslgname;
cslgname=new;
offguard();
if(old)
free(old);
}
int setcomsat(chp)const char*chp;
{ char*chad;int newvalid; struct sockaddr_in newaddr;
chad=strchr(chp,SERV_ADDRsep);
if(!chad&&!renvint(-1L,chp))
return csvalid=0;
newvalid=1;
if(chad)
*chad++='\0';
if(!chad||!*chad)
#ifndef IP_localhost
chad=COMSAThost;
#else
{ static const unsigned char ip_localhost[]=IP_localhost;
newaddr.sin_family=AF_INET;
tmemmove(&newaddr.sin_addr,ip_localhost,sizeof ip_localhost);
}
else
#endif
{ const struct hostent*host;
if(!(host=gethostbyname(chad))||!host->h_0addr_list)
{ bbzero(&newaddr.sin_addr,sizeof newaddr.sin_addr);
newvalid=0;
}
else
{ newaddr.sin_family=host->h_addrtype;
tmemmove(&newaddr.sin_addr,host->h_0addr_list,host->h_length);
}
endhostent();
}
if(newvalid)
{ int s;
if(!*chp)
chp=BIFF_serviceport;
s=strtol(chp,&chad,10);
if(chp!=chad)
newaddr.sin_port=htons((short)s);
else
{ const struct servent*serv;
serv=getservbyname(chp,COMSATprotocol);
if(serv)
newaddr.sin_port=serv->s_port;
else
{ newaddr.sin_port=htons((short)0);
newvalid=0;
}
endservent();
}
}
onguard();
if(csvalid=newvalid)
tmemmove(&csaddr,&newaddr,sizeof(newaddr));
offguard();
return newvalid;
}
void sendcomsat(folder)const char*folder;
{ int s;const char*p;
if(!csvalid||!buf)
return;
if(!*cslgname||strlen(cslgname)+2>linebuf)
return;
if(!(p=folder?folder:cslastf))
return;
strcpy(buf,cslgname);
strlcat(buf,"@",linebuf);
if(lasttell>=0)
{ ultstr(0,(unsigned long)lasttell,buf2);
strlcat(buf,buf2,linebuf);
}
strlcat(buf,COMSATxtrsep,linebuf);
strlcat(buf,p,linebuf);
if((s=socket(AF_INET,SOCK_DGRAM,UDP_protocolno))>=0)
{ sendto(s,buf,strlen(buf),0,(struct sockaddr*)&csaddr,sizeof(csaddr));
rclose(s);
yell("Notified comsat:",buf);
}
}
#else
int comsat_dummy_var;
#endif