|
|
1.1 ! root 1: /* ! 2: * Hashing routines to salt away machines seen scanning ! 3: * networks paths that we don't know about. ! 4: */ ! 5: ! 6: #define XHSIZE 19 /* Size of extra hash table */ ! 7: #define NXMID (XHSIZE*3/4) /* Max extra machines */ ! 8: ! 9: struct xtrahash { ! 10: char *xh_name; /* Name of machine */ ! 11: short xh_mid; /* Machine ID */ ! 12: short xh_attnet; /* Attached networks */ ! 13: } xtrahash[XHSIZE]; ! 14: ! 15: struct xtrahash *xtab[XHSIZE]; /* F: mid-->machine name */ ! 16: ! 17: short midfree; /* Next free machine id */ ! 18: ! 19: /* ! 20: * Initialize the extra host hash table. ! 21: * Called by sreset. ! 22: */ ! 23: ! 24: minit() ! 25: { ! 26: register struct xtrahash *xp, **tp; ! 27: register int i; ! 28: ! 29: midfree = 0; ! 30: tp = &xtab[0]; ! 31: for (xp = &xtrahash[0]; xp < &xtrahash[XHSIZE]; xp++) { ! 32: xp->xh_name = NOSTR; ! 33: xp->xh_mid = 0; ! 34: xp->xh_attnet = 0; ! 35: *tp++ = (struct xtrahash *) 0; ! 36: } ! 37: } ! 38: ! 39: /* ! 40: * Stash a net name in the extra host hash table. ! 41: * If a new entry is put in the hash table, deduce what ! 42: * net the machine is attached to from the net character. ! 43: * ! 44: * If the machine is already known, add the given attached ! 45: * net to those already known. ! 46: */ ! 47: ! 48: mstash(name, attnet) ! 49: char name[]; ! 50: { ! 51: register struct xtrahash *xp; ! 52: struct xtrahash *xlocate(); ! 53: ! 54: xp = xlocate(name); ! 55: if (xp == (struct xtrahash *) 0) { ! 56: printf("Ran out of machine id spots\n"); ! 57: return(0); ! 58: } ! 59: if (xp->xh_name == NOSTR) { ! 60: if (midfree >= XHSIZE) { ! 61: printf("Out of machine ids\n"); ! 62: return(0); ! 63: } ! 64: xtab[midfree] = xp; ! 65: xp->xh_name = savestr(name); ! 66: xp->xh_mid = 0200 + midfree++; ! 67: } ! 68: switch (attnet) { ! 69: case '!': ! 70: case '^': ! 71: xp->xh_attnet |= BN; ! 72: break; ! 73: ! 74: default: ! 75: case ':': ! 76: xp->xh_attnet |= SN; ! 77: break; ! 78: ! 79: case '@': ! 80: xp->xh_attnet |= AN; ! 81: break; ! 82: } ! 83: return(xp->xh_mid); ! 84: } ! 85: ! 86: /* ! 87: * Search for the given name in the hash table ! 88: * and return the pointer to it if found, or to the first ! 89: * empty slot if not found. ! 90: * ! 91: * If no free slots can be found, return 0. ! 92: */ ! 93: ! 94: struct xtrahash * ! 95: xlocate(name) ! 96: char name[]; ! 97: { ! 98: register int h, q, i; ! 99: register char *cp; ! 100: register struct xtrahash *xp; ! 101: ! 102: for (h = 0, cp = name; *cp; h = (h << 2) + *cp++) ! 103: ; ! 104: if (h < 0 && (h = -h) < 0) ! 105: h = 0; ! 106: h = h % XHSIZE; ! 107: cp = name; ! 108: for (i = 0, q = 0; q < XHSIZE; i++, q = i * i) { ! 109: xp = &xtrahash[(h + q) % XHSIZE]; ! 110: if (xp->xh_name == NOSTR) ! 111: return(xp); ! 112: if (strcmp(cp, xp->xh_name) == 0) ! 113: return(xp); ! 114: if (h - q < 0) ! 115: q += XHSIZE; ! 116: xp = &xtrahash[(h - q) % XHSIZE]; ! 117: if (xp->xh_name == NOSTR) ! 118: return(xp); ! 119: if (strcmp(cp, xp->xh_name) == 0) ! 120: return(xp); ! 121: } ! 122: return((struct xtrahash *) 0); ! 123: } ! 124: ! 125: /* ! 126: * Return the name from the extra host hash table corresponding ! 127: * to the passed machine id. ! 128: */ ! 129: ! 130: char * ! 131: mlook(mid) ! 132: { ! 133: register int m; ! 134: ! 135: if ((mid & 0200) == 0) ! 136: return(NOSTR); ! 137: m = mid & ~0200; ! 138: if (m >= midfree) { ! 139: printf("Use made of undefined machine id\n"); ! 140: return(NOSTR); ! 141: } ! 142: return(xtrahash[xtab[m]].xh_name); ! 143: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.