*DECK SSIPSCR 
USETEXT TEXTATS 
USETEXT TEXTRPC 
USETEXT TEXTXDR 
      PROC SSIPSCR (POSITION, LENGTH, RETCODE); 
*CALL COPYRITE
# TITLE SSIPSCR - PROCESS SERVER COMMAND RESPONSE.                     #
  
      BEGIN                            # SSIPSCR                       #
# 
****  SSIPSCR - PROCESS SERVER COMMAND RESPONSE.
* 
*     THIS PROCEDURE PROCESSES A REPLY TO A MOUNT OR DISMOUNT SERVER
*     REQUEST.
* 
*     PROC SSIPSCR
* 
*     ENTRY    POSITION = CURRENT POSITION IN INDATABUF 
*              LENGTH   = REMAINING BYTES IN INDATABUF
* 
*     EXIT     POSITION = CURRENT POSITION IN INDATABUF 
*              LENGTH   = REMAINING BYTES IN INDATABUF
*              RETCODE  = COMPLETION STATUS OF COMMAND
* 
*     METHOD   EXTRACT THE VOLUME ID WHICH IS REPRESENTED AS A STRING.
*              DETERMINE THAT THE CORRECT NUMBER OF BYTES ARE IN THE
*              REPLY.  IF ENOUGH BYTES EXIST, EXTRACT THE DRIVE ID. 
*              SAVE THE REPLY IN THE NEXT OPEN REPLY DATA SLOT.  IF 
*              NONE ARE AVAILABLE THEN INCREMENT A LOST RESPONSE
*              COUNT AND RETURN AN ERROR. 
# 
  
# 
****  PROC SSIPSCR - XREF LIST. 
# 
  
      XREF
        BEGIN 
        PROC XDRINT;     # CONVERT INTEGER TO XDR FORMAT.              #
        PROC XDRSTR;     # CONVERT STRING TO XDR FORMAT.               #
        END 
  
# 
**
# 
  
      ITEM RETCODE             I;      # ERROR STATUS                  #
      ITEM LENGTH              I;      # REMAINING REPLY LNGTH IN BYTES#
      ITEM POSITION            I;      # CURRENT BYTE LOCATION IN BUF  #
  
      ITEM VOLBYTE             I;      # VOLID LENGTH IN BYTES IN BUF  #
      ITEM VOLSIZE             I;      # VOLID LENGTH IN CHARACTERS    #
  
      BASED ARRAY CMDBASE [00:00] S(1);;
CONTROL EJECT;
  
# 
****  START MAIN PROCEDURE
# 
  
      VOLBYTE = POSITION; 
      XDRSTR (INDATABUF [0], POSITION, VOL$HDR [REPLY$],
              VOLSIZE, XDROPER"READ");
      VOLSIZE = VOLSIZE - 1;           # REMOVE ZBYTE INCLUDED BY SUN  #
      VOLBYTE = POSITION - VOLBYTE; 
      LENGTH = LENGTH - ((MRSIZE$ * 4) + VOLBYTE);
  
      IF LENGTH GQ 0
      THEN
        BEGIN                          # VALID REPLY LENGTH            #
        IF REP$WORD0 [NEXTWRITE] EQ 0 
        THEN
          BEGIN                      # REPLY CAN BE RETURNED TO SUBS   #
          P<CMDBASE> = LOC (CMD$DRIVEID [REPLY$]);
          XDRINT (INDATABUF [0], POSITION, CMDBASE [0], 
                  MRSIZE$, XDROPER"READ");
          REP$WC [NEXTWRITE]        = BLOCKSIZE$; 
          REP$ID [NEXTWRITE]        = MSG$PACKID [REPLY$];
          REP$EC [NEXTWRITE]        = RSP$STATUS [REPLY$];
          REP$VSN [NEXTWRITE]       = C<0,VOLSIZE>VOL$ID [REPLY$];
          REP$ATS [NEXTWRITE]       = CMD$ATS [REPLY$]; 
          REP$LSM [NEXTWRITE]       = CMD$LSM [REPLY$]; 
          REP$PANEL [NEXTWRITE]     = CMD$PANEL [REPLY$]; 
          REP$DRIVE [NEXTWRITE]     = CMD$DRIVE [REPLY$]; 
  
          IF (MSG$COMMAND [REPLY$] EQ CSIDISMOUNT$) AND 
             (MSG$MESOPT [REPLY$] EQ FORCEOPT$) 
          THEN
            REP$COMMAND [NEXTWRITE] = FORCEDIS$;
          ELSE IF MSG$COMMAND [REPLY$] EQ CSIMOUNT$ 
          THEN
            REP$COMMAND [NEXTWRITE] = MOUNT$; 
          ELSE
            REP$COMMAND [NEXTWRITE] = DISMOUNT$;
  
          NEXTWRITE = XDRMODU ((NEXTWRITE + 1), NUMBREP$);
          RETURN; 
          END                          # REPLY CAN BE RETURNED TO SUBS #
  
        RETCODE = REPFULL$;            # NO ENTRIES LEFT               #
        LOST$MSG = LOST$MSG + 1;       # TRACK THROWN OUT RESPONSES    #
        END                            # VALID REPLY LENGTH            #
      END                              # SSIPSCR                       #
  
      TERM
