|
|
1.1 ! root 1: %Start GATE ! 2: ws [ \t\n]* ! 3: s [ \t\n]+ ! 4: num [0123456789abcdefABCDEF]+ ! 5: name [a-zA-Z.\-_][a-zA-Z0-9.\-_]* ! 6: other [^ \t\na-zA-Z.\-_0-9;] ! 7: ! 8: %{ ! 9: #include <ctype.h> ! 10: #include <sys/types.h> ! 11: #include <sys/socket.h> ! 12: #include <netinet/in.h> ! 13: #include <netdb.h> ! 14: #include "hyr_sym.h" ! 15: #undef output ! 16: ! 17: struct sym *curgate = NULL; ! 18: struct sym *sym_head = NULL; ! 19: static char rcsid[] = "$Header: hyr_lex.l,v 2.4 84/05/04 12:15:34 steveg Exp $$Locker: $"; ! 20: ! 21: char name[32]; ! 22: ! 23: int lexdebug = 0; ! 24: ! 25: extern struct sym *lookup(); ! 26: %} ! 27: ! 28: %% ! 29: ^\*.*$ ; ! 30: ^#.*$ ; ! 31: ^{ws}$ ; ! 32: ! 33: {ws}direct{s}{name}{s}{num}{s}{num}{s}{num}{ws}; { ! 34: register struct sym *s; ! 35: unsigned dst, ctl, access; ! 36: ! 37: outwrap(); ! 38: sscanf(yytext, " direct %s %x %x %x ", name, &dst, &ctl, &access); ! 39: if (lexdebug) ! 40: fprintf(stderr, "DIRECT %s %04x %04x %04x\n", name, dst, ctl, access); ! 41: if (s = lookup(name)) { ! 42: s->sym_dst = htons(dst); ! 43: s->sym_ctl = htons(ctl); ! 44: s->sym_access = htons(access); ! 45: s->sym_flags = HS_DIR; ! 46: } ! 47: } ! 48: ! 49: {ws}loop{s}{name}{s}{num}{s}{num}{s}{num}{ws}; { ! 50: register struct sym *s; ! 51: unsigned dst, ctl, access; ! 52: ! 53: outwrap(); ! 54: sscanf(yytext, " loop %s %x %x %x ", name, &dst, &ctl, &access); ! 55: if (lexdebug) ! 56: fprintf(stderr, "LOOP %s %04x %04x %04x\n", name, dst, ctl, access); ! 57: if (s = lookup(name)) { ! 58: s->sym_dst = htons(dst); ! 59: s->sym_ctl = htons(ctl); ! 60: s->sym_access = htons(access); ! 61: s->sym_flags = HS_DIR + HS_LOOP; ! 62: } ! 63: } ! 64: ! 65: {ws}remloop{s}{name}{s}{num}{s}{num}{s}{num}{ws}; { ! 66: register struct sym *s; ! 67: unsigned dst, ctl, access; ! 68: ! 69: outwrap(); ! 70: sscanf(yytext, " remloop %s %x %x %x ", name, &dst, &ctl, &access); ! 71: if (lexdebug) ! 72: fprintf(stderr, "REMLOOP %s %04x %04x %04x\n", name, dst, ctl, access); ! 73: if (s = lookup(name)) { ! 74: s->sym_dst = htons(dst); ! 75: s->sym_ctl = htons(ctl); ! 76: s->sym_access = htons(access); ! 77: s->sym_flags = HS_DIR + HS_RLOOP; ! 78: } ! 79: } ! 80: ! 81: {ws}gateway{s}{name} { ! 82: register struct sym *s; ! 83: ! 84: outwrap(); ! 85: sscanf(yytext, " gateway %s ", name); ! 86: if (lexdebug) ! 87: fprintf(stderr, "GATEWAY %s ->", name); ! 88: if (s = lookup(name)) { ! 89: s->sym_flags = HS_INDIR; ! 90: curgate = s; ! 91: } ! 92: BEGIN GATE; ! 93: } ! 94: ! 95: <GATE>{s}{name} { ! 96: register struct sym *s; ! 97: ! 98: outwrap(); ! 99: sscanf(yytext, " %s ", name); ! 100: if (lexdebug) ! 101: fprintf(stderr, " %s", name); ! 102: if (s = lookup(name)) { ! 103: if (curgate->sym_ngate < 32) ! 104: curgate->sym_gate[curgate->sym_ngate++] = s; ! 105: s->sym_flags |= HS_GATE; ! 106: } ! 107: } ! 108: ! 109: <GATE>{ws}; { ! 110: outwrap(); ! 111: if (lexdebug) ! 112: fprintf(stderr, "\n"); ! 113: curgate = NULL; ! 114: BEGIN 0; ! 115: } ! 116: ; ; /* ignore extra ';'s */ ! 117: ! 118: %% ! 119: ! 120: struct sym * ! 121: lookup(cp) ! 122: char *cp; ! 123: { ! 124: register struct sym *s; ! 125: register struct hostent *hp; ! 126: struct hostent *gethostbyname(); ! 127: extern char *malloc(); ! 128: ! 129: for (s = sym_head; s != NULL; s = s->sym_next) { ! 130: if (strncmp(cp, s->sym_name, sizeof(s->sym_name)) == 0 || ! 131: strncmp(cp, s->sym_nickname, sizeof(s->sym_nickname)) == 0) { ! 132: return(s); ! 133: } ! 134: } ! 135: hp = gethostbyname(cp); ! 136: if (hp == NULL) { ! 137: printf("Host %s not found\n", cp); ! 138: return(NULL); ! 139: } ! 140: if (hp->h_addrtype != AF_INET) { ! 141: printf("Host %s not Internet\n", cp); ! 142: return(NULL); ! 143: } ! 144: s = (struct sym *) malloc(sizeof *s); ! 145: if (s != NULL) { ! 146: s->sym_lastok = 0; ! 147: s->sym_flags = 0; ! 148: s->sym_ngate = 0; ! 149: s->sym_dst = s->sym_ctl = s->sym_access = 0; ! 150: s->sym_inaddr = *(struct in_addr *)hp->h_addr; ! 151: s->sym_next = sym_head; ! 152: sym_head = s; ! 153: strncpy(s->sym_name, hp->h_name, sizeof(s->sym_name)); ! 154: strncpy(s->sym_nickname, cp, sizeof(s->sym_nickname)); ! 155: } ! 156: return(s); ! 157: } ! 158: ! 159: sym_print(s) ! 160: register struct sym *s; ! 161: { ! 162: register int i; ! 163: char *str = " "; ! 164: ! 165: printf("Host %s", s->sym_name); ! 166: if (strcmp(s->sym_name, s->sym_nickname) != 0) ! 167: printf(" (aka %s)", s->sym_nickname); ! 168: printf("\n\tInternet address: "); ! 169: in_print(s->sym_inaddr.s_addr); ! 170: printf("\n"); ! 171: if (s->sym_flags & HS_DIR) { ! 172: if (s->sym_flags & HS_LOOP) ! 173: printf("\tLoop: "); ! 174: else if (s->sym_flags & HS_RLOOP) ! 175: printf("\tRemloop: "); ! 176: else ! 177: printf("\tDirect: "); ! 178: printf("dst %04x ctl %04x access %04x%s\n", ! 179: ntohs(s->sym_dst), ! 180: ntohs(s->sym_ctl), ! 181: ntohs(s->sym_access), ! 182: (s->sym_flags & HS_GATE) ? "\tused as a gateway" : ""); ! 183: } else if (s->sym_flags & HS_INDIR) { ! 184: printf("\tGatewayed through:"); ! 185: for (i = 0; i < s->sym_ngate; i++) { ! 186: printf("%s%s", str, s->sym_gate[i]->sym_name); ! 187: str = ", "; ! 188: } ! 189: printf("\n"); ! 190: } ! 191: } ! 192: ! 193: symtab_print() ! 194: { ! 195: register struct sym *s; ! 196: ! 197: printf("\n"); ! 198: for (s = sym_head; s != NULL; s = s->sym_next) ! 199: sym_print(s); ! 200: printf("End of Symbol table\n"); ! 201: } ! 202: ! 203: char outbuf[128] = ""; ! 204: char *outbufp = outbuf; ! 205: ! 206: /* ! 207: * record characters in the output buffer for later error message ! 208: */ ! 209: output(c) ! 210: int c; ! 211: { ! 212: if ((isprint(c) || c == ' ') && isascii(c) && outbufp < &outbuf[sizeof(outbuf)]) ! 213: *outbufp++ = c; ! 214: *outbufp = '\0'; ! 215: } ! 216: ! 217: /* ! 218: * if there are any characters in the output buffer, print an error message ! 219: */ ! 220: outwrap() ! 221: { ! 222: if (outbufp != outbuf) { ! 223: fprintf(stderr, "hyroute: syntax error on \"%s\"\n", outbuf); ! 224: outbufp = outbuf; ! 225: lex_error++; ! 226: } ! 227: } ! 228: ! 229: /* ! 230: * flush last error message out then return saying no more input available ! 231: */ ! 232: yywrap() { ! 233: outwrap(); ! 234: return(1); ! 235: } ! 236: ! 237: /* ! 238: * print an internet format address in "dot" notation ! 239: * input address is in network byte ordering ! 240: */ ! 241: in_print(n) ! 242: register unsigned long n; ! 243: { ! 244: n = ntohl(n); ! 245: printf("%d.%d.%d.%d", (n >> 24) & 0xff, (n >> 16) & 0xff, (n >> 8) & 0xff, n & 0xff); ! 246: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.