home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 2 BBS
/
02-BBS.zip
/
XGRP_000.SZH
/
ROUTE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-08-04
|
7KB
|
181 lines
#include "xgroup.h"
/* external var references */
extern char buffer[1024];
extern GROUP *group;
extern CONTROLS control;
extern ADDR *myaddr;
extern ECHOREC *echos;
extern ASSHOLE *assholes;
extern char *groupin;
extern char *groupout;
extern char *grouphold;
extern char *msgdir;
extern char *outbound;
extern char *inbound;
extern char *archive;
extern char *unarchive;
extern word packsize;
extern word netarea;
extern DUPES *dupes;
extern word nextdupe;
extern word maxdupes;
extern ROUTE *routes;
/* globals created here */
int _fastcall do_route (void) {
FILEFINDBUF f;
int search_handle,num_matches,handle;
ROUTE *rinfo;
long counter = 0L;
char *p,newpktname[32],newarcname[32];
struct stat st,chk;
if(!routes) return 0;
rinfo = routes;
while(rinfo) {
sprintf(buffer,"%s/P.%s",outbound,rinfo->mask);
search_handle = 1;
num_matches = 1;
if(!DosFindFirst(buffer,&search_handle,0,&f,
sizeof(FILEFINDBUF),&num_matches,0L)) {
do {
if(rinfo->addr) {
sprintf(buffer,"%s/A.%u.%u.%u.%u.%s",outbound,rinfo->addr->zone,
rinfo->addr->net,rinfo->addr->node,rinfo->addr->point,
rinfo->addr->domain);
}
else {
sprintf(buffer,"%s/%s",outbound,f.achName);
buffer[strlen(outbound) + 1] = 'A';
}
if(stat(buffer,&chk)) chk.st_size = 0L;
else if(access(buffer,6)) goto ContHere;
if(!chk.st_size) my_unlink(buffer);
sprintf(newpktname,"%08lx.PKT",time(NULL) + counter);
sprintf(buffer,"%s/%s %s/%s",outbound,f.achName,outbound,newpktname);
p = strrchr(buffer,' ');
if(!p) goto ContHere;
*p = 0;
p++;
my_rename(buffer,p);
sprintf(newarcname,"%08lx.MO0",time(NULL) + counter++);
if(rinfo->addr) {
sprintf(buffer,"%s/A.%u.%u.%u.%u.%s %s/%s",outbound,
rinfo->addr->zone,rinfo->addr->net,
rinfo->addr->node,rinfo->addr->point,
rinfo->addr->domain,outbound,newarcname);
}
else {
sprintf(buffer,"%s/%s %s/%s",outbound,f.achName,outbound,newarcname);
buffer[strlen(outbound) + 1] = 'A';
}
p = strrchr(buffer,' ');
if(!p) goto ContHere;
*p = 0;
p++;
my_rename(buffer,p);
sprintf(buffer,"%s %s %s",rinfo->archive,newarcname,newpktname);
if(!chk.st_size) printf("Creating ");
else printf("Adding to ");
if(rinfo->addr) {
printf("A.%u.%u.%u.%u.%s (%s)\n",
rinfo->addr->zone,rinfo->addr->net,
rinfo->addr->node,rinfo->addr->point,
rinfo->addr->domain,f.achName);
}
else printf("A%s\n",&f.achName[1]);
switch_to(outbound);
system(buffer);
switch_back();
if(rinfo->addr) {
sprintf(buffer,"%s/%s %s/A.%u.%u.%u.%u.%s",outbound,
newarcname,outbound,
rinfo->addr->zone,rinfo->addr->net,
rinfo->addr->node,rinfo->addr->point,
rinfo->addr->domain);
}
else {
sprintf(buffer,"%s/%s %s/%s",outbound,newarcname,
outbound,f.achName);
buffer[(strlen(outbound) * 2) + strlen(newarcname) + 3] = 'A';
}
p = strchr(buffer,' ');
if(!p) {
printf("\nOh, shit!\n\n");
logf("Routing problem (%s)",buffer);
goto ContHere;
}
*p = 0;
p++;
my_rename(buffer,p);
if(rinfo->addr) {
sprintf(buffer,"%s/A.%u.%u.%u.%u.%s",outbound,
rinfo->addr->zone,rinfo->addr->net,
rinfo->addr->node,rinfo->addr->point,
rinfo->addr->domain);
}
else {
sprintf(buffer,"%s/%s",outbound,f.achName);
buffer[strlen(outbound) + 1] = 'A';
}
if(stat(buffer,&st)) st.st_size = 0L;
if(chk.st_size >= st.st_size || !st.st_size) {
if(!st.st_size) my_unlink(buffer);
sprintf(buffer,"%s/%s %s/%s",outbound,newpktname,outbound,f.achName);
p = strchr(buffer,' ');
if(p) {
*p = 0;
p++;
my_rename(buffer,p);
printf("\nArchive attempt failed (%s)\n\n",f.achName);
logf("Archive attempt failed (%s)",f.achName);
goto ContHere;
}
}
sprintf(buffer,"%s/%s",outbound,newpktname);
my_unlink(buffer);
if(rinfo->addr) { /* create empty attach if required */
sprintf(buffer,"%s/%c.%u.%u.%u.%u.%s",outbound,rinfo->type,
rinfo->addr->zone,rinfo->addr->net,
rinfo->addr->node,rinfo->addr->point,
rinfo->addr->domain);
}
else {
sprintf(buffer,"%s/%s",outbound,f.achName);
buffer[strlen(outbound) + 1] = rinfo->type;
}
handle = sopen(buffer,O_RDWR | O_CREAT | O_BINARY,SH_DENYNO,S_IWRITE | S_IREAD);
if(handle != -1) close(handle);
ContHere:
num_matches = 1;
} while(!DosFindNext(search_handle,&f,sizeof(FILEFINDBUF),
&num_matches));
DosFindClose(search_handle);
}
rinfo = rinfo->next;
}
return 0;
}