|
|
1.1 ! root 1: /* actions1.c - VTPM: FSM sector 1 actions */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/vt/RCS/actions1.c,v 7.0 89/11/23 22:31:26 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/vt/RCS/actions1.c,v 7.0 89/11/23 22:31:26 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: actions1.c,v $ ! 12: * Revision 7.0 89/11/23 22:31:26 mrose ! 13: * Release 6.0 ! 14: * ! 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: #include "vtpm.h" ! 29: #include "sector1.h" ! 30: ! 31: /************************************************************************/ ! 32: /* This file contains the functions that are executed when the */ ! 33: /* VT Protocol machine is in a Sector 1 state and a protocol */ ! 34: /* event occurs. The state transition matrix is specified in */ ! 35: /* Table 32 of ISO 9041 (July 1987 version). The actions which */ ! 36: /* this collection of functions perform are specified in Table 33 */ ! 37: /* of ISO 9041. */ ! 38: /************************************************************************/ ! 39: ! 40: extern int sd; /*Global Session Descriptor (ISODE) */ ! 41: ! 42: #define invalid_result(str,pe) \ ! 43: adios (NULLCP, "%s: invalid result (%s)", (str), \ ! 44: pe_error ((p) -> pe_errno)) ! 45: ! 46: int ! 47: a1_0(pe) /*NDQ-ntr in states 50B or 51Q (Release awaiting peer)*/ ! 48: /*Also RTQ in state 51T (Release awaiting peer)*/ ! 49: PE pe; ! 50: { ! 51: /*If quarantined data delivery were supported, we would do: ! 52: /* ++vnt; ! 53: /* enque(pe); ! 54: /*For now, only supporting simple or no delivery control, so give pe ! 55: /*to application here. ! 56: */ ! 57: ! 58: vdatind(SEQUENCED,pe); /*Deliver the NDQ to application*/ ! 59: return(OK); ! 60: } ! 61: ! 62: ! 63: int ! 64: a1_1(pe) /*NDQ-tr in states 50B or 51Q (Release Awaiting Peer)*/ ! 65: PE pe; ! 66: { ! 67: /* Same comment as in a1_0 above */ ! 68: vdatind(SEQUENCED,pe); /*Deliver the NDQ to application*/ ! 69: vnt = 0; ! 70: return(OK); ! 71: } ! 72: ! 73: ! 74: int ! 75: a1_2(pe) /*VASSreq from user in state 01 (No Association)*/ ! 76: PE pe; ! 77: { ! 78: dr_pm_st = DEFINED; /*Draft-VTE param. status = Defined ! 79: /*(SetVTPmS(P) in 9041) */ ! 80: /*Set draft-VTE parameter values per profile (SetVTPmV(P) in 9041)*/ ! 81: ! 82: asq(pe); /*Send the ASQ PDU*/ ! 83: ! 84: vsmd = 0; /*Very TEMPORARY -- A-Mode only ! 85: Should be done in VT-user or application call ! 86: */ ! 87: if(vsmd) state = S1_02S; ! 88: else state = S1_02B; ! 89: return(OK); ! 90: } ! 91: ! 92: ! 93: int ! 94: a1_3(pe) /*VASSrsp from user in state 03B (Associate -- Awaiting user)*/ ! 95: PE pe; ! 96: { ! 97: PE p; ! 98: vrsl = -1; ! 99: for(p = first_member(pe); p; p = next_member(pe,p)) ! 100: /*Step through elements in sequence*/ ! 101: { ! 102: if(PE_ID(p->pe_class,p->pe_id) == PE_ID(PE_CLASS_CONT,2) ) ! 103: /*If the result element*/ ! 104: { ! 105: if( (vrsl = prim2num(p)) == NOTOK) ! 106: invalid_result ("a1_3", p); ! 107: break; ! 108: } ! 109: } ! 110: if(vrsl < 0) /*If no result field*/ ! 111: adios(NULLCP, "a1_3: no result field"); ! 112: if(vrsl == FAILURE) ! 113: { ! 114: clear_vte(); ! 115: (void) asr(pe,FAILURE); ! 116: } ! 117: else ! 118: { ! 119: /*Set draft-VTE parameters according to list in primitive ! 120: /* (SetVTPmV(L) in 9041) ! 121: /*Set status of draft-VTE parameters above to defined ! 122: /* (SetVTPmSDe(L) ! 123: /*Set current VTE from draft VTE (SetCuVTE) */ ! 124: ! 125: vena = TRUE; /*Current VTE agreed to*/ ! 126: waca = TRUE; ! 127: (void) asr(pe,SUCCESS); ! 128: if(vrsl == SUCCESS) ! 129: { ! 130: sector = 5; ! 131: state = S5_400B; ! 132: } ! 133: else state = S1_10B; ! 134: } ! 135: return(OK); ! 136: } ! 137: ! 138: ! 139: int ! 140: a1_4(pe) /*VASSrsp from user in state 03S (Associate -- Awaiting user)*/ ! 141: PE pe; ! 142: { ! 143: PE p; ! 144: vrsl = -1; ! 145: for(p = first_member(pe); p; p = next_member(pe,p)) ! 146: /*Step through elements in sequence*/ ! 147: { ! 148: if(PE_ID(p->pe_class,p->pe_id) == PE_ID(PE_CLASS_CONT,2) ) ! 149: /*If the result element*/ ! 150: { ! 151: if( (vrsl = prim2num(p)) == NOTOK) ! 152: invalid_result ("a1_4", p); ! 153: break; ! 154: } ! 155: } ! 156: if(vrsl < 0) /*If no result field*/ ! 157: adios(NULLCP,"a1_4: no result field"); ! 158: if(vrsl == FAILURE) ! 159: { ! 160: clear_vte(); /*Discard VTE (DisVTE)*/ ! 161: (void) asr(pe,FAILURE); /*Send the ASR to peer*/ ! 162: } ! 163: else ! 164: { ! 165: /*Set draft-VTE parameters according to list in primitive ! 166: /* (SetVTPmV(L) in 9041) ! 167: /*Set status of draft-VTE parameters above to defined ! 168: /* (SetVTPmSDe(L) ! 169: /*Set current VTE from draft VTE (SetCuVTE) */ ! 170: ! 171: vena = TRUE; /*Current VTE agreed to*/ ! 172: (void) asr(pe,SUCCESS); ! 173: if(vrsl == SUCCESS) ! 174: { ! 175: sector = 5; ! 176: if(vtok)state = S5_40T; ! 177: else state = S5_40N; ! 178: } ! 179: else ! 180: { ! 181: if(vtok) state = S1_10T; ! 182: else state = S1_10N; ! 183: } ! 184: } ! 185: return(OK); ! 186: } ! 187: ! 188: ! 189: /* ARGSUSED */ ! 190: int ! 191: a1_5(pe) /*RTQ (Token Request) in state 10B ! 192: (Environment not agreed)*/ ! 193: PE pe; ! 194: { ! 195: give_token(); /*Need a call to lower layer in ISODE to do this*/ ! 196: return(OK); ! 197: } ! 198: ! 199: ! 200: /* ARGSUSED */ ! 201: int ! 202: a1_6(pe) /*VGVTreq from user in 10T*/ ! 203: PE pe; ! 204: { ! 205: give_token(); /*Need a call to lower layer in ISODE to do this*/ ! 206: state = S1_10N; ! 207: return(OK); ! 208: } ! 209: ! 210: ! 211: /* ARGSUSED */ ! 212: int ! 213: a1_7(pe) /*VRELreq from user in state 10B (Env. not agreed)*/ ! 214: /*GTQ in 50B*/ ! 215: PE pe; ! 216: { ! 217: if(vtok) ! 218: { ! 219: vt_disconnect(); /*May be only TEMP*/ ! 220: state = S1_51Q; ! 221: } ! 222: else ! 223: { ! 224: request_token(); ! 225: /*Need call to ISODE to request token*/ ! 226: state = S1_50B; ! 227: ! 228: /*Probably need to release the NULL PE for VRELreq that got us here*/ ! 229: ! 230: } ! 231: return(OK); ! 232: } ! 233: ! 234: ! 235: /* ARGSUSED */ ! 236: int ! 237: a1_8(pe) /*VRELreq in 10T*/ ! 238: PE pe; ! 239: { ! 240: vt_disconnect(); /*May be only TEMP--check function*/ ! 241: state = S1_51T; ! 242: ! 243: /*Release NULL PE from VT USER*/ ! 244: ! 245: return(OK); ! 246: } ! 247: ! 248: int ! 249: a1_9(pe) /*VRELrsp in 51R & 51N (Release -- Awaiting User)*/ ! 250: PE pe; ! 251: { ! 252: ! 253: ! 254: /* vrsl = -1; ! 255: /* for(p = first_member(pe); p; p = next_member(pe,p) ) ! 256: /* /*Get Result parameter*/ ! 257: /* { ! 258: /* if(PE_ID(p->pe_class,p->pe_id) == PE_ID(PE_CLASS_CONT,0) ) ! 259: /* { ! 260: /* if( (vrsl = prim2num(p)) == NOTOK) ! 261: /* invalid_result ("a1_9", p); ! 262: /* break; ! 263: /* } ! 264: /* } ! 265: /* if(vrsl < 0) ! 266: /* adios(NULLCP,"a1_9: no result field"); ! 267: /* ! 268: /* we should look in the pdu and see what the result is, but ! 269: /* since we know our vt-user is an agreeable fellow, we can ! 270: /* assume success ! 271: */ ! 272: ! 273: vrsl = SUCCESS; ! 274: if(vrsl == SUCCESS) ! 275: { ! 276: if(vns > 0) /*If data left to send*/ ! 277: { ! 278: advise(LLOG_NOTICE,NULLCP, "Sending remaining data (a1_9() )"); ! 279: send_all(); /*Send remaining data (NDQseq(Vns)-ntr)*/ ! 280: vns = 0; ! 281: } ! 282: send_rlr(pe); /*Send the RLR which User built*/ ! 283: clear_vte(); /*Erase the Environment*/ ! 284: state = S1_01; ! 285: /* system("reset"); */ ! 286: finalbye (); ! 287: advise(LLOG_NOTICE,NULLCP,"association released by terminal service"); ! 288: (void)fflush (stdout); ! 289: exit(0); ! 290: } ! 291: else /*Result was failure*/ ! 292: { ! 293: send_rlr(pe); /*Send the RLR*/ ! 294: if(vena) /*If agreement on VTE*/ ! 295: { ! 296: sector = 5; ! 297: if(vsmd) state = S5_40N; /*If S-Mode*/ ! 298: else state = S5_400B; ! 299: } ! 300: else ! 301: { ! 302: if(vsmd) state = S1_10N; ! 303: else state = S1_10B; ! 304: } ! 305: } ! 306: return(OK); ! 307: } ! 308: ! 309: ! 310: /* ARGSUSED */ ! 311: int ! 312: a1_10(pe) /*VRQTreq(request token) n state 10N*/ ! 313: PE pe; ! 314: { ! 315: request_token(); /*TEMP -- Need an ISODE call to really do this ! 316: since there is no VTP PDU*/ ! 317: ! 318: /*Probably need to free the NullPE that triggered this*/ ! 319: ! 320: state = S1_10N; /*Should be here already. Do this to follow ! 321: the spec literally*/ ! 322: return(OK); ! 323: } ! 324: ! 325: ! 326: /* ARGSUSED */ ! 327: int ! 328: a1_11(pe) /*VSNEGreq (User Start Negotiation)*/ ! 329: PE pe; ! 330: { ! 331: ! 332: /*MIN not implemented*/ ! 333: /*Probably need to send back a negative Acknowledgement*/ ! 334: ! 335: return(OK); ! 336: } ! 337: ! 338: ! 339: /* ARGSUSED */ ! 340: int ! 341: a1_12(pe) /*VSNEGreq*/ ! 342: PE pe; ! 343: { ! 344: ! 345: /*MIN not implemented*/ ! 346: /*Probably need to send back a Negative Acknowledgement*/ ! 347: ! 348: return(OK); ! 349: } ! 350: ! 351: ! 352: /* ARGSUSED */ ! 353: int ! 354: a1_13(pe) /*VSWPreq (User Switch profile request)*/ ! 355: PE pe; ! 356: { ! 357: ! 358: /*Switch Profile not implemented*/ ! 359: /*Should probably send back a negative acknowledgement*/ ! 360: ! 361: return(OK); ! 362: } ! 363: ! 364: ! 365: /* ARGSUSED */ ! 366: int ! 367: a1_14(pe) /*VSWPreq*/ ! 368: PE pe; ! 369: { ! 370: ! 371: /*Switch Profile not implented*/ ! 372: /*Should Probably send back a negative acknowledgement*/ ! 373: ! 374: return(OK); ! 375: } ! 376: ! 377: ! 378: int ! 379: a1_15(pe) /*ASR in state 2B (Assoc. awaiting target) */ ! 380: PE pe; ! 381: { ! 382: PE p; ! 383: ! 384: vrsl = -1; ! 385: for(p = first_member(pe); p; p = next_member(pe,p) ) ! 386: { ! 387: if(PE_ID(p->pe_class,p->pe_id) == PE_ID(PE_CLASS_CONT,2) ) ! 388: { ! 389: if( (vrsl = prim2num(p)) == NOTOK) ! 390: invalid_result ("a1_15", p); ! 391: break; ! 392: } ! 393: } ! 394: if(vrsl < 0) ! 395: adios(NULLCP,"a1_15: no result field"); ! 396: if(vrsl == FAILURE) ! 397: { ! 398: clear_vte(); ! 399: state = S1_01; ! 400: return(FAILURE); /*Notify user of ASR (VASScnf)*/ ! 401: } ! 402: else ! 403: { ! 404: ! 405: /*Set draft-VTE param. according to list in primitive or protocol ! 406: /*element (SetVTPmV(L)). ! 407: /*Set status of draft-VTE params. listed in primitive or protocol ! 408: /*element to defined (SetVTPmSDe(L)) ! 409: /*Set current-VTE from draft-VTE (SetCuVTE) */ ! 410: ! 411: vena = 1; ! 412: waci = 1; ! 413: if(vrsl == SUCCESS) ! 414: { ! 415: sector = 5; ! 416: state = S5_400B; ! 417: } ! 418: else state = S1_10B; ! 419: } ! 420: return(SUCCESS); /*Notify user of ASR (VASScnf)*/ ! 421: } ! 422: ! 423: int ! 424: a1_16(pe) /*ASR in state 2S (Assoc. awaiting target) */ ! 425: PE pe; ! 426: { ! 427: PE p; ! 428: ! 429: vrsl = -1; ! 430: for(p = first_member(pe); p; p = next_member(pe,p) ) ! 431: { ! 432: if(PE_ID(p->pe_class,p->pe_id) == PE_ID(PE_CLASS_CONT,2) ) ! 433: { ! 434: if( (vrsl = prim2num(p)) == NOTOK) ! 435: invalid_result ("a1_16", p); ! 436: break; ! 437: } ! 438: } ! 439: if(vrsl < 0) ! 440: adios(NULLCP,"a1_16: no result field"); ! 441: if(vrsl == FAILURE) ! 442: { ! 443: clear_vte(); ! 444: state = S1_01; ! 445: return(FAILURE); /*Notify user of ASR (VASScnf)*/ ! 446: } ! 447: else ! 448: { ! 449: ! 450: /*Set draft-VTE param. according to list in primitive or protocol ! 451: /*element (SetVTPmV(L)). ! 452: /*Set status of draft-VTE params. listed in primitive or protocol ! 453: /*element to defined (SetVTPmSDe(L)) ! 454: /*Set current-VTE from draft-VTE (SetCuVTE) */ ! 455: ! 456: vena = 1; ! 457: if(vrsl == SUCCESS) ! 458: { ! 459: sector = 5; ! 460: if(vtok) state = S5_40T; ! 461: else state = S5_40N; ! 462: } ! 463: else ! 464: { ! 465: if(vtok) state = S1_10T; ! 466: else state = S1_10N; ! 467: } ! 468: } ! 469: return(SUCCESS); /*Notify user of ASR (VASScnf) */ ! 470: } ! 471: ! 472: ! 473: int ! 474: a1_17(pe) /*ASQ in state 01 (No Association)*/ ! 475: PE pe; ! 476: { ! 477: ! 478: int result; ! 479: ! 480: result = read_asq(pe); /*Unpack ASQ*/ ! 481: if(result == PROFILE_NG) ! 482: { ! 483: (void)send_bad_asr(PROFILE_NG); /*Send Failure ASR with reason*/ ! 484: return(NOTOK); ! 485: } ! 486: if(result == 0) ! 487: { ! 488: (void)send_bad_asr(0); /*Send failure ASR w/ no reason*/ ! 489: return(NOTOK); ! 490: } ! 491: ! 492: /*SetVTPmS(P)*/ ! 493: /*SetVTPmV(P)*/ ! 494: dr_pm_st = DEFINED; ! 495: vsmd = 0; ! 496: vtok = 1; /*For Telnet & transparent profiles*/ ! 497: if(vsmd) state = S1_03S; /*If S-Mode*/ ! 498: else state = S1_03B; ! 499: result = vassind(pe); /*doesn't really use pe but for consistency ! 500: with version 1*/ ! 501: return(result); ! 502: } ! 503: ! 504: ! 505: int ! 506: a1_18(pe) /*UDQ (uncontrolled data) in 51T (Release Awaiting Peer)*/ ! 507: PE pe; ! 508: { ! 509: vdatind(SEQUENCED,pe); /*Want to do VDATind-h but this is all that's ! 510: now available*/ ! 511: return(OK); ! 512: } ! 513: ! 514: ! 515: /* ARGSUSED */ ! 516: int ! 517: a1_19(pe) /*GTQ in 10N or VRTQreq in 10T*/ ! 518: PE pe; ! 519: { ! 520: vtok = TRUE; ! 521: vgvt_ind(); /*VGVTind -- Tell user we have token (as if he cares)*/ ! 522: state = S1_10T;; ! 523: return(OK); ! 524: } ! 525: ! 526: ! 527: int ! 528: a1_20(pe) /*RLR (Release Response) in 51Q or 51T (Release Awaiting Peer)*/ ! 529: PE pe; ! 530: { ! 531: ! 532: PE p; ! 533: ! 534: vrsl = -1; ! 535: for(p = first_member(pe); p; p = next_member(pe,p) ) ! 536: { ! 537: if(PE_ID(p->pe_class,p->pe_id) == PE_ID(PE_CLASS_CONT,0) ) ! 538: /*If result element*/ ! 539: { ! 540: if( (vrsl = prim2num(p)) == NOTOK) ! 541: invalid_result ("a1_20", p); ! 542: break; ! 543: } ! 544: } ! 545: if(vrsl < 0) /*if no result field*/ ! 546: adios(NULLCP,"a1_20: no result field"); ! 547: if(vrsl == SUCCESS) ! 548: { ! 549: /*VRELcnf -- Confirm the release to user -- for now, use the ! 550: original mechanism (closing TELNET) -- should be changed ! 551: especially for forms mode*/ ! 552: ! 553: vrelcnf(); ! 554: if(vnt > 0) ! 555: /*Should never happen until Quarantined Delivery ! 556: supported*/ ! 557: { ! 558: /*VDATind-n(Vnt)*/ ! 559: vnt = 0; ! 560: } ! 561: clear_vte(); ! 562: state = S1_01; ! 563: } ! 564: else /*Release Failed*/ ! 565: { ! 566: if(vena) ! 567: { ! 568: sector = 5; ! 569: if(vsmd) state = S5_40T; ! 570: else state = S5_400B; ! 571: } ! 572: else ! 573: { ! 574: if(vsmd) state = S1_10T; ! 575: else state = S1_10B; ! 576: } ! 577: } ! 578: return(OK); ! 579: } ! 580: ! 581: ! 582: int ! 583: a1_21(pe) /*DLQ (Deliver Request) in 50B or 51Q (Release Awaiting Peer)*/ ! 584: PE pe; ! 585: { ! 586: if( (vra = prim2flag(pe)) == NOTOK) ! 587: adios(NULLCP,"a1_21: incorrect DLQ"); ! 588: if(vra) ! 589: { ! 590: vrsl = FAILURE; ! 591: vrea = COLL_DET; ! 592: /*VRELcnf required in spec but there's really nothing to tell ! 593: the user*/ ! 594: } ! 595: if(vnt > 0) /*Should not happen unless Quarantine Delivery supported*/ ! 596: { ! 597: /*VDATind-n(Vnt)*/ ! 598: vnt = 0; ! 599: } ! 600: vdelind(pe,vra); /*Also irrelevant without Quarantine*/ ! 601: if(vra) ! 602: { ! 603: sector = 5; ! 604: state = S5_402B; ! 605: } ! 606: return(OK); ! 607: } ! 608: ! 609: ! 610: /* ARGSUSED */ ! 611: int ! 612: a1_22(pe) /*RLQ (Release Request) in 50B*/ ! 613: PE pe; ! 614: { ! 615: ! 616: vrsl = FAILURE; ! 617: vrea = COLL_DET; ! 618: /*VRELcnf -- Confirm to user telling of failure due to collision -- ! 619: but user can't do anything now anyway. */ ! 620: ! 621: if(vnt > 0) /*Shouldn't happen without Quarantine Delivery Ctrl*/ ! 622: { ! 623: /*VDATind-n(Vnt)*/ ! 624: vnt = 0; ! 625: } ! 626: (void)vrelind(); /*Tell user that peer requested release*/ ! 627: state = S1_51R; ! 628: return(OK); ! 629: } ! 630: ! 631: ! 632: /* ARGSUSED */ ! 633: int ! 634: a1_23(pe) /*SNQ (Start negotiation) in 50B*/ ! 635: PE pe; ! 636: { ! 637: /*Switch Negotiation not implemented. ! 638: Should probably send back negative acknowledgement. */ ! 639: ! 640: return(OK); ! 641: } ! 642: ! 643: ! 644: /* ARGSUSED */ ! 645: int ! 646: a1_24(pe) /*SPQ (Switch Profile Request) in state 50B*/ ! 647: PE pe; ! 648: { ! 649: /*Profile Switch not implemented. ! 650: Should probably send back negative acknowledgement. */ ! 651: ! 652: return(OK); ! 653: } ! 654: ! 655: ! 656: /* ARGSUSED */ ! 657: int ! 658: a1_25(pe) /*RLQ (Release Request) in 10B (Environment not agreed) */ ! 659: PE pe; ! 660: { ! 661: (void)vrelind(); ! 662: state = S1_51R; ! 663: return(OK); ! 664: } ! 665: ! 666: /* ARGSUSED */ ! 667: int ! 668: a1_26(pe) /*RLQ (Release Request) in state 10N*/ ! 669: PE pe; ! 670: { ! 671: (void)vrelind(); ! 672: state = S1_51R; ! 673: return(OK); ! 674: ! 675: } ! 676: ! 677: ! 678: /* ARGSUSED */ ! 679: int ! 680: a1_27(pe) /*RTQ (Request Token) in state 10T*/ ! 681: PE pe; ! 682: { ! 683: vrtq_ind(); /*Tell Application that peer requested token*/ ! 684: ! 685: /*Probably some ISODE call to give token directly instead of telling ! 686: user */ ! 687: ! 688: return(OK); ! 689: } ! 690: ! 691: ! 692: /* ARGSUSED */ ! 693: int ! 694: a1_28(pe) /*SNQ (Start Negotiation) in 10N*/ ! 695: PE pe; ! 696: { ! 697: /*MIN not implemented. ! 698: Need to return NAK. */ ! 699: ! 700: return(OK); ! 701: } ! 702: ! 703: ! 704: /* ARGSUSED */ ! 705: int ! 706: a1_29(pe) /*SNQ (Start Negotiation) in 10B*/ ! 707: PE pe; ! 708: { ! 709: /*MIN not implemented. ! 710: Need to send NAK to peer. */ ! 711: ! 712: return(OK); ! 713: } ! 714: ! 715: ! 716: /* ARGSUSED */ ! 717: int ! 718: a1_30(pe) /*SPQ (Switch Profile Request) in 10B & 10N*/ ! 719: PE pe; ! 720: { ! 721: /*Switch Profile not implemented. ! 722: Should send NAK to peer. */ ! 723: ! 724: return(OK); ! 725: } ! 726: ! 727: ! 728: /* ARGSUSED */ ! 729: ! 730: int ! 731: a1_100(pe) /*APQ (VT-P-ABORT -- Abort from VTPM) in any state*/ ! 732: PE pe; ! 733: { ! 734: state = S1_01; /*For rigor*/ ! 735: adios(NULLCP, "protocol abort -- association terminated"); ! 736: } ! 737: ! 738: ! 739: /* ARGSUSED */ ! 740: ! 741: int ! 742: a1_101(pe) /*AUQ (VT-U-ABORT -- Abort from VT User) in any state*/ ! 743: PE pe; ! 744: { ! 745: state = S1_01; ! 746: adios(NULLCP,"user abort -- association terminated"); ! 747: } ! 748: ! 749: ! 750: ! 751: /* ARGSUSED */ ! 752: int ! 753: a1_102(pe) /*VUABreq (Abort by User) in any state*/ ! 754: PE pe; ! 755: { ! 756: ! 757: PE pe_auq; ! 758: char *reason = "Association Closed by User"; ! 759: ! 760: pe_auq = str2prim(reason,strlen(reason),PE_CLASS_CONT,AUQ_PDU); ! 761: if(pe_auq == NULLPE) ! 762: adios(NULLCP, "a1_102: AUQ build failure (out of memory)"); ! 763: if(AcUAbortRequest(sd,&pe_auq,1,aci) == NOTOK) ! 764: acs_adios (&aci -> aci_abort, "A-ABORT.REQUEST"); ! 765: state = S1_01; ! 766: ! 767: finalbye (); ! 768: exit(1); ! 769: } ! 770: ! 771: ! 772: /* ARGSUSED */ ! 773: int ! 774: a1_103(pe) /*VTAB (Irrecoverable exception condition) in any state*/ ! 775: PE pe; ! 776: { ! 777: ! 778: PE pe_apq; ! 779: ! 780: advise(LLOG_NOTICE,NULLCP, "Irrecoverable Exception Condition -- Aborting\n"); ! 781: pe_apq = num2prim(1,PE_CLASS_CONT,APQ_PDU); ! 782: /*1 is value for Local Error. 0 if for Protocol ! 783: Error. Assume 1 for now. */ ! 784: if(pe_apq == NULLPE) ! 785: adios(NULLCP,"a1_103: APQ build failure (out of memory)"); ! 786: if(AcUAbortRequest(sd,&pe_apq,1,aci) == NOTOK) ! 787: acs_adios (&aci -> aci_abort, "A-ABORT.REQUEST"); ! 788: ! 789: state = S1_01; /*For completeness*/ ! 790: ! 791: finalbye (); ! 792: exit(1); ! 793: } ! 794: ! 795: ! 796: /* ARGSUSED */ ! 797: int ! 798: a1_107(pe) /*Generic Action*/ ! 799: PE pe; ! 800: { ! 801: /*Stay in this state*/ ! 802: return(OK); ! 803: } ! 804:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.