Google
 

Trailing-Edge - PDP-10 Archives - tops20-v7-ft-dist1-clock - 7-sources/diumod.b36
There are 4 other files named diumod.b36 in the archive. Click here to see a list.
%TITLE 'Modify DIU Requests'

MODULE DIUMOD (IDENT = '252',
               LANGUAGE(BLISS36),
               ENTRY(DIU$MODIFY)) =
BEGIN

!	COPYRIGHT (C) DIGITAL EQUIPMENT CORPORATION 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:    DIU-20  (Data Interchange Utility for TOPS-20)
!
! ABSTRACT:    This module handles modifications to existing queued
!              reqeusts.
!
! ENVIRONMENT: TOPS-20 V6.1          XPORT
!              BLISS-32 V4           RMS V3
!
! AUTHOR:      Andrew Nourse                    CREATED: 5-Dec-1981
! HISTORY:
!
!  252	Remove library of CONDIT.
!	Sandy Clemens  1-Jul-86
!
!  213  Bad call to S$USERNAME was causing modify requests to occasionally fail
!       and also not default the username correctly.
!       Gregory A. Scott 2-Jun-86
!
!  205  Make the  NEXT function  set the  after time  to zero  and release  the
!       request.  Clean up DIU$MODIFY, move MODREQ outside DIU$MODIFY block.
!       Gregory A. Scott 27-May-86
!
!  146  Last edit was a bit too  adventerous  about  printing  the  node  name.
!       Only output  it if  there wasn't  a request  number specified.   Add  a
!       number of errors to list in MODREQ.
!       Gregory A. Scott 7-May-86
!
!  144  Rename Q$MESSAGE to be DIU$MMESSAGE, and make it print better  messages
!       including the node name specified.   Change call to DIU$MESSAGE to  not
!       enter these messages into the system log file.
!       Gregory A. Scott 6-May-86
!
!  127  Remove strange hack where a negative request id meant that you really 
!       wanted /SEQ:CONT.
!       Gregory A. Scott 26-Apr-86
!
! V01-031  Sandy Clemens  17-Sep-85
!       Change name of DIU-COMMAND.R36 to DIUCOMMAND.R36 to make porting
!       to TOPS-10 easier.  (TOPS-10 will truncate DIUCOMMAND to DIUCOM,
!       but cannot bypass the "-").
!
! V01-004  Doug Rayner     14-Aug-85
!       Add support for TOPS-10 [P,Pn]'s
!
! V01-003  Rick Fricchione  26-Oct-1984
!         Modify for DIU.  Use new queue find routines. Handle
!         new request block format, and clean up.
!
! V01-002  Andy Nourse  --no date--
!          02 - Put in ENTRY points
!--
%SBTTL 'Forward Routine'

FORWARD ROUTINE
    DIU$MODIFY,                         ! Modify existing DIU request(s)
    MODREQ,                             ! Modify one request
    DIU$MMESSAGE: NOVALUE;              ! Print an error with a request block
%SBTTL 'Libraries and Externals'

! Libraries

LIBRARY 'BLI:XPORT';                    ! XPORT is not your friend
LIBRARY 'DIU';                          ! DIU Data Structures
LIBRARY 'FAO';                          ! FAO macros and symbols
LIBRARY 'DIUCOMMAND';                   ! DIU command macros

! External routines 

EXTERNAL ROUTINE IP_FIND,               ! Find a request
                 IP_MODIFY,             ! Modify a request
                 IP_DELETE,             ! Delete a request
                 DIU$MESSAGE,           ! ASCIIze an error message
                 S$CRIF,                ! Output CRLF if needed
                 S$USERNAME,            ! Username from usernumber
                 S$JOBNO,               ! Return our job number
                 S$JOBUSR;              ! Usernumber from job number

EXTERNAL TTY: $XPO_IOB();               ! TTY IOB

MACRO $ = 0, 0, 0, 0 %;

! Static data

OWN modtab: VECTOR[M_MAX+1]
            PRESET(
                    [M_HOLD]   =PP('held'),
                    [M_KILL]   =PP('cancelled'),
                    [M_MODIFY] =PP('modified'),
                    [M_NEXT]   =PP('next'),
                    [M_RELEASE]=PP('released'));
%SBTTL 'Routine DIU$MODIFY'

GLOBAL ROUTINE DIU$MODIFY (request_block : REF $DIU_BLOCK,
                           mfunct,
                           mopt : REF BITVECTOR 
                          )=
BEGIN
!++
! FUNCTIONAL DESCRIPTION:
!
!        Perform work for the following commands: HOLD, RELEASE, KILL, NEXT,
!        and of course MODIFY.
!
! FORMAL PARAMETERS:
!
!        request_block: Template request to modify
!        mfunct: Function code for command (M_MODIFY, M_HOLD, etc).
!        mopt: Bit map for what to modify.
!--

! Condition handler for this routine - just frees memory

ROUTINE modfree (signal_args : REF VECTOR,
                 mech_args,
                 enable_args : REF VECTOR)=
BEGIN                                   ! Routine to free block we allocated

LOCAL tchn;

tchn =..enable_args[1];                 ! Head of chain

SELECT .signal_args[1] OF
        SET
        [SS$_UNWIND]: WHILE .tchn NEQ 0 ! Until we reach the end of chain
                      DO BEGIN
                         LOCAL ttc;
                         ttc = .tchn;
                         tchn = ..tchn; ! Next link
                         $XPO_FREE_MEM(BINARY_DATA=(DIU$K_LEN+%UPVAL,.ttc));
                         SS$_RESIGNAL
                         END;
        [OTHERWISE]: RETURN SS$_RESIGNAL;
        TES
END;                                    ! MODFREE

LOCAL req_count : INITIAL(0),           ! Number of requests processed
      line : $STR_DESCRIPTOR(CLASS=DYNAMIC),    ! Line to print on terminal
      chain : REF VECTOR,               ! Pointer to chain of requests
      tchain : VOLATILE REF VECTOR,
      status;

ENABLE MODFREE(tchain);                 ! Enable our memory free routine

! If no username specified, then default properly to requestor's own requests

IF .request_block[DIU$H_USERNAME] EQL 0
%IF %SWITCHES(TOPS10) %THEN
    AND (.request_block[DIU$G_USER_NUMBER] EQL 0)
%FI
THEN BEGIN
     LOCAL usrdesc : $STR_DESCRIPTOR(CLASS=BOUNDED,
                                     STRING=(40,CH$PTR(request_block[DIU$T_USERNAME])));

     ! Default our user name into the passed request block

     %IF %SWITCHES(TOPS20)
     %THEN
     request_block[DIU$H_USERNAME] = S$USERNAME(S$JOBUSR(S$JOBNO()),usrdesc);
     %ELSE
     request_block[DIU$H_USERNAME] = S$USERNAME(S$JOBNO(),usrdesc);
     %FI
     END;


! Loop through all requests looking for one that matches to change

IF (status = IP_FIND(request_block[$],chain))   ! Look for something to fiddle
THEN DO BEGIN                                   ! Got something
        BIND REQ=CHAIN[%UPVAL]: $DIU_BLOCK;     ! Bind to current request

        ! Request found, do it to this one

        modreq(request_block[$],req[$],.mfunct,.mopt,req_count); 

        ! Free memoru that IP_FIND got for us
        tchain = .chain;                ! Save addr of block so we can free it
        chain = .chain[0];              ! Point to next one in chain
        $XPO_FREE_MEM(BINARY_DATA=(DIU$K_LEN+%UPVAL,.tchain));  ! Free one req

        END WHILE .chain NEQ 0          ! Loop until no more requests to check

ELSE DIU$MMESSAGE(.status,0,request_block[$]);  ! Request wasn't found

! Give message telling how many requests were modified.

S$CRIF();                               ! CRLF if needed

$STR_DESC_INIT(DESC=line, CLASS=DYNAMIC);

$GET_FAO('[!SL request!%S !AZ]!/',      ! Make the line up
         line,
         .req_count,
         .modtab[.mfunct]);

$XPO_PUT(IOB=tty, STRING=line);         ! Send it to the user

$XPO_FREE_MEM(STRING=line);             ! Free dynamic string memory

.status                                 ! Return what IP_FIND returned
END;                                    ! DIU$MODIFY
%SBTTL 'Routine MODREQ'
ROUTINE modreq (request_block: REF $DIU_BLOCK,  ! Template
                req: REF $DIU_BLOCK,            ! Current request
                mfunct,                         ! Which command (M_whatever)
                mopt: REF BITVECTOR,            ! Bitmap of modify options
                req_count                       ! Count of requests hacked
                ) =
BEGIN
!++
! FUNCTIONAL DESCRIPTION:
!
!      This routine hacks one request for routine DIU$MODIFY.
!
! FORMAL PARAMETERS:
!
!       request_block: user's modify request template
!       req: current request to modify
!       mfunct: command to perform
!       mopt: bitmask of fields that change
!       req_count: count of request successfully modified
!
! SIDE EFFECTS:
!
!       The specified request is modified.
!--

! Routine to handle conditions from here... all it does is print messages.

ROUTINE modhan (signal_args: REF VECTOR,
                mech_args: REF VECTOR,
                enable_args: REF VECTOR) =        ! [1]=request block
        BEGIN
        SELECT .signal_args[1] OF
               SET

               ! Request finished or killed while we were running this
               [DIU$_REQ_NOT_FOUND]: RETURN SETUNWIND();

               [DIU$_INSUFF_PRIVS,      ! These errors should not stop
                DIU$_ACTIVE,            ! the command
                DIU$_NO_PREREQ,
                DIU$_HAS_DEPENDENT,
                DIU$_INVALID_PREREQ,
                DIU$_PREREQ_NON_EXIST,
                DIU$_PREREQ_NOT_YOURS,
                DIU$_PREREQ_LOOP]: BEGIN
                                   DIU$MMESSAGE(.signal_args[1],
                                                0,..enable_args[1]);
                                   RETURN SETUNWIND();
                                   END;
               [OTHERWISE]: RETURN SS$_RESIGNAL;
               TES
        END;                            ! End of MODHAN condition handler

LOCAL reqsav: VOLATILE;                 ! Request ID of this request

ENABLE modhan (reqsav);                 ! Enable message printer

reqsav = req[$];

CASE .mfunct FROM M_MIN TO M_MAX OF     ! Figure out what to do
      SET
      [M_KILL]: IP_DELETE(.req[DIU$H_REQUEST_ID]);      ! KILL command
      [M_MODIFY]: BEGIN                                 ! MODIFY command
                  IF .mopt[DIUQ$K_AFTER]                ! /AFTER
                  THEN IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_AFTER,
                                 .request_block[DIU$G_AFTER]);

                  IF .mopt[DIUQ$K_DEADLINE]             ! /DEADLINE
                  THEN IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_DEADLINE,
                                 .request_block[DIU$G_DEADLINE]);

                  IF .mopt[DIUQ$K_PRIORITY]             ! /PRIORITY
                  THEN IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_PRIORITY,
                                 .request_block[DIU$B_PRIORITY]);

                  IF .mopt[DIUQ$K_LOG_FILESPEC]         ! /[NO]LOG
                  THEN BEGIN
                       LOCAL d_log: $STR_DESCRIPTOR();
                             $STR_DESC_INIT(DESC=d_log,
                                            STRING=(.request_block[DIU$H_LOG_FILESPEC],
                                                    CH$PTR(request_block[DIU$T_LOG_FILESPEC])));
                       IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_LOG_FILESPEC,D_LOG);
                       END;

                   IF .mopt[DIUQ$K_SEQUENCE]            ! /SEQUENCE
                   THEN IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_SEQUENCE,
                                  .request_block[DIU$V_SEQ_CONTINUE]);

                   IF .mopt[DIUQ$K_PREREQUISITE_ID]     ! /PREREQUISITE
                   THEN IP_MODIFY(.req[DIU$H_REQUEST_ID],
                                  DIUQ$K_PREREQUISITE_ID,
                                  .request_block[DIU$H_PREREQUISITE_ID]);

                   IF .mopt[DIUQ$K_NOTIFY]
                   THEN IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_NOTIFY,
                                  .request_block[DIU$Z_NOTIFY]);
                   END;                                 ! End of MODIFY command

          [M_NEXT]: BEGIN                               ! NEXT command
                    IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_PRIORITY,63);
                    IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_AFTER,0);
                    IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_HOLDING,0);
                    END;                                ! End of NEXT command

          [M_HOLD]: IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_HOLDING,1);

          [M_RELEASE]: IP_MODIFY(.req[DIU$H_REQUEST_ID],DIUQ$K_HOLDING,0);

          [INRANGE,OUTRANGE]: SIGNAL(DIU$_BUG);         ! owie
      TES;                              ! End of CASE

(.req_count) = ..req_count+1            ! Count the request as modified

END;                                    ! MODREQ
%SBTTL 'Routine DIU$MMESSAGE'
GLOBAL ROUTINE DIU$MMESSAGE (primary, 
                             secondary,
                             req: REF $DIU_BLOCK): NOVALUE =
BEGIN
!++
! FUNCTIONAL DESCRIPTION:
!
!       Print an error message related to a request block
!
! FORMAL PARAMETERS:
!
!       primary: Primary error code
!       secondary: Secondary error code
!       req: Address of request block
!--

LOCAL addtext: $STR_DESCRIPTOR(CLASS=DYNAMIC);

$STR_DESC_INIT(DESC=addtext, CLASS=DYNAMIC);

! Build a description of the request into addtext

IF .req[DIU$H_REQUEST_ID] NEQ 0                         ! Request number or all requests
THEN $STR_COPY(TARGET=addtext, 
               STRING=$STR_CONCAT('Request ',
                                  $STR_ASCII(.req[DIU$H_REQUEST_ID])))
ELSE BEGIN
     $STR_COPY(TARGET=addtext,                          ! No request number specified
               STRING='All requests with');
     IF .req[DIU$H_SOURCE_FILESPEC] NEQ 0               ! Was there a node name?
     THEN $STR_APPEND(TARGET=addtext,
                      STRING=$STR_CONCAT(' node ',
                                    $STR_FORMAT((.req[DIU$H_SOURCE_FILESPEC],
                                           CH$PTR(req[DIU$T_SOURCE_FILESPEC])),
                                                UP_CASE),
                                         '::'));
     END;

IF .req[DIU$H_USERNAME] NEQ 0           ! Was there a user name?
THEN $STR_APPEND(TARGET=addtext,
                 STRING=$STR_CONCAT(' user ',
                                    $STR_FORMAT((.req[DIU$H_USERNAME],
                                                 CH$PTR(req[DIU$T_USERNAME])),
                                                UP_CASE)));

IF .req[DIU$H_JOBNAME] NEQ 0            ! Was there a job name?
THEN $STR_APPEND(TARGET=addtext,
                 STRING=$STR_CONCAT(' job ',
                                    $STR_FORMAT((.req[DIU$H_JOBNAME],
                                                 CH$PTR(req[DIU$T_JOBNAME])),
                                                UP_CASE)));

%IF %SWITCHES(TOPS10) %THEN
IF .req[DIU$G_USER_NUMBER] NEQ 0
THEN $STR_APPEND(TARGET=addtext,        ! Was there a PPN? [10,33]?
                 STRING=$STR_CONCAT(' [',
                                    $STR_ASCII(.REQ[DIU$G_USER_NUMBER]^-18,
                                               LEADING_BLANK, UNSIGNED, BASE8),
                                    ',',
                                    $STR_ASCII(.REQ[DIU$G_USER_NUMBER] AND %O'777777',
                                               LEADING_BLANK, UNSIGNED, BASE8),
                                    ']'))
%FI

! Get all of that turned into a error message, and print it out.

DIU$MESSAGE(.primary, .secondary, addtext, FALSE);   ! Not to system log file

! Free memory and return

$XPO_FREE_MEM(STRING=addtext);

END;
END
ELUDOM