Google
 

Trailing-Edge - PDP-10 Archives - BB-H138F-BM_1988 - 7-sources/dapt20.b36
There are 20 other files named dapt20.b36 in the archive. Click here to see a list.
MODULE DAPT20(
              IDENT='7.0(664) 6-Feb-87',
              ENTRY(
                    s$fbsiz,
                    s$fbbyv,
                    S$Dtstr,
                    S$Strdt,
                    S$Jfn_Str,
                    S$Mount,
                    S$Jobusr,
                    S$Username,
                    s$GetError
                    )
              )=
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-20.
!
! ABSTRACT:
!   This module contains various interface routines to TOPS-20.
!
! ENVIRONMENT:
!   TOPS-20 user mode, XPORT.
!
! AUTHOR: Larry Campbell, CREATION DATE: 21 Oct 1982
! MODIFIED BY: Andrew Nourse
! Revision History
!
! RMS edits:
! 664 -   s$fbsiz, s$fbbyv
! 534 -   S$mount
!
! Module edits:
! 02 -    Pure Data belongs in the hiseg
! 01 -    Move these routines from FTST20 to DAPT20 (this module)
!--

FORWARD ROUTINE
    s$fbbyv,                            ! Read file's fbbyv word
    s$fbsiz,                            ! Read file's byte count word
    s$dtstr : NOVALUE,                  ! Convert date/time to string
    s$strdt,                            ! convert string to date/time
    s$jfn_str,                          ! Convert JFN to string
    s$mount: NOVALUE,                   ! Mount a structure & access it
    s$jobusr,
    s$username,
    S$GetError;

!
! INCLUDE FILES:
!
REQUIRE 'RMSREQ';
REQUIRE 'RMSOSD';                       ! O/S DEPENDENT CODE

!
! MACROS:
!
%( IN REQUIRE FILES

MACRO
    lh = 18, 18 %,
    rh =  0, 18 %;

MACRO
    asciz_len (string) =
        BEGIN
        LOCAL
            tptr;
        tptr = string;
        INCR i FROM 0
        DO
        IF CH$RCHAR_A (tptr) EQL 0
        THEN
            EXITLOOP .i
        END %;
)%
!
! EQUATED SYMBOLS:
!
LITERAL
    minute = %O'1000000' / (24 * 60);   ! One minute

!
! THERE IS NO OWN STORAGE:
! THERE IS, HOWEVER PURE DATA CREATED BY XPORT
!
PSECT OWN=$HIGH$;
GLOBAL ROUTINE s$fbbyv (fab_jfn) : =
!++
! FUNCTIONAL DESCRIPTION:
!    Return file's .FBBYV word
!
! FORMAL PARAMETERS:
!     fab_jfn: JFN of file
!
! ROUTINE VALUE:
!  word from FDB
!--
    BEGIN
    LOCAL byv;
    IF gtfdb (.fab_jfn, $XWD(1,$FBBYV), byv)
    THEN RETURN (.byv)                  ! Return byte size and other stuff
    ELSE RETURN (0);                    ! or zero if error
    END;                                ! End of s$fbbyv
GLOBAL ROUTINE s$fbsiz (fab_jfn) : =
!++
! FUNCTIONAL DESCRIPTION:
!    Return file byte count
!
! FORMAL PARAMETERS:
!     fab_jfn: JFN of file
!
! ROUTINE VALUE:
!  file byte count from FDB
!--
    BEGIN
    LOCAL byte_count;
    IF gtfdb (.fab_jfn, $XWD(1,$FBSIZ), byte_count)
    THEN RETURN (.byte_count)           ! Return byte count 
    ELSE RETURN (0);                    ! or zero if error
    END;                                ! End of s$fbsiz
GLOBAL ROUTINE s$dtstr (date_time, p_descr) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!   Convert internal date/time to string.
!
! FORMAL PARAMETERS:
!   date_time           - date and time in universal internal format
!                         (-1 means now)
!   p_descr             - pointer to descriptor to receive string
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE and
! COMPLETION CODES:
!   NONE
!
! SIDE EFFECTS:
!   NONE
!
!--
    BEGIN

    BIND
        descr = .p_descr : $STR_DESCRIPTOR ();

    LOCAL
        ptr,
        length,
        string_buffer : VECTOR [CH$ALLOCATION (32)];

    ODTIM (CH$PTR (string_buffer), .date_time, 0);
    ptr = CH$PTR (string_buffer);
    length = 0;
    UNTIL (CH$RCHAR_A (ptr) EQL 0)
    DO
        length = .length + 1;
    $STR_COPY (STRING = (.length, CH$PTR (string_buffer)), TARGET = descr,
               OPTION = TRUNCATE);
    END;                                ! End of s$dtstr
GLOBAL ROUTINE s$strdt (p_descr) =
!++
! FUNCTIONAL DESCRIPTION:
!   Convert string to internal date/time
!
! FORMAL PARAMETERS:
!   p_descr             - pointer to descriptor to string
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE
!   Internal Date/Time
!
! SIDE EFFECTS:
!   NONE
!
!--
    BEGIN

    BIND
        descr = .p_descr : $STR_DESCRIPTOR ();

    LOCAL
        internal_date_time,
        result,
        string_buffer : VECTOR [CH$ALLOCATION (32)];

    $STR_COPY (STRING = $STR_CONCAT (descr, %CHAR(0)),
               TARGET = (31, CH$PTR (string_buffer)),
               OPTION = TRUNCATE);

    IF IDTIM (CH$PTR (string_buffer), 0; result, internal_date_time)
    THEN
        RETURN (.internal_date_time)    ! Returned value
    ELSE
        SIGNAL (.result)                ! String was trash or something
    END;                                ! End of s$strdt
GLOBAL ROUTINE s$jfn_str (jfn, p_desc, bits) =
!++
! FUNCTIONAL DESCRIPTION:
!   Convert a JFN to a filespec string.
!
! FORMAL PARAMETERS:
!   jfn         - the JFN
!   p_desc      - address of descriptor to receive the string
!   bits        - format control bits (AC3 of JFNS call).  If 0, this
!                 defaults to the usual case (supply and punctuate everything)
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE and
! COMPLETION CODES:
!   The length of the filespec string is returned, or 0 if any errors (which
!   are also signalled).
!
! SIDE EFFECTS:
!   NONE
!
!--
    BEGIN

    BIND
        desc = .p_desc : $STR_DESCRIPTOR ();

    LOCAL
	temp_desc : $STR_DESCRIPTOR (CLASS = FIXED),
        temp_desc_buffer : VECTOR [CH$ALLOCATION (255)],
        adjusted_length,
        jfns_bits,
        new_ptr;

    $STR_DESC_INIT (DESCRIPTOR = temp_desc,
                    STRING = (255, CH$PTR (temp_desc_buffer)));
    IF .bits EQL 0
    THEN
        jfns_bits = %O'111110000001'    ! Return all the usual fields
    ELSE
        jfns_bits = .bits;
    IF NOT JFNS (.temp_desc[STR$A_POINTER], .jfn, .jfns_bits, 0; new_ptr)
    THEN
        RETURN (SIGNAL (XPO$_CHANNEL); 0);
    temp_desc[STR$H_LENGTH] = ABS (CH$DIFF (.new_ptr,
                                            .temp_desc[STR$A_POINTER])) + 1;
    $STR_COPY (STRING = temp_desc, TARGET = desc, OPTION = TRUNCATE);
    !
    ! Unless the target descriptor was too short, we also copied the trailing
    ! null.  Here we account for that.  If the last character of the target
    ! is null, we copied the null, so must return a length one less.
    !
    adjusted_length = MIN (.desc[STR$H_LENGTH],
                           .temp_desc[STR$H_LENGTH]);
    IF CH$RCHAR (CH$PLUS (.desc[STR$A_POINTER], .adjusted_length - 1)) EQL 0
    THEN
        adjusted_length = .adjusted_length - 1;
    RETURN (.adjusted_length)
    END;                                ! End of s$jfn_str
GLOBAL ROUTINE s$$mount (count, pointer) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
!   MOUNT and ACCESS one structure, or SIGNAL error if can't.
!
! FORMAL PARAMETERS:
!
!   count               - length of structure name
!   pointer             - character pointer to structure name
!
!--
    BEGIN

    LOCAL
        mstatus,                                      ! Status returned by MSTR
        mstr_args : VECTOR [$MSGST + 1],              ! argument block for MSTR
        str_name : VECTOR [CH$ALLOCATION(7)],         ! structure or dir name
        str_descr : $STR_DESCRIPTOR (CLASS = FIXED),  ! descriptor for above
        retcode,                                      ! return value
        ac1;                                          ! temp for value of AC1
    !
    ! If no structure specified, return now.
    !
    IF .count EQL 0
    THEN
        RETURN;
    !
    ! Create descriptor to structure name for error messages
    !
    $STR_DESC_INIT (DESCRIPTOR = str_descr, CLASS = FIXED,
                    STRING = (.count, .pointer));
    !
    ! Make ASCIZ copy of structure name
    !
    CH$COPY (.count, .pointer,
             0,
             .count + 1, CH$PTR (str_name));
    !
    ! Get the current status of the structure
    !
    mstr_args[$MSGSN] = CH$PTR (str_name);
    ac1<lh> = $MSGST + 1;
    ac1<rh> = $MSGSS;
    IF NOT MSTR (.ac1, mstr_args)
    THEN
        UserError ( Rms$_Dev );

    MSTATUS=.MSTR_ARGS[$MSGST];                       ! Save structure status

    !
    ! If structure is PS, no need to mount it
    !
    IF (.mstatus AND MS_PPS) NEQ 0
    THEN
        RETURN;
    !
    ! OK, try to mount the structure
    !
    mstr_args[$MSDEV] = CH$PTR (str_name);
    ac1<lh> = $MSDEV + 1;
    ac1<rh> = $MSIMC;
    IF MSTR (.ac1, mstr_args) EQL 0              ! If it fails
    THEN                                              ! find out why
        !
        ! Analyze the error.  "Structure already mounted" is OK.
        !
        BEGIN
        IF (retcode = s$geterror ($FHSLF)) NEQ MSTX31 ! Structure mounted?
        THEN
            BEGIN
            UserError( Rms$_Dev );      ! Invalid device
            RETURN;                                   ! not accessable
            END
        END;

    !
    ![3] If structure is Domestic, try to ACCESS our own directory on it
    !
    IF (.MSTATUS AND MS_DOM) NEQ 0                    ! If Domestic
    THEN                                              ! then try ACCESS
        BEGIN
        LOCAL ACCBLK: VECTOR[3];        ! ACCES argument block
        LOCAL dir_desc: $STR_DESCRIPTOR(CLASS=DYNAMIC); ! Desc for username
        $STR_DESC_INIT(DESC=dir_desc, CLASS=DYNAMIC);   !
        s$username(s$jobusr(-1),dir_desc);      ! Get our username
        $STR_COPY(STRING=$STR_CONCAT(str_descr, ! Structure name
                                     ':<',      ! delimiters
                                     dir_desc,  ! username
                                     %STRING('>',%CHAR(0))), ! delimiters
                  TARGET=dir_desc);     ! Make str:<username>
        ACCBLK[$ACDIR]=.dir_desc[STR$A_POINTER];
        ACCBLK[$ACPSW]=0;               ! No password needed
        ACCBLK[$ACJOB]=-1;              ! Our job
        ACCES(AC_OWN+3,ACCBLK);    ! Try it, and ignore failure
        $XPO_FREE_MEM(STRING=dir_desc); ! Free the temporary
        END;
    END;                                ! End of s$mount
GLOBAL ROUTINE s$jobusr (job) =
!++
! FUNCTIONAL DESCRIPTION:
!   Return the user number under which a job is logged in.
!
! FORMAL PARAMETERS:
!   job         - job number
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE and
! COMPLETION CODES:
!   0           - some sort of failure
!   or user number
!
! SIDE EFFECTS:
!   NONE
!
!--
    BEGIN

    LOCAL
	getji_block,
        getji_arg2;

    getji_arg2<lh> = -1;
    getji_arg2<rh> = getji_block;
    IF GETJI (.job, .getji_arg2, $JIUNO)
    THEN
        RETURN (.getji_block)
    ELSE
        RETURN (0);
    END;                                ! End of s$jobusr
GLOBAL ROUTINE s$username (user_number, p_desc) =
!++
! FUNCTIONAL DESCRIPTION:
!   Get the username string associated with a user number.
!
! FORMAL PARAMETERS:
!   user_number         - TOPS-20 user number
!   p_desc              - pointer to descriptor to receive string
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE and
! COMPLETION CODES:
!   The length of the filespec string is returned.
!
! SIDE EFFECTS:
!   NONE
!
!--
    BEGIN

    BIND
        dst_desc = .p_desc : $STR_DESCRIPTOR ();

    LOCAL
        string_buff : VECTOR [CH$ALLOCATION (40)],
        length;

    DIRST (CH$PTR (string_buff), .user_number);
    $STR_COPY (TARGET = dst_desc,
               STRING = (length = asciz_len (CH$PTR (string_buff)),
                         CH$PTR (string_buff)));
    RETURN (.length)
    END;                                ! End of s$username
GLOBAL ROUTINE s$geterror (fork_handle) =
!++
! FUNCTIONAL DESCRIPTION:
!   Return the most recent TOPS20 error code for the process.
!
! FORMAL PARAMETERS:
!   NONE
!
! IMPLICIT INPUTS:
!   NONE
!
! IMPLICIT OUTPUTS:
!   NONE
!
! ROUTINE VALUE and
! COMPLETION CODES:
!   NONE
!
! SIDE EFFECTS:
!   NONE
!
!--
    BEGIN

    LOCAL
        error_code;

    GETER ($FHSLF; error_code);
    RETURN (.error_code<rh>)

    END;                                ! End of s$geterror
GLOBAL ROUTINE S$Mount( Fsp ) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
!   MOUNT and ACCESS one structure, or SIGNAL error if can't.
!
! FORMAL PARAMETERS:
!
!   FSP             - character pointer to filespec
!
!--
BEGIN
LOCAL jfn;
LOCAL tdesc: $Str_Descriptor();
LOCAL strname: VECTOR[CH$ALLOCATION(7)];
LOCAL strlen;

$Str_Desc_Init( Desc=Tdesc, Class=Bounded, String=(6,CH$PTR(strname)) );

IF NOT GTJFN( GJ_OFG+GJ_SHT, .Fsp; Jfn ) THEN SIGNAL( Rms$_CGJ );
strlen = S$Jfn_Str( .Jfn, tdesc, JS_DEV );
s$$mount( .strlen, CH$PTR( strname ) );
END;
END ELUDOM			! End of Module