Google
 

Trailing-Edge - PDP-10 Archives - BB-JF18A-BM - sources/rms/rmsrco.b36
There are 3 other files named rmsrco.b36 in the archive. Click here to see a list.
MODULE RCONNECT (	! DAP CONNECT/DISCONNECT Operations
		IDENT = '7.0(572)'
                %BLISS36(,ENTRY(
                                Dap$Connect,
                                Dap$Find,
                                Dap$Delete,
                                Dap$Truncate,
                                Dap$Disconnect,
                                D$Display
                                ))
		) =
BEGIN
!
!	COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 1981, 1986.
!	ALL RIGHTS RESERVED.
!
!	THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY  BE  USED  AND
!	COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH
!	THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE.   THIS  SOFTWARE  OR
!	ANY  OTHER  COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE
!	AVAILABLE TO ANY OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE
!	SOFTWARE IS HEREBY TRANSFERRED.
!
!	THE INFORMATION IN THIS SOFTWARE IS  SUBJECT  TO  CHANGE  WITHOUT
!	NOTICE  AND  SHOULD  NOT  BE CONSTRUED AS A COMMITMENT BY DIGITAL
!	EQUIPMENT CORPORATION.
!
!	DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF
!	ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
!

!++
! FACILITY:  DAP
!
! ABSTRACT:  Routines to transfer records or blocks of file data.
!
!
! ENVIRONMENT:  RMS, BLISSNET, XPORT, Some 36-bit specific code.
!
! AUTHOR:	Andrew Nourse, CREATION DATE:  29-JUN-84

! REVISION HISTORY:
!
! 572 - Complete fixing $display when XABs change
! 571 - Fix $display when XABs change
! 560 - Fix $truncate
! 556 - Fix $delete
! 533 - CRC checking
! 506 - Extended addressing gotcha
!
! TABLE OF CONTENTS
!
!       Dap$Connect
!       Dap$Find
!       Dap$Delete
!       Dap$Truncate
!       Dap$Disconnect
!       D$Display

!
! LIBRARY REFERENCES
!
REQUIRE 'RMSREQ';
LIBRARY 'CONDIT';

!
! EXTERNALS
!
EXTERNAL ROUTINE
    Dap$Handle,			! Condition Handler
    Dap$Error_Dap_Rms,          ! Convert DAP error to RMS error
    Dap$Put_Control,            ! Control message sender
    Dap$Put_Message,            ! Send it out
    Dap$Get_Ack,                ! Get response
    Dap$Get_Attributes,         ! Get file attributes from remote system
    Dap$EndAccess,              ! Close/Disconnect via DAP
    D$SDisplay,                 ! Set display bits 
    UAddr;                      ! Extendify user address !a506
GLOBAL ROUTINE Dap$Connect ( P_Rab: REF $Rab_decl,
                               Err )  =	! Connect RAB to FAB

!++
! FUNCTIONAL DESCRIPTION:
!
!       Connect RAB to FAB for an open file on another system.
!
! FORMAL PARAMETERS:
!
!       P_RAB: Addr of RAB as defined by RMS
!       ERR: Address of error routine
!
! IMPLICIT INPUTS:
!
!	Fab: Address of Fab
!       Fst: Address of Fst
!	Rst: Address of newly-created Rst
!	Fab: Address of Fab
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!--

    BEGIN
    BIND
        URab=.P_Rab: $Rab_decl,          	! The RAB                 !m557
        UFab=.Fab: $Fab_decl,                   ! FAB pointed to by above !m557
        URst=.Rst: $Rms_Rst,                    ! RST we are setting up   !m557
        UFst=.Fst: $Rms_Fst,                    ! FST for file            !m557
        Odd=.Fst[Fst$a_O_Dd]: $Dap_Descriptor,  ! our output message descriptor
        Idd=.Fst[Fst$a_I_Dd]: $Dap_Descriptor;  ! our input message descriptor

    BIND ROUTINE $$Errrtn=.Err: Rms_Ercal;

    LOCAL status_code;                          ! success/error code
    LOCAL Bdata: $XPO_DESCRIPTOR();             ! will point to binary data
    LOCAL Adata: $STR_DESCRIPTOR();             ! will point to ascii data
    LOCAL Display: BITVECTOR[28];

    ROUTINE CHandle( Signal_Args: REF VECTOR, Mech_Args, Enable_Args )=  !a575
        BEGIN
        $Rms$DeLink( Rst );             ! Remove RST from linked list

        ! Invoke regular handler
        Dap$Handle( .Signal_Args, .Mech_Args, .Enable_Args )
        END;

    LOCAL Rabsav: VOLATILE;
    LOCAL Errsav: VOLATILE;

    ENABLE CHandle(Rabsav,Errsav);

    Errsav=.Err;
    Rabsav=URab;                        ! Handler will need this

    Clearv(Display);

    !+
    ! Link into linked list of RSTs
    !-
    $Rms$Link( rst, fst );                                              !a557

    !+
    ! Figure out the stream id to use
    !-
    Odd[Dap$b_StreamId]                                                 !a557vv
    = URst[Rst$v_StreamId]
    =   (BIND prevrst = .URst[Rst$a_BLink]: $Rms_Rst;
         IF .prevrst[Rst$h_Bid] EQL Fst$k_Bid
         THEN 0                         ! This is the first rab connected
         ELSE .prevrst[Rst$v_StreamId] + 1);                      

    URab[Rab$a_Isi] = URst;             ! Point the rab at the rst      !a557^^

    Dap$Put_Control( Odd, URab, Dap$k_Connect, Display );        
    Dap$Put_Message( Odd );
    
    Rst[Rst$v_No_Send_Control]=0;       ! Send control on first Get or Put
    Rst[Rst$v_Remote]=1;                ! This is a remote file

    IF .UFst[Fst$v_Accopt_Crc]          ! If CRC Checking !a533
    THEN URst[Rst$h_Checksum] = %O'177777'; ! Init CRC-16  !a533

    Dap$Get_Ack( Idd );
    .UsrSts
    END;			!End of DAP$CONNECT
GLOBAL ROUTINE Dap$Find ( P_Rab: REF $Rab_decl,
                          Err )  =	! Find record

!++
! FUNCTIONAL DESCRIPTION:
!
!       Do a $FIND for a remote file
!
! FORMAL PARAMETERS:
!
!       P_RAB: Addr of RAB as defined by RMS
!       ERR: Address of error routine
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE

!--

    BEGIN
    BIND
        Rab=.P_Rab: $Rab_decl,          	! The RAB 
        Fab=UAddr(.Rab[Rab$a_Fab]): $Fab_decl,  ! FAB pointed to by above !M506
        Rst=.Rab[Rab$a_Isi]: $Rms_Rst,          ! RST we are setting up
        Fst=.Fab[Fab$a_Ifi]: $Rms_Fst,          ! FST for file
        Odd=.Fst[Fst$a_O_Dd]: $Dap_Descriptor,  ! our output message descriptor
        Idd=.Fst[Fst$a_I_Dd]: $Dap_Descriptor;  ! our input message descriptor

    BIND ROUTINE $$Errrtn=.Err: Rms_Ercal;

    LOCAL status_code;                          ! success/error code
    LOCAL Display: BITVECTOR[28];

    LOCAL Rabsav: VOLATILE;
    LOCAL Errsav: VOLATILE;

    ENABLE Dap$Handle(Rabsav,Errsav);

    Errsav=.Err;
    Rabsav=Rab;                        ! Handler will need this

    Clearv(Display);

    Dap$Put_Control( Odd, Rab, Dap$k_Find, Display );        
    Dap$Put_Message( Odd );
    
    Dap$Get_Ack( Idd );
    .UsrSts
    END;			!End of DAP$FIND

GLOBAL ROUTINE Dap$Delete ( P_Rab: REF $Rab_decl,
                            Err )  =	! Delete record

!++
! FUNCTIONAL DESCRIPTION:
!
!       Do a $DELETE for a remote file
!
! FORMAL PARAMETERS:
!
!       P_RAB: Addr of RAB as defined by RMS
!       ERR: Address of error routine
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE

!--

    BEGIN
    BIND
        Rab=.P_Rab: $Rab_decl,          	! The RAB 
        Fab=UAddr(.Rab[Rab$a_Fab]): $Fab_decl,  ! FAB pointed to by above !M506
        Rst=.Rab[Rab$a_Isi]: $Rms_Rst,          ! RST we are setting up
        Fst=.Fab[Fab$a_Ifi]: $Rms_Fst,          ! FST for file
        Odd=.Fst[Fst$a_O_Dd]: $Dap_Descriptor,  ! our output message descriptor
        Idd=.Fst[Fst$a_I_Dd]: $Dap_Descriptor;  ! our input message descriptor

    BIND ROUTINE $$Errrtn=.Err: Rms_Ercal;

    LOCAL status_code;                          ! success/error code
    LOCAL Display: BITVECTOR[28];

    LOCAL Rabsav: VOLATILE;
    LOCAL Errsav: VOLATILE;

    ENABLE Dap$Handle(Rabsav,Errsav);

    Errsav=.Err;
    Rabsav=Rab;                        ! Handler will need this

    Clearv(Display);

    Dap$Put_Control( Odd, Rab, Dap$k_Delete, Display );        
    Dap$Put_Message( Odd );
    
    Dap$Get_Ack( Idd );
    .UsrSts
    END;			!End of DAP$DELETE
GLOBAL ROUTINE Dap$Truncate ( P_Rab: REF $Rab_decl,
                              Err )  =	! Truncate file

!++
! FUNCTIONAL DESCRIPTION:
!
!       Do a $Truncate for a remote file
!
! FORMAL PARAMETERS:
!
!       P_RAB: Addr of RAB as defined by RMS
!       ERR: Address of error routine
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE

!--

    BEGIN
    BIND
        Rab=.P_Rab: $Rab_decl,          	! The RAB 
        Fab=UAddr(.Rab[Rab$a_Fab]): $Fab_decl,  ! FAB pointed to by above !M506
        Rst=.Rab[Rab$a_Isi]: $Rms_Rst,          ! RST we are setting up
        Fst=.Fab[Fab$a_Ifi]: $Rms_Fst,          ! FST for file
        Odd=.Fst[Fst$a_O_Dd]: $Dap_Descriptor,  ! our output message descriptor
        Idd=.Fst[Fst$a_I_Dd]: $Dap_Descriptor;  ! our input message descriptor

    BIND ROUTINE $$Errrtn=.Err: Rms_Ercal;

    LOCAL status_code;                          ! success/error code
    LOCAL Display: BITVECTOR[28];

    LOCAL Rabsav: VOLATILE;
    LOCAL Errsav: VOLATILE;

    ENABLE Dap$Handle(Rabsav,Errsav);

    Errsav=.Err;
    Rabsav=Rab;                        ! Handler will need this

    Clearv(Display);

    Dap$Put_Control( Odd, Rab, Dap$k_Truncate, Display );        
    Dap$Put_Message( Odd );

    Dap$Get_Ack( Idd );
    .UsrSts
    END;			!End of Dap$Truncate
GLOBAL ROUTINE Dap$Disconnect (P_Rab: REF $Rab_Decl,  ! Disconnect RAB from FAB
                        Err)  =
                                 
!++
! FUNCTIONAL DESCRIPTION:
!
!       Disconnect RAB from FAB for an open file on another system.
!
! FORMAL PARAMETERS:
!
!       P_RAB: A RAB as defined by RMS
!       ERR: Address of error routine
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
! COMPLETION CODES:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!--
BEGIN
BIND Rab=.P_Rab: $Rab_decl,
     Fab=UAddr(.Rab[Rab$a_Fab]): $Fab_decl;     ! Get addr of FAB !m506

Dap$EndAccess ( Fab, Dap$k_Accomp_Eos, .Err )
END; ! of Dap$Disconnect
GLOBAL ROUTINE D$Display ( P_Fab: REF $Rab_decl,
                           Err )  =	! Display file

!++
! FUNCTIONAL DESCRIPTION:
!
!       Do a $Display for a remote file
!
! FORMAL PARAMETERS:
!
!       P_FAB: Addr of FAB as defined by RMS
!       ERR: Address of error routine
!
!--

    BEGIN
    BIND
        Fab=.P_Fab: $Fab_decl,          	! The FAB 
        Fst=.Fab[Fab$a_Ifi]: $Rms_Fst,          ! FST for file
        Odd=.Fst[Fst$a_O_Dd]: $Dap_Descriptor,  ! our output message descriptor
        Idd=.Fst[Fst$a_I_Dd]: $Dap_Descriptor;  ! our input message descriptor
    LOCAL
        Rst: $Rms_Rst PRESET([Rst$v_Streamid]=0),   ! dummy RST
        Rab: $Rab( Fab=fab, rac=seq );              ! dummy RAB

    BIND ROUTINE $$Errrtn=.Err: Rms_Ercal;

    LOCAL status_code;                          ! success/error code
    LOCAL Display: BITVECTOR[28];

    LOCAL Rabsav: VOLATILE;
    LOCAL Errsav: VOLATILE;

    ENABLE Dap$Handle(Rabsav,Errsav);

    Errsav=.Err;
    Rabsav=Rab;                        ! Handler will need this

    Rab[Rab$a_Isi]=Rst;

    ! Recheck xab chain & set display bits, user might have added xabs
    Fst[Fst$v_Display] = Display = D$SDisplay( Fab );               !m572
    
    ! Send the control messages
    Dap$Put_Control( Odd, Rab, Dap$k_Display, Display );        
    Dap$Put_Message( Odd );

    ! Get the attributes back
    Dap$Get_Attributes( Idd, Fab );

    (.UsrSts LSS RMS$K_ERR_MIN)         ! Return True if no error
    END;			!End of D$Display
END
ELUDOM