home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 2 BBS / 02-BBS.zip / XGRP_000.SZH / ROUTE.C < prev    next >
C/C++ Source or Header  |  1991-08-04  |  7KB  |  181 lines

  1. #include "xgroup.h"
  2.  
  3. /* external var references */
  4.  
  5. extern char     buffer[1024];
  6. extern GROUP    *group;
  7. extern CONTROLS control;
  8. extern ADDR     *myaddr;
  9. extern ECHOREC  *echos;
  10. extern ASSHOLE  *assholes;
  11. extern char     *groupin;
  12. extern char     *groupout;
  13. extern char     *grouphold;
  14. extern char     *msgdir;
  15. extern char     *outbound;
  16. extern char     *inbound;
  17. extern char     *archive;
  18. extern char     *unarchive;
  19. extern word     packsize;
  20. extern word     netarea;
  21. extern DUPES    *dupes;
  22. extern word     nextdupe;
  23. extern word     maxdupes;
  24. extern ROUTE    *routes;
  25.  
  26. /* globals created here */
  27.  
  28.  
  29.  
  30.  
  31. int _fastcall do_route (void) {
  32.  
  33.     FILEFINDBUF f;
  34.     int         search_handle,num_matches,handle;
  35.     ROUTE       *rinfo;
  36.     long        counter = 0L;
  37.     char        *p,newpktname[32],newarcname[32];
  38.     struct stat st,chk;
  39.  
  40.  
  41.     if(!routes) return 0;
  42.  
  43.     rinfo = routes;
  44.     while(rinfo) {
  45.         sprintf(buffer,"%s/P.%s",outbound,rinfo->mask);
  46.         search_handle = 1;
  47.         num_matches = 1;
  48.         if(!DosFindFirst(buffer,&search_handle,0,&f,
  49.           sizeof(FILEFINDBUF),&num_matches,0L)) {
  50.             do {
  51.                 if(rinfo->addr) {
  52.                     sprintf(buffer,"%s/A.%u.%u.%u.%u.%s",outbound,rinfo->addr->zone,
  53.                             rinfo->addr->net,rinfo->addr->node,rinfo->addr->point,
  54.                             rinfo->addr->domain);
  55.                 }
  56.                 else {
  57.                     sprintf(buffer,"%s/%s",outbound,f.achName);
  58.                     buffer[strlen(outbound) + 1] = 'A';
  59.                 }
  60.                 if(stat(buffer,&chk)) chk.st_size = 0L;
  61.                 else if(access(buffer,6)) goto ContHere;
  62.                 if(!chk.st_size) my_unlink(buffer);
  63.  
  64.                 sprintf(newpktname,"%08lx.PKT",time(NULL) + counter);
  65.                 sprintf(buffer,"%s/%s %s/%s",outbound,f.achName,outbound,newpktname);
  66.                 p = strrchr(buffer,' ');
  67.                 if(!p) goto ContHere;
  68.                 *p = 0;
  69.                 p++;
  70.                 my_rename(buffer,p);
  71.  
  72.                 sprintf(newarcname,"%08lx.MO0",time(NULL) + counter++);
  73.                 if(rinfo->addr) {
  74.                     sprintf(buffer,"%s/A.%u.%u.%u.%u.%s %s/%s",outbound,
  75.                             rinfo->addr->zone,rinfo->addr->net,
  76.                             rinfo->addr->node,rinfo->addr->point,
  77.                             rinfo->addr->domain,outbound,newarcname);
  78.                 }
  79.                 else {
  80.                     sprintf(buffer,"%s/%s %s/%s",outbound,f.achName,outbound,newarcname);
  81.                     buffer[strlen(outbound) + 1] = 'A';
  82.                 }
  83.                 p = strrchr(buffer,' ');
  84.                 if(!p) goto ContHere;
  85.                 *p = 0;
  86.                 p++;
  87.                 my_rename(buffer,p);
  88.  
  89.                 sprintf(buffer,"%s %s %s",rinfo->archive,newarcname,newpktname);
  90.  
  91.                 if(!chk.st_size) printf("Creating ");
  92.                 else printf("Adding to ");
  93.                 if(rinfo->addr) {
  94.                     printf("A.%u.%u.%u.%u.%s (%s)\n",
  95.                             rinfo->addr->zone,rinfo->addr->net,
  96.                             rinfo->addr->node,rinfo->addr->point,
  97.                             rinfo->addr->domain,f.achName);
  98.                 }
  99.                 else printf("A%s\n",&f.achName[1]);
  100.  
  101.                 switch_to(outbound);
  102.                 system(buffer);
  103.                 switch_back();
  104.  
  105.                 if(rinfo->addr) {
  106.                     sprintf(buffer,"%s/%s %s/A.%u.%u.%u.%u.%s",outbound,
  107.                             newarcname,outbound,
  108.                             rinfo->addr->zone,rinfo->addr->net,
  109.                             rinfo->addr->node,rinfo->addr->point,
  110.                             rinfo->addr->domain);
  111.                 }
  112.                 else {
  113.                     sprintf(buffer,"%s/%s %s/%s",outbound,newarcname,
  114.                             outbound,f.achName);
  115.                     buffer[(strlen(outbound) * 2) + strlen(newarcname) + 3] = 'A';
  116.                 }
  117.                 p = strchr(buffer,' ');
  118.                 if(!p) {
  119.                     printf("\nOh, shit!\n\n");
  120.                     logf("Routing problem (%s)",buffer);
  121.                     goto ContHere;
  122.                 }
  123.                 *p = 0;
  124.                 p++;
  125.                 my_rename(buffer,p);
  126.  
  127.                 if(rinfo->addr) {
  128.                     sprintf(buffer,"%s/A.%u.%u.%u.%u.%s",outbound,
  129.                             rinfo->addr->zone,rinfo->addr->net,
  130.                             rinfo->addr->node,rinfo->addr->point,
  131.                             rinfo->addr->domain);
  132.                 }
  133.                 else {
  134.                     sprintf(buffer,"%s/%s",outbound,f.achName);
  135.                     buffer[strlen(outbound) + 1] = 'A';
  136.                 }
  137.  
  138.                 if(stat(buffer,&st)) st.st_size = 0L;
  139.                 if(chk.st_size >= st.st_size || !st.st_size) {
  140.                     if(!st.st_size) my_unlink(buffer);
  141.                     sprintf(buffer,"%s/%s %s/%s",outbound,newpktname,outbound,f.achName);
  142.                     p = strchr(buffer,' ');
  143.                     if(p) {
  144.                         *p = 0;
  145.                         p++;
  146.                         my_rename(buffer,p);
  147.                         printf("\nArchive attempt failed (%s)\n\n",f.achName);
  148.                         logf("Archive attempt failed (%s)",f.achName);
  149.                         goto ContHere;
  150.                     }
  151.                 }
  152.                 sprintf(buffer,"%s/%s",outbound,newpktname);
  153.                 my_unlink(buffer);
  154.  
  155.                 if(rinfo->addr) {   /* create empty attach if required */
  156.                     sprintf(buffer,"%s/%c.%u.%u.%u.%u.%s",outbound,rinfo->type,
  157.                             rinfo->addr->zone,rinfo->addr->net,
  158.                             rinfo->addr->node,rinfo->addr->point,
  159.                             rinfo->addr->domain);
  160.                 }
  161.                 else {
  162.                     sprintf(buffer,"%s/%s",outbound,f.achName);
  163.                     buffer[strlen(outbound) + 1] = rinfo->type;
  164.                 }
  165.                 handle = sopen(buffer,O_RDWR | O_CREAT | O_BINARY,SH_DENYNO,S_IWRITE | S_IREAD);
  166.                 if(handle != -1) close(handle);
  167.  
  168. ContHere:
  169.  
  170.                 num_matches = 1;
  171.             } while(!DosFindNext(search_handle,&f,sizeof(FILEFINDBUF),
  172.                                  &num_matches));
  173.             DosFindClose(search_handle);
  174.         }
  175.  
  176.         rinfo = rinfo->next;
  177.     }
  178.  
  179.     return 0;
  180. }
  181.