|
|
1.1 ! root 1: /* psapinitiate.c - PPM: initiator */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap2/RCS/psapinitiate.c,v 7.3 90/07/01 21:05:00 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap2/RCS/psapinitiate.c,v 7.3 90/07/01 21:05:00 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: psapinitiate.c,v $ ! 12: * Revision 7.3 90/07/01 21:05:00 mrose ! 13: * pepsy ! 14: * ! 15: * Revision 7.2 90/01/27 10:26:29 mrose ! 16: * touch-up ! 17: * ! 18: * Revision 7.1 89/11/24 16:22:14 mrose ! 19: * sync ! 20: * ! 21: * Revision 7.0 89/11/23 22:14:20 mrose ! 22: * Release 6.0 ! 23: * ! 24: */ ! 25: ! 26: /* ! 27: * NOTICE ! 28: * ! 29: * Acquisition, use, and distribution of this module and related ! 30: * materials are subject to the restrictions of a license agreement. ! 31: * Consult the Preface in the User's Manual for the full terms of ! 32: * this agreement. ! 33: * ! 34: */ ! 35: ! 36: ! 37: /* LINTLIBRARY */ ! 38: ! 39: #include <stdio.h> ! 40: #include <signal.h> ! 41: #include "PS-types.h" ! 42: #include "ppkt.h" ! 43: #include "isoservent.h" ! 44: #include "tailor.h" ! 45: ! 46: /* P-(ASYN-)CONNECT.REQUEST */ ! 47: ! 48: int PAsynConnRequest (calling, called, ctxlist, defctxname, prequirements, ! 49: srequirements, isn, settings, ref, data, ndata, qos, pc, pi, async) ! 50: struct PSAPaddr *calling, ! 51: *called; ! 52: int prequirements, ! 53: srequirements, ! 54: settings, ! 55: ndata, ! 56: async; ! 57: long isn; ! 58: struct PSAPctxlist *ctxlist; ! 59: OID defctxname; ! 60: struct SSAPref *ref; ! 61: PE *data; ! 62: struct QOStype *qos; ! 63: struct PSAPconnect *pc; ! 64: struct PSAPindication *pi; ! 65: { ! 66: SBV smask; ! 67: int result; ! 68: ! 69: isodetailor (NULLCP, 0); ! 70: ! 71: #ifdef notdef ! 72: missingP (calling); ! 73: #endif ! 74: missingP (called); ! 75: ! 76: if (ctxlist && ctxlist -> pc_nctx > NPCTX) ! 77: return psaplose (pi, PC_PARAMETER, NULLCP, ! 78: "only %d proposed presentation contexts supported", NPCTX); ! 79: if (prequirements & ~PR_MYREQUIRE) ! 80: return psaplose (pi, PC_PARAMETER, NULLCP, ! 81: "presentation requirements settings not supported"); ! 82: if ((prequirements & PR_RESTORATION) ! 83: && !(prequirements & PR_MANAGEMENT)) ! 84: return psaplose (pi, PC_PARAMETER, NULLCP, ! 85: "context restoration service requires context management service"); ! 86: ! 87: /* let session provider catch errors in session parameters */ ! 88: ! 89: toomuchP (data, ndata, NPDATA, "initial"); ! 90: missingP (pc); ! 91: missingP (pi); ! 92: ! 93: smask = sigioblock (); ! 94: ! 95: result = PConnRequestAux (calling, called, ctxlist, defctxname, ! 96: prequirements, srequirements, isn, settings, ref, data, ndata, ! 97: qos, pc, pi, async); ! 98: ! 99: (void) sigiomask (smask); ! 100: ! 101: return result; ! 102: } ! 103: ! 104: /* */ ! 105: ! 106: static int PConnRequestAux (calling, called, ctxlist, defctxname, ! 107: prequirements, srequirements, isn, settings, ref, data, ndata, qos, ! 108: pc, pi, async) ! 109: struct PSAPaddr *calling, ! 110: *called; ! 111: int prequirements, ! 112: srequirements, ! 113: settings, ! 114: ndata, ! 115: async; ! 116: long isn; ! 117: struct PSAPctxlist *ctxlist; ! 118: OID defctxname; ! 119: struct SSAPref *ref; ! 120: PE *data; ! 121: struct QOStype *qos; ! 122: struct PSAPconnect *pc; ! 123: struct PSAPindication *pi; ! 124: { ! 125: int i, ! 126: len, ! 127: result; ! 128: PE pe; ! 129: register struct psapblk *pb; ! 130: struct SSAPconnect scs; ! 131: register struct SSAPconnect *sc = &scs; ! 132: struct SSAPindication sis; ! 133: register struct SSAPindication *si = &sis; ! 134: register struct SSAPabort *sa = &si -> si_abort; ! 135: register struct type_PS_CP__type *pdu; ! 136: register struct element_PS_0 *normal; ! 137: ! 138: if ((pb = newpblk ()) == NULL) ! 139: return psaplose (pi, PC_CONGEST, NULLCP, "out of memory"); ! 140: ! 141: pb -> pb_srequirements = pb -> pb_urequirements = srequirements; ! 142: ! 143: #ifdef notdef ! 144: if (called -> pa_selectlen > 0) { ! 145: if (calling == NULLPA) { ! 146: static struct PSAPaddr pas; ! 147: ! 148: calling = &pas; ! 149: bzero ((char *) calling, sizeof *calling); ! 150: } ! 151: ! 152: if (calling -> pa_selectlen == 0) { ! 153: calling -> pa_port = ! 154: htons ((u_short) (0x8000 | (getpid () & 0x7fff))); ! 155: calling -> pa_selectlen = sizeof calling -> pa_port; ! 156: } ! 157: } ! 158: #endif ! 159: ! 160: pe = NULLPE; ! 161: if ((pdu = (struct type_PS_CP__type *) calloc (1, sizeof *pdu)) == NULL) { ! 162: no_mem: ; ! 163: (void) psaplose (pi, PC_CONGEST, NULLCP, "out of memory"); ! 164: goto out2; ! 165: } ! 166: if ((pdu -> mode = (struct type_PS_Mode__selector *) ! 167: malloc (sizeof *pdu -> mode)) == NULL) ! 168: goto no_mem; ! 169: pdu -> mode -> parm = int_PS_Mode__selector_normal__mode; ! 170: if ((pdu -> normal__mode = (struct element_PS_0 *) ! 171: calloc (1, sizeof *pdu -> normal__mode)) ! 172: == NULL) ! 173: goto no_mem; ! 174: normal = pdu -> normal__mode; ! 175: if (calling ! 176: && calling -> pa_selectlen > 0 ! 177: && (normal -> calling = str2qb (calling -> pa_selector, ! 178: calling -> pa_selectlen, 1)) ! 179: == NULL) ! 180: goto no_mem; ! 181: if (called -> pa_selectlen > 0 ! 182: && (normal -> called = str2qb (called -> pa_selector, ! 183: called -> pa_selectlen, 1)) ! 184: == NULL) ! 185: goto no_mem; ! 186: ! 187: if ((pb -> pb_asn = ode2oid (DFLT_ASN)) == NULLOID) { ! 188: (void) psaplose (pi, PC_ABSTRACT, NULLCP, "%s: unknown", DFLT_ASN); ! 189: goto out2; ! 190: } ! 191: if ((pb -> pb_asn = oid_cpy (pb -> pb_asn)) == NULLOID) ! 192: goto no_mem; ! 193: if ((pb -> pb_atn = ode2oid (DFLT_ATN)) == NULLOID) { ! 194: (void) psaplose (pi, PC_TRANSFER, NULLCP, "%s: unknown", DFLT_ATN); ! 195: goto out2; ! 196: } ! 197: if ((pb -> pb_atn = oid_cpy (pb -> pb_atn)) == NULLOID) ! 198: goto no_mem; ! 199: if ((pb -> pb_ber = oid_cpy (pb -> pb_atn)) == NULLOID) ! 200: goto no_mem; ! 201: ! 202: if (ctxlist && ctxlist -> pc_nctx > 0) { ! 203: register struct type_PS_Definition__list *cd, ! 204: **cp; ! 205: register struct PSAPcontext *pp, ! 206: *qp; ! 207: ! 208: cp = &normal -> context__list; ! 209: ! 210: i = ctxlist -> pc_nctx - 1; ! 211: for (pp = ctxlist -> pc_ctx, qp = pb -> pb_contexts; ! 212: i >= 0; ! 213: i--, pp++, qp++){ ! 214: if (!((qp -> pc_id = pp -> pc_id) & 01)) { ! 215: (void) psaplose (pi, PC_PARAMETER, NULLCP, ! 216: "only odd values allowed for context identifiers"); ! 217: goto out2; ! 218: } ! 219: ! 220: if (pp -> pc_asn == NULLOID) { ! 221: (void) psaplose (pi, PC_PARAMETER, NULLCP, ! 222: "no abstract syntax name given for context %d", ! 223: pp -> pc_id); ! 224: goto out2; ! 225: } ! 226: if ((qp -> pc_asn = oid_cpy (pp -> pc_asn)) == NULLOID) ! 227: goto no_mem; ! 228: ! 229: if (pp -> pc_atn && !atn_is_ok (pb, pp -> pc_atn)) { ! 230: (void) psaplose (pi, PC_TRANSFER, NULLCP, ! 231: "unknown transfer syntax name given for context %d", ! 232: pp -> pc_id); ! 233: goto out2; ! 234: } ! 235: if ((qp -> pc_atn = oid_cpy (pp -> pc_atn ? pp -> pc_atn ! 236: : pb -> pb_atn)) == NULLOID) ! 237: goto no_mem; ! 238: ! 239: if ((cd =(struct type_PS_Definition__list *) ! 240: calloc (1, sizeof *cd)) == NULL) ! 241: goto no_mem; ! 242: *cp = cd; ! 243: cp = &cd -> next; ! 244: if ((cd -> element_PS_5 = (struct element_PS_6 *) ! 245: calloc (1, sizeof *cd -> element_PS_5)) == NULL) ! 246: goto no_mem; ! 247: cd -> element_PS_5 -> identifier = qp -> pc_id; ! 248: if ((cd -> element_PS_5 -> abstract__syntax = ! 249: oid_cpy (qp -> pc_asn)) == NULLOID ! 250: || (cd -> element_PS_5 -> transfer__syntax__list = ! 251: (struct element_PS_7 *) ! 252: calloc (1, sizeof (struct element_PS_7))) ! 253: == NULL ! 254: || (cd -> element_PS_5 -> transfer__syntax__list -> ! 255: Transfer__syntax__name = ! 256: oid_cpy (qp -> pc_atn)) ! 257: == NULL) ! 258: goto no_mem; ! 259: ! 260: qp -> pc_result = PC_ACCEPT; ! 261: ! 262: pb -> pb_ncontext++; ! 263: } ! 264: } ! 265: ! 266: if (defctxname) { ! 267: oid_free (pb -> pb_asn); ! 268: if ((pb -> pb_asn = oid_cpy (defctxname)) == NULLOID ! 269: || (normal -> default__context = ! 270: (struct type_PS_Context__name *) ! 271: calloc (1, sizeof *normal -> default__context)) ! 272: == NULL ! 273: || (normal -> default__context -> abstract__syntax = ! 274: oid_cpy (pb -> pb_asn)) == NULLOID ! 275: /* perhaps should be user-definable */ ! 276: || (normal -> default__context -> transfer__syntax = ! 277: oid_cpy (pb -> pb_atn)) == NULLOID) ! 278: goto no_mem; ! 279: } ! 280: pb -> pb_result = PC_ACCEPT; ! 281: ! 282: if ((pb -> pb_prequirements = prequirements) != PR_MYREQUIRE) { ! 283: register struct pair *pp; ! 284: ! 285: if ((normal -> presentation__fu = prim2bit (pe_alloc (PE_CLASS_UNIV, ! 286: PE_FORM_PRIM, ! 287: PE_PRIM_BITS))) ! 288: == NULL) ! 289: goto no_mem; ! 290: ! 291: for (pp = preq_pairs; pp -> p_mask; pp++) ! 292: if ((pb -> pb_prequirements & pp -> p_mask) ! 293: && bit_on (normal -> presentation__fu, pp -> p_bitno) ! 294: == NOTOK) ! 295: goto no_mem; ! 296: ! 297: if (bit2prim (normal -> presentation__fu) == NULLPE) ! 298: goto no_mem; ! 299: } ! 300: ! 301: if (pb -> pb_prequirements & PR_MANAGEMENT) ! 302: pb -> pb_srequirements |= SR_TYPEDATA; ! 303: if (pb -> pb_urequirements != pb -> pb_srequirements) { ! 304: register struct pair *pp; ! 305: ! 306: if ((normal -> session__fu = prim2bit (pe_alloc (PE_CLASS_UNIV, ! 307: PE_FORM_PRIM, ! 308: PE_PRIM_BITS))) ! 309: == NULL) ! 310: goto no_mem; ! 311: ! 312: for (pp = sreq_pairs; pp -> p_mask; pp++) ! 313: if ((pb -> pb_urequirements & pp -> p_mask) ! 314: && bit_on (normal -> session__fu, pp -> p_bitno) == NOTOK) ! 315: goto no_mem; ! 316: ! 317: if (bit2prim (normal -> session__fu) == NULLPE) ! 318: goto no_mem; ! 319: } ! 320: ! 321: if (data ! 322: && ndata > 0 ! 323: && (normal -> user__data = info2ppdu (pb, pi, data, ndata, ! 324: PPDU_CP)) == NULL) ! 325: goto out2; ! 326: ! 327: if (encode_PS_CP__type (&pe, 1, 0, NULLCP, pdu) == NOTOK) { ! 328: (void) psaplose (pi, PC_CONGEST, NULLCP, "error encoding PDU: %s", ! 329: PY_pepy); ! 330: goto out2; ! 331: } ! 332: ! 333: PLOGP (psap2_log,PS_CP__type, pe, "CP-type", 0); ! 334: ! 335: if (pe2ssdu (pe, &pb -> pb_retry, &len) == NOTOK) ! 336: goto no_mem; ! 337: ! 338: free_PS_CP__type (pdu); ! 339: pdu = NULL; ! 340: ! 341: pe_free (pe); ! 342: pe = NULLPE; ! 343: ! 344: if ((result = SAsynConnRequest (ref, calling ? &calling -> pa_addr ! 345: : NULLSA, &called -> pa_addr, pb -> pb_srequirements, settings, ! 346: isn, pb -> pb_retry, len, qos, sc, si, async)) == NOTOK) { ! 347: (void) ss2pslose (NULLPB, pi, "SAsynConnRequest", sa); ! 348: goto out1; ! 349: } ! 350: ! 351: pb -> pb_fd = sc -> sc_sd; ! 352: ! 353: if (async) { ! 354: switch (result) { ! 355: case CONNECTING_1: ! 356: case CONNECTING_2: ! 357: pc -> pc_sd = pb -> pb_fd; ! 358: return result; ! 359: } ! 360: } ! 361: if ((result = PAsynRetryAux (pb, sc, si, pc, pi)) == DONE && !async) ! 362: result = OK; ! 363: return result; ! 364: ! 365: out2: ; ! 366: if (pe) ! 367: pe_free (pe); ! 368: if (pdu) ! 369: free_PS_CP__type (pdu); ! 370: ! 371: out1: ; ! 372: freepblk (pb); ! 373: ! 374: return NOTOK; ! 375: } ! 376: ! 377: /* P-ASYN-RETRY.REQUEST (pseudo) */ ! 378: ! 379: int PAsynRetryRequest (sd, pc, pi) ! 380: int sd; ! 381: struct PSAPconnect *pc; ! 382: struct PSAPindication *pi; ! 383: { ! 384: SBV smask; ! 385: int result; ! 386: register struct psapblk *pb; ! 387: struct SSAPconnect scs; ! 388: register struct SSAPconnect *sc = &scs; ! 389: struct SSAPindication sis; ! 390: register struct SSAPindication *si = &sis; ! 391: register struct SSAPabort *sa = &si -> si_abort; ! 392: ! 393: missingP (pc); ! 394: missingP (pi); ! 395: ! 396: smask = sigioblock (); ! 397: ! 398: if ((pb = findpblk (sd)) == NULL) { ! 399: (void) sigiomask (smask); ! 400: return psaplose (pi, PC_PARAMETER, NULLCP, ! 401: "invalid presentation descriptor"); ! 402: } ! 403: if (pb -> pb_flags & PB_CONN) { ! 404: (void) sigiomask (smask); ! 405: return psaplose (pi, PC_OPERATION, NULLCP, ! 406: "presentation descriptor connected"); ! 407: } ! 408: ! 409: switch (result = SAsynRetryRequest (pb -> pb_fd, sc, si)) { ! 410: case NOTOK: ! 411: pb -> pb_fd = NOTOK; ! 412: (void) ss2pslose (pb, pi, "SAsynRetryRequest", sa); ! 413: freepblk (pb); ! 414: break; ! 415: ! 416: case CONNECTING_1: ! 417: case CONNECTING_2: ! 418: break; ! 419: ! 420: case DONE: ! 421: result = PAsynRetryAux (pb, sc, si, pc, pi); ! 422: break; ! 423: } ! 424: ! 425: (void) sigiomask (smask); ! 426: ! 427: return result; ! 428: } ! 429: ! 430: /* */ ! 431: ! 432: static int PAsynRetryAux (pb, sc, si, pc, pi) ! 433: register struct psapblk *pb; ! 434: struct SSAPconnect *sc; ! 435: struct SSAPindication *si; ! 436: struct PSAPconnect *pc; ! 437: struct PSAPindication *pi; ! 438: { ! 439: int i, ! 440: result; ! 441: PE pe; ! 442: struct qbuf *qb; ! 443: register struct SSAPabort *sa = &si -> si_abort; ! 444: struct type_PS_CPA__type *cpa; ! 445: register struct element_PS_1 *cpa_normal; ! 446: struct type_PS_CPR__type *cpr; ! 447: register struct element_PS_2 *cpr_normal; ! 448: struct type_PS_ARP__PPDU *arp; ! 449: ! 450: pe = NULLPE; ! 451: ! 452: free (pb -> pb_retry); ! 453: pb -> pb_retry = NULL; ! 454: ! 455: bzero ((char *) pc, sizeof *pc); ! 456: ! 457: if (sc -> sc_result == SC_ABORT) { ! 458: (void) ss2psabort (pb, sa, pi); ! 459: ! 460: pc -> pc_sd = NOTOK; ! 461: pc -> pc_result = PC_ABORTED; ! 462: ! 463: return DONE; ! 464: } ! 465: ! 466: cpa = NULL, cpr = NULL, arp = NULL; ! 467: if ((pe = ssdu2pe (sc -> sc_data, sc -> sc_cc, NULLCP, &result)) ! 468: == NULLPE) { ! 469: if (sc -> sc_result != SC_ACCEPT) { ! 470: bzero ((char *) sa, sizeof *sa); ! 471: sa -> sa_reason = sc -> sc_result; ! 472: pb -> pb_fd = NOTOK; ! 473: (void) ss2pslose (pb, pi, "SAsynConnRequest(pseudo)", sa); ! 474: ! 475: pc -> pc_sd = NOTOK; ! 476: pc -> pc_result = pi -> pi_abort.pa_reason; ! 477: ! 478: result = DONE; ! 479: goto out1; ! 480: } ! 481: else ! 482: (void) ppktlose (pb, pi, result != PS_ERR_NMEM ? PC_UNRECOGNIZED ! 483: : PC_NOTSPECIFIED, sc -> sc_result == SC_ACCEPT ? PPDU_CPA ! 484: : PPDU_CPR, NULLCP, "%s", ps_error (result)); ! 485: goto out2; ! 486: } ! 487: ! 488: SCFREE (sc); ! 489: ! 490: if (sc -> sc_result == SC_ACCEPT) { ! 491: pb -> pb_flags |= PB_CONN; ! 492: ! 493: pb -> pb_srequirements = sc -> sc_requirements; ! 494: pb -> pb_urequirements &= pb -> pb_srequirements; ! 495: ! 496: #define dotoken(requires,shift,bit,type) \ ! 497: { \ ! 498: if (pb -> pb_srequirements & requires) \ ! 499: switch (sc -> sc_settings & (ST_MASK << shift)) { \ ! 500: case ST_INIT_VALUE << shift: \ ! 501: pb -> pb_owned |= bit; \ ! 502: pb -> pb_avail |= bit; \ ! 503: break; \ ! 504: \ ! 505: case ST_RESP_VALUE << shift: \ ! 506: pb -> pb_avail |= bit; \ ! 507: break; \ ! 508: } \ ! 509: } ! 510: dotokens (); ! 511: #undef dotoken ! 512: ! 513: pb -> pb_ssdusize = sc -> sc_ssdusize; ! 514: ! 515: if (decode_PS_CPA__type (pe, 1, NULLIP, NULLVP, &cpa) == NOTOK) { ! 516: (void) ppktlose (pb, pi, PC_UNRECOGNIZED, PPDU_CPA, NULLCP, "%s", ! 517: PY_pepy); ! 518: goto out2; ! 519: } ! 520: ! 521: PLOGP (psap2_log,PS_CPA__type, pe, "CPA-type", 1); ! 522: ! 523: if (cpa -> mode -> parm != int_PS_Mode__selector_normal__mode) { ! 524: (void) ppktlose (pb, pi, PC_INVALID, PPDU_CPA, NULLCP, ! 525: "X.410 mode mismatch"); ! 526: goto out2; ! 527: } ! 528: cpa_normal = cpa -> normal__mode; ! 529: ! 530: pc -> pc_sd = pb -> pb_fd; ! 531: } ! 532: else { ! 533: if (sc -> sc_result == SC_NOTSPECIFIED) { ! 534: if (decode_PS_ARP__PPDU (pe, 1, NULLIP, NULLVP, &arp) == NOTOK) { ! 535: (void) ppktlose (pb, pi, PC_UNRECOGNIZED, PPDU_ARP, NULLCP, ! 536: "%s", PY_pepy); ! 537: goto out2; ! 538: } ! 539: ! 540: PLOGP (psap2_log,PS_ARP__PPDU, pe, "ARP-PPDU", 1); ! 541: ! 542: if (arp -> provider__reason) { ! 543: if ((result = arp -> provider__reason -> parm) == 0) ! 544: result = PC_NOTSPECIFIED; ! 545: else ! 546: result += PC_ABORT_BASE; ! 547: } ! 548: else ! 549: result = PC_NOTSPECIFIED; ! 550: ! 551: (void) psaplose (pi, result, NULLCP, NULLCP); ! 552: goto out2; ! 553: } ! 554: ! 555: if (decode_PS_CPR__type (pe, 1, NULLIP, NULLVP, &cpr) == NOTOK) { ! 556: (void) ppktlose (pb, pi, PC_UNRECOGNIZED, PPDU_CPR, NULLCP, "%s", ! 557: PY_pepy); ! 558: goto out2; ! 559: } ! 560: ! 561: PLOGP (psap2_log,PS_CPR__type, pe, "CPR-type", 1); ! 562: ! 563: if (cpr -> offset != type_PS_CPR__type_normal__mode) { ! 564: (void) ppktlose (pb, pi, PC_INVALID, PPDU_CPR, NULLCP, ! 565: "X.410 mode mismatch"); ! 566: goto out2; ! 567: } ! 568: cpr_normal = cpr -> un.normal__mode; ! 569: ! 570: pc -> pc_sd = NOTOK; ! 571: } ! 572: ! 573: pb -> pb_responding.pa_addr = sc -> sc_responding; /* struct copy */ ! 574: if (qb = cpa ? cpa_normal -> responding : cpr_normal -> responding) { ! 575: char *base; ! 576: ! 577: if ((base = qb2str (qb)) == NULLCP ! 578: && sc -> sc_result == SC_ACCEPT) { ! 579: (void) ppktlose (pb, pi, PC_INVALID, PPDU_CPA, NULLCP, ! 580: "malformed PSAP selector"); ! 581: goto out2; ! 582: } ! 583: if (base) { ! 584: if (qb -> qb_len > sizeof pc -> pc_responding.pa_selector) ! 585: qb -> qb_len = sizeof pc -> pc_responding.pa_selector; ! 586: bcopy (base, pb -> pb_responding.pa_selector, ! 587: pb -> pb_responding.pa_selectlen = qb -> qb_len); ! 588: free (base); ! 589: } ! 590: } ! 591: pc -> pc_responding = pb -> pb_responding; /* struct copy */ ! 592: ! 593: { ! 594: register struct PSAPcontext *pp, ! 595: *qp; ! 596: register struct type_PS_Definition__result__list *lp, ! 597: *mp; ! 598: ! 599: i = 0; ! 600: lp = cpa ? cpa_normal -> context__list : cpr_normal -> context__list; ! 601: for (mp = lp; mp; mp = mp -> next) ! 602: i++; ! 603: if (i != pb -> pb_ncontext && i != 0) { ! 604: if (sc -> sc_result != SC_ACCEPT) { ! 605: pc -> pc_ctxlist.pc_nctx = 0; ! 606: goto carry_on; ! 607: } ! 608: ! 609: (void) ppktlose (pb, pi, PC_INVALID, PPDU_CPA, NULLCP, ! 610: "proposed/resulting presentation contexts mismatch"); ! 611: goto out2; ! 612: } ! 613: ! 614: i = (pc -> pc_ctxlist.pc_nctx = pb -> pb_ncontext) - 1; ! 615: for (pp = pc -> pc_ctxlist.pc_ctx, qp = pb -> pb_contexts, mp = lp; ! 616: i >= 0; ! 617: i--, pp++, qp++) { ! 618: pp -> pc_id = qp -> pc_id; ! 619: pp -> pc_asn = pp -> pc_atn = NULLOID; ! 620: ! 621: if (lp == NULL) { ! 622: pp -> pc_result = PC_ACCEPT; ! 623: continue; ! 624: } ! 625: ! 626: switch (mp -> element_PS_12 -> result) { ! 627: case int_PS_result_acceptance: ! 628: /* assume they gave back ASN.1 */ ! 629: default: ! 630: pp -> pc_result = qp -> pc_result = PC_ACCEPT; ! 631: break; ! 632: ! 633: case int_PS_result_user__rejection: ! 634: pp -> pc_result = qp -> pc_result = PC_REJECTED; ! 635: break; ! 636: ! 637: case int_PS_result_provider__rejection: ! 638: if ((pp -> pc_result = ! 639: mp -> element_PS_12 -> provider__reason) == 0) ! 640: pp -> pc_result = PC_NOTSPECIFIED; ! 641: else ! 642: pp -> pc_result += PC_REASON_BASE; ! 643: qp -> pc_result = pp -> pc_result; ! 644: break; ! 645: } ! 646: ! 647: mp = mp -> next; ! 648: } ! 649: ! 650: i = pb -> pb_ncontext - 1; ! 651: for (qp = pb -> pb_contexts + i; i >= 0; i--, qp--) ! 652: if (qp -> pc_result != PC_ACCEPT) { ! 653: register struct PSAPcontext *qqp; ! 654: ! 655: qqp = pb -> pb_contexts + --pb -> pb_ncontext; ! 656: if (qp -> pc_asn) ! 657: oid_free (qp -> pc_asn); ! 658: if (qp -> pc_atn) ! 659: oid_free (qp -> pc_atn); ! 660: if (qp != qqp) ! 661: *qp = *qqp; /* struct copy */ ! 662: } ! 663: } ! 664: carry_on: ; ! 665: ! 666: if (cpr == NULL || cpr_normal -> default__context == NULL) ! 667: pc -> pc_defctxresult = PC_ACCEPT; ! 668: else ! 669: switch (cpr_normal -> default__context -> parm) { ! 670: case int_PS_Result_acceptance: ! 671: default: ! 672: pc -> pc_defctxresult = PC_ACCEPT; ! 673: break; ! 674: ! 675: case int_PS_Result_user__rejection: ! 676: pc -> pc_defctxresult = PC_REJECTED; ! 677: break; ! 678: ! 679: case int_PS_Result_provider__rejection: ! 680: pc -> pc_defctxresult = PC_NOTSPECIFIED; ! 681: break; ! 682: } ! 683: ! 684: if (ppdu2info (pb, pi, cpa ? cpa_normal -> user__data ! 685: : cpr_normal -> user__data, pc -> pc_info, ! 686: &pc -> pc_ninfo, cpa ? PPDU_CPA : PPDU_CPR) == NOTOK) ! 687: goto out2; ! 688: ! 689: if (sc -> sc_result == SC_ACCEPT) { ! 690: if (cpa_normal -> presentation__fu) { ! 691: register struct pair *pp; ! 692: ! 693: if (!(pb -> pb_srequirements & SR_TYPEDATA)) { ! 694: (void) bit_off (cpa_normal -> presentation__fu, ! 695: bit_PS_Presentation__requirements_context__management); ! 696: (void) bit_off (cpa_normal -> presentation__fu, ! 697: bit_PS_Presentation__requirements_restoration); ! 698: } ! 699: for (pp = preq_pairs; pp -> p_mask; pp++) ! 700: if (!(pb -> pb_prequirements & pp -> p_mask)) { ! 701: if (bit_test (cpa_normal -> presentation__fu, ! 702: pp -> p_bitno) == 1) { ! 703: (void) ppktlose (pb, pi, PC_INVALID, PPDU_CPA, NULLCP, ! 704: "presentation-requirements negotiation botched"); ! 705: goto out2; ! 706: } ! 707: } ! 708: else ! 709: if (bit_test (cpa_normal -> presentation__fu, ! 710: pp -> p_bitno) < 1) ! 711: pb -> pb_prequirements &= ~pp -> p_mask; ! 712: } ! 713: pc -> pc_prequirements = pb -> pb_prequirements; ! 714: ! 715: if (cpa_normal -> session__fu) { ! 716: register struct pair *pp; ! 717: ! 718: for (pp = preq_pairs; pp -> p_mask; pp++) ! 719: if (bit_test (cpa_normal -> session__fu, pp -> p_bitno) < 1) ! 720: pb -> pb_urequirements &= ~pp -> p_mask; ! 721: } ! 722: pc -> pc_srequirements = pb -> pb_urequirements; ! 723: pc -> pc_settings = sc -> sc_settings; ! 724: pc -> pc_please = sc -> sc_please; ! 725: pc -> pc_isn = sc -> sc_isn; ! 726: ! 727: pc -> pc_connect = sc -> sc_connect; /* struct copy */ ! 728: ! 729: pc -> pc_ssdusize = sc -> sc_ssdusize; ! 730: ! 731: pc -> pc_qos = sc -> sc_qos; /* struct copy */ ! 732: ! 733: pc -> pc_result = PC_ACCEPT; ! 734: ! 735: free_PS_CPA__type (cpa); ! 736: } ! 737: else { ! 738: if (cpr_normal -> optionals & opt_PS_element_PS_2_reason) ! 739: pc -> pc_result = cpr_normal -> reason + PC_PROV_BASE; ! 740: else ! 741: pc -> pc_result = PC_NOTSPECIFIED; ! 742: ! 743: free_PS_CPR__type (cpr); ! 744: freepblk (pb); ! 745: } ! 746: ! 747: pe_free (pe); ! 748: ! 749: return DONE; ! 750: ! 751: out2: ; ! 752: result = NOTOK; ! 753: if (pe) ! 754: pe_free (pe); ! 755: if (cpa) ! 756: free_PS_CPA__type (cpa); ! 757: if (cpr) ! 758: free_PS_CPR__type (cpr); ! 759: if (arp) ! 760: free_PS_ARP__PPDU (arp); ! 761: ! 762: out1: ; ! 763: SCFREE (sc); ! 764: freepblk (pb); ! 765: ! 766: return result; ! 767: } ! 768: ! 769: /* P-ASYN-NEXT.REQUEST (pseudo) */ ! 770: ! 771: int PAsynNextRequest (sd, pc, pi) ! 772: int sd; ! 773: struct PSAPconnect *pc; ! 774: struct PSAPindication *pi; ! 775: { ! 776: SBV smask; ! 777: int result; ! 778: register struct psapblk *pb; ! 779: struct SSAPconnect scs; ! 780: register struct SSAPconnect *sc = &scs; ! 781: struct SSAPindication sis; ! 782: register struct SSAPindication *si = &sis; ! 783: register struct SSAPabort *sa = &si -> si_abort; ! 784: ! 785: missingP (pc); ! 786: missingP (pi); ! 787: ! 788: smask = sigioblock (); ! 789: ! 790: if ((pb = findpblk (sd)) == NULL) { ! 791: (void) sigiomask (smask); ! 792: return psaplose (pi, PC_PARAMETER, NULLCP, ! 793: "invalid presentation descriptor"); ! 794: } ! 795: if (pb -> pb_flags & PB_CONN) { ! 796: (void) sigiomask (smask); ! 797: return psaplose (pi, PC_OPERATION, NULLCP, ! 798: "presentation descriptor connected"); ! 799: } ! 800: ! 801: switch (result = SAsynNextRequest (pb -> pb_fd, sc, si)) { ! 802: case NOTOK: ! 803: pb -> pb_fd = NOTOK; ! 804: (void) ss2pslose (pb, pi, "SAsynRetryRequest", sa); ! 805: freepblk (pb); ! 806: break; ! 807: ! 808: case CONNECTING_1: ! 809: case CONNECTING_2: ! 810: break; ! 811: ! 812: case DONE: ! 813: result = PAsynRetryAux (pb, sc, si, pc, pi); ! 814: break; ! 815: } ! 816: ! 817: (void) sigiomask (smask); ! 818: ! 819: return result; ! 820: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.