|
|
1.1 ! root 1: /* ro2ss.c - ROPM: SSAP interface */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/rosap/RCS/ro2ss.c,v 7.1 90/07/01 21:05:48 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/rosap/RCS/ro2ss.c,v 7.1 90/07/01 21:05:48 mrose Exp $ ! 9: * ! 10: * Based on an TCP-based implementation by George Michaelson of University ! 11: * College London. ! 12: * ! 13: * ! 14: * $Log: ro2ss.c,v $ ! 15: * Revision 7.1 90/07/01 21:05:48 mrose ! 16: * pepsy ! 17: * ! 18: * Revision 6.0 89/03/18 23:42:14 mrose ! 19: * Release 5.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 "ROS-types.h" ! 38: #include "../acsap/OACS-types.h" ! 39: #include "ropkt.h" ! 40: #include "tailor.h" ! 41: ! 42: /* DATA */ ! 43: ! 44: #define doSSabort ss2rosabort ! 45: ! 46: ! 47: int ssDATAser (), ssTOKENser (), ssSYNCser (), ssACTIVITYser (), ! 48: ssREPORTser (), ssFINISHser (), ssABORTser (); ! 49: ! 50: /* bind underlying service */ ! 51: ! 52: int RoSService (acb, roi) ! 53: register struct assocblk *acb; ! 54: struct RoSAPindication *roi; ! 55: { ! 56: if (acb -> acb_flags & (ACB_ACS | ACB_RTS)) ! 57: return rosaplose (roi, ROS_OPERATION, NULLCP, ! 58: "not an association descriptor for ROS on session"); ! 59: ! 60: acb -> acb_putosdu = ro2sswrite; ! 61: acb -> acb_rowaitrequest = ro2sswait; ! 62: acb -> acb_getosdu = qbuf2pe; ! 63: acb -> acb_ready = ro2ssready; ! 64: acb -> acb_rosetindications = ro2ssasync; ! 65: acb -> acb_roselectmask = ro2ssmask; ! 66: acb -> acb_ropktlose = ro2sslose; ! 67: ! 68: return OK; ! 69: } ! 70: ! 71: /* define vectors for INDICATION events */ ! 72: ! 73: #define e(i) (indication ? (i) : NULLIFP) ! 74: ! 75: ! 76: /* ARGSUSED */ ! 77: ! 78: int ro2ssasync (acb, indication, roi) ! 79: register struct assocblk *acb; ! 80: IFP indication; ! 81: struct RoSAPindication *roi; ! 82: { ! 83: struct SSAPindication sis; ! 84: register struct SSAPabort *sa = &sis.si_abort; ! 85: ! 86: if (SSetIndications (acb -> acb_fd, e (ssDATAser), e (ssTOKENser), ! 87: e (ssSYNCser), e (ssACTIVITYser), e (ssREPORTser), ! 88: e (ssFINISHser), e (ssABORTser), &sis) == NOTOK) ! 89: switch (sa -> sa_reason) { ! 90: case SC_WAITING: ! 91: return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP); ! 92: ! 93: default: ! 94: (void) ss2roslose (acb, roi, "SSetIndications", sa); ! 95: freeacblk (acb); ! 96: return NOTOK; ! 97: } ! 98: ! 99: if (acb -> acb_rosindication = indication) ! 100: acb -> acb_flags |= ACB_ASYN; ! 101: else ! 102: acb -> acb_flags &= ~ACB_ASYN; ! 103: ! 104: return OK; ! 105: } ! 106: ! 107: #undef e ! 108: ! 109: /* map association descriptors for select() */ ! 110: ! 111: /* ARGSUSED */ ! 112: ! 113: int ro2ssmask (acb, mask, nfds, roi) ! 114: register struct assocblk *acb; ! 115: fd_set *mask; ! 116: int *nfds; ! 117: struct RoSAPindication *roi; ! 118: { ! 119: struct SSAPindication sis; ! 120: register struct SSAPabort *sa = &sis.si_abort; ! 121: ! 122: if (SSelectMask (acb -> acb_fd, mask, nfds, &sis) == NOTOK) ! 123: switch (sa -> sa_reason) { ! 124: case SC_WAITING: ! 125: return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP); ! 126: ! 127: default: ! 128: (void) ss2roslose (acb, roi, "SSelectMask", sa); ! 129: freeacblk (acb); ! 130: return NOTOK; ! 131: } ! 132: ! 133: return OK; ! 134: } ! 135: ! 136: /* protocol-level abort */ ! 137: ! 138: int ro2sslose (acb, result) ! 139: register struct assocblk *acb; ! 140: int result; ! 141: { ! 142: int len; ! 143: char *base; ! 144: PE pe; ! 145: struct SSAPindication sis; ! 146: ! 147: base = NULL, len = 0; ! 148: /* begin AbortInformation PSDU (pseudo) */ ! 149: if (pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_CONS, PE_CONS_SET)) { ! 150: if (set_add (pe, num2prim (result, PE_CLASS_CONT, 0)) != NOTOK) ! 151: (void) pe2ssdu (pe, &base, &len); ! 152: ! 153: PLOGP (rosap_log,OACS_AbortInformation, pe, "AbortInformation", ! 154: 0); ! 155: ! 156: pe_free (pe); ! 157: } ! 158: /* end AbortInformation PSDU */ ! 159: ! 160: (void) SUAbortRequest (acb -> acb_fd, base, len, &sis); ! 161: acb -> acb_fd = NOTOK; ! 162: ! 163: if (base) ! 164: free (base); ! 165: } ! 166: ! 167: /* SSAP interface */ ! 168: ! 169: int ro2sswait (acb, invokeID, secs, roi) ! 170: register struct assocblk *acb; ! 171: int *invokeID, ! 172: secs; ! 173: register struct RoSAPindication *roi; ! 174: { ! 175: int result; ! 176: struct SSAPdata sxs; ! 177: register struct SSAPdata *sx = &sxs; ! 178: struct SSAPindication sis; ! 179: register struct SSAPindication *si = &sis; ! 180: ! 181: if (acb -> acb_apdu) { ! 182: result = acb2osdu (acb, NULLIP, acb -> acb_apdu, roi); ! 183: acb -> acb_apdu = NULLPE; ! 184: ! 185: return result; ! 186: } ! 187: ! 188: for (;;) { ! 189: switch (result = SReadRequest (acb -> acb_fd, sx, secs, si)) { ! 190: case NOTOK: ! 191: return doSSabort (acb, &si -> si_abort, roi); ! 192: ! 193: case OK: ! 194: if ((result = doSSdata (acb, invokeID, sx, roi)) != OK) ! 195: return (result != DONE ? result : OK); ! 196: continue; ! 197: ! 198: case DONE: ! 199: switch (si -> si_type) { ! 200: case SI_TOKEN: ! 201: if (doSStokens (acb, &si -> si_token, roi) == NOTOK) ! 202: return NOTOK; ! 203: continue; ! 204: ! 205: case SI_SYNC: ! 206: if (doSSsync (acb, &si -> si_sync, roi) == NOTOK) ! 207: return NOTOK; ! 208: continue; ! 209: ! 210: case SI_ACTIVITY: ! 211: if (doSSactivity (acb, &si -> si_activity, roi) == NOTOK) ! 212: return NOTOK; ! 213: continue; ! 214: ! 215: case SI_REPORT: ! 216: if (doSSreport (acb, &si -> si_report, roi) == NOTOK) ! 217: return NOTOK; ! 218: continue; ! 219: ! 220: case SI_FINISH: ! 221: if (doSSfinish (acb, &si -> si_finish, roi) == NOTOK) ! 222: return NOTOK; ! 223: return DONE; ! 224: ! 225: default: ! 226: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 227: "unknown indication (0x%x) from session", ! 228: si -> si_type); ! 229: break; ! 230: } ! 231: break; ! 232: ! 233: default: ! 234: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 235: "unexpected return from SReadRequest=%d", result); ! 236: break; ! 237: } ! 238: break; ! 239: } ! 240: ! 241: freeacblk (acb); ! 242: ! 243: return NOTOK; ! 244: } ! 245: ! 246: /* */ ! 247: ! 248: /* ARGSUSED */ ! 249: ! 250: int ro2ssready (acb, priority, roi) ! 251: register struct assocblk *acb; ! 252: int priority; ! 253: struct RoSAPindication *roi; ! 254: { ! 255: int result; ! 256: PE pe; ! 257: struct SSAPdata sxs; ! 258: register struct SSAPdata *sx = &sxs; ! 259: struct SSAPindication sis; ! 260: struct SSAPindication *si = &sis; ! 261: struct SSAPabort *sa = &si -> si_abort; ! 262: ! 263: if (acb -> acb_apdu || (acb -> acb_flags & ACB_CLOSING)) ! 264: return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP); ! 265: ! 266: if (!(acb -> acb_requirements & SR_HALFDUPLEX) ! 267: || (acb -> acb_flags & ACB_TURN)) ! 268: return OK; ! 269: ! 270: if (!(acb -> acb_flags & ACB_PLEASE)) { ! 271: if (SPTokenRequest (acb -> acb_fd, ST_DAT_TOKEN, NULLCP, 0, si) ! 272: == NOTOK) { ! 273: (void) ss2roslose (acb, roi, "SPTokenRequest", sa); ! 274: goto out; ! 275: } ! 276: ! 277: acb -> acb_flags |= ACB_PLEASE; ! 278: } ! 279: ! 280: for (;;) { ! 281: switch (result = SReadRequest (acb -> acb_fd, sx, NOTOK, si)) { ! 282: case NOTOK: ! 283: return doSSabort (acb, &si -> si_abort, roi); ! 284: ! 285: case OK: ! 286: if (sx -> sx_type != SX_NORMAL) { ! 287: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 288: "unexpected data indication (0x%x)", ! 289: sx -> sx_type); ! 290: goto bad_sx; ! 291: } ! 292: if (pe = qbuf2pe (&sx -> sx_qbuf, sx -> sx_cc, &result)) { ! 293: acb -> acb_apdu = pe; ! 294: return rosaplose (roi, ROS_WAITING, NULLCP, NULLCP); ! 295: } ! 296: if (result != PS_ERR_NMEM) { ! 297: (void) rosapreject (acb, roi, ROS_GP_STRUCT, NULLCP, "%s", ! 298: ps_error (result)); ! 299: continue; ! 300: } ! 301: ! 302: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, "%s", ! 303: ps_error (result)); ! 304: bad_sx: ; ! 305: SXFREE (sx); ! 306: goto out; ! 307: ! 308: case DONE: ! 309: switch (si -> si_type) { ! 310: case SI_TOKEN: ! 311: if (doSStokens (acb, &si -> si_token, roi) == NOTOK) ! 312: return NOTOK; ! 313: return OK; ! 314: ! 315: case SI_SYNC: ! 316: if (doSSsync (acb, &si -> si_sync, roi) == NOTOK) ! 317: return NOTOK; ! 318: continue; ! 319: ! 320: case SI_ACTIVITY: ! 321: if (doSSactivity (acb, &si -> si_activity, roi) == NOTOK) ! 322: return NOTOK; ! 323: continue; ! 324: ! 325: case SI_REPORT: ! 326: if (doSSreport (acb, &si -> si_report, roi) == NOTOK) ! 327: return NOTOK; ! 328: continue; ! 329: ! 330: case SI_FINISH: ! 331: if (doSSfinish (acb, &si -> si_finish, roi) == NOTOK) ! 332: return NOTOK; ! 333: return DONE; ! 334: ! 335: default: ! 336: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 337: "unknown indication (0x%x) from session", ! 338: si -> si_type); ! 339: break; ! 340: } ! 341: break; ! 342: ! 343: default: ! 344: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 345: "unexpected return from SReadRequest=%d", result); ! 346: break; ! 347: } ! 348: break; ! 349: } ! 350: ! 351: out: ; ! 352: freeacblk (acb); ! 353: ! 354: return NOTOK; ! 355: } ! 356: ! 357: /* */ ! 358: ! 359: /* ARGSUSED */ ! 360: ! 361: int ro2sswrite (acb, pe, fe, priority, roi) ! 362: register struct assocblk *acb; ! 363: register PE pe; ! 364: PE fe; ! 365: int priority; ! 366: struct RoSAPindication *roi; ! 367: { ! 368: int result; ! 369: register struct udvec *vv; ! 370: struct udvec *uv; ! 371: struct SSAPindication sis; ! 372: register struct SSAPindication *si = &sis; ! 373: register struct SSAPabort *sa = &si -> si_abort; ! 374: ! 375: PLOGP (rosap_log,ROS_OPDU, pe, "OPDU", 0); ! 376: ! 377: uv = NULL; ! 378: if ((result = pe2uvec (pe, &uv)) == NOTOK) ! 379: (void) rosaplose (roi, ROS_CONGEST, NULLCP, "out of memory"); ! 380: else ! 381: if ((result = SWriteRequest (acb -> acb_fd, 0, uv, si)) == NOTOK) ! 382: (void) ss2roslose (acb, roi, "SWriteRequest", sa); ! 383: else ! 384: result = OK; ! 385: ! 386: if (fe) ! 387: (void) pe_extract (pe, fe); ! 388: pe_free (pe); ! 389: ! 390: if (uv) { ! 391: for (vv = uv; vv -> uv_base; vv++) ! 392: if (!vv -> uv_inline) ! 393: free ((char *) vv -> uv_base); ! 394: free ((char *) uv); ! 395: } ! 396: ! 397: if (result == NOTOK) ! 398: freeacblk (acb); ! 399: ! 400: return result; ! 401: } ! 402: ! 403: /* */ ! 404: ! 405: static int doSSdata (acb, invokeID, sx, roi) ! 406: register struct assocblk *acb; ! 407: int *invokeID; ! 408: register struct SSAPdata *sx; ! 409: struct RoSAPindication *roi; ! 410: { ! 411: int result; ! 412: register PE pe; ! 413: ! 414: if (sx -> sx_type != SX_NORMAL) { ! 415: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 416: "unexpected data indication (0x%x)", sx -> sx_type); ! 417: goto out; ! 418: } ! 419: ! 420: if (pe = (*acb -> acb_getosdu) (&sx -> sx_qbuf, sx -> sx_cc, &result)) ! 421: return acb2osdu (acb, invokeID, pe, roi); ! 422: ! 423: if (result != PS_ERR_NMEM) ! 424: return rosapreject (acb, roi, ROS_GP_STRUCT, NULLCP, "%s", ! 425: ps_error (result)); ! 426: ! 427: (void) ropktlose (acb, roi, ROS_CONGEST, NULLCP, "%s", ! 428: ps_error (result)); ! 429: ! 430: out: ; ! 431: SXFREE (sx); ! 432: ! 433: freeacblk (acb); ! 434: return NOTOK; ! 435: } ! 436: ! 437: /* */ ! 438: ! 439: static int doSStokens (acb, st, roi) ! 440: register struct assocblk *acb; ! 441: register struct SSAPtoken *st; ! 442: struct RoSAPindication *roi; ! 443: { ! 444: int result; ! 445: struct SSAPindication sis; ! 446: struct SSAPindication *si = &sis; ! 447: struct SSAPabort *sa = &si -> si_abort; ! 448: ! 449: switch (st -> st_type) { ! 450: case ST_CONTROL: ! 451: break; ! 452: ! 453: case ST_PLEASE: ! 454: if (!(acb -> acb_requirements & SR_HALFDUPLEX)) ! 455: break; ! 456: if (!(acb -> acb_flags & ACB_TURN)) ! 457: break; /* error - do not have turn */ ! 458: ! 459: result = SGTokenRequest (acb -> acb_fd, ST_DAT_TOKEN, si); ! 460: ! 461: if (result == NOTOK) { ! 462: (void) ss2roslose (acb, roi, "SGTokenRequest", sa); ! 463: goto out; ! 464: } ! 465: acb -> acb_flags &= ~ACB_TURN; ! 466: STFREE (st); ! 467: return result; ! 468: ! 469: case ST_GIVE: ! 470: if (!(acb -> acb_requirements & SR_HALFDUPLEX)) ! 471: break; ! 472: if (acb -> acb_flags & ACB_TURN) ! 473: break; /* error - have turn already */ ! 474: ! 475: if (st -> st_tokens & ST_DAT_TOKEN) { ! 476: acb -> acb_flags |= ACB_TURN; ! 477: acb -> acb_flags &= ~ACB_PLEASE; ! 478: } ! 479: return result; ! 480: ! 481: default: ! 482: break; ! 483: } ! 484: ! 485: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 486: "unexpected token indication (0x%x)", st -> st_type); ! 487: ! 488: out: ; ! 489: STFREE (st); ! 490: ! 491: freeacblk (acb); ! 492: return NOTOK; ! 493: } ! 494: ! 495: /* */ ! 496: ! 497: static int doSSsync (acb, sn, roi) ! 498: register struct assocblk *acb; ! 499: register struct SSAPsync *sn; ! 500: struct RoSAPindication *roi; ! 501: { ! 502: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 503: "unexpected sync indication (0x%x)", sn -> sn_type); ! 504: ! 505: SNFREE (sn); ! 506: ! 507: freeacblk (acb); ! 508: return NOTOK; ! 509: } ! 510: ! 511: /* */ ! 512: ! 513: static int doSSactivity (acb, sv, roi) ! 514: register struct assocblk *acb; ! 515: register struct SSAPactivity *sv; ! 516: struct RoSAPindication *roi; ! 517: { ! 518: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 519: "unexpected activity indication (0x%x)", sv -> sv_type); ! 520: ! 521: SVFREE (sv); ! 522: ! 523: freeacblk (acb); ! 524: return NOTOK; ! 525: } ! 526: ! 527: /* */ ! 528: ! 529: static int doSSreport (acb, sp, roi) ! 530: register struct assocblk *acb; ! 531: register struct SSAPreport *sp; ! 532: struct RoSAPindication *roi; ! 533: { ! 534: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 535: "unexpected exception report indication (0x%x)", sp -> sp_peer); ! 536: ! 537: SPFREE (sp); ! 538: ! 539: freeacblk (acb); ! 540: return NOTOK; ! 541: } ! 542: ! 543: /* */ ! 544: ! 545: static int doSSfinish (acb, sf, roi) ! 546: register struct assocblk *acb; ! 547: struct SSAPfinish *sf; ! 548: struct RoSAPindication *roi; ! 549: { ! 550: SFFREE (sf); ! 551: ! 552: if (acb -> acb_flags & ACB_INIT) { ! 553: (void) ropktlose (acb, roi, ROS_PROTOCOL, NULLCP, ! 554: "association management botched"); ! 555: freeacblk (acb); ! 556: return NOTOK; ! 557: } ! 558: ! 559: acb -> acb_flags |= ACB_FINN; ! 560: roi -> roi_type = ROI_END; ! 561: { ! 562: register struct RoSAPend *roe = &roi -> roi_end; ! 563: ! 564: bzero ((char *) roe, sizeof *roe); ! 565: } ! 566: ! 567: return DONE; ! 568: } ! 569: ! 570: /* */ ! 571: ! 572: int ss2rosabort (acb, sa, roi) ! 573: register struct assocblk *acb; ! 574: register struct SSAPabort *sa; ! 575: struct RoSAPindication *roi; ! 576: { ! 577: int result; ! 578: register PE pe; ! 579: struct type_OACS_AbortInformation *pabort ! 580: = (struct type_OACS_AbortInformation *) 0; ! 581: int acsap_abort = -1; ! 582: ! 583: if (!sa -> sa_peer) { ! 584: if (sa -> sa_reason == SC_TIMER) ! 585: return rosaplose (roi, ROS_TIMER, NULLCP, NULLCP); ! 586: ! 587: (void) ss2roslose (acb, roi, NULLCP, sa); ! 588: goto out; ! 589: } ! 590: ! 591: if (sa -> sa_cc == 0) { ! 592: (void) rosaplose (roi, ROS_ABORTED, NULLCP, NULLCP); ! 593: goto out; ! 594: } ! 595: ! 596: if ((pe = ssdu2pe (sa -> sa_info, sa -> sa_cc, NULLCP, &result)) ! 597: == NULLPE) { ! 598: (void) rosaplose (roi, ROS_PROTOCOL, NULLCP, NULLCP); ! 599: goto out; ! 600: } ! 601: result = parse_OACS_AbortInformation (pe, 1, NULLIP, NULLVP, NULLCP); ! 602: ! 603: #ifdef DEBUG ! 604: if (result != NOTOK && (rosap_log -> ll_events & LLOG_PDUS)) ! 605: pvpdu (rosap_log, print_OACS_AbortInformation_P, pe, ! 606: "AbortInformation", 1); ! 607: #endif ! 608: ! 609: pe_free (pe); ! 610: if (result == NOTOK) { ! 611: (void) rosaplose (roi, ROS_PROTOCOL, "%s", PY_pepy); ! 612: goto out; ! 613: } ! 614: acsap_abort = pabort->member_OACS_6->parm; ! 615: switch (acsap_abort) { ! 616: case ABORT_LSP: ! 617: case ABORT_TMP: ! 618: result = ROS_REMOTE; ! 619: break; ! 620: ! 621: default: ! 622: result = ROS_PROTOCOL; ! 623: break; ! 624: } ! 625: (void) rosaplose (roi, result, NULLCP, NULLCP); ! 626: ! 627: out: ; ! 628: SAFREE (sa); ! 629: acb -> acb_fd = NOTOK; ! 630: freeacblk (acb); ! 631: if (pabort) ! 632: free_OACS_AbortInformation(pabort); ! 633: ! 634: return NOTOK; ! 635: } ! 636: ! 637: /* */ ! 638: ! 639: static int ssDATAser (sd, sx) ! 640: int sd; ! 641: register struct SSAPdata *sx; ! 642: { ! 643: IFP handler; ! 644: register struct assocblk *acb; ! 645: struct RoSAPindication rois; ! 646: register struct RoSAPindication *roi = &rois; ! 647: ! 648: if ((acb = findacblk (sd)) == NULL) ! 649: return; ! 650: handler = acb -> acb_rosindication; ! 651: ! 652: if (doSSdata (acb, NULLIP, sx, roi) != OK) ! 653: (*handler) (sd, roi); ! 654: } ! 655: ! 656: /* */ ! 657: ! 658: static int ssTOKENser (sd, st) ! 659: int sd; ! 660: register struct SSAPtoken *st; ! 661: { ! 662: IFP handler; ! 663: register struct assocblk *acb; ! 664: struct RoSAPindication rois; ! 665: register struct RoSAPindication *roi = &rois; ! 666: ! 667: if ((acb = findacblk (sd)) == NULL) ! 668: return; ! 669: handler = acb -> acb_rosindication; ! 670: ! 671: if (doSStokens (acb, st, roi) != OK) ! 672: (*handler) (sd, roi); ! 673: } ! 674: ! 675: /* */ ! 676: ! 677: static int ssSYNCser (sd, sn) ! 678: int sd; ! 679: register struct SSAPsync *sn; ! 680: { ! 681: IFP handler; ! 682: register struct assocblk *acb; ! 683: struct RoSAPindication rois; ! 684: register struct RoSAPindication *roi = &rois; ! 685: ! 686: if ((acb = findacblk (sd)) == NULL) ! 687: return; ! 688: handler = acb -> acb_rosindication; ! 689: ! 690: if (doSSsync (acb, sn, roi) != OK) ! 691: (*handler) (sd, roi); ! 692: } ! 693: ! 694: /* */ ! 695: ! 696: static int ssACTIVITYser (sd, sv) ! 697: int sd; ! 698: register struct SSAPactivity *sv; ! 699: { ! 700: IFP handler; ! 701: register struct assocblk *acb; ! 702: struct RoSAPindication rois; ! 703: register struct RoSAPindication *roi = &rois; ! 704: ! 705: if ((acb = findacblk (sd)) == NULL) ! 706: return; ! 707: handler = acb -> acb_rosindication; ! 708: ! 709: if (doSSactivity (acb, sv, roi) != OK) ! 710: (*handler) (sd, roi); ! 711: } ! 712: ! 713: /* */ ! 714: ! 715: static int ssREPORTser (sd, sp) ! 716: int sd; ! 717: register struct SSAPreport *sp; ! 718: { ! 719: IFP handler; ! 720: register struct assocblk *acb; ! 721: struct RoSAPindication rois; ! 722: register struct RoSAPindication *roi = &rois; ! 723: ! 724: if ((acb = findacblk (sd)) == NULL) ! 725: return; ! 726: handler = acb -> acb_rosindication; ! 727: ! 728: if (doSSreport (acb, sp, roi) != OK) ! 729: (*handler) (sd, roi); ! 730: } ! 731: ! 732: /* */ ! 733: ! 734: static int ssFINISHser (sd, sf) ! 735: int sd; ! 736: struct SSAPfinish *sf; ! 737: { ! 738: IFP handler; ! 739: register struct assocblk *acb; ! 740: struct RoSAPindication rois; ! 741: register struct RoSAPindication *roi = &rois; ! 742: ! 743: if ((acb = findacblk (sd)) == NULL) ! 744: return; ! 745: handler = acb -> acb_rosindication; ! 746: ! 747: (void) doSSfinish (acb, sf, roi); ! 748: ! 749: (*handler) (sd, roi); ! 750: } ! 751: ! 752: /* */ ! 753: ! 754: static int ssABORTser (sd, sa) ! 755: int sd; ! 756: register struct SSAPabort *sa; ! 757: { ! 758: IFP handler; ! 759: register struct assocblk *acb; ! 760: struct RoSAPindication rois; ! 761: register struct RoSAPindication *roi = &rois; ! 762: ! 763: if ((acb = findacblk (sd)) == NULL) ! 764: return; ! 765: handler = acb -> acb_rosindication; ! 766: ! 767: (void) doSSabort (acb, sa, roi); ! 768: ! 769: (*handler) (sd, roi); ! 770: } ! 771: ! 772: /* */ ! 773: ! 774: int ss2roslose (acb, roi, event, sa) ! 775: register struct assocblk *acb; ! 776: register struct RoSAPindication *roi; ! 777: char *event; ! 778: register struct SSAPabort *sa; ! 779: { ! 780: int reason; ! 781: char *cp, ! 782: buffer[BUFSIZ]; ! 783: ! 784: if (event) ! 785: SLOG (rosap_log, LLOG_EXCEPTIONS, NULLCP, ! 786: (sa -> sa_cc > 0 ? "%s: %s [%*.*s]": "%s: %s", event, ! 787: SErrString (sa -> sa_reason), sa -> sa_cc, sa -> sa_cc, ! 788: sa -> sa_data)); ! 789: ! 790: cp = ""; ! 791: switch (sa -> sa_reason) { ! 792: case SC_SSAPID: ! 793: case SC_SSUSER: ! 794: case SC_ADDRESS: ! 795: reason = ROS_ADDRESS; ! 796: break; ! 797: ! 798: case SC_REFUSED: ! 799: reason = ROS_REFUSED; ! 800: break; ! 801: ! 802: case SC_CONGEST: ! 803: reason = ROS_CONGEST; ! 804: break; ! 805: ! 806: default: ! 807: (void) sprintf (cp = buffer, " (%s at session)", ! 808: SErrString (sa -> sa_reason)); ! 809: case SC_TRANSPORT: ! 810: case SC_ABORT: ! 811: reason = ROS_SESSION; ! 812: break; ! 813: } ! 814: ! 815: if (sa -> sa_cc > 0) ! 816: return ropktlose (acb, roi, reason, NULLCP, "%*.*s%s", ! 817: sa -> sa_cc, sa -> sa_cc, sa -> sa_data, cp); ! 818: else ! 819: return ropktlose (acb, roi, reason, NULLCP, "%s", *cp ? cp + 1 : cp); ! 820: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.