home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 2 BBS
/
02-BBS.zip
/
XGRP_000.SZH
/
RESCAN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-22
|
10KB
|
344 lines
/* echomail rescanner */
#include "xgroup.h"
#define MAXKLUDGE 256
#define SETSCANNED(x) (x.m_attr |= MSGSCANNED)
#define SETSENT(x) (x.attr |= MSGSENT)
#define RESETSENT(x) (x.attr &= (~MSGSENT))
#define SETDELETED(x) (x.m_attr |= MSGDELETED)
/* function declarations specific to this module */
static int _fastcall open_pkt (ADDR *addr);
static int _fastcall write_pkt_msg (int fp,XMSG *amsg,char *npth,
char *text,char *area);
static int _fastcall do_export(ECHOREC *einfo,int dataptr,
int textptr,ADDR *addr,
unsigned int startat);
/* external var references */
extern GROUP *group;
extern CONTROLS control;
extern ADDR *myaddr;
extern ECHOREC *echos;
extern char *groupin;
extern char *groupout;
extern char *grouphold;
extern char *msgdir;
extern char *archive;
extern char *unarchive;
extern char *outbound;
extern char *inbound;
extern word packsize;
extern char buffer[1024];
extern word netarea;
extern DUPES *dupes;
extern word nextdupe,maxdupes;
extern char founddupes;
void _fastcall rescan_echo_mail (ECHOREC *currecho,ADDR *addr,
unsigned int startat) {
word exported;
int dataptr,textptr;
struct stat st;
if(!currecho || !addr) return;
printf("\nRescanning echo area \"%s\"for %u:%u/%u.%u@%s...",currecho->tag,
addr->zone,addr->net,addr->node,addr->point,addr->domain);
sprintf(buffer,"%s/XDATA.%03x",msgdir,currecho->areano);
if(stat(buffer,&st)) st.st_size = 0L;
if(!st.st_size) {
printf("no msgs\n\x1b[K");
return;
}
else printf("%u msg%s\n\x1b[K",(word)(st.st_size / (long)sizeof(XMSG)),
&"s"[((word)(st.st_size / (long)sizeof(XMSG)) == 1)]);
dataptr = sopen(buffer,O_RDWR | O_BINARY,SH_DENYNO);
if(dataptr == -1) {
printf("\nCouldn't open data file %s\n",buffer);
return;
}
sprintf(buffer,"%s/XTEXT.%03x",msgdir,currecho->areano);
textptr = sopen(buffer,O_RDWR | O_BINARY,SH_DENYNO);
if(textptr == -1) {
close(dataptr);
printf("\nCouldn't open text file %s\n",buffer);
return;
}
exported = do_export(currecho,dataptr,textptr,addr,startat);
close(textptr);
close(dataptr);
if(exported)
logf("Rescanned %u msg%s from area #%u \"%s\" for %u:%u/%u.%u@%s",
exported,&"s"[(exported == 1)],currecho->areano,currecho->tag,
addr->zone,addr->net,addr->node,addr->point,addr->domain);
}
static int _fastcall do_export (ECHOREC *einfo,int dataptr,
int textptr,ADDR *addr,
unsigned int startat) {
word x,tries,test,exported = 0;
word nummsgs;
long pos;
int fp;
char *text = NULL;
XMSG xmsg;
ADDR *maddr;
tries = 0;
while(tries < 50) {
if(lseek(dataptr,0L,SEEK_END) != -1L) break;
DosSleep(100L);
tries++;
}
if(tries >= 50) {
printf("\nLocking conflict; aborting...(#14)\n");
return 0;
}
maddr = best_guess(addr,myaddr);
fp = open_pkt(addr);
if(fp == -1) {
return 0;
}
if(startat) startat--;
nummsgs = (word)(tell(dataptr) / (long)sizeof(XMSG));
for(x = startat;x < nummsgs;x++) {
tries = 0;
while(tries < 50) {
if(lseek(dataptr,(long)x * (long)sizeof(XMSG),SEEK_SET) != -1L) break;
DosSleep(100L);
tries++;
}
if(tries >= 50) {
printf("\nLocking conflict; aborting...(#15)\n");
if(fp != -1) close(fp);
return exported;
}
pos = tell(dataptr);
tries = 0;
while(tries < 50) {
if((size_t)read(dataptr,&xmsg,sizeof(XMSG)) == sizeof(XMSG)) break;
DosSleep(100L);
tries++;
lseek(dataptr,pos,SEEK_SET);
}
if(tries >= 50) {
printf("\nLocking conflict; aborting...(#16)\n");
if(fp != -1) close(fp);
return -1;
}
if(xmsg.m_attr & MSGDELETED) continue;
if(!(xmsg.m_attr & MSGECHO)) continue;
/* Got one to export */
tries = 0;
while(tries < 50) {
if(lseek(textptr,xmsg.start,SEEK_SET) != -1L) break;
DosSleep(100L);
tries++;
}
if(tries >= 50) {
printf("\nLocking conflict; aborting...(#17)\n");
if(fp != -1) close(fp);
return exported;
}
text = (char *)malloc(xmsg.length + 2);
if(!text) continue;
tries = 0;
while(tries < 50) {
*text = 0;
test = (word)read(textptr,text,xmsg.length + 1);
if(test != 65535U) {
if(test >= (xmsg.length - 1)) break;
}
DosSleep(100L);
tries++;
lseek(textptr,xmsg.start,SEEK_SET);
}
if(tries >= 50) {
printf("\nLocking conflict; aborting...(#19)\n");
if(fp != -1) close(fp);
return exported;
}
if(!*text){
my_free(text);
text = NULL;
continue;
}
if(xmsg.m_attr & MSGPACKED) {
if(unpack_msg(&text) == NULL) {
my_free(text);
text = NULL;
continue;
}
}
exported++;
xmsg.d_zone = addr->zone;
xmsg.dest_net = addr->net;
xmsg.dest = addr->node;
xmsg.d_point = addr->point;
printf("#%u (#%u)\r",
x+1,exported);
text[xmsg.length] = 0;
text[xmsg.length-1] = 0;
write_pkt_msg(fp,&xmsg,NULL,text,einfo->tag);
}
if(fp != -1) close(fp);
my_free(text);
text = NULL;
}
static int _fastcall open_pkt (ADDR *addr) {
int fp;
long pos;
PKTHDR ph;
ADDR *maddr;
static char currout[1027];
char *p;
/* Open (create if necessary) a packet for address given.
Return a file handle for the packet positioned to eop */
if(!control.xbbsos2) {
strcpy(currout,outbound);
if(addr->domain && *addr->domain && stricmp(myaddr->domain,addr->domain)) {
p = strrchr(currout,'\\');
if(p) p++;
else p = &currout[strlen(currout)];
strcat(currout,addr->domain);
}
if(myaddr->zone != addr->zone) {
sprintf(&currout[strlen(currout)],".%03x",addr->zone);
DosMkDir(currout,0L);
}
sprintf(buffer,"%s/%04x%04x.OUT",currout,addr->net,addr->node);
}
else {
sprintf(buffer,"%s/P.%u.%u.%u.%u.%0.8s",outbound,addr->zone,addr->net,
addr->node,addr->point,addr->domain);
}
fp = sopen(buffer,O_RDWR | O_BINARY | O_CREAT,SH_DENYWR,S_IREAD | S_IWRITE);
if(fp != -1) {
lseek(fp,0L,SEEK_END);
if(!tell(fp)) {
memset(&ph,0,sizeof(PKTHDR));
ph.version = 2;
ph.subver = 2;
ph.dnode = addr->node;
ph.dnet = addr->net;
ph.dzone = addr->zone;
ph.dpoint = addr->point;
strncpy(ph.ddomain,addr->domain,8);
maddr = best_guess(addr,myaddr);
ph.onode = maddr->node;
ph.onet = maddr->net;
ph.ozone = maddr->zone;
ph.opoint = maddr->point;
strncpy(ph.odomain,maddr->domain,8);
write(fp,&ph,sizeof(PKTHDR));
write(fp,"\0",2);
}
pos = tell(fp);
if(pos) lseek(fp,pos - 2L,SEEK_SET); /* Position to next msg spot */
}
return fp;
}
static int _fastcall write_pkt_msg (int fp,XMSG *amsg,char *npth,
char *text,char *area) {
char pmsg[192],*p;
word x;
/* Write the message given to the end of the file given as a
packed msg */
memset(pmsg,192,0);
*pmsg = 0x02;
pmsg[1] = 0x00;
memcpy(&pmsg[2],&amsg->orig,2);
memcpy(&pmsg[4],&amsg->dest,2);
memcpy(&pmsg[6],&amsg->orig_net,2);
memcpy(&pmsg[8],&amsg->dest_net,2);
memcpy(&pmsg[10],&amsg->attr,2);
x = 0;
memcpy(&pmsg[12],&x,2);
for(x = 0;x < 20;x++) if(!amsg->date[x]) amsg->date[x] = 'Q';
amsg->date[19] = 0; /* damn qmail anyway... */
memcpy(&pmsg[14],amsg->date,20);
p = &pmsg[34];
strcpy(p,amsg->to);
x = 34;
while(*p){
x++;
p++;
}
p++;
x++;
strcpy(p,amsg->from);
while(*p){
x++;
p++;
}
x++;
p++;
strcpy(p,amsg->subj);
while(*p){
x++;
p++;
}
x++;
p++;
write(fp,pmsg,x);
if(area && *area) { /* Prepend area tag */
write(fp,"AREA: ",6);
write(fp,area,strlen(area));
write(fp,"\r",1);
}
if(npth) write(fp,npth,strlen(npth));
write(fp,text,strlen(text));
write(fp,"\0\0",3);
lseek(fp,(tell(fp) - 2L),SEEK_SET); /* Ready for another msg */
return 1;
}