|
|
1.1 root 1: /* ftamrelease1.c - FPM: initiate release */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamrelease1.c,v 7.0 89/11/23 21:53:49 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/ftam/RCS/ftamrelease1.c,v 7.0 89/11/23 21:53:49 mrose Rel $
9: *
10: *
11: * $Log: ftamrelease1.c,v $
12: * Revision 7.0 89/11/23 21:53:49 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 "fpkt.h"
33:
34: /* F-TERMINATE.REQUEST */
35:
36: int FTerminateRequest (sd, sharedASE, ftr, fti)
37: int sd;
38: PE sharedASE;
39: struct FTAMrelease *ftr;
40: struct FTAMindication *fti;
41: {
42: SBV smask;
43: int result;
44: register struct ftamblk *fsb;
45:
46: missingP (ftr);
47: missingP (fti);
48:
49: smask = sigioblock ();
50:
51: ftamPsig (fsb, sd);
52:
53: result = FTerminateRequestAux (fsb, sharedASE, ftr, fti);
54:
55: (void) sigiomask (smask);
56:
57: return result;
58: }
59:
60: /* */
61:
62: static int FTerminateRequestAux (fsb, sharedASE, ftr, fti)
63: register struct ftamblk *fsb;
64: PE sharedASE;
65: struct FTAMrelease *ftr;
66: struct FTAMindication *fti;
67: {
68: int result;
69: PE pe;
70: struct AcSAPrelease acrs;
71: register struct AcSAPrelease *acr = &acrs;
72: struct AcSAPindication acis;
73: register struct AcSAPindication *aci = &acis;
74: register struct AcSAPabort *aca = &aci -> aci_abort;
75: struct type_FTAM_PDU *pdu;
76: register struct type_FTAM_F__TERMINATE__response *rsp;
77:
78: if (!(fsb -> fsb_flags & FSB_INIT))
79: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
80: if (fsb -> fsb_state != FSB_INITIALIZED)
81: return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
82: "not in the initialized state");
83:
84: bzero ((char *) acr, sizeof *acr);
85: bzero ((char *) ftr, sizeof *ftr);
86:
87: pe = NULLPE;
88: if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
89: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
90: out: ;
91: if (pe)
92: pe_free (pe);
93: if (pdu)
94: free_FTAM_PDU (pdu);
95: if (fti -> fti_abort.fta_action == FACTION_PERM)
96: freefsblk (fsb);
97: return NOTOK;
98: }
99: pdu -> offset = type_FTAM_PDU_f__terminate__request;
100: if (sharedASE
101: && (pdu -> un.f__terminate__request =
102: shared2fpm (fsb, sharedASE, fti)) == NULL)
103: goto out;
104:
105: if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
106: (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
107: "error encoding PDU: %s", PY_pepy);
108: goto out;
109: }
110:
111: pe -> pe_context = fsb -> fsb_id;
112:
113: fsbtrace (fsb, (fsb -> fsb_fd, "A-RELEASE.REQUEST", "F-TERMINATE-request",
114: pe, 0));
115:
116: result = AcRelRequest (fsb -> fsb_fd, ACF_NORMAL, &pe, 1, NOTOK, acr, aci);
117:
118: pe_free (pe);
119: pe = NULLPE;
120: free_FTAM_PDU (pdu);
121: pdu = NULL;
122:
123: if (result == NOTOK) {
124: if (aca -> aca_source == ACA_USER)
125: return acs2ftamabort (fsb, aca, fti);
126:
127: (void) acs2ftamlose (fsb, fti, "AcRelRequest", aca);
128: goto out;
129: }
130:
131: if (!acr -> acr_affirmative) {
132: result = fpktlose (fsb, fti, FS_ACS_MGMT, NULLCP,
133: "other side refused to release association");
134: goto done;
135: }
136: fsb -> fsb_fd = NOTOK;
137:
138: if (acr -> acr_ninfo < 1 || (pe = acr -> acr_info[0]) == NULLPE) {
139: result = fpktlose (fsb, fti, FS_PRO_ERR, NULLCP, NULLCP);
140: goto done;
141: }
142:
143: if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK)
144: result = fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
145: "unable to parse PDU: %s", PY_pepy);
146: else {
147: if (pdu -> offset != type_FTAM_PDU_f__terminate__response) {
148: result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
149: "expecting F-TERMINATE-response, got %d",
150: pdu -> offset);
151: goto done;
152: }
153: rsp = pdu -> un.f__terminate__response;
154:
155: fsbtrace (fsb,
156: (fsb -> fsb_fd, "A-RELEASE.CONFIRMATION",
157: "F-TERMINATE-response", pe, 1));
158:
159: if (rsp -> shared__ASE__information
160: && fpm2shared (fsb, rsp -> shared__ASE__information,
161: &ftr -> ftr_sharedASE, fti) == NOTOK)
162: goto done;
163: if (rsp -> charging
164: && fpm2chrg (fsb, rsp -> charging, &ftr -> ftr_charges, fti)
165: == NOTOK)
166: goto done;
167:
168: result = OK;
169: }
170:
171: done: ;
172: if (pdu)
173: free_FTAM_PDU (pdu);
174: ACRFREE (acr);
175: freefsblk (fsb);
176:
177: return result;
178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.