/* ftambulk1.c - FPM: initiate bulk data transfer */
static char *rcsid
= "$Header: /f/osi/ftam/RCS/ftambulk1.c,v 7.1 91/02/22 09:22:42 mrose Interim $";
* $Header: /f/osi/ftam/RCS/ftambulk1.c,v 7.1 91/02/22 09:22:42 mrose Interim $
* Revision 7.1 91/02/22 09:22:42 mrose
* Revision 7.0 89/11/23 21:53:27 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 F-{READ,WRITE}.REQUEST */
int FReadWriteRequest (sd
, operation
, identity
, context
, level
, lock
, fti
)
struct FADUidentity
*identity
;
int context
, /* F-READ.REQUEST only */
struct FTAMindication
*fti
;
register struct ftamblk
*fsb
;
return ftamlose (fti
, FS_GEN_NOREASON
, 0, NULLCP
,
"bad value for operation parameter");
if (operation
== FA_OPS_READ
)
return ftamlose (fti
, FS_GEN_NOREASON
, 0, NULLCP
,
"bad value for context parameter");
result
= FReadWriteRequestAux (fsb
, state
, operation
, identity
, context
,
(void) sigiomask (smask
);
static int FReadWriteRequestAux (fsb
, state
, operation
, identity
, context
,
register struct ftamblk
*fsb
;
struct FADUidentity
*identity
;
struct FTAMindication
*fti
;
struct PSAPindication pis
;
struct PSAPindication
*pi
= &pis
;
struct PSAPabort
*pa
= &pi
-> pi_abort
;
register struct type_FTAM_PDU
*pdu
;
register struct type_FTAM_F__READ__request
*rd
;
register struct type_FTAM_F__WRITE__request
*wr
;
if (!(fsb
-> fsb_flags
& FSB_INIT
))
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
, "not initiator");
if (fsb
-> fsb_state
!= FSB_DATAIDLE
)
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
, "wrong state");
if (!(fsb
-> fsb_units
& FUNIT_READ
))
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
,
if (!(fsb
-> fsb_units
& FUNIT_WRITE
))
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
,
if ((pdu
= (struct type_FTAM_PDU
*) calloc (1, sizeof *pdu
)) == NULL
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
, "out of memory");
if (fti
-> fti_abort
.fta_action
== FACTION_PERM
)
if (state
!= FSB_DATAREAD
) {
pdu
-> offset
= type_FTAM_PDU_f__write__request
;
if ((wr
= (struct type_FTAM_F__WRITE__request
*)
calloc (1, sizeof *wr
)) == NULL
)
pdu
-> un
.f__write__request
= wr
;
fpdu
= "F-WRITE-request";
wr
-> file__access__data__unit__operation
= operation
;
if ((wr
-> file__access__data__unit__identity
=
faduid2fpm (fsb
, identity
, fti
)) == NULL
)
if (fsb
-> fsb_units
& FUNIT_FADULOCK
) {
if ((wr
-> fadu__lock
= (struct type_FTAM_FADU__Lock
*)
calloc (1, sizeof *wr
-> fadu__lock
))
wr
-> fadu__lock
-> parm
= lock
? int_FTAM_FADU__Lock_on
: int_FTAM_FADU__Lock_off
;
pdu
-> offset
= type_FTAM_PDU_f__read__request
;
if ((rd
= (struct type_FTAM_F__READ__request
*)
calloc (1, sizeof *rd
)) == NULL
)
pdu
-> un
.f__read__request
= rd
;
if ((rd
-> file__access__data__unit__identity
=
faduid2fpm (fsb
, identity
, fti
)) == NULL
)
if ((rd
-> access__context
=
(struct type_FTAM_Access__Context
*)
calloc (1, sizeof *rd
-> access__context
))
if ((rd
-> access__context
-> access__context
= context
)
rd
-> access__context
-> optionals
|=
opt_FTAM_Access__Context_level__number
;
rd
-> access__context
-> level__number
= level
;
if (fsb
-> fsb_units
& FUNIT_FADULOCK
) {
if ((rd
-> fadu__lock
= (struct type_FTAM_FADU__Lock
*)
calloc (1, sizeof *wr
-> fadu__lock
))
rd
-> fadu__lock
-> parm
= lock
? int_FTAM_FADU__Lock_on
: int_FTAM_FADU__Lock_off
;
if (encode_FTAM_PDU (&pe
, 1, 0, NULLCP
, pdu
) == NOTOK
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
,
"error encoding PDU: %s", PY_pepy
);
pe
-> pe_context
= fsb
-> fsb_id
;
fsbtrace (fsb
, (fsb
-> fsb_fd
, "P-DATA.REQUEST", fpdu
, pe
, 0));
result
= PDataRequest (fsb
-> fsb_fd
, &pe
, 1, pi
);
(void) ps2ftamlose (fsb
, fti
, "PDataRequest", pa
);
fsb
-> fsb_state
= state
;
/* \f F-TRANSFER-END.REQUEST */
int FTransEndRequest (sd
, sharedASE
, fti
)
struct FTAMindication
*fti
;
register struct ftamblk
*fsb
;
result
= FTransEndRequestAux (fsb
, sharedASE
, fti
);
(void) sigiomask (smask
);
static int FTransEndRequestAux (fsb
, sharedASE
, fti
)
register struct ftamblk
*fsb
;
struct FTAMindication
*fti
;
struct PSAPindication pis
;
struct PSAPindication
*pi
= &pis
;
struct PSAPabort
*pa
= &pi
-> pi_abort
;
register struct type_FTAM_PDU
*pdu
;
if (!(fsb
-> fsb_flags
& FSB_INIT
))
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
, "not initiator");
if (fsb
-> fsb_state
!= FSB_DATAFIN1
)
return ftamlose (fti
, FS_GEN (fsb
), 0, NULLCP
, "wrong state");
if ((pdu
= (struct type_FTAM_PDU
*) calloc (1, sizeof *pdu
)) == NULL
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
, "out of memory");
if (fti
-> fti_abort
.fta_action
== FACTION_PERM
)
pdu
-> offset
= type_FTAM_PDU_f__transfer__end__request
;
&& (pdu
-> un
.f__transfer__end__request
=
shared2fpm (fsb
, sharedASE
, fti
)) == NULL
)
if (encode_FTAM_PDU (&pe
, 1, 0, NULLCP
, pdu
) == NOTOK
) {
(void) ftamlose (fti
, FS_GEN (fsb
), 1, NULLCP
,
"error encoding PDU: %s", PY_pepy
);
pe
-> pe_context
= fsb
-> fsb_id
;
fsbtrace (fsb
, (fsb
-> fsb_fd
, "P-DATA.REQUEST", "F-TRANSFER-END-request",
result
= PDataRequest (fsb
-> fsb_fd
, &pe
, 1, pi
);
(void) ps2ftamlose (fsb
, fti
, "PDataRequest", pa
);
fsb
-> fsb_state
= FSB_DATAFIN2
;
return FWaitRequestAux (fsb
, NOTOK
, fti
);