|
|
1.1 ! root 1: /* pathalias -- by steve bellovin, as told to peter honeyman */ ! 2: #ifndef lint ! 3: static char *sccsid = "@(#)addlink.c 8.1 (down!honey) 86/01/19"; ! 4: #endif lint ! 5: ! 6: #include "def.h" ! 7: ! 8: static link *Trace[NTRACE]; ! 9: static int Tracecount; ! 10: ! 11: link * ! 12: addlink(from, to, cost, netchar, netdir) ! 13: node *from; ! 14: register node *to; ! 15: Cost cost; ! 16: char netchar; ! 17: char netdir; ! 18: { ! 19: register link *l, *prev = 0; ! 20: ! 21: if (Tflag) ! 22: ltrace(from, to, cost, netchar, netdir); ! 23: /* maintain uniqueness for dead links (only) */ ! 24: for (l = from->n_link; l && l->l_flag & LDEAD; l = l->l_next) { ! 25: if (to == l->l_to) { ! 26: /* what the hell, use cheaper cost */ ! 27: if (cost < l->l_cost) { ! 28: l->l_cost = cost; ! 29: netbits(l, netchar, netdir); ! 30: } ! 31: return(l); ! 32: } ! 33: prev = l; ! 34: } ! 35: ! 36: /* allocate and link in the new link struct */ ! 37: l = newlink(); ! 38: if (cost != INF) /* ignore back links */ ! 39: Lcount++; ! 40: if (prev) { ! 41: l->l_next = prev->l_next; ! 42: prev->l_next = l; ! 43: } else { ! 44: l->l_next = from->n_link; ! 45: from->n_link = l; ! 46: } ! 47: ! 48: l->l_to = to; ! 49: l->l_cost = cost; ! 50: if (netchar == 0) { ! 51: netchar = DEFNET; ! 52: netdir = DEFDIR; ! 53: } ! 54: netbits(l, netchar, netdir); ! 55: ! 56: return(l); ! 57: } ! 58: ! 59: link * ! 60: addgateway(from, to, cost, netchar, netdir) ! 61: node *from; ! 62: node *to; ! 63: Cost cost; ! 64: char netchar; ! 65: char netdir; ! 66: { ! 67: register link *l; ! 68: ! 69: l = addlink(from, to, cost, netchar, netdir); ! 70: l->l_flag |= LGATEWAY; ! 71: return(l); ! 72: } ! 73: ! 74: deadlink(s) ! 75: char *s; ! 76: { ! 77: char *t, c; ! 78: link *l; ! 79: ! 80: t = index(s, '!'); ! 81: if (t) { ! 82: c = *t; ! 83: *t = 0; ! 84: l = addlink(addnode(s), addnode(t + 1), INF / 2, c, DEFDIR); ! 85: l->l_flag |= LDEAD; ! 86: } else ! 87: addnode(s)->n_flag |= NDEAD; ! 88: } ! 89: ! 90: netbits(l, netchar, netdir) ! 91: link *l; ! 92: char netchar, netdir; ! 93: { ! 94: char *nptr; ! 95: ! 96: if ((nptr = index(Netchars, netchar)) == 0) { ! 97: fprintf(stderr, "%s: unknown network operator: %c\n", ! 98: ProgName, netchar); ! 99: badmagic(1); ! 100: } ! 101: l->l_flag &= ~(LNETCHARS|LDIR); ! 102: l->l_flag |= (nptr - Netchars) | dirbits(netdir); ! 103: } ! 104: ! 105: tracelink(arg) ! 106: char *arg; ! 107: { ! 108: char *bang; ! 109: link *l; ! 110: ! 111: if (Tracecount >= NTRACE) ! 112: return(-1); ! 113: l = newlink(); ! 114: bang = index(arg, '!'); ! 115: if (bang) { ! 116: *bang = 0; ! 117: l->l_to = addnode(bang+1); ! 118: } else ! 119: l->l_to = 0; ! 120: ! 121: l->l_from = (link *) addnode(arg); ! 122: Trace[Tracecount++] = l; ! 123: return(0); ! 124: } ! 125: ! 126: STATIC ! 127: ltrace(from, to, cost, netchar, netdir) ! 128: node *from, *to; ! 129: Cost cost; ! 130: char netchar; ! 131: char netdir; ! 132: { ! 133: link *l; ! 134: int i; ! 135: ! 136: for (i = 0; i < Tracecount; i++) { ! 137: l = Trace[i]; ! 138: /* overkill -- you asked for it! */ ! 139: if ((l->l_to == 0 ! 140: && (from == (node *) l->l_from || to == (node *) l->l_from)) ! 141: || (from == (node *) l->l_from && to == l->l_to) ! 142: || (to == (node *) l->l_from && from == l->l_to)) { ! 143: ltrprint(from, to, cost, netchar, netdir); ! 144: return; ! 145: } ! 146: } ! 147: } ! 148: ! 149: /* print a trace item */ ! 150: STATIC ! 151: ltrprint(from, to, cost, netchar, netdir) ! 152: node *from, *to; ! 153: Cost cost; ! 154: char netchar; ! 155: char netdir; ! 156: { ! 157: char buf[256], *bptr = buf; ! 158: ! 159: strcpy(bptr, from->n_name); ! 160: bptr += strlen(bptr); ! 161: *bptr++ = ' '; ! 162: if (netdir == LRIGHT) /* @% */ ! 163: *bptr++ = netchar; ! 164: strcpy(bptr, to->n_name); ! 165: bptr += strlen(bptr); ! 166: if (netdir == LLEFT) /* !: */ ! 167: *bptr++ = netchar; ! 168: sprintf(bptr, "(%ld)", cost); ! 169: yyerror(buf); ! 170: } ! 171: ! 172: atrace(n1, n2) ! 173: node *n1, *n2; ! 174: { ! 175: link *l; ! 176: int i; ! 177: char buf[256]; ! 178: ! 179: for (i = 0; i < Tracecount; i++) { ! 180: l = Trace[i]; ! 181: if (l->l_to == 0 && ((node *) l->l_from == n1 || (node *) l->l_from == n2)) { ! 182: sprintf(buf, "%s = %s", n1->n_name, n2->n_name); ! 183: yyerror(buf); ! 184: return; ! 185: } ! 186: } ! 187: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.