*DECK FFSCHLP 
USETEXT TEXTFFS 
      PROC FFSCHLP; 
*CALL COPYRITE
      BEGIN                            # FFSCHLP                       #
# 
**    FFSCHLP - FTP HELP COMMAND PROCESSOR. 
* 
*     THIS PROCEDURE PROCESS THE HELP COMMAND.
*     THE FORMAT OF THE HELP COMMAND IS:  
*         HELP [<SP> <STRING>]
* 
*     PROC FFSCHLP
* 
*     ENTRY    (PAR)   - FTP COMMAND FROM CRACKER ROUTINE.
* 
*     EXIT     RESPONSE SENT VIA A REQUEST CALL TO *FFSLCRP*. 
* 
*     METHOD   IF THE HELP COMMAND ENTERED WITHOUT A PARAMETER: 
*                SEND THE LIST OF AVAILABLE FTP COMMANDS. 
*              ELSE:  
*                VERIFY THE PARAMETER AND PROCESS ACCORDINGLY.
# 
  
# 
****  PROC FFSCHLP - XREF LIST
# 
  
      XREF
        BEGIN 
        PROC FFSLCRP;                  # C/N MANAGMNT RESPONSE PROCESSR#
        PROC FFSUCDA;                  # CONVERT FROM DISPLAY TO ASCII #
        END 
# 
****
# 
  
      ITEM CHLP$IDENT C(10) = "  FFSCHLP "; 
  
      ITEM I          U;               # LOOP INDUCTION VARIABLE       #
      ITEM LEN        U;               # LENGTH OF RESPONSE IN CM WORDS#
      ITEM LENCHAR    U;               # LENGTH OF RESPONSE IN CHARS   #
  
# 
**    THIS ARRAY DEFINES THE RESPONSE TO A HELP COMMAND WITHOUT 
*     A PARAMETER.
* 
# 
      DEF HELPLINES$ #  9 #;           # NO OF LINES IN HELP RESPONSE..#
                                       #..ZERO RELATIVE.               #
      DEF HSIZ$      #  7 #;           # NO OF WORDS PER RESPONSE LINE #
      DEF HELP$LEN   # 70 #;           # = (HELPLINES$ + 1) * HSIZ$    #
  
      ARRAY HELP$ [00:HELPLINES$] S(HSIZ$) ;
        BEGIN 
        ITEM HELPMSG   C(00,00,68) =
["214-THE FOLLOWING COMMANDS ARE RECOGNIZED (* =>'S UNIMPLEMENTED).   ",
 "                                                                    ",
 "   ABOR*       DELE        NOOP        REIN*       SITE        SYST ",
 "   ACCT        HELP        PASS        REST*       SMNT*       TYPE ",
 "   ALLO        LIST        PASV        RETR        STAT*       USER ",
 "   APPE        MKD *       PORT        RMD *       STOR             ",
 "   CDUP*       MODE        PWD *       RNFR        STOU*            ",
 "   CWD *       NLST        QUIT        RNTO        STRU             ",
 "                                                                    ",
"214 HELP COMMAND COMPLETED.                                         "];
        ITEM HELPZBYTE U(06,48,12) = [0,HELPLINES$(0)]; 
        END 
  
  
      DEF CMDNUM     # 33 #;           # TOTAL NUMBER OF COMMANDS + 1  #
      ARRAY PARAM$CMD [00 : CMDNUM] S(1); 
        BEGIN 
        ITEM CMD$PARAM  U(00,00,60) = [ABOR,
                                       ACCT,
                                       ALLO,
                                       APPE,
                                       CDUP,
                                       CWD, 
                                       DELE,
                                       HELP,
                                       LIST,
                                       MKD, 
                                       MODE,
                                       NLST,
                                       NOOP,
                                       PASS,
                                       PASV,
                                       PORT,
                                       PWD, 
                                       QUIT,
                                       REIN,
                                       REST,
                                       RETR,
                                       RMD, 
                                       RNFR,
                                       RNTO,
                                       SITE,
                                       SMNT,
                                       STAT,
                                       STOR,
                                       STOU,
                                       STRU,
                                       SYST,
                                       TYPE,
                                       USER,
                                       0];
        END 
  
      ARRAY RSP$214$R [00 : CMDNUM] S(HSIZ$) ;
        BEGIN 
        ITEM RSP$214   C(00,00,65) =
  ["214 SYNTAX: ABOR (UNIMPLEMENTED)                                 ", 
   "214 SYNTAX: ACCT <SP> <CHARGE-NUMBER>,<PROJECT-NUMBER>           ", 
   "214 SYNTAX: ALLO <SP> <DECIMAL-INTEGER>                          ", 
   "214 SYNTAX: APPE <SP> <PATHNAME>                                 ", 
   "214 SYNTAX: CDUP (UNIMPLEMENTED)                                 ", 
   "214 SYNTAX: CWD  <SP> <PATHNAME> (UNIMPLEMENTED)                 ", 
   "214 SYNTAX: DELE <SP>PFN,UN=USERNAME,PW=PASSWORD,PN=PACKNAME,R=R.", 
   "214 SYNTAX: HELP [<SP> <STRING>]                                 ", 
   "214 SYNTAX: LIST [<SP> FN=PFN,UN=USERNAME,PN=PACKNAME,R=R,DN=DN.]", 
   "214 SYNTAX: MKD  <SP> <PATHNAME> (UNIMPLEMENTED)                 ", 
   "214 SYNTAX: MODE <SP> <MODE-CODE>                                ", 
   "214 SYNTAX: NLST [<SP> FN=PFN,UN=USERNAME,PN=PACKNAME,R=R,DN=DN.]", 
   "214 SYNTAX: NOOP                                                 ", 
   "214 SYNTAX: PASS <SP> <PASSWORD>                                 ", 
   "214 SYNTAX: PASV                                                 ", 
   "214 SYNTAX: PORT <SP> <HOST-PORT>                                ", 
   "214 SYNTAX: PWD  (UNIMPLEMENTED)                                 ", 
   "214 SYNTAX: QUIT                                                 ", 
   "214 SYNTAX: REIN (UNIMPLEMENTED)                                 ", 
   "214 SYNTAX: REST <SP> <MARKER> (UNIMPLEMENTED)                   ", 
   "214 SYNTAX: RETR <SP> <PATHNAME>                                 ", 
   "214 SYNTAX: RMD  <SP> <PATHNAME> (UNIMPLEMENTED)                 ", 
   "214 SYNTAX: RNFR <SP> OFN                                        ", 
   "214 SYNTAX: RNTO <SP> <PATHNAME>                                 ", 
   "214 SYNTAX: SITE <SP> <CS=CODE_SET> <DA OR IA>                   ", 
   "214 SYNTAX: SMNT <SP> <PATHNAME> (UNIMPLEMENTED)                 ", 
   "214 SYNTAX: STAT [<SP> <PATHNAME>] (UNIMPLEMENTED)               ", 
   "214 SYNTAX: STOR <SP> <PATHNAME>                                 ", 
   "214 SYNTAX: STOU (UNIMPLEMENTED)                                 ", 
   "214 SYNTAX: STRU <SP> <STRUCTURE-CODE>                           ", 
   "214 SYNTAX: SYST                                                 ", 
   "214 SYNTAX: TYPE <SP> <TYPE-CODE>                                ", 
   "214 SYNTAX: USER <SP> <USERNAME>[,<PASSWORD>][,<FAMILY>]         ", 
   "504 COMMAND NOT IMPLEMENTED FOR THAT PARAMETER.                  "];
        ITEM RSP$ZERO   U(06,30,30) = [0, CMDNUM(0)]; 
        END 
  
      DEF APSTSIZ$   # 4 * HSIZ$ #; 
      ARRAY APSTRSP [00 : 03] S(HSIZ$);    # APPE OR STOR              #
        BEGIN 
        ITEM APST$RSP  C(00,00,61) =
      ["214-SYNTAX: APPE <SP> PFN,PW=PASSWORD,CT=CT,M=M,BR=BR,PR=PR, ", 
       "            PN=PACKNAME,R=R,S=SPACE,AL=LEVEL,XD=EXPIREDATE,  ", 
       "            AC=AC,XT=EXPIRETERM,UN=USERNAME,SS=SUBSYSTEM,    ", 
       "214         CS=CS,DA,IA,TRUNC.                               "];
        ITEM APST$ID   C(01,12,04); 
        ITEM APST$ZERO U(06,06,54) = [4(0)];
        END 
  
  
      DEF RETRSIZ$   # 2 * HSIZ$ #; 
      ARRAY RETRRSP [00 : 01] S(HSIZ$);    # RETR                      #
        BEGIN 
        ITEM RETR$RSP  C(00,00,61) =
      ["214-SYNTAX: RETR <SP> PFN,UN=USERNAME,PW=PASSWORD,R=R,       ", 
       "214         PN=PACKNAME,CS=CS,FSC=FSC,READEOI.               "];
        ITEM RETR$ZERO U(06,06,54) = [2(0)];
        END 
  
      DEF RNTOSIZ$   # 3 * HSIZ$ #; 
      ARRAY RNTORSP [00 : 02] S(HSIZ$);    # RNTO                      #
        BEGIN 
        ITEM RNTO$RSP  C(00,00,61) =
      ["214-SYNTAX: RNTO <SP> NFN,PW=PASSWORD,CT=CT,M=M,BR=BR,PR=PR, ", 
       "            SS=SUBSYSTEM,PN=PACKNAME,R=R,CE,CP,AC=AC,        ", 
       "214         XD=EXPIREDATE,XT=EXPIRETERM.                     "];
        ITEM RNTO$ZERO U(06,06,54) = [3(0)];
        END 
  
      CONTROL EJECT;
# 
**    START MAIN PROCEDURE. 
* 
# 
  
      IF PARA$NUM[0] EQ 0 
      THEN
        BEGIN                          # HELP COMMAND WITHOUT PARAMETER#
        LEN      = HELP$LEN ;          # LENGTH IN CM WORDS            #
        P<TBUFF> = LOC(HELPMSG[0]) ;   # ADDRESS OF MESSAGE            #
        END 
      ELSE
        BEGIN                          # FTP CMD PARAMETER SPECIFIED   #
  
        IF    (PAR$VALUE[1] EQ APPE)
           OR (PAR$VALUE[1] EQ STOR)
        THEN
          BEGIN                        # APPE/STOR                     #
          IF PAR$VALUE[1] EQ STOR 
          THEN
            BEGIN                      # STOR                          #
            APST$ID[0] = "STOR";
            END 
          ELSE
            BEGIN 
            APST$ID[0] = "APPE";
            END 
  
          LEN      = APSTSIZ$;
          P<TBUFF> = LOC(APSTRSP);
          GOTO LSENDATA;
          END 
  
        IF PAR$VALUE[1] EQ RETR 
        THEN
          BEGIN                        # RETR                          #
          LEN      = RETRSIZ$;
          P<TBUFF> = LOC(RETRRSP);
          GOTO LSENDATA;
          END 
  
        IF PAR$VALUE[1] EQ RNTO 
        THEN
          BEGIN                        # RNTO                          #
          LEN      = RNTOSIZ$;
          P<TBUFF> = LOC(RNTORSP);
          GOTO LSENDATA;
          END 
  
        ELSE
          BEGIN                        # FOR ALL OTHER FTP COMMANDS    #
          CMD$PARAM[CMDNUM] = PAR$VALUE[1];  # SET TO LAST FOR MATCHING#
  
          FOR I = 0 STEP 1 WHILE
                 (PAR$VALUE[1] NQ CMD$PARAM[I]) 
          DO
            BEGIN                      # LOOP THRU TABLE UNTIL A MATCH #
            END 
  
          LEN      = HSIZ$;            # LENGTH IN CM WORDS            #
          P<TBUFF> = LOC(RSP$214[I]);  # ADDRESS OF MESSAGE            #
          END                          # FOR ALL OTHER FTP COMMANDS    #
  
        END                            # FTP CMD PARAMETER SPECIFIED   #
  
  
 LSENDATA:  
      FFSUCDA(TBUFF, LEN,              # CONVERT FROM DISPLAY TO ASCII #
              SENDBUF, LENCHAR);
  
      REQ$RCODE[RFTPCM$] = RCM"RCSENDAT";  # SEND DATA OVER            #
      REQ$CTYPE[RFTPCM$] = CTYPE"CTCTRL";  # CONTROL CONNECTION        #
      REQ$ADDR[RFTPCM$]  = LOC(SENDBUF);
      REQ$LEN[RFTPCM$]   = LENCHAR; 
      FFSLCRP;
  
      RETURN; 
  
      END                              # FFSCHLP                       #
  
      TERM
