/* acsapreleas1.c - ACPM: initiate release */
static char *rcsid
= "$Header: /f/osi/acsap/RCS/acsapreleas1.c,v 7.2 91/02/22 09:14:12 mrose Interim $";
* $Header: /f/osi/acsap/RCS/acsapreleas1.c,v 7.2 91/02/22 09:14:12 mrose Interim $
* $Log: acsapreleas1.c,v $
* Revision 7.2 91/02/22 09:14:12 mrose
* Revision 7.1 90/07/01 21:02:02 mrose
* Revision 7.0 89/11/23 21:21:54 mrose
* Acquisition, use, and distribution of this module and related
* materials are subject to the restrictions of a license agreement.
* Consult the Preface in the User's Manual for the full terms of
/* \f A-RELEASE.REQUEST */
int AcRelRequest (sd
, reason
, data
, ndata
, secs
, acr
, aci
)
struct AcSAPrelease
*acr
;
struct AcSAPindication
*aci
;
register struct assocblk
*acb
;
register struct type_ACS_RLRQ__apdu
*rlrq
;
return acsaplose (aci
, ACS_PARAMETER
, NULLCP
,
"invalid value for reason parameter");
toomuchP (data
, ndata
, NACDATA
, "release");
if (data
) { /* XXX: probably should have a more intensive check... */
for (pep
= data
, i
= ndata
; i
> 0; pep
++, i
--)
if ((*pep
) -> pe_context
== PE_DFLT_CTX
)
return acsaplose (aci
, ACS_PARAMETER
, NULLCP
,
"default context not allowed for user-data at slot %d",
if ((rlrq
= (struct type_ACS_RLRQ__apdu
*) calloc (1, sizeof *rlrq
))
(void) acsaplose (aci
, ACS_CONGEST
, NULLCP
, "out of memory");
rlrq
-> optionals
|= opt_ACS_RLRQ__apdu_reason
;
&& (rlrq
-> user__information
= info2apdu (acb
, aci
, data
, ndata
))
result
= encode_ACS_RLRQ__apdu (&acb
-> acb_retry
, 1, 0, NULLCP
, rlrq
);
free_ACS_RLRQ__apdu (rlrq
);
(void) acsaplose (aci
, ACS_CONGEST
, NULLCP
, "error encoding PDU: %s",
acb
-> acb_retry
-> pe_context
= acb
-> acb_id
;
PLOGP (acsap_log
,ACS_ACSE__apdu
, acb
-> acb_retry
, "RLRQ-apdu", 0);
result
= AcRelRetryRequestAux (acb
, secs
, acr
, aci
);
pe_free (acb
-> acb_retry
);
acb
-> acb_retry
= NULLPE
;
free_ACS_RLRQ__apdu (rlrq
);
(void) sigiomask (smask
);
/* \f A-RELEASE-RETRY.REQUEST (pseudo) */
int AcRelRetryRequest (sd
, secs
, acr
, aci
)
struct AcSAPrelease
*acr
;
struct AcSAPindication
*aci
;
register struct assocblk
*acb
;
if ((acb
= findacblk (sd
)) == NULL
)
result
= acsaplose (aci
, ACS_PARAMETER
, NULLCP
,
"invalid association descriptor");
if (!(acb
-> acb_flags
& ACB_RELEASE
))
result
= acsaplose (aci
, ACS_OPERATION
, "release not in progress");
result
= AcRelRetryRequestAux (acb
, secs
, acr
, aci
);
(void) sigiomask (smask
);
static int AcRelRetryRequestAux (acb
, secs
, acr
, aci
)
register struct assocblk
*acb
;
struct AcSAPrelease
*acr
;
struct AcSAPindication
*aci
;
char *id
= acb
-> acb_flags
& ACB_RELEASE
? "PRelRetryRequest"
register struct PSAPrelease
*pr
= &prs
;
struct PSAPindication pis
;
register struct PSAPabort
*pa
= &pis
.pi_abort
;
struct type_ACS_ACSE__apdu
*pdu
= NULL
;
register struct type_ACS_RLRE__apdu
*rlre
;
bzero ((char *) pr
, sizeof *pr
);
if ((result
= (acb
-> acb_flags
& ACB_RELEASE
)
? PRelRetryRequest (acb
-> acb_fd
, secs
, pr
, &pis
)
: PRelRequest (acb
-> acb_fd
, &acb
-> acb_retry
, 1,
secs
, pr
, &pis
)) == NOTOK
) {
if (pa
-> pa_reason
== PC_TIMER
) {
acb
-> acb_flags
|= ACB_RELEASE
;
return ps2acslose (NULLACB
, aci
, id
, pa
);
(void) AcABORTser (acb
-> acb_fd
, pa
, aci
);
if (PC_FATAL (pa
-> pa_reason
)) {
(void) ps2acslose (acb
, aci
, id
, pa
);
(void) ps2acslose (NULLACB
, aci
, id
, pa
);
bzero ((char *) acr
, sizeof *acr
);
if (pr
-> pr_ninfo
== 0) {
result
= acsaplose (aci
, ACS_PROTOCOL
, NULLCP
,
"no user-data on P-RELEASE");
result
= decode_ACS_ACSE__apdu (pe
= pr
-> pr_info
[0], 1, NULLIP
, NULLVP
,
if (result
== OK
&& (acsap_log
-> ll_events
& LLOG_PDUS
))
pvpdu (acsap_log
, print_ACS_ACSE__apdu_P
, pe
, "ACSE-apdu", 1);
pe
= pr
-> pr_info
[0] = NULLPE
;
(void) acpktlose (acb
, aci
, ACS_PROTOCOL
, NULLCP
, "%s", PY_pepy
);
if (pdu
-> offset
!= type_ACS_ACSE__apdu_rlre
) {
(void) acpktlose (acb
, aci
, ACS_PROTOCOL
, NULLCP
,
"unexpected PDU %d on P-RELEASE", pdu
-> offset
);
if (rlre
-> optionals
& opt_ACS_RLRE__apdu_reason
)
acr
-> acr_reason
= rlre
-> reason
;
acr
-> acr_reason
= int_ACS_reason_normal
;
if (apdu2info (acb
, aci
, rlre
-> user__information
, acr
-> acr_info
,
&acr
-> acr_ninfo
) == NOTOK
)
if (acr
-> acr_affirmative
= pr
-> pr_affirmative
) {
freeacblk (acb
), acb
= NULLACB
;
if (acb
&& acb
-> acb_retry
) {
pe_free (acb
-> acb_retry
);
acb
-> acb_retry
= NULLPE
;
free_ACS_ACSE__apdu (pdu
);