|
|
1.1 ! root 1: -- dse.py - help out co-resident DSE ! 2: ! 3: -- $Header: /f/osi/acsap/RCS/dse.py,v 7.2 90/07/09 14:31:05 mrose Exp $ ! 4: -- ! 5: -- ! 6: -- $Log: dse.py,v $ ! 7: -- Revision 7.2 90/07/09 14:31:05 mrose ! 8: -- sync ! 9: -- ! 10: -- Revision 7.1 89/12/04 08:44:12 mrose ! 11: -- touch-up ! 12: -- ! 13: -- Revision 7.0 89/11/23 21:22:09 mrose ! 14: -- Release 6.0 ! 15: -- ! 16: ! 17: -- ! 18: -- NOTICE ! 19: -- ! 20: -- Acquisition, use, and distribution of this module and related ! 21: -- materials are subject to the restrictions of a license agreement. ! 22: -- Consult the Preface in the User's Manual for the full terms of ! 23: -- this agreement. ! 24: -- ! 25: -- ! 26: ! 27: ! 28: DSE DEFINITIONS ::= ! 29: %{ ! 30: #ifndef lint ! 31: static char *rcsid = "$Header: /f/osi/acsap/RCS/dse.py,v 7.2 90/07/09 14:31:05 mrose Exp $"; ! 32: #endif ! 33: ! 34: #include <stdio.h> ! 35: #include "psap.h" ! 36: #include "isoaddrs.h" ! 37: #include "tailor.h" ! 38: ! 39: /* Encoding on "unrealNS" addresses based on ! 40: ! 41: "An interim approach to use of Network Addresses", ! 42: S.E. Kille, January 16, 1989 ! 43: ! 44: */ ! 45: ! 46: /* */ ! 47: ! 48: #define getstr(ss,sl,ds,dl,dn,w) \ ! 49: if (sl > dn) { \ ! 50: advise (NULLCP, "%s too long", w); \ ! 51: return NOTOK; \ ! 52: } \ ! 53: bcopy (ss, ds, dl = sl); ! 54: ! 55: %} ! 56: ! 57: BEGIN ! 58: ! 59: ENCODER build ! 60: ! 61: PSAPaddr ! 62: %{ ! 63: register int n; ! 64: struct PSAPaddr *pa = (struct PSAPaddr *) parm; ! 65: struct SSAPaddr *sa = &pa -> pa_addr; ! 66: struct TSAPaddr *ta = &sa -> sa_addr; ! 67: register struct NSAPaddr *na, ! 68: *ca; ! 69: %} ! 70: ::= ! 71: SEQUENCE { ! 72: pSelector[0] ! 73: OCTET STRING ! 74: [[ o pa -> pa_selector $ pa -> pa_selectlen ]] ! 75: OPTIONAL << pa -> pa_selectlen >>, ! 76: ! 77: sSelector[1] ! 78: OCTET STRING ! 79: [[ o sa -> sa_selector $ sa -> sa_selectlen ]] ! 80: OPTIONAL << sa -> sa_selectlen >>, ! 81: ! 82: tSelector[2] ! 83: OCTET STRING ! 84: [[ o ta -> ta_selector $ ta -> ta_selectlen ]] ! 85: OPTIONAL << ta -> ta_selectlen >>, ! 86: ! 87: nAddress[3] ! 88: SET OF ! 89: %{ ! 90: if ((ca = na2norm (na)) == NULLNA) { ! 91: advise (NULLCP, ! 92: "unable to normalize address, check logs"); ! 93: return NOTOK; ! 94: } ! 95: %} ! 96: <<na = ta -> ta_addrs, n = ta -> ta_naddr; n > 0; na++, n-->> ! 97: OCTET STRING ! 98: [[ o ca -> na_address $ ca -> na_addrlen ]] ! 99: } ! 100: ! 101: ! 102: DECODER parse ! 103: ! 104: PSAPaddr ! 105: %{ ! 106: struct PSAPaddr *pa = (struct PSAPaddr *) parm; ! 107: struct SSAPaddr *sa = &pa -> pa_addr; ! 108: struct TSAPaddr *ta = &sa -> sa_addr; ! 109: %} ! 110: ::= ! 111: %{ ! 112: bzero ((char *) pa, sizeof *pa); ! 113: %} ! 114: SEQUENCE { ! 115: pSelector[0] ! 116: OCTET STRING ! 117: %{ ! 118: getstr ($$, $$_len, pa -> pa_selector, pa -> pa_selectlen, ! 119: sizeof pa -> pa_selector, "psap selector"); ! 120: %} ! 121: OPTIONAL, ! 122: ! 123: ! 124: sSelector[1] ! 125: OCTET STRING ! 126: %{ ! 127: getstr ($$, $$_len, sa -> sa_selector, sa -> sa_selectlen, ! 128: sizeof sa -> sa_selector, "ssap selector"); ! 129: %} ! 130: OPTIONAL, ! 131: ! 132: tSelector[2] ! 133: OCTET STRING ! 134: %{ ! 135: getstr ($$, $$_len, ta -> ta_selector, ta -> ta_selectlen, ! 136: sizeof ta -> ta_selector, "tsap selector"); ! 137: %} ! 138: OPTIONAL, ! 139: ! 140: nAddress[3] ! 141: SET OF ! 142: %{ ! 143: if (ta -> ta_naddr >= NTADDR) { ! 144: advise (NULLCP, "too many network addresses"); ! 145: return NOTOK; ! 146: } ! 147: %} ! 148: NSAPaddr ! 149: [[ p (char *) &ta -> ta_addrs[ta -> ta_naddr++] ]] ! 150: } ! 151: ! 152: NSAPaddr ! 153: %{ ! 154: struct NSAPaddr *na = (struct NSAPaddr *) parm; ! 155: %} ! 156: ::= ! 157: OCTET STRING ! 158: %{ ! 159: if (($$_len == 8) ! 160: && (($$[0] == 0x36) || ($$[0] == 0x37))) { ! 161: int xlen; /* SEK - X121 form */ ! 162: register char *cp, ! 163: *cp2, ! 164: *dp; ! 165: char nsap[14]; ! 166: ! 167: dp = nsap; ! 168: for (cp2 = (cp = $$ + 1) + 7; cp < cp2; cp++) { ! 169: register int j; ! 170: ! 171: if ((j = ((*cp & 0xf0) >> 4)) > 9) ! 172: goto concrete; ! 173: *dp++ = j + '0'; ! 174: ! 175: if ((j = (*cp & 0x0f)) > 9) { ! 176: if (j != 0x0f) ! 177: goto concrete; ! 178: } ! 179: else ! 180: *dp++ = j + '0'; ! 181: } ! 182: ! 183: for (cp = nsap, xlen = 14; *cp == '0'; cp++, xlen--) ! 184: continue; ! 185: na -> na_dtelen = xlen; ! 186: for (cp2 = na -> na_dte; xlen-- > 0; ) ! 187: *cp2++ = *cp++; ! 188: *cp2 = NULL; ! 189: #ifdef BRIDGE_X25 ! 190: na -> na_type = bridgediscrim (na) ? NA_BRG : NA_X25; ! 191: #else ! 192: na -> na_type = NA_X25; ! 193: #endif ! 194: na -> na_subnet = SUBNET_INT_X25; ! 195: } ! 196: else { ! 197: register struct ts_interim *ts, ! 198: *tp; ! 199: ! 200: tp = NULL; ! 201: for (ts = ts_interim; ts -> ts_name; ts++) ! 202: if ($$_len > ts -> ts_length ! 203: && (tp == NULL ! 204: || ts -> ts_length > tp -> ts_length) ! 205: && bcmp ($$, ts -> ts_prefix, ! 206: ts -> ts_length) == 0) ! 207: tp = ts; ! 208: if (tp) { ! 209: int i, ! 210: ilen, ! 211: rlen; ! 212: register char *cp, ! 213: *dp, ! 214: *ep; ! 215: char nsap[NASIZE * 2 + 1]; ! 216: ! 217: dp = nsap; ! 218: for (cp = $$ + tp -> ts_length, ep = $$ + $$_len; ! 219: cp < ep; ! 220: cp++) { ! 221: register int j; ! 222: ! 223: if ((j = ((*cp & 0xf0) >> 4)) > 9) { ! 224: concrete: ; ! 225: LLOG (addr_log, LLOG_EXCEPTIONS, ! 226: ("invalid concrete encoding")); ! 227: goto realNS; ! 228: } ! 229: *dp++ = j + '0'; ! 230: ! 231: if ((j = (*cp & 0x0f)) > 9) { ! 232: if (j != 0x0f) ! 233: goto concrete; ! 234: } ! 235: else ! 236: *dp++ = j + '0'; ! 237: } ! 238: *dp = NULL; ! 239: ! 240: cp = nsap; ! 241: na -> na_subnet = tp -> ts_subnet; ! 242: switch (na -> na_type = tp -> ts_syntax) { ! 243: case NA_NSAP: ! 244: goto unrealNS; ! 245: ! 246: case NA_X25: ! 247: if (strlen (cp) < 1) { ! 248: LLOG (addr_log, LLOG_EXCEPTIONS, ! 249: ("missing DTE+CUDF indicator: %s", ! 250: nsap)); ! 251: goto realNS; ! 252: } ! 253: (void) sscanf (cp, "%1d", &i); ! 254: cp += 1; ! 255: switch (i) { ! 256: case 0: /* DTE only */ ! 257: break; ! 258: ! 259: case 1: /* DTE+PID */ ! 260: case 2: /* DTE+CUDF */ ! 261: if (strlen (cp) < 1) { ! 262: LLOG (addr_log, LLOG_EXCEPTIONS, ! 263: ("missing DTE+CUDF indicator: %s", ! 264: nsap)); ! 265: goto realNS; ! 266: } ! 267: (void) sscanf (cp, "%1d", &ilen); ! 268: cp += 1; ! 269: rlen = ilen * 3; ! 270: if (strlen (cp) < rlen) { ! 271: LLOG (addr_log, LLOG_EXCEPTIONS, ! 272: ("bad DTE+CUDF length: %s", ! 273: nsap)); ! 274: goto realNS; ! 275: } ! 276: if (i == 1) { ! 277: if (ilen > NPSIZE) { ! 278: LLOG (addr_log, ! 279: LLOG_EXCEPTIONS, ! 280: ("PID too long: %s", ! 281: nsap)); ! 282: goto realNS; ! 283: } ! 284: dp = na -> na_pid; ! 285: na -> na_pidlen = ilen; ! 286: } ! 287: else { ! 288: if (ilen > CUDFSIZE) { ! 289: LLOG (addr_log, ! 290: LLOG_EXCEPTIONS, ! 291: ("CUDF too long: %s", ! 292: nsap)); ! 293: goto realNS; ! 294: } ! 295: dp = na -> na_cudf; ! 296: na -> na_cudflen = ilen; ! 297: } ! 298: for (; rlen > 0; rlen -= 3) { ! 299: (void) sscanf (cp, "%3d", &i); ! 300: cp += 3; ! 301: ! 302: if (i > 255) { ! 303: LLOG (addr_log, ! 304: LLOG_EXCEPTIONS, ! 305: ("invalid PID/CUDF: %s", ! 306: nsap)); ! 307: goto realNS; ! 308: } ! 309: *dp++ = i & 0xff; ! 310: } ! 311: break; ! 312: ! 313: default: ! 314: LLOG (addr_log, LLOG_EXCEPTIONS, ! 315: ("invalid DTE+CUDF indicator: %s", ! 316: nsap)); ! 317: goto realNS; ! 318: } ! 319: (void) strcpy (na -> na_dte, cp); ! 320: na -> na_dtelen = strlen (na -> na_dte); ! 321: ! 322: #ifdef BRIDGE_X25 ! 323: if (bridgediscrim (na)) ! 324: na -> na_type = NA_BRG; ! 325: #endif ! 326: break; ! 327: ! 328: case NA_TCP: ! 329: if (strlen (cp) < 12) { ! 330: LLOG (addr_log, LLOG_EXCEPTIONS, ! 331: ("missing IP address: %s", nsap)); ! 332: goto realNS; ! 333: } ! 334: { ! 335: int q[4]; ! 336: ! 337: (void) sscanf (cp, "%3d%3d%3d%3d", q, ! 338: q + 1, q + 2, q + 3); ! 339: (void) sprintf (na -> na_domain, ! 340: "%d.%d.%d.%d", ! 341: q[0], q[1], q[2], q[3]); ! 342: } ! 343: cp += 12; ! 344: ! 345: if (*cp) { ! 346: if (strlen (cp) < 5) { ! 347: LLOG (addr_log, LLOG_EXCEPTIONS, ! 348: ("missing port: %s", nsap)); ! 349: goto realNS; ! 350: } ! 351: (void) sscanf (cp, "%5d", &i); ! 352: cp += 5; ! 353: na -> na_port = htons ((u_short) i); ! 354: ! 355: if (*cp) { ! 356: if (strlen (cp) < 5) { ! 357: LLOG (addr_log, LLOG_EXCEPTIONS, ! 358: ("missing tset: %s", nsap)); ! 359: goto realNS; ! 360: } ! 361: (void) sscanf (cp, "%5d", &i); ! 362: cp += 5; ! 363: na -> na_tset = (u_short) i; ! 364: ! 365: if (*cp) ! 366: LLOG (addr_log, LLOG_EXCEPTIONS, ! 367: ("extra TCP information: %s", ! 368: nsap)); ! 369: } ! 370: } ! 371: break; ! 372: ! 373: default: ! 374: LLOG (addr_log, LLOG_NOTICE, ! 375: ("unknown syntax %d for DSP: %s", ! 376: ts -> ts_syntax, nsap)); ! 377: goto realNS; ! 378: } ! 379: } ! 380: else { ! 381: realNS: ; ! 382: na -> na_type = NA_NSAP; ! 383: na -> na_subnet = SUBNET_REALNS; ! 384: unrealNS: ; ! 385: getstr ($$, $$_len, na -> na_address, na -> na_addrlen, ! 386: sizeof na -> na_address, "NSAP address"); ! 387: } ! 388: } ! 389: %} ! 390: ! 391: ! 392: PRINTER print ! 393: ! 394: PSAPaddr ::= ! 395: SEQUENCE { ! 396: pSelector[0] ! 397: OCTET STRING ! 398: OPTIONAL, ! 399: ! 400: sSelector[1] ! 401: OCTET STRING ! 402: OPTIONAL, ! 403: ! 404: tSelector[2] ! 405: OCTET STRING ! 406: OPTIONAL, ! 407: ! 408: nAddress[3] ! 409: SET OF ! 410: OCTET STRING ! 411: } ! 412: ! 413: END
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.