home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Tools / tables / tjoin / tjoin2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  11.4 KB  |  600 lines

  1. /* tjoin2.c: */ 
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Tools/tables/tjoin/RCS/tjoin2.c,v 6.0 1991/12/18 20:35:29 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Tools/tables/tjoin/RCS/tjoin2.c,v 6.0 1991/12/18 20:35:29 jpo Rel $
  9.  *
  10.  * $Log: tjoin2.c,v $
  11.  * Revision 6.0  1991/12/18  20:35:29  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include        <stdio.h>
  19. #include    "tjoin.h"
  20.  
  21. extern    char    *av0;
  22. extern    int    Debug, PrintRoute, DirectFirst, ComplexOutput;
  23. extern    MTA    *MtaTree;
  24. extern    CHAN    *ValidChanList;
  25. extern char    *FastInChanList();
  26.  
  27. static    MTST    *MtaStore = NULL;
  28. static    CHST    *ChanStore = NULL;
  29.  
  30. static    char    *MailRoute();
  31. static  void    DoDomainOutput(), PrintOutList(), PrintThing(),
  32.         FreePrintList();
  33. static    int    HighestCost(), CountAts();
  34.  
  35. PRINT        *DoChanOrder(), *InsertPrint(), *DeleteItem();
  36.  
  37.  
  38. /* ------------------------  Begin  Routines  ------------------------------- */
  39.  
  40.  
  41. WalkTree (tree, func)
  42. register MTA    *tree;
  43. int        (*func)();
  44. {
  45.     if (tree == NULL)
  46.         return;
  47.     if (tree -> mta_left != NULL)
  48.         WalkTree (tree -> mta_left, func);
  49.  
  50.     (*func) (tree);
  51.  
  52.     if (tree -> mta_right != NULL)
  53.         WalkTree (tree -> mta_right, func);
  54. }
  55.  
  56.  
  57. DebugTree (tree, indent)
  58. register MTA    *tree;
  59. int        indent;
  60. {
  61.     int    i; 
  62.  
  63.     if (tree == NULL)
  64.         return;
  65.  
  66.     if (tree -> mta_left != NULL)
  67.         DebugTree (tree -> mta_left, indent - 3);
  68.  
  69.     for (i=0; i < indent; i++)  printf (" ");
  70.     printf ("%s\n", tree -> mta_name ? tree -> mta_name  : "null");
  71.     fflush (stdout);
  72.  
  73.     if (tree -> mta_right != NULL)
  74.         DebugTree (tree -> mta_right, indent + 3);
  75. }
  76.  
  77.  
  78.  
  79. PrintNode (node)
  80. register MTA    *node;
  81. {
  82.     register PRINT    *print, *list2, *p2, *p3;
  83.     register int    cost, i;
  84.     
  85.     if (node == NULL)
  86.         return;
  87.  
  88.     if (Debug == 1)
  89.         printf ("PrintNode - %s\n", 
  90.             node -> mta_name ? node -> mta_name : "null");
  91.  
  92.     if (node -> mta_domain != NULL) {
  93.         DoDomainOutput (node);
  94.         return;
  95.     }
  96.  
  97.     if ((print = DoChanOrder (node)) == NULL)
  98.         return;
  99.  
  100.     if (DirectFirst != 0) {
  101.         /* Sort List2 by cost (Hop Count) */
  102.         list2 = NULL;
  103.         cost = HighestCost (print);
  104.         for (i = 0; i <= cost; i++)
  105.             for (p2 = print; p2 != NULL; p2 = p3) {
  106.                 p3 = p2 -> pr_next;
  107.                 if (p2 -> pr_cost == i) {
  108.                     print = DeleteItem (print, p2);
  109.                     list2 = InsertPrint (list2, p2);
  110.                 }
  111.             }
  112.         print = list2;
  113.     }
  114.  
  115.     PrintOutList (print, node -> mta_name);
  116.     FreePrintList (print);
  117. }
  118.  
  119. MTA *InsertMta (tree, mta)
  120. register MTA    *tree, *mta;
  121. {
  122.     register int    x;
  123.     
  124.     if (tree == NULL)
  125.         return (mta);
  126.  
  127.     if (Debug == 1)
  128.         printf ("InsertMTA - %s  %s\n",
  129.             tree -> mta_name ? tree -> mta_name : "null", 
  130.             mta -> mta_name ? mta -> mta_name : "null");
  131.  
  132.     if ((x = strcmp (mta -> mta_name, tree -> mta_name)) == 0) {
  133.         /* --- Found the same node - should not happen --- */
  134.         fprintf (stderr, "%s: InsertMta - Fatal Error\n", av0);
  135.         exit (1);
  136.     }
  137.     if (x < 0)
  138.         tree -> mta_left = InsertMta (tree -> mta_left, mta);
  139.     else
  140.         tree -> mta_right = InsertMta (tree -> mta_right, mta);
  141.     return (tree);
  142. }
  143.  
  144.  
  145.  
  146. MTA *NameToMta (name)
  147. char    *name;
  148. {
  149.     register MTA    *mta;
  150.     register int    x;
  151.  
  152.     if (Debug == 1)
  153.         printf ("NameToMTA - %s\n", name ? name : "null");
  154.     
  155.     mta = MtaTree;
  156.  
  157.     while (mta != NULL) {
  158.         if ((x = strcmp (name, mta -> mta_name)) == 0)
  159.             break;
  160.         if (x < 0)
  161.             mta = mta -> mta_left;
  162.         else
  163.             mta = mta -> mta_right;
  164.     }
  165.     return (mta);
  166. }
  167.  
  168.  
  169. CHAN *GetChan()
  170. {
  171.     register CHST    *chst;
  172.     register CHAN    *chan;
  173.     
  174.     if (ChanStore == NULL) {            
  175.         /* Starting up */
  176.         if ((ChanStore = (CHST *) malloc (sizeof (CHST))) == NULL) {
  177.             fprintf (stderr, "%s: GetChan - No Memory [1]\n", av0);
  178.             exit (1);
  179.         }
  180.  
  181.         if (Debug == 1) 
  182.             printf ("GetChan Start - Malloc %x\n", ChanStore);
  183.  
  184.         bzero ((char *)ChanStore, sizeof(*ChanStore));
  185.     }
  186.  
  187.  
  188.     if (ChanStore -> chs_index >= CHANSTORESIZE) {            
  189.         /* Get another bunch */
  190.         if ((chst = (CHST *) malloc (sizeof (CHST))) == NULL) {
  191.             fprintf (stderr, "%s: GetChan - No Memory [2]\n", av0);
  192.             exit (1);
  193.         }
  194.  
  195.         if (Debug == 1) 
  196.             printf ("GetChan GetBuff - Malloc %x\n", chst);
  197.  
  198.         bzero ((char *)chst, sizeof(*chst));
  199.         chst -> chs_next = ChanStore;
  200.         ChanStore = chst;
  201.     }
  202.  
  203.     chan = &ChanStore -> chs_buffer [ChanStore -> chs_index++];
  204.     chan -> ch_next = NULL;
  205.     chan -> ch.name = NULL;
  206.     return (chan);
  207. }
  208.  
  209.  
  210. SBUFF *InitStringStore()
  211. {
  212.     register SBUFF    *str;
  213.     
  214.     if ((str = (SBUFF *) malloc (sizeof (SBUFF))) == NULL) {
  215.         fprintf (stderr, "%s: InitStringStore - No Memory\n", av0);
  216.         exit (1);
  217.     }
  218.  
  219.     if (Debug == 1)
  220.         printf ("InitStringStore - Malloc %x\n", str);
  221.  
  222.     bzero ((char *)str, sizeof(*str));
  223.     return (str);
  224. }
  225.  
  226.  
  227.  
  228. char *StoreStr (store, string)
  229. register SBUFF    *store;
  230. char        *string;
  231. {
  232.     register int    length;
  233.     char        *ptr;
  234.  
  235.     if (Debug == 1)
  236.         printf ("StoreStr - %s\n", string ? string : "null");
  237.  
  238.     if (string == NULL || *string == '\0')
  239.         return ((char *)0);
  240.     
  241.     length = strlen (string) + 1;
  242.  
  243.     if (length > STRINGSTORESIZE) {
  244.         /* This is FATAL */
  245.         fprintf (stderr, "%s: StoreStr - Can't store %s - Ignored\n",
  246.              av0, string);
  247.         exit (1);
  248.     }
  249.  
  250.     while (length > STRINGSTORESIZE - store -> str_index) {
  251.         if (store -> str_next != NULL) {
  252.             store = store -> str_next;
  253.             continue;
  254.         }
  255.  
  256.         store -> str_next = (SBUFF *) malloc (sizeof (SBUFF));
  257.  
  258.         if (store -> str_next == NULL) {
  259.             fprintf (stderr, "%s: StoreStr - No Memory\n", av0);
  260.             exit (1);
  261.         }
  262.  
  263.         if (Debug == 1) 
  264.             printf ("Malloc %x - StoreStr\n", store -> str_next);
  265.  
  266.         store = store -> str_next;
  267.         bzero ((char *)store, sizeof(*store));
  268.         break;
  269.     }
  270.  
  271.     ptr = &store -> str_buffer [store -> str_index];
  272.     (void) strcpy (ptr, string);
  273.     store -> str_index += length;
  274.     return (ptr);
  275. }
  276.  
  277.  
  278.  
  279. MTA *GetMta()
  280. {
  281.     register MTST    *mtst;
  282.     register MTA    *mta;
  283.     
  284.     if (MtaStore == NULL) {            
  285.         /* Starting up */
  286.         if ((MtaStore = (MTST *) malloc (sizeof (MTST))) == NULL) {
  287.             fprintf (stderr, "%s: GetMta - No Memory [1]\n", av0);
  288.             exit (1);
  289.         }
  290.  
  291.         if (Debug == 1) 
  292.             printf ("GetMta Start - Malloc %x \n", MtaStore);
  293.  
  294.         bzero ((char *)MtaStore, sizeof(*MtaStore));
  295.     }
  296.  
  297.     if (MtaStore -> mts_index >= MTASTORESIZE) {            
  298.         /* Get another bunch */
  299.         if ((mtst = (MTST *) malloc (sizeof (MTST))) == NULL) {
  300.             fprintf (stderr, "%s: GetMta - No Memory [2]\n", av0);
  301.             exit (1);
  302.         }
  303.         if (Debug == 1) 
  304.             printf ("GetMta GetBuffer - Malloc %x \n", mtst);
  305.  
  306.         bzero ((char *)mtst, sizeof(*mtst));
  307.         mtst -> mts_next = MtaStore;
  308.         MtaStore = mtst;
  309.     }
  310.  
  311.     mta = &MtaStore -> mts_buffer [MtaStore -> mts_index++];
  312.     mta -> mta_left = NULL;
  313.     mta -> mta_right = NULL;
  314.     mta -> mta_chan = NULL;
  315.     mta -> mta_arlist = NULL;
  316.     mta -> mta_domain = NULL;
  317.     mta -> mta_name = NULL;
  318.     return (mta);
  319. }
  320.  
  321.  
  322.  
  323. FreeStringStore (str)
  324. register SBUFF    *str;
  325. {
  326.     register SBUFF    *startstr = str,
  327.             *s2;
  328.  
  329.     if (Debug == 1) 
  330.         printf ("FreeStringStore - %x\n", str);
  331.     
  332.     for (; str != NULL; str = s2) {
  333.         s2 = str -> str_next;
  334.         if (str)    free ((char *)str);
  335.     }
  336.  
  337.     startstr = NULL;
  338. }
  339.  
  340.  
  341.  
  342. /* ------------------------  Static Routines  ------------------------------- */
  343.  
  344.  
  345.  
  346.  
  347.  
  348. static void DoDomainOutput (node)
  349. register MTA    *node;
  350. {
  351.     register CHAN    *chan;
  352.     register int    flag = 0;
  353.     
  354.     if (Debug == 1)
  355.         printf ("DoDomainOutput - %s\n", 
  356.             node -> mta_name ? node -> mta_name : "null");
  357.  
  358.     printf ("%s:", node -> mta_name);
  359.  
  360.     if (ComplexOutput != 0)
  361.         printf ("(");
  362.  
  363.     for (chan = ValidChanList; chan != NULL; chan = chan -> ch_next)
  364.         if (FastInChanList (node->mta_domain, chan->ch.name) != NULL) {
  365.             if (flag == 1)
  366.                 printf (",");
  367.             if (ComplexOutput == 0)
  368.                 printf ("(%s)", chan -> ch.name);
  369.             else
  370.                 printf ("%s", chan -> ch.name);
  371.             flag = 1;
  372.         }
  373.  
  374.     if (ComplexOutput != 0)
  375.         printf (")");
  376.  
  377.     printf ("\n");
  378. }
  379.  
  380.  
  381. static int HighestCost (print)
  382. register PRINT    *print;
  383. {
  384.     register int    cost;
  385.  
  386.     cost = 0;
  387.     for (; print != NULL; print = print -> pr_next)
  388.         if (print -> pr_cost > cost)
  389.             cost = print -> pr_cost;
  390.     return (cost);
  391. }
  392.  
  393.  
  394. static void PrintOutList (print, mtaname)
  395. register PRINT    *print;
  396. register char    *mtaname;
  397. {
  398.     register char    *last;
  399.  
  400.     if (Debug == 1)
  401.         printf ("PrintOutList - %s\n", mtaname ? mtaname : "null");
  402.     
  403.     printf ("%s:", mtaname);
  404.  
  405.     last = "";
  406.  
  407.     for (; print != NULL; print = print -> pr_next) {
  408.  
  409.         if (PrintRoute == 0) {
  410.             PrintThing (print -> pr_nexthop, last);
  411.             if (ComplexOutput != 0)
  412.                 last = print -> pr_nexthop;
  413.         }
  414.         else {
  415.             PrintThing (&print -> pr_relay [0], last);
  416.             if (ComplexOutput != 0)
  417.                 last = &print -> pr_relay [0];
  418.         }
  419.  
  420.         printf ("%s", print -> pr_chan);
  421.  
  422.         if (print -> pr_next == NULL)
  423.             if (ComplexOutput == 0)
  424.                 printf (")\n");
  425.             else
  426.                 printf (")\n");
  427.         else
  428.             if (ComplexOutput == 0)
  429.                 printf ("),");
  430.     }
  431. }
  432.  
  433.  
  434.  
  435. static void PrintThing (host, last)
  436. register char    *host, *last;
  437. {
  438.     if (Debug == 1)
  439.         printf ("PrintThing - %s\n", host ? host : "null");
  440.  
  441.     if (ComplexOutput == 0)
  442.         printf ("%s(", host);
  443.     else
  444.         if (*last == '\00')
  445.             printf ("%s(", host);
  446.         else
  447.             if (strcmp (last, host) != 0)
  448.                 printf ("),%s(", host);
  449.             else
  450.                 printf (",");
  451. }
  452.  
  453.  
  454. static void FreePrintList (print)
  455. register PRINT    *print;
  456. {
  457.     register PRINT    *startprint = print,
  458.             *p2;
  459.     
  460.     for (; print != NULL; print = p2) {
  461.         p2 = print -> pr_next;
  462.         if (print)    free ((char *)print);
  463.     }
  464.  
  465.     startprint = NULL;
  466. }
  467.  
  468.  
  469. static PRINT *DoChanOrder (node)
  470. register MTA    *node;
  471. {
  472.     register CHAN    *chan;
  473.     char        *ptr, buff [LOADS];
  474.     PRINT        *print, *p2;
  475.     int        space;
  476.     if (Debug == 1)
  477.         printf ("DoChanOrder - %s\n", 
  478.             node -> mta_name ? node -> mta_name : "null");
  479.  
  480.     print = NULL;
  481.  
  482.     for (chan = ValidChanList; chan != NULL; chan = chan -> ch_next) {
  483.         space = sizeof(buff);
  484.         if ((ptr = MailRoute (node, chan, &buff [0], &space)) != NULL) {
  485.             if ((p2 = (PRINT *) malloc (sizeof (PRINT))) == NULL) {
  486.                 fprintf (stderr, "%s: DoChanOrder - No ", av0);
  487.                 fprintf (stderr, "memory\n");
  488.                 exit (1);
  489.             }
  490.  
  491.             bzero ((char *)p2, sizeof(*p2));
  492.             (void) strcpy (&p2 -> pr_relay [0], &buff [1]);
  493.             p2 -> pr_nexthop = ptr;
  494.             p2 -> pr_chan = chan -> ch.name;
  495.             p2 -> pr_cost = CountAts (&buff [1]);
  496.             print = InsertPrint (print, p2);
  497.         }
  498.     }
  499.     return (print);
  500. }
  501.  
  502.  
  503. static int CountAts (str)
  504. register char    *str;
  505. {
  506.     register int    count;
  507.     
  508.     if (str == NULL)
  509.         return (0);
  510.     count = 0;
  511.     for (; *str != '\00'; str++)
  512.         if (*str == '@')
  513.             count++;
  514.     return (count);
  515. }
  516.  
  517.  
  518.  
  519. static PRINT *DeleteItem (list, item)
  520. register PRINT    *list, *item;
  521. {
  522.     register PRINT    *p1;
  523.     
  524.     if (Debug == 1)    printf ("DeleteItem\n");
  525.  
  526.     if (list == NULL) {
  527.         fprintf (stderr, "%s: DeleteItem - List is NULL\n", av0);
  528.         return (NULL);
  529.     }
  530.  
  531.     if (list == item) {
  532.         p1 = list -> pr_next;
  533.         list -> pr_next = NULL;
  534.         return (p1);
  535.     }
  536.  
  537.     for (p1 = list; p1 -> pr_next != NULL; p1 = p1 -> pr_next)
  538.         if (item == p1 -> pr_next) {
  539.             p1 -> pr_next = item -> pr_next;
  540.             item -> pr_next = NULL;
  541.             return (list);
  542.         }
  543.  
  544.     fprintf (stderr, "%s: DeleteItem - Item not in List\n", av0);
  545.     return (list);
  546. }
  547.  
  548.  
  549. static PRINT *InsertPrint (list, item)
  550. register PRINT    *list, *item;
  551. {
  552.     register PRINT    *p1;
  553.     
  554.     if (Debug == 1)    printf ("InsertPrint\n");
  555.  
  556.     if (list == NULL)
  557.         return (item);
  558.     for (p1 = list; p1 -> pr_next != NULL; p1 = p1 -> pr_next)
  559.         continue;
  560.     p1 -> pr_next = item;
  561.     return (list);
  562. }
  563.  
  564.  
  565.  
  566. static char *MailRoute (mta, chan, str, space)
  567. register MTA    *mta;
  568. register CHAN    *chan;
  569. register char    *str;
  570. int        *space;
  571. {
  572.     register CHAN    *c1;
  573.     register MTA    *m1;
  574.     register char    *ptr;
  575.     
  576.     if (Debug == 1)    printf ("MailRoute\n");
  577.  
  578.     if ((*space -= ((int)strlen(mta -> mta_name) + 1)) < 1) {
  579.         fprintf(stderr, 
  580.             "Possible AR loop detected containing mta '%s' (buffer overrun)\n",
  581.             mta->mta_name);
  582.         return (NULL);
  583.     }
  584.  
  585.     (void) sprintf (str, "@%s", mta -> mta_name);
  586.  
  587.     if (FastInChanList (mta -> mta_chan, chan -> ch.name) != NULL)
  588.         return (mta -> mta_name);
  589.  
  590.     for (c1 = mta -> mta_arlist; c1 != NULL; c1 = c1 -> ch_next) {
  591.         if ((m1 = c1 -> ch.mta) == NULL)
  592.             continue;
  593.         if ((ptr = MailRoute (m1, chan, &str [strlen (str)], space)) != NULL)
  594.             return (ptr);
  595.     }
  596.     return (NULL);
  597. }
  598.  
  599.  
  600.