|
|
1.1 ! root 1: /* psaprelease1.c - PPM: initiate release */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap2/RCS/psaprelease1.c,v 7.0 89/11/23 22:14:26 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap2/RCS/psaprelease1.c,v 7.0 89/11/23 22:14:26 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: psaprelease1.c,v $ ! 12: * Revision 7.0 89/11/23 22:14: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: /* LINTLIBRARY */ ! 29: ! 30: #include <stdio.h> ! 31: #include <signal.h> ! 32: #include "ppkt.h" ! 33: ! 34: /* P-RELEASE.REQUEST */ ! 35: ! 36: int PRelRequest (sd, data, ndata, secs, pr, pi) ! 37: int sd; ! 38: PE *data; ! 39: int ndata; ! 40: int secs; ! 41: struct PSAPrelease *pr; ! 42: struct PSAPindication *pi; ! 43: { ! 44: SBV smask; ! 45: int result; ! 46: register struct psapblk *pb; ! 47: ! 48: toomuchP (data, ndata, NPDATA, "release"); ! 49: missingP (pr); ! 50: missingP (pi); ! 51: ! 52: smask = sigioblock (); ! 53: ! 54: psapPsig (pb, sd); ! 55: ! 56: switch (result = info2ssdu (pb, pi, data, ndata, &pb -> pb_realbase, ! 57: &pb -> pb_retry, &pb -> pb_len, ! 58: "P-RELEASE user-data", PPDU_NONE)) { ! 59: case OK: ! 60: default: ! 61: result = PRelRetryRequestAux (pb, secs, pr, pi); ! 62: goto out; ! 63: ! 64: case NOTOK: ! 65: freepblk (pb), pb = NULLPB; ! 66: break; ! 67: ! 68: case DONE: ! 69: result = NOTOK; ! 70: break; ! 71: } ! 72: ! 73: if (pb) { ! 74: if (pb -> pb_realbase) ! 75: free (pb -> pb_realbase); ! 76: else ! 77: if (pb -> pb_retry) ! 78: free (pb -> pb_retry); ! 79: pb -> pb_realbase = pb -> pb_retry = NULL; ! 80: } ! 81: ! 82: out: ; ! 83: (void) sigiomask (smask); ! 84: ! 85: return result; ! 86: } ! 87: ! 88: /* P-RELEASE-RETRY.REQUEST (pseudo) */ ! 89: ! 90: int PRelRetryRequest (sd, secs, pr, pi) ! 91: int sd; ! 92: int secs; ! 93: struct PSAPrelease *pr; ! 94: struct PSAPindication *pi; ! 95: { ! 96: SBV smask; ! 97: int result; ! 98: register struct psapblk *pb; ! 99: ! 100: missingP (pr); ! 101: missingP (pi); ! 102: ! 103: smask = sigioblock (); ! 104: ! 105: if ((pb = findpblk (sd)) == NULL) ! 106: result = psaplose (pi, PC_PARAMETER, NULLCP, ! 107: "invalid session descriptor"); ! 108: else ! 109: if (!(pb -> pb_flags & PB_RELEASE)) ! 110: result = psaplose (pi, PC_OPERATION, "release not in progress"); ! 111: else ! 112: result = PRelRetryRequestAux (pb, secs, pr, pi); ! 113: ! 114: (void) sigiomask (smask); ! 115: ! 116: return result; ! 117: } ! 118: ! 119: /* */ ! 120: ! 121: static int PRelRetryRequestAux (pb, secs, pr, pi) ! 122: struct psapblk *pb; ! 123: int secs; ! 124: struct PSAPrelease *pr; ! 125: struct PSAPindication *pi; ! 126: { ! 127: int result; ! 128: char *id = pb -> pb_flags & PB_RELEASE ? "SRelRetryRequest" ! 129: : "SRelRequest"; ! 130: struct SSAPrelease srs; ! 131: register struct SSAPrelease *sr = &srs; ! 132: struct SSAPindication sis; ! 133: register struct SSAPabort *sa = &sis.si_abort; ! 134: ! 135: bzero ((char *) sr, sizeof *sr); ! 136: ! 137: if ((result = (pb -> pb_flags & PB_RELEASE) ! 138: ? SRelRetryRequest (pb -> pb_fd, secs, sr, &sis) ! 139: : SRelRequest (pb -> pb_fd, pb -> pb_retry, ! 140: pb -> pb_len, secs, sr, &sis)) ! 141: == NOTOK) { ! 142: if (sa -> sa_reason == SC_TIMER) { ! 143: pb -> pb_flags |= PB_RELEASE; ! 144: ! 145: return ss2pslose (NULLPB, pi, id, sa); ! 146: } ! 147: ! 148: if (sa -> sa_peer) { ! 149: (void) ss2psabort (pb, sa, pi); ! 150: goto out1; ! 151: } ! 152: if (SC_FATAL (sa -> sa_reason)) { ! 153: (void) ss2pslose (pb, pi, id, sa); ! 154: goto out2; ! 155: } ! 156: else { ! 157: (void) ss2pslose (NULLPB, pi, id, sa); ! 158: goto out1; ! 159: } ! 160: } ! 161: ! 162: bzero ((char *) pr, sizeof *pr); ! 163: ! 164: if ((result = ssdu2info (pb, pi, sr -> sr_data, sr -> sr_cc, pr -> pr_info, ! 165: &pr -> pr_ninfo, "P-RELEASE user-data", PPDU_NONE)) == NOTOK) ! 166: goto out2; ! 167: ! 168: if (pr -> pr_affirmative = sr -> sr_affirmative) { ! 169: pb -> pb_fd = NOTOK; ! 170: result = OK; ! 171: } ! 172: else ! 173: result = DONE; ! 174: ! 175: out2: ; ! 176: if (result == DONE) ! 177: result = OK; ! 178: else ! 179: freepblk (pb), pb = NULLPB; ! 180: out1: ; ! 181: SRFREE (sr); ! 182: if (pb) { ! 183: if (pb -> pb_realbase) ! 184: free (pb -> pb_realbase); ! 185: else ! 186: if (pb -> pb_retry) ! 187: free (pb -> pb_retry); ! 188: pb -> pb_realbase = pb -> pb_retry = NULL; ! 189: } ! 190: ! 191: return result; ! 192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.