home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume3 / pathalias2 / part2 / printit.c < prev   
Encoding:
C/C++ Source or Header  |  1986-11-30  |  3.6 KB  |  192 lines

  1. /* pathalias -- by steve bellovin, as told to peter honeyman */
  2. #ifndef lint
  3. static char    *sccsid = "@(#)printit.c    8.1 (down!honey) 86/01/19";
  4. #endif
  5.  
  6. #include "def.h"
  7.  
  8. /* use lots of char bufs -- profiling indicates this costs about 5 kbytes */
  9.  
  10. /* in practice, even the longest paths are < 100 bytes */
  11. #define PSIZE 512
  12.  
  13. printit()
  14. {    link *l;
  15.     char pbuf[PSIZE];
  16.  
  17.     /* print home */
  18.     if (Cflag)
  19.         printf("%ld\t", (long) Home->n_cost);
  20.     printf("%s\t%%s\n", Home->n_name);
  21.     
  22.     strcpy(pbuf, "%s");
  23.     for (l = Home->n_link; l; l = l->l_next) {
  24.         if (l->l_flag & LTREE) {
  25.             preorder(l, pbuf);
  26.             strcpy(pbuf, "%s");
  27.         }
  28.     }
  29. }
  30.  
  31. /* preorder traversal of shortest path tree */
  32. preorder(l, ppath)
  33. register link *l;
  34. char *ppath;
  35. {
  36.     register node *n;
  37.     char npath[PSIZE];
  38.  
  39.     setpath(l, ppath, npath);
  40.     n = l->l_to;
  41.     if ((n->n_flag & NNET) || ISADOMAIN(n))
  42.         printnet(n, npath, n->n_cost);
  43.     else
  44.         printhost(n, npath, n->n_cost);
  45.     for (l = n->n_link; l; l = l->l_next)
  46.         if (l->l_flag & LTREE)
  47.             preorder(l, npath);
  48. }
  49.  
  50. setpath(l, ppath, npath) 
  51. link *l;
  52. register char *ppath, *npath;
  53. {
  54.     register node *next;
  55.     char netchar;
  56.     extern char *hostpath();
  57.  
  58.     next = l->l_to;
  59.     /*
  60.      * for magic @-% conversion.
  61.      * assume that gateways to domains want no @'s
  62.      */
  63.     if (next->n_parent->n_flag & ATSIGN || ISADOMAIN(next))
  64.         next->n_flag |= ATSIGN;
  65.  
  66.     /* special handling for aliases , domains, and nets */
  67.     if ((l->l_flag & LALIAS) || (next->n_flag & NNET) || ISADOMAIN(next)) {
  68.         strcpy(npath, ppath);
  69.         return;
  70.     }
  71.         
  72.     netchar = NETCHAR(l);
  73.     if (netchar == '@')
  74.         if (next->n_flag & ATSIGN)
  75.             netchar = '%';    /* shazam?  shaman? */
  76.         else
  77.             next->n_flag |= ATSIGN;
  78.  
  79.     /* remainder should be a sprintf -- foo on '%' as an operator */
  80.     for ( ; *npath = *ppath; ppath++) {
  81.         if (*ppath == '%') {
  82.             switch(ppath[1]) {
  83.             case 's':
  84.                 ppath++;
  85.                 npath = hostpath(npath, l, netchar);
  86.                 break;
  87.  
  88.             case '%':
  89.                 *++npath = *++ppath;
  90.                 npath++;
  91.                 break;
  92.  
  93.             default:
  94.                 fprintf(stderr, "%s: %%%c found in setpath\n",
  95.                         ProgName, ppath[1]);
  96.                 badmagic(1);
  97.                 break;
  98.             }
  99.         } else
  100.             npath++;
  101.     }
  102. }
  103.  
  104. char *
  105. hostpath(path, l, netchar)
  106. register char *path;
  107. register link *l;
  108. char netchar;
  109. {
  110.     register node *prev;
  111.  
  112.     prev = l->l_to->n_parent;
  113.     if (NETDIR(l) == LLEFT) {
  114.         /* host!user */
  115.         strcpy(path, l->l_to->n_name);
  116.         path += strlen(path);
  117.         while (ISADOMAIN(prev)) {
  118.             strcpy(path, prev->n_name);
  119.             path += strlen(path);
  120.             prev = prev->n_parent;
  121.         }
  122.         *path++ = netchar;
  123.         if (netchar == '%')
  124.             *path++ = '%';
  125.         *path++ = '%';
  126.         *path++ = 's';
  127.     } else {
  128.         /* %s@host */
  129.         *path++ = '%';
  130.         *path++ = 's';
  131.         *path++ = netchar;
  132.         if (netchar == '%')
  133.             *path++ = '%';
  134.         strcpy(path, l->l_to->n_name);
  135.         path += strlen(path);
  136.         while (ISADOMAIN(prev)) {
  137.             strcpy(path, prev->n_name);
  138.             path += strlen(path);
  139.             prev = prev->n_parent;
  140.         }
  141.     }
  142.     return(path);
  143. }
  144.  
  145. STATIC
  146. printhost(n, path, cost)
  147. node *n;
  148. char *path;
  149. Cost cost;
  150. {
  151.     /* for collisions, print the domained name only */
  152.     if ((n->n_flag & (ISPRIVATE|COLLISION)) == 0) {
  153.         if (Cflag)
  154.             printf("%ld\t", (long) cost);
  155.         fputs(n->n_name, stdout);
  156.         putchar('\t');
  157.         puts(path);
  158.     } else if (ISADOMAIN(n->n_parent))
  159.         printdomain(n, path, cost);    /* print fully qualified name */
  160. }
  161.  
  162. STATIC
  163. printnet(n, path, cost)
  164. node *n;
  165. char *path;
  166. Cost cost;
  167. {
  168.     /* print gateways */
  169.     if (!ISADOMAIN(n))
  170.         return;
  171.     /* if it's private, print only if qualifed */
  172.     if ((n->n_flag & (ISPRIVATE|COLLISION)) && !ISADOMAIN(n->n_parent))
  173.         return;
  174.     printdomain(n, path, cost);
  175. }
  176.  
  177. STATIC
  178. printdomain(n, path, cost)
  179. node *n;
  180. char *path;
  181. Cost cost;
  182. {
  183.     if (Cflag)
  184.         printf("%ld\t", (long) cost);
  185.     do {
  186.         fputs(n->n_name, stdout);
  187.         n = n->n_parent;
  188.     } while (ISADOMAIN(n));
  189.     putchar('\t');
  190.     puts(path);
  191. }
  192.