|
|
1.1 ! root 1: /* isoaddrs.c - simple parsing of ISODE addresses */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/compat/RCS/isoaddrs.c,v 7.2 90/07/09 14:31:51 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/compat/RCS/isoaddrs.c,v 7.2 90/07/09 14:31:51 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: isoaddrs.c,v $ ! 12: * Revision 7.2 90/07/09 14:31:51 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.1 90/01/11 18:35:10 mrose ! 16: * real-sync ! 17: * ! 18: * Revision 7.0 89/11/23 21:23:05 mrose ! 19: * Release 6.0 ! 20: * ! 21: */ ! 22: ! 23: /* ! 24: * NOTICE ! 25: * ! 26: * Acquisition, use, and distribution of this module and related ! 27: * materials are subject to the restrictions of a license agreement. ! 28: * Consult the Preface in the User's Manual for the full terms of ! 29: * this agreement. ! 30: * ! 31: */ ! 32: ! 33: ! 34: /* LINTLIBRARY */ ! 35: ! 36: #include <ctype.h> ! 37: #include <stdio.h> ! 38: #include "general.h" ! 39: #include "manifest.h" ! 40: #include "isoaddrs.h" ! 41: #include "internet.h" ! 42: #include "tailor.h" ! 43: ! 44: /* DATA */ ! 45: ! 46: static char *isomacros = "isomacros"; ! 47: ! 48: #define MBUCKETS 128 ! 49: #define MHASH(nm) \ ! 50: (((nm)[1]) ? (((chrcnv[((nm)[0])] - chrcnv[((nm)[1])]) & 0x1f) \ ! 51: + ((chrcnv[(nm)[2]]) & 0x5f)) \ ! 52: : (chrcnv[(nm)[0]]) & 0x7f) ! 53: ! 54: struct macro { ! 55: char *m_name; ! 56: char *m_value; ! 57: ! 58: struct macro *m_chain; ! 59: }; ! 60: ! 61: static int inited = 0; ! 62: static struct macro *Mbuckets[MBUCKETS]; ! 63: ! 64: /* MACROS */ ! 65: ! 66: static struct macro *name2macro (name) ! 67: char *name; ! 68: { ! 69: register struct macro *m; ! 70: ! 71: read_macros (); ! 72: ! 73: for (m = Mbuckets[MHASH (name)]; ! 74: m && lexequ (m -> m_name, name); ! 75: m = m -> m_chain) ! 76: continue; ! 77: ! 78: if (m) ! 79: LLOG (addr_log, LLOG_DEBUG, ! 80: ("MACRO \"%s\" VALUE \"%s\"", m -> m_name, m -> m_value)); ! 81: else ! 82: LLOG (addr_log, LLOG_DEBUG, ! 83: ("lookup of MACRO \"%s\" failed", name)); ! 84: ! 85: return m; ! 86: } ! 87: ! 88: /* */ ! 89: ! 90: static struct macro *value2macro (value) ! 91: char *value; ! 92: { ! 93: register int i, ! 94: j, ! 95: k; ! 96: register struct macro *m, ! 97: *p, ! 98: **np, ! 99: **pp; ! 100: ! 101: read_macros (); ! 102: ! 103: p = NULL, i = 0; ! 104: k = strlen (value); ! 105: for (pp = (np = Mbuckets) + MBUCKETS; np < pp; np++) ! 106: for (m = *np; m; m = m -> m_chain) ! 107: if ((j = strlen (m -> m_value)) <= k ! 108: && j > i ! 109: && strncmp (value, m -> m_value, j) == 0) ! 110: p = m, i = j; ! 111: ! 112: if (p) ! 113: LLOG (addr_log, LLOG_DEBUG, ! 114: ("MACRO \"%s\" VALUE \"%s\" differential %d", ! 115: p -> m_name, p -> m_value, k - strlen (p -> m_value))); ! 116: else ! 117: LLOG (addr_log, LLOG_DEBUG, ! 118: ("lookup of VALUE \"%s\" failed", value)); ! 119: ! 120: return p; ! 121: } ! 122: ! 123: /* */ ! 124: ! 125: static int read_macros () ! 126: { ! 127: register char *hp; ! 128: char buffer[BUFSIZ]; ! 129: ! 130: if (inited) ! 131: return; ! 132: inited = 1; ! 133: ! 134: bzero ((char *) Mbuckets, sizeof Mbuckets); ! 135: ! 136: read_file (isodefile (isomacros, 0)); ! 137: ! 138: if ((hp = getenv ("HOME")) == NULL) ! 139: hp = "."; ! 140: (void) sprintf (buffer, "%s/.isode_macros", hp); ! 141: read_file (buffer); ! 142: } ! 143: ! 144: /* */ ! 145: ! 146: static int read_file (file) ! 147: char *file; ! 148: { ! 149: register char *cp; ! 150: char buffer[BUFSIZ + 1], ! 151: *vec[NVEC + NSLACK + 1]; ! 152: register FILE *fp; ! 153: ! 154: if ((fp = fopen (file, "r")) == NULL) ! 155: return; ! 156: ! 157: while (fgets (buffer, sizeof buffer, fp)) { ! 158: if (*buffer == '#') ! 159: continue; ! 160: if (cp = index (buffer, '\n')) ! 161: *cp = NULL; ! 162: if (str2vec (buffer, vec) < 2) ! 163: continue; ! 164: ! 165: if (add_macro (vec[0], vec[1]) == NOTOK) ! 166: break; ! 167: } ! 168: ! 169: (void) fclose (fp); ! 170: } ! 171: ! 172: /* */ ! 173: ! 174: static int add_macro (name, value) ! 175: char *name, ! 176: *value; ! 177: { ! 178: int i; ! 179: register char *cp; ! 180: char buffer[BUFSIZ]; ! 181: register struct macro *m, ! 182: *p; ! 183: ! 184: if (cp = index (value, '=')) { ! 185: *cp++ = NULL; ! 186: if ((p = name2macro (value)) == NULL) { ! 187: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 188: ("macro \"%s\" references non-existant macro \"%s\"", ! 189: name, value)); ! 190: return OK; ! 191: } ! 192: ! 193: (void) sprintf (value = buffer, "%s%s", p -> m_value, cp); ! 194: } ! 195: ! 196: if ((m = (struct macro *) calloc (1, sizeof *m)) == NULL) { ! 197: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 198: ("calloc of macro structure failed")); ! 199: return NOTOK; ! 200: } ! 201: if ((m -> m_name = malloc ((unsigned) (strlen (name) + 1))) == NULL ! 202: || (m -> m_value = malloc ((unsigned) (strlen (value) + 1))) ! 203: == NULL) { ! 204: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 205: ("malloc of alias structure failed")); ! 206: if (m -> m_name) ! 207: free (m -> m_name); ! 208: free ((char *) m); ! 209: return NOTOK; ! 210: } ! 211: (void) strcpy (m -> m_name, name); ! 212: (void) strcpy (m -> m_value, value); ! 213: ! 214: m -> m_chain = Mbuckets[i = MHASH (m -> m_name)]; ! 215: Mbuckets[i] = m; ! 216: ! 217: return OK; ! 218: } ! 219: ! 220: /* */ ! 221: ! 222: char *macro2str (name) ! 223: char *name; ! 224: { ! 225: register struct macro *m = name2macro (name); ! 226: ! 227: return (m ? m -> m_value : NULLCP); ! 228: } ! 229: ! 230: /* STR2PADDR */ ! 231: ! 232: #define PS_INIT 0 /* <selector> or <network-address> */ ! 233: #define PS_SEL1 1 /* .. got one selector already */ ! 234: #define PS_SEL2 2 /* .. got two selectors already */ ! 235: #define PS_SEL3 3 /* <network-address> */ ! 236: ! 237: ! 238: static struct pair { ! 239: char *p_name; ! 240: char *p_value; ! 241: } afi_entries[] = { ! 242: "X121", "36", ! 243: "DCC", "38", ! 244: "TELEX", "54", ! 245: "PSTN", "56", ! 246: "ISDN", "58", ! 247: "ICD", "46", ! 248: "LOCAL", "48", ! 249: ! 250: NULL ! 251: }; ! 252: ! 253: ! 254: static char sel1[TSSIZE]; ! 255: static char sel2[TSSIZE]; ! 256: static char sel3[TSSIZE]; ! 257: static char *sels[3] = { ! 258: sel1, sel2, sel3 ! 259: }; ! 260: ! 261: ! 262: #define IMPLODE(intres,octres,octval,intval) \ ! 263: { \ ! 264: register int z = (intval); \ ! 265: register char *y = (octval); \ ! 266: register char *zp = y + z; \ ! 267: \ ! 268: while (zp-- > y) \ ! 269: if (!isxdigit (*zp)) { \ ! 270: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, \ ! 271: ("invalid hexstring: \"%*.*s\"", \ ! 272: z, z, y)); \ ! 273: } \ ! 274: (intres) = implode ((u_char *) (octres), y, z); \ ! 275: } ! 276: ! 277: /* */ ! 278: ! 279: #ifdef notdef ! 280: /* An interim approach to use of Network Addresses... */ ! 281: ! 282: #define INTERIM_IDP "5400728722" ! 283: #endif ! 284: ! 285: ! 286: struct PSAPaddr *str2paddr (str) ! 287: char *str; ! 288: { ! 289: register int state, ! 290: *lp; ! 291: int j, ! 292: lens[3]; ! 293: register char *cp, ! 294: *dp, ! 295: *ep, ! 296: *np, ! 297: **sp; ! 298: char buf1[BUFSIZ], ! 299: buf2[BUFSIZ], ! 300: nsap[NASIZE * 2 + 1]; ! 301: register struct macro *m; ! 302: register struct pair *pp; ! 303: static int i = 0; ! 304: static struct PSAPaddr pas[2]; ! 305: register struct PSAPaddr *pa = &pas[i++]; ! 306: register struct SSAPaddr *sa = &pa -> pa_addr; ! 307: register struct TSAPaddr *ta = &sa -> sa_addr; ! 308: register struct NSAPaddr *na = ta -> ta_addrs; ! 309: ! 310: i = i % 2; ! 311: ! 312: bzero ((char *) pa, sizeof *pa); ! 313: (void) strcpy (buf1, str); ! 314: ! 315: state = PS_INIT; ! 316: sp = sels, lp = lens; ! 317: ! 318: for (cp = buf1; *cp; ) ! 319: switch (state) { ! 320: case PS_INIT: ! 321: case PS_SEL1: ! 322: case PS_SEL2: ! 323: switch (*cp) { ! 324: case '"': /* '"' <otherstring> '"' */ ! 325: if ((cp = index (dp = cp + 1, '"')) == NULL) { ! 326: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 327: ("missing double-quote in selector: %s", ! 328: str)); ! 329: return NULLPA; ! 330: } ! 331: *cp++ = NULL; ! 332: (void) strcpy (*sp, dp); ! 333: *lp = strlen (dp); ! 334: break; ! 335: ! 336: case '#': /* '#' <digitstring> */ ! 337: j = 0; ! 338: for (cp++; isdigit (*cp); cp++) ! 339: j = j * 10 + *cp - '0'; ! 340: if (j > 0xffff) { ! 341: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 342: ("invalid #-style selector: %s", str)); ! 343: return NULLPA; ! 344: } ! 345: (*sp)[0] = (j >> 8) & 0xff; ! 346: (*sp)[1] = j & 0xff; ! 347: *lp = 2; ! 348: break; ! 349: ! 350: case '\'': /* "'" <hexstring> "'H" */ ! 351: if ((cp = index (dp = cp + 1, '\'')) == NULL) { ! 352: missing_quoteH: ; ! 353: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 354: ("missing 'H in selector: %s",str)); ! 355: return NULLPA; ! 356: } ! 357: *cp++ = NULL; ! 358: if (*cp++ != 'H') ! 359: goto missing_quoteH; ! 360: IMPLODE (*lp, *sp, dp, strlen (dp)); ! 361: break; ! 362: ! 363: case '/': /* empty selector */ ! 364: *lp = 0; ! 365: break; ! 366: ! 367: default: ! 368: goto stuff_selectors; ! 369: } ! 370: sp++, lp++; ! 371: if (*cp++ != '/') { ! 372: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 373: ("missing selector seperator at position %d: %s", ! 374: cp - buf1, str)); ! 375: return NULLPA; ! 376: } ! 377: state++; ! 378: break; ! 379: ! 380: stuff_selectors: ; ! 381: state = PS_SEL3; ! 382: /* and fall */ ! 383: ! 384: case PS_SEL3: ! 385: if ((cp = index (ep = cp, '|')) == NULL) ! 386: cp = ep + strlen (ep); ! 387: else ! 388: *cp++ = NULL; ! 389: ! 390: if (dp = index (ep, '=')) { ! 391: *dp++ = NULL; ! 392: if ((m = name2macro (ep)) == NULL) { ! 393: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 394: ("non-existant macro \"%s\"", ep)); ! 395: return NULLPA; ! 396: } ! 397: (void) sprintf (ep = buf2, "%s%s", m -> m_value, dp); ! 398: } ! 399: ! 400: { ! 401: register int k, ! 402: l, ! 403: n; ! 404: register struct ts_interim *ts, ! 405: *tp; ! 406: ! 407: tp = NULL, n = 0; ! 408: k = strlen (ep); ! 409: for (ts = ts_interim; ts -> ts_name; ts++) ! 410: if (ts -> ts_value ! 411: && (l = strlen (ts -> ts_value)) <= k ! 412: && l > n ! 413: && strncmp (ep, ts -> ts_value, l) == 0) ! 414: tp = ts, n = l; ! 415: if (tp) ! 416: na -> na_community = tp -> ts_subnet; ! 417: else ! 418: /* XXX: what a hack! */ ! 419: if (strncmp (ep, "X121+", sizeof "X121+" - 1) == 0) ! 420: na -> na_community = SUBNET_INT_X25; ! 421: else { ! 422: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 423: ("unable to determine community for %s",ep)); ! 424: return NULLPA; ! 425: } ! 426: } ! 427: ! 428: if ((ep = index (dp = ep, '+')) == NULL) { ! 429: missing_seperator: ; ! 430: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 431: ("missing network-address seperator: %s", str)); ! 432: return NULLPA; ! 433: } ! 434: *ep++ = NULL; ! 435: if (ta -> ta_naddr >= NTADDR) { ! 436: #ifdef h_addr ! 437: too_many: ; ! 438: #endif ! 439: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 440: ("too many network addresses starting at position %d: %s", ! 441: dp - buf1 + 1, str)); ! 442: return pa; ! 443: } ! 444: ! 445: na -> na_stack = NA_NSAP; ! 446: if (lexequ (dp, "NS") == 0) { ! 447: IMPLODE (na -> na_addrlen, na -> na_address, ep, ! 448: strlen (ep)); ! 449: } ! 450: else { ! 451: for (pp = afi_entries; pp -> p_name; pp++) ! 452: if (lexequ (pp -> p_name, dp) == 0) ! 453: break; ! 454: if (!pp -> p_name) { ! 455: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 456: ("unknown AFI \"%s\": %s", dp, str)); ! 457: return NULLPA; ! 458: } ! 459: if ((ep = index (dp = ep, '+')) == NULL) ! 460: ep = dp + strlen (dp); ! 461: else ! 462: *ep++ = NULL; ! 463: if (lexequ (pp -> p_name, "X121") == 0) { ! 464: /* X121 form -- should be more general */ ! 465: (void) strcpy (nsap, dp); ! 466: if ((na -> na_dtelen = strlen (nsap)) > NSAP_DTELEN) { ! 467: dp = nsap; ! 468: goto invalid_dte; ! 469: } ! 470: (void) strcpy (na -> na_dte, nsap); ! 471: #ifdef BRIDGE_X25 ! 472: na -> na_stack = bridgediscrim (na) ? NA_BRG : NA_X25; ! 473: #else ! 474: na -> na_stack = NA_X25; ! 475: #endif ! 476: na -> na_community = SUBNET_INT_X25; ! 477: if (*ep != NULL) { ! 478: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 479: ("bad X121 form \"%s\"", ep)); ! 480: return NULLPA; ! 481: } ! 482: goto next; ! 483: } ! 484: else ! 485: (void) sprintf (nsap, "%s%s", pp -> p_value, dp); ! 486: switch (*ep) { ! 487: case 'd': ! 488: (void) strcpy (nsap + strlen (nsap), ep + 1); ! 489: /* and fall */ ! 490: case 'x': ! 491: case 'l': ! 492: case NULL: ! 493: np = nsap, dp = na -> na_address; ! 494: while (*np) { ! 495: *dp = (*np++ - '0') << 4; ! 496: if (*np) ! 497: *dp++ |= (*np++ - '0') & 0x0f; ! 498: else ! 499: *dp++ |= 0x0f; ! 500: } ! 501: na -> na_addrlen = dp - na -> na_address; ! 502: if (*ep == 'x') { ! 503: IMPLODE (j, dp, ep + 1, strlen (ep + 1)); ! 504: na -> na_addrlen += j; ! 505: } ! 506: else ! 507: if (*ep == 'l') { ! 508: (void) strcpy (dp, ep + 1); ! 509: na -> na_addrlen += strlen (ep + 1); ! 510: } ! 511: break; ! 512: ! 513: default: ! 514: if (strncmp ("RFC-1006+", ep, ! 515: sizeof "RFC-1006+" - 1) == 0) { ! 516: #ifdef h_addr ! 517: register char **ap; ! 518: #endif ! 519: register struct hostent *hp; ! 520: ! 521: na -> na_stack = NA_TCP; ! 522: #ifdef notdef ! 523: if (strcmp (nsap, INTERIM_IDP)) { ! 524: wrong_idp: ; ! 525: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 526: ("wrong IDP \"%s\" for DSP \"%s\"", ! 527: nsap, ep)); ! 528: return NULLPA; ! 529: } ! 530: #endif ! 531: ep += sizeof "RFC-1006+" - 1; ! 532: if ((ep = index (dp = ep, '+')) == NULL) ! 533: goto missing_seperator; ! 534: *ep++ = NULL; ! 535: #ifdef notdef ! 536: na -> na_community = atoi (dp); ! 537: #endif ! 538: if ((ep = index (dp = ep, '+')) == NULL) ! 539: ep = dp + strlen (dp); ! 540: else ! 541: *ep++ = NULL; ! 542: ! 543: if ((hp = gethostbystring (dp)) == NULL) { ! 544: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 545: ("%s: unknown host", dp)); ! 546: return NULLPA; ! 547: } ! 548: (void) strcpy (na -> na_domain, ! 549: inet_ntoa (*(struct in_addr *) ! 550: hp -> h_addr)); ! 551: if (*ep) { ! 552: if ((ep = index (dp = ep, '+')) == NULL) ! 553: ep = dp + strlen (dp); ! 554: else ! 555: *ep++ = NULL; ! 556: na -> na_port = htons ((u_short) atoi(dp)); ! 557: ! 558: if (*ep) ! 559: na -> na_tset = atoi (ep); ! 560: } ! 561: #ifdef h_addr ! 562: for (ap = hp -> h_addr_list + 1; *ap; ap++) { ! 563: ta -> ta_naddr++, na++; ! 564: ! 565: if (ta -> ta_naddr >= NTADDR) ! 566: goto too_many; ! 567: bcopy ((char *) (na - 1), (char *) na, ! 568: sizeof *na); ! 569: (void) strcpy (na -> na_domain, ! 570: inet_ntoa (*(struct in_addr *) *ap)); ! 571: } ! 572: #endif ! 573: break; ! 574: } ! 575: if (strncmp ("X.25(80)+", ep, ! 576: sizeof "X.25(80)+" - 1) == 0) { ! 577: na -> na_stack = NA_X25; ! 578: #ifdef notdef ! 579: if (strcmp (nsap, INTERIM_IDP)) ! 580: goto wrong_idp; ! 581: #endif ! 582: ep += sizeof "X.25(80)+" - 1; ! 583: if ((ep = index (dp = ep, '+')) == NULL) ! 584: goto missing_seperator; ! 585: *ep++ = NULL; ! 586: #ifdef notdef ! 587: na -> na_community = atoi (dp); ! 588: #endif ! 589: if ((ep = index (dp = ep, '+')) == NULL) ! 590: ep = dp + strlen (dp); ! 591: else ! 592: *ep++ = NULL; ! 593: for (np = dp; *np; np++) ! 594: if (!isdigit (*np)) { ! 595: invalid_dte: ; ! 596: SLOG (addr_log, LLOG_EXCEPTIONS, ! 597: NULLCP, ! 598: ("invalid DTE \"%s\": %s", ! 599: dp, str)); ! 600: return NULLPA; ! 601: } ! 602: if (np - dp > NSAP_DTELEN + 1) ! 603: goto invalid_dte; ! 604: (void) strcpy (na -> na_dte, dp); ! 605: na -> na_dtelen = strlen (na -> na_dte); ! 606: if (*ep) { ! 607: char *cudf, ! 608: *clen; ! 609: ! 610: if ((ep = index (dp = ep, '+')) == NULL) ! 611: goto missing_seperator; ! 612: *ep++ = NULL; ! 613: ! 614: if (lexequ (dp, "CUDF") == 0) { ! 615: cudf = na -> na_cudf; ! 616: clen = &na -> na_cudflen; ! 617: j = sizeof na -> na_cudf; ! 618: } ! 619: else ! 620: if (lexequ (dp, "PID") == 0) { ! 621: cudf = na -> na_pid; ! 622: clen = &na -> na_pidlen; ! 623: j = sizeof na -> na_pid; ! 624: } ! 625: else { ! 626: invalid_field: ; ! 627: SLOG (addr_log, LLOG_EXCEPTIONS, ! 628: NULLCP, ! 629: ("invalid field \"%s\": %s", ! 630: dp, str)); ! 631: return NULLPA; ! 632: } ! 633: if (j * 2 < strlen (ep)) ! 634: goto invalid_field; ! 635: IMPLODE (j, cudf, ep, strlen (ep)); ! 636: *clen = j & 0xff; ! 637: } ! 638: #ifdef BRIDGE_X25 ! 639: na -> na_stack = bridgediscrim (na) ? NA_BRG ! 640: : NA_X25; ! 641: #endif ! 642: break; ! 643: } ! 644: #ifdef notdef ! 645: if (lexequ ("ECMA-117-Binary", ep) == 0) { ! 646: /* some day support this... */ ! 647: break; ! 648: } ! 649: if (lexequ ("ECMA-117-Decimal", ep) == 0) { ! 650: /* some day support this... */ ! 651: break; ! 652: } ! 653: #endif ! 654: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 655: ("unknown DSP \"%s\": %s", ep, str)); ! 656: return NULLPA; ! 657: } ! 658: } ! 659: next: ; ! 660: ta -> ta_naddr++, na++; ! 661: break; ! 662: } ! 663: ! 664: switch (sp - sels) { ! 665: case 3: /* PSEL+SSEL+TSEL */ ! 666: bcopy (*--sp, ta -> ta_selector, ! 667: ta -> ta_selectlen = *--lp); ! 668: bcopy (*--sp, sa -> sa_selector, ! 669: sa -> sa_selectlen = *--lp); ! 670: bcopy (*--sp, pa -> pa_selector, ! 671: pa -> pa_selectlen = *--lp); ! 672: break; ! 673: ! 674: case 2: /* SSEL+TSEL */ ! 675: bcopy (*--sp, ta -> ta_selector, ! 676: ta -> ta_selectlen = *--lp); ! 677: bcopy (*--sp, sa -> sa_selector, ! 678: sa -> sa_selectlen = *--lp); ! 679: break; ! 680: ! 681: case 1: /* TSEL */ ! 682: bcopy (*--sp, ta -> ta_selector, ! 683: ta -> ta_selectlen = *--lp); ! 684: break; ! 685: ! 686: default: ! 687: break; ! 688: } ! 689: ! 690: return pa; ! 691: } ! 692: ! 693: /* */ ! 694: ! 695: int macro2comm (name, ts) ! 696: char *name; ! 697: register struct ts_interim *ts; ! 698: { ! 699: int j; ! 700: register char *ap, ! 701: *cp, ! 702: *dp, ! 703: *ep, ! 704: *fp, ! 705: *np; ! 706: char addr[NASIZE * 2 + 1], ! 707: buffer[BUFSIZ]; ! 708: register struct pair *pp; ! 709: ! 710: ts -> ts_length = 0, ts -> ts_syntax = NA_NSAP; ! 711: if ((cp = macro2str (name)) == NULLCP) ! 712: return NOTOK; ! 713: ts -> ts_value = cp; ! 714: (void) strcpy (buffer, cp); ! 715: ap = addr; ! 716: ! 717: if ((ep = index (dp = buffer, '+')) == NULL) ! 718: ep = dp + strlen (dp); ! 719: else ! 720: *ep++ = NULL; ! 721: ! 722: if (lexequ (dp, "NS") == 0) { ! 723: IMPLODE (ts -> ts_length, ts -> ts_prefix, ep, strlen (ep)); ! 724: ! 725: return OK; ! 726: } ! 727: ! 728: for (pp = afi_entries; pp -> p_name; pp++) ! 729: if (lexequ (pp -> p_name, dp) == 0) ! 730: break; ! 731: if (!pp -> p_name) { ! 732: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 733: ("unknown AFI \"%s\": %s", dp, cp)); ! 734: return NOTOK; ! 735: } ! 736: ! 737: (void) strcpy (ap, pp -> p_value); ! 738: ap += strlen (ap); ! 739: ! 740: if (!ep) ! 741: goto out; ! 742: ! 743: if ((ep = index (dp = ep, '+')) == NULL) ! 744: ep = dp + strlen (dp); ! 745: else ! 746: *ep++ = NULL; ! 747: ! 748: for (fp = dp; *fp; fp++) ! 749: if (!isdigit (*fp)) ! 750: break; ! 751: if (*fp) { ! 752: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 753: ("invalid AFI suffix \"%s\": %s", dp, cp)); ! 754: return NOTOK; ! 755: } ! 756: (void) strcpy (ap, dp); ! 757: ap += strlen (ap); ! 758: ! 759: if (lexequ (pp -> p_name, "X121") == 0) { ! 760: if (*ep) { ! 761: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 762: ("invalid DTE \"%s\": %s", dp, cp)); ! 763: return NOTOK; ! 764: } ! 765: ! 766: ts -> ts_syntax = NA_X25; ! 767: ts -> ts_subnet = SUBNET_INT_X25; ! 768: goto out; ! 769: } ! 770: ! 771: switch (*ep) { ! 772: case 'd': ! 773: (void) strcpy (ap, ep + 1); ! 774: /* and fall */ ! 775: case 'x': ! 776: case 'l': ! 777: case NULL: ! 778: break; ! 779: ! 780: default: ! 781: if ((ep = index (dp = ep, '+')) == NULL) ! 782: ep = dp + strlen (dp); ! 783: else ! 784: *ep++ = NULL; ! 785: if (lexequ (dp, "RFC-1006") == 0) ! 786: ts -> ts_syntax = NA_TCP; ! 787: else ! 788: if (lexequ (dp, "X.25(80)") == 0) ! 789: ts -> ts_syntax = NA_X25; ! 790: else { ! 791: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 792: ("unknown DSP \"%s\": %s", dp, cp)); ! 793: return NOTOK; ! 794: } ! 795: if ((ep = index (dp = ep, '+')) == NULL) ! 796: ep = dp + strlen (dp); ! 797: else ! 798: *ep++ = NULL; ! 799: ! 800: (void) strcpy (ap, dp); ! 801: ap += strlen (ap); ! 802: ! 803: if (*ep) { ! 804: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 805: ("invalid MACRO for community \"%s\": %s", name, cp)); ! 806: return NOTOK; ! 807: } ! 808: break; ! 809: } ! 810: ! 811: out: ; ! 812: ap = addr, np = ts -> ts_prefix; ! 813: while (*ap) { ! 814: *np = (*ap++ - '0') << 4; ! 815: if (*ap) ! 816: *np++ |= (*ap++ - '0') & 0x0f; ! 817: else ! 818: *np++ |= 0x0f; ! 819: } ! 820: switch (*ep) { ! 821: case 'x': ! 822: IMPLODE (j, np, ep + 1, strlen (ep + 1)); ! 823: np += j; ! 824: break; ! 825: ! 826: case 'l': ! 827: (void) strcpy (np, ep + 1); ! 828: np += strlen (ep + 1); ! 829: break; ! 830: ! 831: default: ! 832: break; ! 833: } ! 834: ts -> ts_length = np - ts -> ts_prefix; ! 835: ! 836: return OK; ! 837: } ! 838: ! 839: /* PADDR2STR */ ! 840: ! 841: static char *SEL2STR (sel, len) ! 842: char *sel; ! 843: int len; ! 844: { ! 845: register char *cp, ! 846: *dp, ! 847: *ep; ! 848: static char buffer[PSSIZE * 2 + 4]; ! 849: ! 850: if (len <= 0) ! 851: return ""; ! 852: ! 853: cp = buffer; ! 854: *cp++ = '"'; ! 855: for (ep = (dp = sel) + len; dp < ep; dp++) { ! 856: switch (*dp) { ! 857: case '+': ! 858: case '-': ! 859: case '.': ! 860: break; ! 861: ! 862: default: ! 863: if (!isalnum (*dp)) { ! 864: cp = buffer; ! 865: *cp++ = '\''; ! 866: cp += explode (cp, (u_char *) sel, len); ! 867: (void) strcpy (cp, "'H"); ! 868: return buffer; ! 869: } ! 870: break; ! 871: } ! 872: ! 873: *cp++ = *dp; ! 874: } ! 875: *cp++ = '"'; ! 876: *cp = NULL; ! 877: ! 878: return buffer; ! 879: } ! 880: ! 881: /* */ ! 882: ! 883: char *_paddr2str (pa, na, compact) ! 884: register struct PSAPaddr *pa; ! 885: register struct NSAPaddr *na; ! 886: int compact; ! 887: { ! 888: register int n; ! 889: int first; ! 890: register char *bp, ! 891: *cp, ! 892: *dp; ! 893: register struct macro *m; ! 894: register struct SSAPaddr *sa; ! 895: register struct TSAPaddr *ta; ! 896: register struct NSAPaddr *ca; ! 897: static int i = 0; ! 898: static char buf1[BUFSIZ], ! 899: buf2[BUFSIZ]; ! 900: static char *bufs[] = { buf1, buf2 }; ! 901: ! 902: bp = cp = bufs[i++]; ! 903: i = i % 2; ! 904: ! 905: if (pa == NULLPA) { ! 906: bad_pa: ; ! 907: (void) strcpy (bp, "NULLPA"); ! 908: return bp; ! 909: } ! 910: sa = &pa -> pa_addr; ! 911: ta = &sa -> sa_addr; ! 912: ! 913: if (na) ! 914: n = 1; ! 915: else ! 916: if ((n = ta -> ta_naddr) > 0) ! 917: na = ta -> ta_addrs; ! 918: ! 919: if (pa -> pa_selectlen > 0) { ! 920: (void) sprintf (cp, "%s/", ! 921: SEL2STR (pa -> pa_selector, pa -> pa_selectlen)); ! 922: cp += strlen (cp); ! 923: } ! 924: if (sa -> sa_selectlen > 0 || bp != cp) { ! 925: (void) sprintf (cp, "%s/", ! 926: SEL2STR (sa -> sa_selector, sa -> sa_selectlen)); ! 927: cp += strlen (cp); ! 928: } ! 929: if (ta -> ta_selectlen > 0 || bp != cp) { ! 930: (void) sprintf (cp, "%s/", ! 931: SEL2STR (ta -> ta_selector, ta -> ta_selectlen)); ! 932: cp += strlen (cp); ! 933: } ! 934: ! 935: for (first = 1; n > 0; na++, n--) { ! 936: register struct ts_interim *ts; ! 937: ! 938: if (first) ! 939: first = 0; ! 940: else ! 941: *cp++ = '|'; ! 942: ! 943: if (compact > 0) { ! 944: if ((ca = na2norm (na)) == NULLNA) ! 945: goto bad_pa; ! 946: ! 947: (void) strcpy (cp, "NS+"); ! 948: cp += strlen (cp); ! 949: ! 950: cp += explode (cp, (u_char *) ca -> na_address, ca -> na_addrlen); ! 951: *cp = NULL; ! 952: continue; ! 953: } ! 954: ! 955: for (ts = ts_interim; ts -> ts_name; ts++) ! 956: if (ts -> ts_subnet == na -> na_community) ! 957: break; ! 958: if (!ts -> ts_name) { ! 959: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 960: ("unable to find community #%d", na -> na_community)); ! 961: goto bad_pa; ! 962: } ! 963: if (!ts -> ts_value) { ! 964: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 965: ("community \"%s\" (subnet #%d) has no corresponding MACRO", ! 966: ts -> ts_name, na -> na_community)); ! 967: goto bad_pa; ! 968: } ! 969: (void) strcpy (dp = cp, ts -> ts_value); ! 970: cp += strlen (cp) - 1; ! 971: if (*cp != '+') ! 972: *++cp = '+', *++cp = NULL; ! 973: else ! 974: cp++; ! 975: ! 976: switch (na -> na_stack) { ! 977: case NA_NSAP: ! 978: (void) strcpy (cp = dp, "NS+"); ! 979: cp += strlen (cp); ! 980: ! 981: cp += explode (cp, (u_char *) na -> na_address, na -> na_addrlen); ! 982: *cp = NULL; ! 983: break; ! 984: ! 985: case NA_TCP: ! 986: (void) strcpy (cp, na -> na_domain); ! 987: cp += strlen (cp); ! 988: if (na -> na_port) { ! 989: (void) sprintf (cp, "+%d", (int) ntohs (na -> na_port)); ! 990: cp += strlen (cp); ! 991: ! 992: if (na -> na_tset) { ! 993: (void) sprintf (cp, "+%d", (int) na -> na_tset); ! 994: cp += strlen (cp); ! 995: } ! 996: } ! 997: break; ! 998: ! 999: case NA_X25: ! 1000: case NA_BRG: ! 1001: if (na -> na_community == SUBNET_INT_X25 ! 1002: && na -> na_cudflen == 0 ! 1003: && na -> na_pidlen == 0 ! 1004: && na -> na_dte[0] != '0') { ! 1005: (void) sprintf (cp = dp, "X121+%s", na -> na_dte); ! 1006: cp += strlen (cp); ! 1007: } ! 1008: else { ! 1009: (void) strcpy (cp, na -> na_dte); ! 1010: cp += strlen (cp); ! 1011: if (na -> na_pidlen > 0) { ! 1012: (void) strcpy (cp, "+PID+"); ! 1013: cp += strlen (cp); ! 1014: ! 1015: cp += explode (cp, (u_char *) na -> na_pid, ! 1016: (int) na -> na_pidlen); ! 1017: } ! 1018: else ! 1019: if (na -> na_cudflen > 0) { ! 1020: (void) strcpy (cp, "+CUDF+"); ! 1021: cp += strlen (cp); ! 1022: ! 1023: cp += explode (cp, (u_char *) na -> na_cudf, ! 1024: (int) na -> na_cudflen); ! 1025: } ! 1026: *cp = NULL; ! 1027: } ! 1028: break; ! 1029: ! 1030: default: ! 1031: SLOG (addr_log, LLOG_EXCEPTIONS, NULLCP, ! 1032: ("unknown address type 0x%x", na -> na_stack)); ! 1033: goto bad_pa; ! 1034: } ! 1035: ! 1036: SLOG (addr_log, LLOG_DEBUG, NULLCP, ("dp = %s",dp)); ! 1037: ! 1038: if (!compact && (m = value2macro (dp))) { ! 1039: char buffer[BUFSIZ]; ! 1040: ! 1041: (void) sprintf (buffer, "%s=%s", m -> m_name, ! 1042: dp + strlen (m -> m_value)); ! 1043: (void) strcpy (dp, buffer); ! 1044: cp = dp + strlen (dp); ! 1045: } ! 1046: } ! 1047: *cp = NULL; ! 1048: ! 1049: return bp; ! 1050: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.