|
|
1.1 ! root 1: /* acsaprespond.c - ACPM: responder */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/acsap/RCS/acsaprespond.c,v 7.2 90/07/09 14:30:38 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/acsap/RCS/acsaprespond.c,v 7.2 90/07/09 14:30:38 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: acsaprespond.c,v $ ! 12: * Revision 7.2 90/07/09 14:30:38 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.1 90/07/01 21:02:08 mrose ! 16: * pepsy ! 17: * ! 18: * Revision 7.0 89/11/23 21:21:57 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 <stdio.h> ! 37: #include "ACS-types.h" ! 38: #define ACSE ! 39: #include "acpkt.h" ! 40: #include "tailor.h" ! 41: ! 42: /* A-ASSOCIATE.INDICATION */ ! 43: ! 44: int AcInit (vecp, vec, acs, aci) ! 45: int vecp; ! 46: char **vec; ! 47: struct AcSAPstart *acs; ! 48: struct AcSAPindication *aci; ! 49: { ! 50: register int i; ! 51: int ctx, ! 52: result; ! 53: register struct assocblk *acb; ! 54: register struct PSAPstart *ps; ! 55: struct PSAPindication pis; ! 56: register struct PSAPindication *pi = &pis; ! 57: register struct PSAPabort *pa = &pi -> pi_abort; ! 58: PE pe; ! 59: struct type_ACS_ACSE__apdu *pdu; ! 60: register struct type_ACS_AARQ__apdu *aarq; ! 61: ! 62: isodetailor (NULLCP, 0); ! 63: ! 64: missingP (vec); ! 65: missingP (acs); ! 66: missingP (aci); ! 67: ! 68: ps = &acs -> acs_start; ! 69: if ((acb = newacblk ()) == NULL) ! 70: return acsaplose (aci, ACS_CONGEST, NULLCP, "out of memory"); ! 71: ! 72: bzero ((char *) acs, sizeof *acs); ! 73: ! 74: if (PInit (vecp, vec, ps, pi) == NOTOK) { ! 75: (void) ps2acslose (acb, aci, "PInit", pa); ! 76: goto out1; ! 77: } ! 78: ! 79: acb -> acb_flags |= ACB_ACS; ! 80: acb -> acb_fd = ps -> ps_sd; ! 81: acb -> acb_sversion = ps -> ps_qos.qos_sversion; ! 82: acb -> acb_uabort = PUAbortRequest; ! 83: ! 84: pdu = NULL; ! 85: if (ps -> ps_ninfo < 1) { ! 86: (void) acsaplose (aci, ACS_PROTOCOL, NULLCP, ! 87: "no user-data on P-CONNECT"); ! 88: goto out2; ! 89: } ! 90: ! 91: result = decode_ACS_ACSE__apdu (pe = ps -> ps_info[0], 1, NULLIP, NULLVP, ! 92: &pdu); ! 93: ! 94: #ifdef DEBUG ! 95: if (result == OK && (acsap_log -> ll_events & LLOG_PDUS)) ! 96: pvpdu (acsap_log, print_ACS_ACSE__apdu_P, pe, "ACSE-apdu", 1); ! 97: #endif ! 98: ! 99: ctx = pe -> pe_context; ! 100: ! 101: pe_free (pe); ! 102: pe = ps -> ps_info[0] = NULLPE; ! 103: ! 104: if (result == NOTOK) { ! 105: (void) acsaplose (aci, ACS_PROTOCOL, NULLCP, "%s", PY_pepy); ! 106: goto out2; ! 107: } ! 108: ! 109: if (pdu -> offset != type_ACS_ACSE__apdu_aarq) { ! 110: (void) acsaplose (aci, ACS_PROTOCOL, NULLCP, ! 111: "unexpected PDU %d on P-CONNECT", pdu -> offset); ! 112: goto out2; ! 113: } ! 114: ! 115: aarq = pdu -> un.aarq; ! 116: ! 117: if ((acb -> acb_context = oid_cpy (aarq -> application__context__name)) ! 118: == NULLOID) { ! 119: (void) acsaplose (aci, ACS_CONGEST, NULLCP, NULLCP); ! 120: goto out2; ! 121: } ! 122: ! 123: { ! 124: register OID oid; ! 125: register struct PSAPcontext *pp; ! 126: ! 127: if ((oid = ode2oid (AC_ASN)) == NULLOID) { ! 128: (void) acsaplose (aci, ACS_PARAMETER, NULLCP, ! 129: "%s: unknown", AC_ASN); ! 130: goto out2; ! 131: } ! 132: ! 133: for (pp = ps -> ps_ctxlist.pc_ctx, i = ps -> ps_ctxlist.pc_nctx - 1; ! 134: i >= 0; ! 135: pp++, i--) ! 136: if (pp -> pc_id == ctx) { ! 137: if (oid_cmp (pp -> pc_asn, oid)) { ! 138: (void) acsaplose (aci, ACS_PROTOCOL, NULLCP, ! 139: "wrong ASN for ACSE"); ! 140: goto out2; ! 141: } ! 142: if (pp -> pc_result != PC_ACCEPT) { ! 143: (void) acsaplose (aci, ACS_PROTOCOL, NULLCP, ! 144: "PCI for ACSE not accepted"); ! 145: goto out2; ! 146: } ! 147: ! 148: acb -> acb_id = ctx; ! 149: } ! 150: else ! 151: if (acb -> acb_rosid == PE_DFLT_CTX) ! 152: acb -> acb_rosid = pp -> pc_id; ! 153: ! 154: if (acb -> acb_id == PE_DFLT_CTX) { ! 155: (void) acsaplose (aci, ACS_PROTOCOL, NULLCP, ! 156: "unable to find PCI for ACSE"); ! 157: goto out2; ! 158: } ! 159: } ! 160: ! 161: acs -> acs_sd = acb -> acb_fd; ! 162: ! 163: if (apdu2info (acb, aci, aarq -> user__information, acs -> acs_info, ! 164: &acs -> acs_ninfo) == NOTOK) ! 165: goto out2; ! 166: ! 167: acs -> acs_context = aarq -> application__context__name; ! 168: aarq -> application__context__name = NULLOID; ! 169: acs -> acs_callingtitle.aei_ap_title = aarq -> calling__AP__title; ! 170: aarq -> calling__AP__title = NULLPE; ! 171: acs -> acs_callingtitle.aei_ae_qualifier = ! 172: aarq -> calling__AE__qualifier; ! 173: aarq -> calling__AE__qualifier = NULLPE; ! 174: if (aarq -> calling__AP__invocation__id) { ! 175: acs -> acs_callingtitle.aei_ap_id = ! 176: aarq -> calling__AP__invocation__id -> parm; ! 177: acs -> acs_callingtitle.aei_flags |= AEI_AP_ID; ! 178: } ! 179: if (aarq -> calling__AE__invocation__id) { ! 180: acs -> acs_callingtitle.aei_ae_id = ! 181: aarq -> calling__AE__invocation__id -> parm; ! 182: acs -> acs_callingtitle.aei_flags |= AEI_AE_ID; ! 183: } ! 184: acs -> acs_calledtitle.aei_ap_title = aarq -> called__AP__title; ! 185: aarq -> called__AP__title = NULLPE; ! 186: acs -> acs_calledtitle.aei_ae_qualifier = ! 187: aarq -> called__AE__qualifier; ! 188: aarq -> called__AE__qualifier = NULLPE; ! 189: if (aarq -> called__AP__invocation__id) { ! 190: acs -> acs_calledtitle.aei_ap_id = ! 191: aarq -> called__AP__invocation__id -> parm; ! 192: acs -> acs_calledtitle.aei_flags |= AEI_AP_ID; ! 193: } ! 194: if (aarq -> called__AE__invocation__id) { ! 195: acs -> acs_calledtitle.aei_ae_id = ! 196: aarq -> called__AE__invocation__id -> parm; ! 197: acs -> acs_calledtitle.aei_flags |= AEI_AE_ID; ! 198: } ! 199: ! 200: for (i = ps -> ps_ninfo - 1; i >= 0; i--) ! 201: if (ps -> ps_info[i]) { ! 202: pe_free (ps -> ps_info[i]); ! 203: ps -> ps_info[i] = NULL; ! 204: } ! 205: ps -> ps_ninfo = 0; ! 206: ! 207: free_ACS_ACSE__apdu (pdu); ! 208: ! 209: return OK; ! 210: ! 211: out2: ; ! 212: if (pdu) ! 213: free_ACS_ACSE__apdu (pdu); ! 214: ! 215: /* XXX: should do AARE APDU, but can't given any useful info... */ ! 216: (void) PConnResponse (ps -> ps_sd, PC_REJECTED, NULLPA, &ps -> ps_ctxlist, ! 217: ps -> ps_defctxresult, 0, 0, SERIAL_NONE, 0, ! 218: &ps -> ps_connect, NULLPEP, 0, &pis); ! 219: ! 220: PSFREE (ps); ! 221: ! 222: out1: ; ! 223: freeacblk (acb); ! 224: ! 225: return NOTOK; ! 226: } ! 227: ! 228: /* A-ASSOCIATE.RESPONSE */ ! 229: ! 230: int AcAssocResponse (sd, status, reason, context, respondtitle, ! 231: respondaddr, ctxlist, defctxresult, prequirements, srequirements, isn, ! 232: settings, ref, data, ndata, aci) ! 233: int sd; ! 234: int status, ! 235: reason; ! 236: OID context; ! 237: AEI respondtitle; ! 238: struct PSAPaddr *respondaddr; ! 239: int prequirements, ! 240: srequirements, ! 241: settings, ! 242: ndata; ! 243: long isn; ! 244: struct PSAPctxlist *ctxlist; ! 245: int defctxresult; ! 246: struct SSAPref *ref; ! 247: PE *data; ! 248: struct AcSAPindication *aci; ! 249: { ! 250: int pstatus, ! 251: result; ! 252: PE pe; ! 253: register struct assocblk *acb; ! 254: struct PSAPindication pis; ! 255: register struct PSAPindication *pi = &pis; ! 256: register struct PSAPabort *pa = &pi -> pi_abort; ! 257: register struct type_ACS_AARE__apdu *pdu; ! 258: ! 259: if ((acb = findacblk (sd)) == NULL || (acb -> acb_flags & ACB_CONN)) ! 260: return acsaplose (aci, ACS_PARAMETER, NULLCP, ! 261: "invalid association descriptor"); ! 262: switch (status) { ! 263: case ACS_ACCEPT: ! 264: pstatus = PC_ACCEPT; ! 265: if (reason != ACS_USER_NULL) { ! 266: bad_reason: ; ! 267: return acsaplose (aci, ACS_PARAMETER, NULLCP, ! 268: "invalid value for reason parameter"); ! 269: } ! 270: break; ! 271: ! 272: case ACS_PERMANENT: ! 273: case ACS_TRANSIENT: ! 274: pstatus = PC_REJECTED; ! 275: switch (reason) { ! 276: case ACS_USER_NOREASON: ! 277: case ACS_CONTEXT: ! 278: case ACS_CALLING_AP_TITLE: ! 279: case ACS_CALLING_AP_ID: ! 280: case ACS_CALLING_AE_QUAL: ! 281: case ACS_CALLING_AE_ID: ! 282: case ACS_CALLED_AP_TITLE: ! 283: case ACS_CALLED_AP_ID: ! 284: case ACS_CALLED_AE_QUAL: ! 285: case ACS_CALLED_AE_ID: ! 286: break; ! 287: ! 288: default: ! 289: goto bad_reason; ! 290: } ! 291: break; ! 292: ! 293: default: ! 294: return acsaplose (aci, ACS_PARAMETER, NULLCP, ! 295: "bad value for status parameter"); ! 296: } ! 297: #ifdef notdef ! 298: missingP (context); ! 299: missingP (respondtitle); ! 300: #endif ! 301: ! 302: /* let presentation provider catch errors in presentation parameters */ ! 303: ! 304: toomuchP (data, ndata, NACDATA, "initial"); ! 305: if (data) { /* XXX: probably should have a more intensive check... */ ! 306: register int i; ! 307: register PE *pep; ! 308: ! 309: for (pep = data, i = ndata; i > 0; pep++, i--) ! 310: if ((*pep) -> pe_context == PE_DFLT_CTX) ! 311: return acsaplose (aci, ACS_PARAMETER, NULLCP, ! 312: "default context not allowed for user-data at slot %d", ! 313: pep - data); ! 314: } ! 315: missingP (aci); ! 316: ! 317: pe = NULLPE; ! 318: if ((pdu = (struct type_ACS_AARE__apdu *) calloc (1, sizeof *pdu)) ! 319: == NULL) { ! 320: no_mem: ; ! 321: (void) acsaplose (aci, ACS_CONGEST, NULLCP, "out of memory"); ! 322: goto out2; ! 323: } ! 324: pdu -> application__context__name = context ? context : acb -> acb_context; ! 325: pdu -> result = status; ! 326: if ((pdu -> result__source__diagnostic = ! 327: (struct type_ACS_Associate__source__diagnostic *) malloc ! 328: (sizeof (struct type_ACS_Associate__source__diagnostic))) == NULL) ! 329: goto no_mem; ! 330: pdu -> result__source__diagnostic -> offset = ! 331: type_ACS_Associate__source__diagnostic_acse__service__user; ! 332: pdu -> result__source__diagnostic -> un.acse__service__user = ! 333: reason - ACS_USER_BASE; ! 334: if (respondtitle) { ! 335: pdu -> responding__AP__title = respondtitle -> aei_ap_title; ! 336: pdu -> responding__AE__qualifier = respondtitle -> aei_ae_qualifier; ! 337: if (respondtitle -> aei_flags & AEI_AP_ID) ! 338: pdu -> responding__AP__invocation__id = ! 339: (struct type_ACS_AP__invocation__id *) ! 340: &respondtitle -> aei_ap_id; ! 341: if (respondtitle -> aei_flags & AEI_AE_ID) ! 342: pdu -> responding__AE__invocation__id = ! 343: (struct type_ACS_AE__invocation__id *) ! 344: &respondtitle -> aei_ae_id; ! 345: } ! 346: if (data ! 347: && ndata > 0 ! 348: && (pdu -> user__information = info2apdu (acb, aci, data, ndata)) ! 349: == NULL) ! 350: goto out2; ! 351: ! 352: result = encode_ACS_AARE__apdu (&pe, 1, 0, NULLCP, pdu); ! 353: ! 354: free_ACS_Associate__source__diagnostic (pdu -> result__source__diagnostic); ! 355: if (pdu -> user__information) ! 356: free_ACS_Association__information (pdu -> user__information); ! 357: free ((char *) pdu); ! 358: pdu = NULL; ! 359: ! 360: if (result == NOTOK) { ! 361: (void) acsaplose (aci, ACS_CONGEST, NULLCP, "error encoding PDU: %s", ! 362: PY_pepy); ! 363: goto out2; ! 364: } ! 365: ! 366: if (ctxlist) { ! 367: register int i; ! 368: register struct PSAPcontext *pp; ! 369: ! 370: if (ctxlist -> pc_nctx > NPCTX) { ! 371: (void) acsaplose (aci, ACS_PARAMETER, NULLCP, "too many contexts"); ! 372: goto out1; ! 373: } ! 374: ! 375: for (pp = ctxlist -> pc_ctx, i = ctxlist -> pc_nctx - 1; ! 376: i >= 0; ! 377: i--, pp++) ! 378: if (acb -> acb_id == pp -> pc_id) { ! 379: if (pp -> pc_result != PC_ACCEPT) { ! 380: (void) acsaplose (aci, ACS_PARAMETER, NULLCP, ! 381: "PCI for ACSE not accepted"); ! 382: goto out1; ! 383: } ! 384: } ! 385: else ! 386: if (pp -> pc_result == PC_ACCEPT) ! 387: acb -> acb_rosid = pp -> pc_id; ! 388: } ! 389: pe -> pe_context = acb -> acb_id; ! 390: ! 391: PLOGP (acsap_log,ACS_ACSE__apdu, pe, "AARE-apdu", 0); ! 392: ! 393: result = PConnResponse (acb -> acb_fd, pstatus, respondaddr, ! 394: ctxlist, defctxresult, prequirements, srequirements, isn, ! 395: settings, ref, &pe, 1, pi); ! 396: ! 397: pe_free (pe); ! 398: pe = NULLPE; ! 399: ! 400: if (result == NOTOK) { ! 401: (void) ps2acslose (acb, aci, "PConnResponse", pa); ! 402: if (PC_FATAL (pa -> pa_reason)) ! 403: goto out2; ! 404: else ! 405: goto out1; ! 406: } ! 407: ! 408: if (status == ACS_ACCEPT) ! 409: acb -> acb_flags |= ACB_CONN; ! 410: else { ! 411: acb -> acb_fd = NOTOK; ! 412: freeacblk (acb); ! 413: } ! 414: ! 415: return OK; ! 416: ! 417: out2: ; ! 418: freeacblk (acb); ! 419: out1: ; ! 420: if (pdu) { ! 421: if (pdu -> result__source__diagnostic) ! 422: free_ACS_Associate__source__diagnostic (pdu -> result__source__diagnostic); ! 423: if (pdu -> user__information) ! 424: free_ACS_Association__information (pdu -> user__information); ! 425: free ((char *) pdu); ! 426: } ! 427: if (pe) ! 428: pe_free (pe); ! 429: ! 430: return NOTOK; ! 431: } ! 432:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.