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

  1. #include "xgroup.h"
  2.  
  3. /* external var references */
  4.  
  5. extern GROUP    *group;
  6. extern CONTROLS control;
  7. extern ADDR     *myaddr;
  8. extern ECHOREC  *echos;
  9. extern char     *groupin;
  10. extern char     *groupout;
  11. extern char     *grouphold;
  12. extern char     *msgdir;
  13. extern char     *outbound;
  14. extern char     *inbound;
  15. extern char     *archive;
  16. extern char     *unarchive;
  17. extern word     packsize;
  18. extern word     netarea;
  19. extern char     buffer[1024];
  20.  
  21. #define MAXPATH  12480
  22.  
  23.  
  24.  
  25.  
  26. SB * _fastcall parse_oldpath (char *sbs) {
  27.  
  28.     /* returns an array of net/node pairs (ending in 0/0) */
  29.  
  30.     SB     *s;
  31.     char *p,endofline;
  32.     word lastnet = 0;
  33.     int  x = 0;
  34.  
  35.  
  36.     s = (SB *)calloc(MAXPATH + 1,sizeof(SB));
  37.     if(!s) return NULL;
  38.  
  39.     do {
  40.         while(*sbs == '\r') {
  41.             sbs++;
  42.         }
  43.         if(!strncmp(sbs,"\01PATH",5)) {
  44.             sbs += 5;
  45.             if(*sbs == ':') sbs++;
  46.             sbs = skip_white(sbs);
  47.             endofline = 0;
  48.             while(*sbs && *sbs != '\r' && !endofline) {
  49.                 while(*sbs && *sbs == ' ' || *sbs == '\t') sbs++;
  50.                 p = sbs;
  51.                 while(*p && *p != ' ' && *p != '\t' && *p != '\r') p++;
  52.                 if(*p == '\r') {
  53.                     endofline = 1;
  54.                 }
  55.                 if(*p) {
  56.                     *p = 0;
  57.                     p++;
  58.                 }
  59.                 if(lastnet == 0) lastnet = atoi(sbs);
  60.                 if(!strstr(sbs,"/")) s[x].net = lastnet;
  61.                 else {
  62.                     s[x].net = atoi(sbs);
  63.                     lastnet = s[x].net;
  64.                     while(*sbs != '/' && *sbs) sbs++;
  65.                     if(*sbs == '/') sbs++;
  66.                 }
  67.                 s[x++].node = atoi(sbs);
  68.                 if(x > MAXPATH) { /* this has GOT to be a grunged msg */
  69.                     my_free(s);
  70.                     return NULL;
  71.                 }
  72.                 sbs = p;
  73.             }
  74.         }
  75.         else break;
  76.     } while(*sbs && lastnet != 0);
  77.  
  78.     return s;
  79. }
  80.  
  81.  
  82. long _fastcall spit_oldpath (SB *s,int handle) {
  83.  
  84.     /* puke path array out to file, formatted as old path */
  85.  
  86.     int  len = 0,x = 0;
  87.     word lastnet = 0;
  88.     char temp[32];
  89.     long totallen = 0L;
  90.  
  91.  
  92.     while(s[x].net != 0) {
  93.         if(len > 67) {
  94.             totallen += (long)ffprintf(handle,"%s\r",buffer);
  95.             len = 0;
  96.         }
  97.         if(!len) {
  98.             len += sprintf(buffer,"\01PATH: ");
  99.             strcat(buffer,ltoa((long)s[x].net,temp,10));
  100.             len += strlen(temp);
  101.             strcat(buffer,"/");
  102.             len++;
  103.             strcat(buffer,ltoa((long)s[x].node,temp,10));
  104.             len += strlen(temp);
  105.             lastnet = s[x++].net;
  106.         }
  107.         else {
  108.             if(lastnet != s[x].net) {
  109.                 strcat(buffer," ");
  110.                 len++;
  111.                 strcat(buffer,ltoa((long)s[x].net,temp,10));
  112.                 lastnet = s[x].net;
  113.                 len += strlen(temp);
  114.                 strcat(buffer,"/");
  115.                 len++;
  116.                 strcat(buffer,ltoa((long)s[x].node,temp,10));
  117.                 len += strlen(temp);
  118.             }
  119.             else {
  120.                 strcat(buffer," ");
  121.                 len++;
  122.                 strcat(buffer,ltoa((long)s[x].node,temp,10));
  123.                 len += strlen(temp);
  124.             }
  125.             x++;
  126.         }
  127.     }
  128.  
  129.     if(len) {
  130.         totallen += (long)ffprintf(handle,"%s\r",buffer);
  131.     }
  132.  
  133.     return totallen;
  134. }
  135.  
  136.  
  137.  
  138. ADDR * _fastcall parse_newpath (char *sbs) {
  139.  
  140.     ADDR *top = NULL,*info,*last;
  141.     char *domain,*zone,*net,*node,*point,*temp;
  142.     char *lastdomain,*lastzone,*lastnet,*lastnode,*lastpoint;
  143.     char lastdelim = 0,endofline;
  144.     char *p,*pp;
  145.  
  146.  
  147.     if(!sbs || !*sbs) return NULL;
  148.  
  149.     lastdomain = lastzone = lastnet = lastnode = lastpoint =
  150.       domain = zone = net = node = point = temp = NULL;
  151.  
  152.     do {
  153.         while(*sbs == '\r') {
  154.             sbs++;
  155.         }
  156.         if(!strncmp(sbs,"\01NPTH",5)) {
  157.             sbs += 5;
  158.             if(*sbs == ':') sbs++;
  159.             sbs = skip_white(sbs);
  160.             endofline = 0;
  161.             while(*sbs && *sbs != '\r' && !endofline) {
  162.                 while(*sbs && *sbs == ' ' || *sbs == '\t') sbs++;
  163.                 pp = sbs;
  164.                 while(*pp && *pp != ' ' && *pp != '\t' && *pp != '\r') pp++;
  165.                 if(*pp == '\r') {
  166.                     endofline = 1;
  167.                 }
  168.                 if(*pp) {
  169.                     *pp = 0;
  170.                     pp++;
  171.                 }
  172.  
  173.                 p = sbs;
  174.  
  175.                 do {
  176.                     temp = p;
  177.                     p = to_delim(p,"#:/.\t ");
  178.                     switch((int) *p) {
  179.                         case '\0':
  180.                         case '\r':
  181.                         case ' ':
  182.                         case 't':   if(lastdelim == '.') point = temp;
  183.                                     else if(lastdelim=='@') domain = temp;
  184.                                     else node = temp;
  185.                                     goto BreakOut;
  186.                         case '#':   domain = temp;
  187.                                     break;
  188.                         case ':':   zone = temp;
  189.                                     break;
  190.                         case '/':   net = temp;
  191.                                     break;
  192.                         case '.':   node = temp;
  193.                                     break;
  194.                     }
  195.                     lastdelim = *p;
  196.                     p++;     /* Skip delimiter */
  197.                 } while(p && *p);
  198. BreakOut:
  199.                 sbs = pp;
  200.  
  201.                 if(domain) lastdomain = domain;
  202.                 if(zone) lastzone = zone;
  203.                 if(net) lastnet = net;
  204.                 if(node) lastnode = node;
  205.                 if(point) lastpoint = point;
  206.                 if(!domain) domain = lastdomain;
  207.                 if(!zone) zone = lastzone;
  208.                 if(!net) net = lastnet;
  209.                 if(!node) node = lastnode;
  210.                 if(!point) point = lastpoint;
  211.  
  212.                 info = (ADDR *)malloc(sizeof(ADDR));
  213.                 if(!info) {
  214.                     printf("\nOut of memory\n");
  215.                     free_addresses(top);
  216.                     return NULL;
  217.                 }
  218.  
  219.                 if(zone) info->zone = atoi(zone);
  220.                 else info->zone = 0;
  221.                 if(net) info->net = atoi(net);
  222.                 else info->net = 0;
  223.                 if(node) info->node = atoi(node);
  224.                 else info->node = 0;
  225.                 if(point) info->point = atoi(point);
  226.                 else info->point = 0;
  227.                 info->domain = strdup(domain);
  228.                 if(!info->domain) {
  229.                     printf("\nOut of memory\n");
  230.                     my_free(info);
  231.                     free_addresses(top);
  232.                     return NULL;
  233.                 }
  234.  
  235.                 if(!top) {
  236.                     top = info;
  237.                 }
  238.                 else {
  239.                     last->next = info;
  240.                 }
  241.                 info->next = NULL;
  242.                 last = info;
  243.             }
  244.         }
  245.         else break;
  246.     } while(*sbs && *lastdomain);
  247.  
  248.     return top;
  249. }
  250.  
  251.  
  252.  
  253. long _fastcall spit_newpath (SB *s,ADDR *addr,ADDR *maddr,int handle) {
  254.  
  255.     /* puke path arrays out to file, formatted as new path */
  256.  
  257.     int  len = 0,x = 0;
  258.     word lastnet = 0,lastzone = 0,lastpoint = 0,lastnode = 65535U;
  259.     char temp[32],*lastdomain = NULL;
  260.     long totallen = 0L;
  261.     ADDR *info;
  262.  
  263.  
  264.     info = addr;
  265.     while(info) {
  266.         if(len > 67) {
  267.             totallen += (long)ffprintf(handle,"%s\r",buffer);
  268.             len = 0;
  269.             *buffer = 0;
  270.         }
  271.         if(!len) {
  272.             len += sprintf(buffer,"\01NPTH:");
  273.         }
  274.         if(!lastdomain || stricmp(lastdomain,info->domain)) {
  275.             strcat(buffer," ");
  276.             len++;
  277.             strcat(buffer,info->domain);
  278.             len += strlen(info->domain);
  279.             strcat(buffer,"#");
  280.             strcat(buffer,ltoa((long)info->zone,temp,10));
  281.             len += strlen(temp);
  282.             strcat(buffer,":");
  283.             len++;
  284.             strcat(buffer,ltoa((long)info->net,temp,10));
  285.             len += strlen(temp);
  286.             strcat(buffer,"/");
  287.             len++;
  288.             strcat(buffer,ltoa((long)info->node,temp,10));
  289.             len += strlen(temp);
  290.             if(info->point) {
  291.                 strcat(buffer,".");
  292.                 len++;
  293.                 strcat(buffer,ltoa((long)info->point,temp,10));
  294.                 len += strlen(temp);
  295.             }
  296.             lastdomain = info->domain;
  297.             lastzone = info->zone;
  298.             lastnet = info->net;
  299.             lastnode = info->node;
  300.             lastpoint = info->point;
  301.         }
  302.         else if(lastzone != info->zone) {
  303.             strcat(buffer," ");
  304.             len++;
  305.             strcat(buffer,ltoa((long)info->zone,temp,10));
  306.             len += strlen(temp);
  307.             strcat(buffer,":");
  308.             len++;
  309.             strcat(buffer,ltoa((long)info->net,temp,10));
  310.             len += strlen(temp);
  311.             strcat(buffer,"/");
  312.             len++;
  313.             strcat(buffer,ltoa((long)info->node,temp,10));
  314.             len += strlen(temp);
  315.             if(info->point) {
  316.                 strcat(buffer,".");
  317.                 len++;
  318.                 strcat(buffer,ltoa((long)info->point,temp,10));
  319.                 len += strlen(temp);
  320.             }
  321.             lastzone = info->zone;
  322.             lastnet = info->net;
  323.             lastnode = info->node;
  324.             lastpoint = info->point;
  325.         }
  326.         else if(lastnet != info->net) {
  327.             strcat(buffer," ");
  328.             len++;
  329.             strcat(buffer,ltoa((long)info->net,temp,10));
  330.             len += strlen(temp);
  331.             strcat(buffer,"/");
  332.             len++;
  333.             strcat(buffer,ltoa((long)info->node,temp,10));
  334.             len += strlen(temp);
  335.             if(info->point) {
  336.                 strcat(buffer,".");
  337.                 len++;
  338.                 strcat(buffer,ltoa((long)info->point,temp,10));
  339.                 len += strlen(temp);
  340.             }
  341.             lastnet = info->net;
  342.             lastnode = info->node;
  343.             lastpoint = info->point;
  344.         }
  345.         else if(lastnode != info->node) {
  346.             strcat(buffer," ");
  347.             len++;
  348.             strcat(buffer,ltoa((long)info->node,temp,10));
  349.             len += strlen(temp);
  350.             if(info->point) {
  351.                 strcat(buffer,".");
  352.                 len++;
  353.                 strcat(buffer,ltoa((long)info->point,temp,10));
  354.                 len += strlen(temp);
  355.             }
  356.             lastnode = info->node;
  357.             lastpoint = info->point;
  358.         }
  359.         else if(lastpoint != info->point) {
  360.             if(info->point) {
  361.                 strcat(buffer," ");
  362.                 len++;
  363.                 strcat(buffer,".");
  364.                 len++;
  365.                 strcat(buffer,ltoa((long)info->point,temp,10));
  366.                 len += strlen(temp);
  367.             }
  368.             lastpoint = info->point;
  369.         }
  370.  
  371.         info = info->next;
  372.     }
  373.  
  374.     if(!s) goto SkipOld;
  375.  
  376.     lastpoint = 0;
  377.  
  378.     while(s[x].net != 0) {  /* add old stuff */
  379.         if(len > 67) {
  380.             totallen += (long)ffprintf(handle,"%s\r",buffer);
  381.             len = 0;
  382.             *buffer = 0;
  383.         }
  384.         if(!len) {
  385.             len += sprintf(buffer,"\01NPTH:");
  386.             if(!addr) {
  387.                 strcat(buffer," ");
  388.                 len++;
  389.                 strcat(buffer,maddr->domain);
  390.                 len += strlen(maddr->domain);
  391.                 lastdomain = maddr->domain;
  392.                 strcat(buffer,"#");
  393.                 len++;
  394.                 strcat(buffer,ltoa((long)maddr->zone,temp,10));
  395.                 len += strlen(temp);
  396.                 lastzone = maddr->zone;
  397.                 strcat(buffer,":");
  398.                 len++;
  399.                 strcat(buffer,ltoa((long)s[x].net,temp,10));
  400.                 len += strlen(temp);
  401.                 lastnet = s[x].net;
  402.                 strcat(buffer,"/");
  403.                 len++;
  404.                 strcat(buffer,ltoa((long)s[x].node,temp,10));
  405.                 len += strlen(temp);
  406.                 lastnode = s[x++].node;
  407.             }
  408.         }
  409.         else {
  410.             if(lastnet != s[x].net) {
  411.                 strcat(buffer," ");
  412.                 len++;
  413.                 strcat(buffer,ltoa((long)s[x].net,temp,10));
  414.                 lastnet = s[x].net;
  415.                 len += strlen(temp);
  416.                 strcat(buffer,"/");
  417.                 len++;
  418.                 strcat(buffer,ltoa((long)s[x].node,temp,10));
  419.                 len += strlen(temp);
  420.             }
  421.             else {
  422.                 strcat(buffer," ");
  423.                 len++;
  424.                 strcat(buffer,ltoa((long)s[x].node,temp,10));
  425.                 len += strlen(temp);
  426.             }
  427.             x++;
  428.         }
  429.     }
  430.  
  431. SkipOld:
  432.  
  433.     if(len > 67) {
  434.         totallen += (long)ffprintf(handle,"%s\r",buffer);
  435.         len = 0;
  436.         *buffer = 0;
  437.     }
  438.     if(!len) {
  439.         len += sprintf(buffer,"\01NPTH:");
  440.     }
  441.  
  442.     if(!lastdomain || stricmp(lastdomain,maddr->domain)) {
  443.         strcat(buffer," ");
  444.         len++;
  445.         strcat(buffer,maddr->domain);
  446.         len += strlen(maddr->domain);
  447.         strcat(buffer,"#");
  448.         strcat(buffer,ltoa((long)maddr->zone,temp,10));
  449.         len += strlen(temp);
  450.         strcat(buffer,":");
  451.         len++;
  452.         strcat(buffer,ltoa((long)maddr->net,temp,10));
  453.         len += strlen(temp);
  454.         strcat(buffer,"/");
  455.         len++;
  456.         strcat(buffer,ltoa((long)maddr->node,temp,10));
  457.         len += strlen(temp);
  458.         if(maddr->point) {
  459.             strcat(buffer,".");
  460.             len++;
  461.             strcat(buffer,ltoa((long)maddr->point,temp,10));
  462.             len += strlen(temp);
  463.         }
  464.     }
  465.     else if(lastzone != maddr->zone) {
  466.         strcat(buffer," ");
  467.         len++;
  468.         strcat(buffer,ltoa((long)maddr->zone,temp,10));
  469.         len += strlen(temp);
  470.         strcat(buffer,":");
  471.         len++;
  472.         strcat(buffer,ltoa((long)maddr->net,temp,10));
  473.         len += strlen(temp);
  474.         strcat(buffer,"/");
  475.         len++;
  476.         strcat(buffer,ltoa((long)maddr->node,temp,10));
  477.         len += strlen(temp);
  478.         if(maddr->point) {
  479.             strcat(buffer,".");
  480.             len++;
  481.             strcat(buffer,ltoa((long)maddr->point,temp,10));
  482.             len += strlen(temp);
  483.         }
  484.     }
  485.     else if(lastnet != maddr->net) {
  486.         strcat(buffer," ");
  487.         len++;
  488.         strcat(buffer,ltoa((long)maddr->net,temp,10));
  489.         len += strlen(temp);
  490.         strcat(buffer,"/");
  491.         len++;
  492.         strcat(buffer,ltoa((long)maddr->node,temp,10));
  493.         len += strlen(temp);
  494.         if(maddr->point) {
  495.             strcat(buffer,".");
  496.             len++;
  497.             strcat(buffer,ltoa((long)maddr->point,temp,10));
  498.             len += strlen(temp);
  499.         }
  500.     }
  501.     else if(lastnode != maddr->node) {
  502.         strcat(buffer," ");
  503.         len++;
  504.         strcat(buffer,ltoa((long)maddr->node,temp,10));
  505.         len += strlen(temp);
  506.         if(maddr->point) {
  507.             strcat(buffer,".");
  508.             len++;
  509.             strcat(buffer,ltoa((long)maddr->point,temp,10));
  510.             len += strlen(temp);
  511.         }
  512.     }
  513.     else if(lastpoint != maddr->point) {
  514.         if(maddr->point) {
  515.             strcat(buffer," ");
  516.             len++;
  517.             strcat(buffer,".");
  518.             len++;
  519.             strcat(buffer,ltoa((long)maddr->point,temp,10));
  520.             len += strlen(temp);
  521.         }
  522.         lastpoint = maddr->point;
  523.     }
  524.  
  525.     if(len) {
  526.         totallen += (long)ffprintf(handle,"%s\r",buffer);
  527.     }
  528.  
  529.     return totallen;
  530. }
  531.  
  532.  
  533.  
  534. void _fastcall free_addresses (ADDR *top) { /* free list of addresses */
  535.  
  536.     ADDR *next;
  537.  
  538.  
  539.     while(top) {
  540.         next = top->next;
  541.         if(top->domain) my_free(top->domain);
  542.         my_free(top);
  543.         top = next;
  544.     }
  545. }
  546.