|
|
1.1 ! root 1: /* dse-c.c - DSE wrapper for pepsy */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/acsap/RCS/dse-c.c,v 7.2 90/07/27 08:41:47 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/acsap/RCS/dse-c.c,v 7.2 90/07/27 08:41:47 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: dse-c.c,v $ ! 12: * Revision 7.2 90/07/27 08:41:47 mrose ! 13: * update ! 14: * ! 15: * Revision 7.1 90/07/09 14:31:01 mrose ! 16: * sync ! 17: * ! 18: * Revision 7.0 90/07/01 19:51:16 mrose ! 19: * *** empty log message *** ! 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: /* LINTLIBRARY */ ! 34: ! 35: ! 36: #include <stdio.h> ! 37: #include "psap.h" ! 38: #include "isoaddrs.h" ! 39: #include "tailor.h" ! 40: #include "DSE-types.h" ! 41: ! 42: ! 43: #define advise PY_advise ! 44: ! 45: ! 46: extern struct type_DSE_PSAPaddr *psap2dse (); ! 47: ! 48: /* */ ! 49: ! 50: int build_DSE_PSAPaddr (pe, explicit, len, buffer, parm) ! 51: PE *pe; ! 52: int explicit; ! 53: int len; ! 54: char *buffer; ! 55: char *parm; ! 56: { ! 57: int result; ! 58: register struct PSAPaddr *pa = (struct PSAPaddr *) parm; ! 59: struct type_DSE_PSAPaddr *dse; ! 60: ! 61: if ((dse = psap2dse (pa)) == NULL) ! 62: return NOTOK; ! 63: ! 64: result = encode_DSE_PSAPaddr (pe, explicit, len, buffer, (char *) dse); ! 65: ! 66: free_DSE_PSAPaddr (dse); ! 67: ! 68: return result; ! 69: } ! 70: ! 71: /* */ ! 72: ! 73: static struct type_DSE_PSAPaddr *psap2dse (pa) ! 74: register struct PSAPaddr *pa; ! 75: { ! 76: register int n; ! 77: register struct type_DSE_PSAPaddr *dse; ! 78: register struct SSAPaddr *sa = &pa -> pa_addr; ! 79: register struct TSAPaddr *ta = &sa -> sa_addr; ! 80: register struct NSAPaddr *na; ! 81: register struct member_DSE_0 *nDSE, ! 82: **oDSE; ! 83: ! 84: if ((dse = (struct type_DSE_PSAPaddr *) calloc (1, sizeof *dse)) == NULL) { ! 85: advise (NULLCP, "psap2dse: out of memory"); ! 86: return NULL; ! 87: } ! 88: ! 89: if (pa -> pa_selectlen > 0) ! 90: dse -> pSelector = str2qb (pa -> pa_selector, pa -> pa_selectlen, 1); ! 91: ! 92: if (sa -> sa_selectlen > 0) ! 93: dse -> sSelector = str2qb (sa -> sa_selector, sa -> sa_selectlen, 1); ! 94: ! 95: if (ta -> ta_selectlen > 0) ! 96: dse -> tSelector = str2qb (ta -> ta_selector, ta -> ta_selectlen, 1); ! 97: ! 98: oDSE = &dse -> nAddress; ! 99: for (na = ta -> ta_addrs, n = ta -> ta_naddr; n > 0; na++, n--) { ! 100: register struct NSAPaddr *ca; ! 101: ! 102: if ((nDSE = (struct member_DSE_0 *) calloc (1, sizeof *nDSE)) ! 103: == NULL) { ! 104: advise (NULLCP, "psap2dse: out of memory"); ! 105: losing: ; ! 106: free_DSE_PSAPaddr (dse); ! 107: return NULL; ! 108: } ! 109: *oDSE = nDSE; ! 110: oDSE = &nDSE -> next; ! 111: ! 112: if ((ca = na2norm (na)) == NULLNA) { ! 113: advise (NULLCP, "unable to normalize address"); ! 114: goto losing; ! 115: } ! 116: ! 117: nDSE -> member_DSE_1 = str2qb (ca -> na_address, ca -> na_addrlen, 1); ! 118: } ! 119: ! 120: return dse; ! 121: } ! 122: ! 123: /* */ ! 124: ! 125: int parse_DSE_PSAPaddr (pe, explicit, len, buffer, parm) ! 126: register PE pe; ! 127: int explicit; ! 128: int *len; ! 129: char **buffer; ! 130: char *parm; ! 131: { ! 132: int result; ! 133: register struct PSAPaddr *pa = (struct PSAPaddr *) parm; ! 134: struct type_DSE_PSAPaddr *dse; ! 135: ! 136: if (decode_DSE_PSAPaddr (pe, explicit, len, buffer, &dse) == NOTOK) ! 137: return NOTOK; ! 138: ! 139: result = dse2psap (dse, pa); ! 140: ! 141: free_DSE_PSAPaddr (dse); ! 142: ! 143: return result; ! 144: } ! 145: ! 146: /* */ ! 147: ! 148: static int dse2psap (dse, pa) ! 149: register struct type_DSE_PSAPaddr *dse; ! 150: register struct PSAPaddr *pa; ! 151: { ! 152: register struct SSAPaddr *sa = &pa -> pa_addr; ! 153: register struct TSAPaddr *ta = &sa -> sa_addr; ! 154: register struct member_DSE_0 *nDSE; ! 155: ! 156: bzero ((char *) pa, sizeof *pa); ! 157: ! 158: pa -> pa_selectlen = gstring (pa -> pa_selector, ! 159: sizeof pa -> pa_selector, ! 160: dse -> pSelector, "psap selector"); ! 161: ! 162: sa -> sa_selectlen = gstring (sa -> sa_selector, sizeof sa -> sa_selector, ! 163: dse -> sSelector, "ssap selector"); ! 164: ! 165: ta -> ta_selectlen = gstring (ta -> ta_selector, sizeof ta -> ta_selector, ! 166: dse -> tSelector, "tsap selector"); ! 167: ! 168: for (nDSE = dse -> nAddress; nDSE; nDSE = nDSE -> next) { ! 169: char *p; ! 170: ! 171: if (ta -> ta_naddr >= NTADDR) { ! 172: advise (NULLCP, "too many network addresses"); ! 173: return NOTOK; ! 174: } ! 175: ! 176: p = qb2str (nDSE->member_DSE_1); ! 177: if (str2nsap (p, nDSE -> member_DSE_1 -> qb_len, ! 178: &ta -> ta_addrs[ta -> ta_naddr++]) == NOTOK) ! 179: return NOTOK; ! 180: free (p); ! 181: } ! 182: ! 183: return OK; ! 184: } ! 185: ! 186: /* */ ! 187: ! 188: static int gstring (buf, buflen, qb, w) ! 189: char *buf; ! 190: int buflen; ! 191: struct qbuf *qb; ! 192: char *w; ! 193: { ! 194: char *p; ! 195: ! 196: if (qb == NULL || qb -> qb_len <= 0) ! 197: return 0; ! 198: ! 199: if (qb -> qb_len > buflen) { ! 200: advise (NULLCP, "%s too long", w); ! 201: return 0; ! 202: } ! 203: ! 204: p = qb2str (qb); ! 205: bcopy (p, buf, qb -> qb_len); ! 206: free (p); ! 207: ! 208: return qb -> qb_len; ! 209: } ! 210: ! 211: /* */ ! 212: ! 213: static int str2nsap (p, len, na) ! 214: char *p; ! 215: int len; ! 216: struct NSAPaddr *na; ! 217: { ! 218: na -> na_stack = NA_NSAP; ! 219: ! 220: if ((len == 8) && ((p[0] == 0x36) || (p[0] == 0x37))) { ! 221: int xlen; /* SEK - X121 form */ ! 222: register char *cp, ! 223: *cp2, ! 224: *dp; ! 225: char nsap[14]; ! 226: ! 227: dp = nsap; ! 228: for (cp2 = (cp = p + 1) + 7; cp < cp2; cp++) { ! 229: register int j; ! 230: ! 231: if ((j = ((*cp & 0xf0) >> 4)) > 9) ! 232: goto concrete; ! 233: *dp++ = j + '0'; ! 234: ! 235: if ((j = (*cp & 0x0f)) > 9) { ! 236: if (j != 0x0f) ! 237: goto concrete; ! 238: } ! 239: else ! 240: *dp++ = j + '0'; ! 241: } ! 242: ! 243: for (cp = nsap, xlen = 14; *cp == '0'; cp++, xlen--) ! 244: continue; ! 245: na -> na_dtelen = xlen; ! 246: for (cp2 = na -> na_dte; xlen-- > 0; ) ! 247: *cp2++ = *cp++; ! 248: *cp2 = NULL; ! 249: #ifdef BRIDGE_X25 ! 250: na -> na_stack = bridgediscrim (na) ? NA_BRG : NA_X25; ! 251: #else ! 252: na -> na_stack = NA_X25; ! 253: #endif ! 254: na -> na_community = SUBNET_INT_X25; ! 255: } ! 256: else { ! 257: register struct ts_interim *ts, ! 258: *tp; ! 259: ! 260: tp = NULL; ! 261: for (ts = ts_interim; ts -> ts_name; ts++) ! 262: if (len > ts -> ts_length ! 263: && (tp == NULL || ts -> ts_length > tp -> ts_length) ! 264: && bcmp (p, ts -> ts_prefix, ts -> ts_length) == 0) ! 265: tp = ts; ! 266: if (tp) { ! 267: int i, ! 268: ilen, ! 269: rlen; ! 270: register char *cp, ! 271: *dp, ! 272: *ep; ! 273: char nsap[NASIZE * 2 + 1]; ! 274: ! 275: dp = nsap; ! 276: for (cp = p + tp -> ts_length, ep = p + len; ! 277: cp < ep; ! 278: cp++) { ! 279: register int j; ! 280: ! 281: if ((j = ((*cp & 0xf0) >> 4)) > 9) { ! 282: concrete: ; ! 283: LLOG (addr_log, LLOG_EXCEPTIONS, ! 284: ("invalid concrete encoding")); ! 285: goto realNS; ! 286: } ! 287: *dp++ = j + '0'; ! 288: ! 289: if ((j = (*cp & 0x0f)) > 9) { ! 290: if (j != 0x0f) ! 291: goto concrete; ! 292: } ! 293: else ! 294: *dp++ = j + '0'; ! 295: } ! 296: *dp = NULL; ! 297: ! 298: cp = nsap; ! 299: na -> na_community = tp -> ts_subnet; ! 300: switch (na -> na_stack = tp -> ts_syntax) { ! 301: case NA_NSAP: ! 302: goto unrealNS; ! 303: ! 304: case NA_X25: ! 305: if (strlen (cp) < 1) { ! 306: LLOG (addr_log, LLOG_EXCEPTIONS, ! 307: ("missing DTE+CUDF indicator: %s", nsap)); ! 308: goto realNS; ! 309: } ! 310: (void) sscanf (cp, "%1d", &i); ! 311: cp += 1; ! 312: switch (i) { ! 313: case 0: /* DTE only */ ! 314: break; ! 315: ! 316: case 1: /* DTE+PID */ ! 317: case 2: /* DTE+CUDF */ ! 318: if (strlen (cp) < 1) { ! 319: LLOG (addr_log, LLOG_EXCEPTIONS, ! 320: ("missing DTE+CUDF indicator: %s", ! 321: nsap)); ! 322: goto realNS; ! 323: } ! 324: (void) sscanf (cp, "%1d", &ilen); ! 325: cp += 1; ! 326: rlen = ilen * 3; ! 327: if (strlen (cp) < rlen) { ! 328: LLOG (addr_log, LLOG_EXCEPTIONS, ! 329: ("bad DTE+CUDF length: %s", nsap)); ! 330: goto realNS; ! 331: } ! 332: if (i == 1) { ! 333: if (ilen > NPSIZE) { ! 334: LLOG (addr_log, LLOG_EXCEPTIONS, ! 335: ("PID too long: %s", nsap)); ! 336: goto realNS; ! 337: } ! 338: dp = na -> na_pid; ! 339: na -> na_pidlen = ilen; ! 340: } ! 341: else { ! 342: if (ilen > CUDFSIZE) { ! 343: LLOG (addr_log, LLOG_EXCEPTIONS, ! 344: ("CUDF too long: %s", nsap)); ! 345: goto realNS; ! 346: } ! 347: dp = na -> na_cudf; ! 348: na -> na_cudflen = ilen; ! 349: } ! 350: for (; rlen > 0; rlen -= 3) { ! 351: (void) sscanf (cp, "%3d", &i); ! 352: cp += 3; ! 353: ! 354: if (i > 255) { ! 355: LLOG (addr_log, LLOG_EXCEPTIONS, ! 356: ("invalid PID/CUDF: %s", nsap)); ! 357: goto realNS; ! 358: } ! 359: *dp++ = i & 0xff; ! 360: } ! 361: break; ! 362: ! 363: default: ! 364: LLOG (addr_log, LLOG_EXCEPTIONS, ! 365: ("invalid DTE+CUDF indicator: %s", nsap)); ! 366: goto realNS; ! 367: } ! 368: (void) strcpy (na -> na_dte, cp); ! 369: na -> na_dtelen = strlen (na -> na_dte); ! 370: ! 371: #ifdef BRIDGE_X25 ! 372: if (bridgediscrim (na)) ! 373: na -> na_stack = NA_BRG; ! 374: #endif ! 375: break; ! 376: ! 377: case NA_TCP: ! 378: if (strlen (cp) < 12) { ! 379: LLOG (addr_log, LLOG_EXCEPTIONS, ! 380: ("missing IP address: %s", nsap)); ! 381: goto realNS; ! 382: } ! 383: { ! 384: int q[4]; ! 385: ! 386: (void) sscanf (cp, "%3d%3d%3d%3d", q, q + 1, q + 2, ! 387: q + 3); ! 388: (void) sprintf (na -> na_domain, ! 389: "%d.%d.%d.%d", q[0], q[1], q[2], q[3]); ! 390: } ! 391: cp += 12; ! 392: ! 393: if (*cp) { ! 394: if (strlen (cp) < 5) { ! 395: LLOG (addr_log, LLOG_EXCEPTIONS, ! 396: ("missing port: %s", nsap)); ! 397: goto realNS; ! 398: } ! 399: (void) sscanf (cp, "%5d", &i); ! 400: cp += 5; ! 401: na -> na_port = htons ((u_short) i); ! 402: ! 403: if (*cp) { ! 404: if (strlen (cp) < 5) { ! 405: LLOG (addr_log, LLOG_EXCEPTIONS, ! 406: ("missing tset: %s", nsap)); ! 407: goto realNS; ! 408: } ! 409: (void) sscanf (cp, "%5d", &i); ! 410: cp += 5; ! 411: na -> na_tset = (u_short) i; ! 412: ! 413: if (*cp) ! 414: LLOG (addr_log, LLOG_EXCEPTIONS, ! 415: ("extra TCP information: %s", nsap)); ! 416: } ! 417: } ! 418: break; ! 419: ! 420: default: ! 421: LLOG (addr_log, LLOG_NOTICE, ! 422: ("unknown syntax %d for DSP: %s", ts -> ts_syntax, ! 423: nsap)); ! 424: goto realNS; ! 425: } ! 426: } ! 427: else { ! 428: realNS: ; ! 429: na -> na_stack = NA_NSAP; ! 430: na -> na_community = SUBNET_REALNS; ! 431: unrealNS: ; ! 432: if (len > sizeof na -> na_address) { ! 433: advise (NULLCP, "NSAP address too long"); ! 434: return NOTOK; ! 435: } ! 436: bcopy (p, na -> na_address, na -> na_addrlen = len); ! 437: } ! 438: } ! 439: ! 440: return OK; ! 441: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.