home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
kermit.columbia.edu
/
kermit.columbia.edu.tar
/
kermit.columbia.edu
/
vmskermit32
/
vmsmit.bli
< prev
next >
Wrap
Text File
|
2018-01-01
|
118KB
|
5,179 lines
MODULE KERMIT (IDENT = '3.3.128', MAIN = MAIN_ROUTINE,
ADDRESSING_MODE(EXTERNAL = GENERAL, NONEXTERNAL = GENERAL)
) =
BEGIN
BIND
IDENT_STRING = %ASCID'VMS Kermit-32 version 3.3.128'; ! Ident message
!++
! FACILITY:
! KERMIT-32
!
! ABSTRACT:
! KERMIT-32 is an implementation of the KERMIT protocal to allow the
! transfer of files from micro computers to the DECsystem-10, DECSYSTEM-20
! and now the VAX/VMS systems.
!
! ENVIRONMENT:
! User mode
!
! AUTHOR: Robert C. McQueen, CREATION DATE: 24-January-1983
!
! MODIFIED BY:
!
!--
%SBTTL 'Table of Contents'
%SBTTL 'Revision History'
!++
! Start of version 1.
!
! 1.0.000 By: Robert C. McQueen On: 4-Jan-1983
! Create this program.
!
! 1.0.001 By: Robert C. McQueen On: 4-May-1983
! Allow RECEIVE without a file specification to mean
! use what ever the remote says.
!
! 1.1.002 By: W. Hom On: 6-July-1983
! Implement CONNECT command.
!
! 1.2.003 By: Robert C. McQueen On: 15-Aug-1983
! Add SET PARITY command and SHOW PARITY to support
! eight bit quoting.
!
! 1.2.004 By: Robert C. McQueen On: 23-August-1983
! Add dummy routine SY_TIME.
!
! 1.2.005 By: Robert C. McQueen On: 23-August-1983
! Add SET [SEND | RECEIVE] EIGHT-BIT-QUOTE <octal>
! command. Add message for SHOW RECEIVE and SHOW SEND parameters
!
! 1.2.006 By: Robert C. McQueen On: 26-August-1983
! Add BYE, FINISH and LOGOUT commands. These commands call
! DO_GENERIC to send generic functions to remote servers.
!
! 1.2.007 By: Robert C. McQueen On: 16-September-1983
! Implement SY_TIME, and XFR_STATUS routines.
! Add more stat type out.
!
! 1.2.008 By: Robert C. McQueen On: 19-September-1983
! Add the SET RETRY command and the SHOW RETRY command.
!
! 1.2.009 By: Robert C. McQueen On: 20-September-1983
! Add CRCCLC routine for calculating CRC-CCITT.
! Set SET BLOCK_CHECK_TYPE and SHOW BLOCK_CHECK_TYPE commands.
!
! 1.2.010 By: Nick Bush On: 3-October-1983
! SERVER (in KERMSG) actually returns a value. If it
! is "ABORTED", then we should prompt again. This allows
! a ^Y typed to the server to put it back into command
! level. (If you want to type out statistics or whatever).
!
! 2.0.011 Release VAX/VMS Kermit-32 version 2.0
!
! 2.0.012 By: Nick Bush On: 10-Nov-1983
! Add type out of version number. Also fix some
! problems with IBM mode and local echo.
!
! 2.0.013 By: Nick Bush On: 11-Nov-1983
! Change how debugging output is done so that it
! can be redirected to the logical device KER$DEBUG.
! If the logical name is defined to be something other
! that SYS$OUTPUT, KERMIT will send any debugging output
! there.
!
! 2.0.014 By: Robert C. McQueen On: 16-Nov-1983
! Make sure all message number checks are mod 64. There
! were four that weren't.
!
! 2.0.015 By: Nick Bush On: 17-Nov-1983
! Always clear purge typeahead when posting receive QIO.
! Also, clear any typeahead just before sending a packet.
!
! 2.0.016 By: Nick Bush On: 4-Dec-1983
! Change how binary files are written to (hopefully) improve
! the performance. We will now use 510 records and only
! write out the record when it is filled (instead of writing
! one record per packet). This should cut down on the overhead
! substantially.
!
! 2.0.017 By: Nick Bush On: 9-Dec-1983
! Fix processing for VFC format files. Also fix GET_ASCII
! for PRN and FTN record types. Change GET_ASCII so that
! 'normal' CR records get sent with trailing CRLF's instead
! of <LF>record<CR>. That was confusing too many people.
!
! 2.0.020 By: Nick Bush On: 9-Dec-1983
! Only abort (when remote) if we seen two control-Y's in
! succession. This way a single glitch does not kill us.
!
! 2.0.021 By: Nick Bush On: 12-Dec-1983
! Add status type-out character (^A), debug toggle
! character (^D), and force timeout character (^M)
! to those accepted during a transfer when we are remote.
!
! 2.0.022 By: Nick Bush On: 15-Dec-1983
! Add Fixed record size (512 byte) format for writing files.
! This can be used for .EXE files. Also clean up writing
! ASCII files so that we don't lose any characters.
!
! 2.0.023 By: Nick Bush On: 16-Dec-1983
! Add a default terminal name for the communications line.
! If KER$COMM is defined, that will be the default.
!
! 2.0.025 By: Robert C. McQueen On: 22-Dec-1983
! Use RMSG_COUNT and SMSG_COUNT now.
!
! 2.0.026 By: Nick Bush On: 3-Jan-1984
! Add options for format of file specification to be
! sent in file header packets. Also type out full file
! specification being sent/received instead of just
! the name we are telling the other end to use.
!
! 2.0.027 By: Nick Bush On: 20-Jan-1984
! Fix reset of parity to use the correct field in the
! IO status block from the IO$_SENSEMODE. It was using
! the LF fill count instead.
!
! 2.0.030 By: Nick Bush On: 3-Feb-1984
! Add the capability of receiving a file with a different
! name than given by KERMSG. The RECEIVE and GET commands
! now really are different.
!
! 2.0.031 By: Nick Bush On: 4-Feb-1984
! Change connect code to improve response (hopefully
! without worsening throughput or runtime requirements).
! When either terminal is idle we will be waiting for
! a single character with a larger buffered read queued
! up immediately after it.
!
! 2.0.032 By: Nick Bush On: 25-Feb-1984
! Add code for LOCAL and REMOTE commands. These depend
! upon support in KERMSG and KERSYS.
!
! 2.0.033 By: Nick Bush On: 6-March-1984
! Change command input and terminal processing so that
! we will always have SYS$OUTPUT and SYS$COMMAND open
! when they are terminals, and will also always have
! the transfer terminal line open. This makes it
! unnecessary for the user to allocate a dialup line
! in order to go between CONNECT and a transfer command,
! and keep anyone else from grabbing the line between
! commands.
! Also add the command parsing for the rest of the LOCAL/REMOTE
! commands. This makes use of the fact that we have
! SYS$COMMAND open to allow us to read passwords without echo.
! Commands which should only be done when Kermit is local
! (GET, BYE, etc.) will now give an error if the transfer
! line is the same as the controlling terminal.
! SEND will now check for the files existance before calling
! KERMSG to send it.
!
! 2.0.034 By: Nick Bush On: 7-March-1984
! Default the parity type to be that of the default transfer
! line. This should make things simpler for systems which use
! parity by default.
!
! 2.0.035 By: Nick Bush On: 8-March-1984
! Add LOG SESSION command to set a log file for CONNECT.
! While we are doing so, clean up the command parsing a little
! so that we don't have as many COPY_xxx routines.
!
! 2.0.036 By: Nick Bush On: 15-March-1984
! Fix PUT_FILE to correctly handle carriage returns which are
! not followed by line feeds. Count was being decremented
! Instead of incremented.
!
! 2.0.037 By: Robert C. McQueen On: 20-March-1984
! Fix call to LOG_OPEN for debug log file.
! Module: KERTRM.
!
! 2.0.040 By: Nick Bush On: 22-March-1984
! Fix processing of FORTRAN carriage control to handle lines
! which do not contain the carriage control character (i.e., zero
! length records). Previously, this type of record was sending
! infinite nulls.
!
! 2.0.041 By: Nick Bush On: 26-March-1984
! Add SET PROMPT command.
!
! 2.0.042 By: Nick Bush On: 26-March-1984
! Fix connect processing to make it easy to type messages
! on the user's terminal while connected. Use this
! to type messages when log file stopped and started.
! Include the node name in the messages to keep
! users who are running through multiple Kermit's from
! getting confused.
!
! 2.0.043 By: Nick Bush On: 28-March-1984
! Fix SET PARITY ODD to work. Somehow, the table entry
! had PR_NONE instead of PR_ODD. Also add status type
! out and help message to connect command.
!
! 2.0.044 By: Nick Bush On: 28-March-1984
! Fix SET SEND START_OF_PACKET to store in SND_SOH instead
! of RCV_SOH. Also, set TY_FIL false before calling FILE_OPEN
! to check for existence of send files.
!
! 3.0.045 Start of version 3.
!
! 3.0.046 By: Nick Bush On: 29-March-1984
! Fix debugging log file to correctly set/clear file open
! flag. Also make log files default to .LOG.
!
! 3.0.047 By: Nick Bush On: 30-March-1984
! Fix SEND command processing to save and restore the file
! specification over the call to FILE_OPEN, since FILE_OPEN
! rewrites it with the resulting file name, losing any
! wild-cards.
!
! 3.0.050 By: Nick Bush On: 2-April-1984
! Add SET SERVER_TIMER to determine period between idle naks.
! Also allow for a routine to process file specs before
! FILE_OPEN uses them. This allows individual sites to
! restrict the format of file specifications used by Kermit.
!
! 3.0.051 By: Nick Bush On: 2-April-1984
! Fix command scanning to correctly exit after performing
! a single command when entered with a command present.
!
! 3.1.052 By: Nick Bush On: 3-July-1984
! Fix KERCOM's definition of MAX_MSG to allow for all characters
! of packet to fit into buffers, not just the counted ones.
!
! 3.1.053 By: Robert C. McQueen On: 9-July-1984
! Fix FORTRAN carriage control processing to pass along
! any character from the carriage control column that is
! not really carriage control.
!
! 3.1.054 By: Nick Bush On: 13-July-1984
! Change TERM_OPEN to take an argument which determines
! whether it should post any QIO's. This makes it unnecessary
! for TERM_CONNECT to cancel the QIO's, and avoids problems
! with DECnet remote terminals.
!
! 3.1.055 By: Nick Bush On: 27-August-1984
! Clear out FILE_SIZE before processing a RECEIVE command to
! ensure that KERMSG doesn't perform a GET.
!
! 3.1.056 By: Nick Bush On: 28-August-1984
! Add a TAKE (or @) command. Also perform an initialization
! file on startup. This file is either VMSKERMIT.INI or
! whatever file is pointed to by the logical name VMSKERMIT.
!
! 3.1.057 By: Nick Bush On: 21-Feb-1985
! Determine VMS version on startup and remember for later
! use. Use it in KERSYS to determine whether we will need
! to force an end-of-file on the mailbox when the subprocess
! on the other end goes away.
!
! 3.1.060 By: Nick Bush On: 16-March-1985
! Increase size of terminal name buffers to account for large
! unit numbers (most likely seen with VTA's).
!
! 3.1.061 By: Nick Bush On: 16-March-1985
! Only attempt to set parity back when closing terminal.
!
! 3.1.062 By: Nick Bush On: 16-March-1985
! Previous edit broke remote commands - must post QIO's
! when opening terminals for these.
!
! 3.1.063 By: Nick Bush On: 16-March-1985
! Fix status command to output right headers over data.
!
! 3.1.064 By: Nick Bush On: 30-March-1985
! Fix LIB$SPAWN call to set SYS$INPUT for the subprocess
! to be NLA0: so that it doesn't try to input from the
! terminal.
!
! 3.1.065 By: Nick Bush On: 10-April-1985
! Split IBM handshaking from parity and local echo. Allow
! link time setting of IBM_MODE defaults by defining symbols:
!
! IBM_MODE_CHARACTER = character value of handshake character
! IBM_MODE_ECHO = 1 for local echo, 2 for no local echo
! IBM_MODE_PARITY = (0 = none), (1 = mark), (2 = even),
! (3 = odd), (4 = space).
!
! If not specified, Kermit will continue to use DC1, local echo
! and odd parity for IBM_MODE.
!
! 3.1.066 By: Nick Bush On: 22-April-1985
! Don't use NLA0: as SYS$INPUT when spawning things under VMS 3.
!
!
! Start version 3.2 on 8-May-1985
!
! 3.2.067 By: Robert McQueen On: 8-May-1985
! Use $GETJPIW and $GETDVIW instead of $GETJPI and $GETDVI.
! Module: KERTRM, KERFIL
!
! 3.2.070 By: Robert McQueen On: 17-Dec-1985
! Fix a problem with CRC calculations when 8 bit data and not
! 8 bit quoting.
!
! 3.2.071 By: Robert McQueen On: 11-March-1986
! Fix a problem were KERMSG didn't allow for a line termination
! character in the buffer.
!
! 3.2.072 By: Robert McQueen On: 11-March-1986
! Allow 0 as a valid value for SET SEND PADDING command.
!
! 3.2.073 By: Robert McQueen On: 11-March-1986
! Fix a problem restoring the terminal characteristics under
! VMS 4.x
!
! 3.2.074 By: Robert McQueen On: 11-March-1986
! Put MAX_MSG back the way it was and fix the problem correctly
! in KERMSG.
!
! 3.2.075 By: Robert McQueen On: 8-April-1986
! Change how the FINISH command works. Cause it to go back to
! the Kermit-32 prompt, not exit.
!
! 3.2.076 By: Robert McQueen On: 17-April-1986
! Set PASSTHRU in addition to everything else we change in VMSTRM.
!
! 3.2.077 By: Robert McQueen On: 8-May-1986
! FIX FORTRAN CC!! (Once and for all I hope)
!
! 3.2.100 By: Gregory P. Welsh On: 1-June-1986
! Add TRANSMIT command along with set SET/SHOW TRANSMIT ECHO
! and DELAY commands.
!
! Start of version 3.3
!
! 3.3.101 By: Robert C. McQueen On: 2-July-1986
! Change $TRNLOG system service calls to LIB$SYS_TRNLOG library
! routine. Handle no translation properly in VMSTRM.BLI.
!
! 3.3.102 By: Robert McQueen On: 5-July-1986
! Add changes/fixes suggested by Art Guion and David Deley for
! VMSTRM.BLI
! - Turn off FALLBACK terminal characteristics for eightbit
! operations.
! - Decrease IBM timeouts when waiting for a handshake.
!
! 3.3.103 By: Robert McQueen On: 5-July-1986
! Add changes/fixes suggested by David Deley for VMSMIT.BLI
! - Problem with an infinite loop getting a command.
!
! 3.3.104 By: Robert McQueen On: 5-July-1986
! Add changes/fixes suggested by Art Guion and David Deley for
! KERMSG.BLI.
! - Always attempt a handshake in IBM mode. Failing to handshake
! may cause 3704/5 style controller to hang a VM system.
! - Don't lose the last character in a buffer. BFR_FILL logic
! forgets to send the last cahracters of a file when it doesn't
! fit into the current packet.
!
! 3.3.105 By: Robert McQueen On: 8-July-1986
! Attempt to fix the truncation errors that we now get from
! LINK with BLISS-32 v4.2. Also do code clean up in VMSTRM and
! VMSFIL.
!
! 3.3.106 By: Robert McQueen On: 8-July-1986
! Fix problem of closing a fixed file and losing data.
!
! 3.3.107 By: Antonino N. Mione On: 8-Sep-1986
! Do not abort on ERROR packet while in SERVER mode. Instead,
! return to SERVER IDLE mode.
!
! 3.3.110 By: Antonino N. Mione On: 8-Sep-1986
! Make KERMIT-32 close the terminal (so the terminal
! parameters are appropriately reset) upon reciept of
! a GENERIC LOGOUT packet.
!
! 3.3.111 By: Robert McQueen On: 2-Oct-1986
! Make Kermit-32 not eat the parity from a CR if a LF doesn't
! follow it when writing an ASCII file.
!
! 3.3.112 JHW0001 Jonathan H. Welch, 28-Apr-1988 12:11
! Fix the message generated in NEXT_FILE so that the
! filenames displayed (i.e. Sending: foo.bar;1 as foo.bar)
! are always terminated by a null (ASCIZ).
!
! 3.3.113 JHW0002 Jonathan H. Welch, 5-May-1988 11:48
! Modified SY_TIME to use $GETTIM as opposed to the LIB$timer
! routines (which broke when their method of calculating
! time differences changed in V4.4?).
!
! Removed the call to LIB$INIT_TIMER in SY_INIT.
!
! 3.3.114 JHW003 Jonathan H. Welch, 6-May-1988 9:41
! Modified MAIN_ROUTINE to return the status code from
! COMND when exiting.
!
! Note: The error message codes returned are internal
! Kermit-32 error codes.
!
! 3.3.115 JHW004 Jonathan H. Welch, 9-May-1988
! Added the ability to send a break character to
! the outgoing terminal session using the sequence
! esc-chr B. The break will be sent after the next
! character arrives. This is because there must be
! no outstanding I/O on a channel in order to modify
! terminal characteristics (necessary to send a break).
!
! 3.3.116 JHW005 Jonathan H. Welch, 12-May-1988 8:35
! Modified COMND_HELP to look for the kermit help
! file called KERMIT_HELP or pointed to by the logical
! name KERMIT_HELP. Thus if a user wants to have the
! kermit help file in a directory other than SYS$HELP
! it is not necessary to define the logical name KERMIT
! (which causes problems: i.e. RUN KERMIT will fail).
!
! 3.3.117 JHW006 Jonathan H. Welch, 12-May-1988
! Calls to LIB$SIGNAL with multiple arguments were
! not coded correctly. For calls with multiple arguments
! an argument count was added.
! Minor changes to KERM_HANDLER to make use of the changed
! argument passing method.
!
! 3.3.118 By: Burt Johnson On: 1-Feb-1990
! Added support for Extended Length packets;
!
! 3.3.119 JHW007 Jonathan H. Welch, 4-Apr-1990 7:47
! Modified Final_Status to have an initial value of SS$_NORMAL.
! Previously, if all kermit operations were successful a
! return status of 0 was generated.
!
! Added a compile-time test for BLISS32 systems in the three
! generic bliss files (GLB, MSG, TT) which didn't have this
! declaration so that references to data use longword offsets.
! Burt Johnson's solution (PSECT PLIT = $CODE$) was generating
! many link-time errors.
!
! 3.3.120 JHW008 Jonathan H. Welch, 5-Apr-1990 10:57
! Modified the call to NORMALIZE_FILE in routine REC_FILE
! to adjust file name and type lengths downwards to 39
! characters each as opposed to the pre-VMS 4 format of
! 9 for the name and 3 for the type.
!
! 3.3.121 JHW009 Jonathan H. Welch, 12-Apr-1990 12:20
! Added and modified routines in vmstrm.bli to notify the
! user if SS$_HANGUP occurs on the outgoing terminal line.
! If the outgoing line is serviced by a decserver (LTA type
! terminal) the user must issue a CONNECT LTAnnn command
! to reestablish a LAT link to the decserver.
!
! 3.3.122 JHW010 Jonathan H. Welch, 23-Apr-1990 09:42
! Added SET FILE BLOCKSIZE nnn (where nnn is the record size
! in bytes) command for incoming BINARY and FIXED file transfers.
! If no blocksize has been specified the old behavior (510 byte
! records plus 2 bytes (for CR/LF) for BINARY files and 512
! byte records for FIXED files will be used.
! Also modified SHOW FILE to display record size when appropriate.
!
! 3.3.123 JHW011 Jonathan H. Welch, 17-May-1990 9:06
! Modified a miscoded call to send_packet in routine
! send_gencmd to correctly specify the length of the
! response packet to transmit. This miscoding only
! affected long packet support, in particular, when
! GETting files standard length packets were being used
! when long packet support was available in both kermit
! programs.
!
! 3.3.124 JHW012 Jonathan H. Welch, 18-May-1990 7:56
! Modified asn_wth_mbx to obtain the master PID in the
! process tree before asking for JPI$_TERMINAL. $GETJPI
! was returning a null string for this item when called
! from a subprocess resulting in a "No default terminal
! line for transfers" message.
!
! 3.3.125 JHW013 Jonathan H. Welch, 18-May-1990 13:00
! Extended the buffer size for terminal names from 20
! characters to 255 to make sure any terminal name can
! be accomodated.
!
! 3.3.126 JHW014 Jonathan H. Welch, 5-Jun-1990 12:38
! Modified asn_wth_mbx to add a ':' to the end of the
! terminal name is one is not returned by VMS.
! This will keep LIB$GETDVI from failing with an
! "invalid device name" which results in the kermit
! error "no default terminal line for transfers."
!
! 3.3.127 JHW015 Jonathan H. Welch, 16-Jul-1990 15:30
! Fixed the logic in GET_ASCII which was causing an infinite
! loop for files with print file carriage control.
!
! 3.3.128 JHW016 Jonathan H. Welch, 17-Oct-1990 9:42
! Modified asn_wth_mbx to work properly in non-interactive mode.
!--
%SBTTL 'Routine definitions -- Forwards'
!<BLF/NOFORMAT>
!
! Forward definitions
!
! Command processing routines
FORWARD ROUTINE
COMND, ! Process a command
COMND_ERROR : NOVALUE, ! Give error for command
COMND_FILE, ! Process command file
DO_COMND, ! Parse and dispatch one command
COMND_HELP : NOVALUE, ! Process the HELP command
COMND_SHOW : NOVALUE, ! Process the SHOW command
COMND_STATUS : NOVALUE, ! Process the STATUS command
COMND_REMOTE : NOVALUE, ! Process the REMOTE command
COMND_LOCAL : NOVALUE, ! Process the LOCAL commands
GET_REM_ARGS, ! Get arguments for REMOTE/LOCAL commands
STORE_TEXT, ! Routine to store a file name
COPY_TERM_NAME, ! Copy device name (TERM_xxxx)
COPY_DESC, ! Copy file name (FILE_xxx)
COPY_ALT_FILE, ! Copy to alternate file name (ALT_FILE_xxx)
COPY_GEN_1DATA, ! Copy to GEN_1DATA (generic command argument)
STORE_BLOCKSIZE, ! Store the blocksize value
STORE_DEBUG, ! Store the debuging flag
STORE_TR_ECHO, ! Store the transmit echo flag [078]
STORE_TR_DELAY, ! Store the transmit delay [078]
STORE_FTP, ! Store the file type
STORE_FNM, ! Store the file name form
STORE_ECHO, ! Store the local echo flag
STORE_PARITY, ! Store the parity type
STORE_CHK, ! This routine will store the checksum type.
STORE_ABT, ! This routine will store the aborted file disposition
STORE_IBM, ! Store IBM flag
STORE_MSG_FIL, ! Store TY_FIL
STORE_MSG_PKT, ! Store TY_PKT
CHECK_PACKET_LEN, ! Validate PACKET length given
CHECK_NPAD, ! Validate the number of pad characters
CHECK_PAD_CHAR, ! Validate the padding character being set
CHECK_EOL, ! Validate EOL character given.
CHECK_QUOTE, ! Validate quoting character
CHECK_SOH, ! Validate the start of packet character given
KEY_ERROR; ! Return correct keyword error value
!
! Error handling routines
!
FORWARD ROUTINE
KERM_HANDLER; ! Condition handler
%SBTTL 'Include files'
!
! INCLUDE FILES:
!
LIBRARY 'SYS$LIBRARY:STARLET';
LIBRARY 'SYS$LIBRARY:TPAMAC';
REQUIRE 'KERCOM'; ! Common definitions
REQUIRE 'KERERR'; ! Error message symbol definitions
%SBTTL 'Macro definitions'
!
! MACROS:
!
MACRO
TPARSE_ARGS =
BUILTIN AP;
MAP AP : REF BLOCK [,BYTE];
%;
!
! Macro to initialize a string descriptor
!
MACRO
INIT_STR_DESC (DESC, BUFFER, SIZE) =
BEGIN
! MAP
! DESC : BLOCK [8, BYTE];
DESC [DSC$B_CLASS] = DSC$K_CLASS_S;
DESC [DSC$B_DTYPE] = DSC$K_DTYPE_T;
DESC [DSC$W_LENGTH] = SIZE;
DESC [DSC$A_POINTER] = BUFFER;
END
%;
%SBTTL 'Equated symbols -- Command types'
!
! EQUATED SYMBOLS:
!
! Command offsets
LITERAL
CMD_MIN = 1, ! Minimum value
CMD_CONN = 1, ! Connect command
CMD_EXIT = 2, ! Exit command
CMD_HELP = 3, ! Help command
CMD_RECEIVE = 4, ! Receive command
CMD_SET = 5, ! Set command
CMD_SEND = 6, ! Send command
CMD_SHOW = 7, ! Show command
CMD_SERVER = 8, ! SERVER command
CMD_STATUS = 9, ! STATUS command
CMD_LOGOUT = 10, ! Generic LOGOUT command
CMD_BYE = 11, ! Generic LOGOUT command and EXIT
CMD_FINISH = 12, ! Generic EXIT command
CMD_GET = 13, ! Get command
CMD_REMOTE = 14, ! Remote command
CMD_LOCAL = 15, ! Local command
CMD_PUSH = 16, ! PUSH command (spawn new DCL)
CMD_NULL = 17, ! Any command which is done
! totally by the LIB$TPARSE call
CMD_TAKE = 18, ! Take command
CMD_TRANSMIT = 19, ! Transmit command [078]
CMD_MAX = 19; ! Maximum command value [078]
! Items to show
LITERAL
SHOW_ALL = 1, ! Show everything
SHOW_DEB = 2, ! Show debugging flag
SHOW_DEL = 3, ! Show delay
SHOW_ESC = 4, ! Show ESCAPE character
SHOW_TIM = 5, ! Show random timing
SHOW_LIN = 6, ! Show the line we are using
SHOW_ECH = 7, ! Show the echo flag
SHOW_SEN = 8, ! Show send parameters
SHOW_REC = 9, ! Show the receive parameters
SHOW_PAR = 10, ! Show the parity setting
SHOW_RTY = 11, ! Show retry counters
SHOW_CHK = 12, ! Show block-check-type
SHOW_ABT = 13, ! Show aborted file disposition
SHOW_FIL = 14, ! Show file parameters
SHOW_PAC = 15, ! Show packet parameters
SHOW_COM = 16, ! Show communications parameters
SHOW_VER = 17, ! Show version
SHOW_TRN = 18; ! Show transmit delay and echo
%SBTTL 'Equated symbols -- Constants'
! Constants
LITERAL
CMD_BFR_LENGTH = 132, ! Command buffer length
OUT_BFR_LENGTH = 80, ! Output buffer length (SHOW cmd)
HELP_LENGTH = 132, ! Length of the help buffer
TEMP_LENGTH = 132; ! Length of the temporary area
!
! The default prompt
!
BIND
DEFAULT_PROMPT = %ASCID'Kermit-32>';
MAP
DEFAULT_PROMPT : BLOCK [8, BYTE]; ! This is a descriptor
%SBTTL 'Storage -- Global'
!<BLF/NOFORMAT>
!
! GLOBAL STORAGE:
!
GLOBAL
TRANSACTION_DESC : BLOCK [8, BYTE], ! Descriptor for transaction log file
TRANSACTION_OPEN, ! File open flag
TRANSACTION_FAB : $FAB_DECL, ! Transaction file FAB
TRANSACTION_RAB : $RAB_DECL, ! Transaction file RAB
ESCAPE_CHR, ! Escape character for CONNECT
ALT_FILE_SIZE, ! Number of characters in FILE_NAME
ALT_FILE_NAME : VECTOR [CH$ALLOCATION (MAX_FILE_NAME)]; ! Storage
%SBTTL 'Storage -- Local'
!
! OWN STORAGE:
!
OWN
! Command scanning information
TPARSE_BLOCK : BLOCK [TPA$K_LENGTH0, BYTE]
INITIAL (TPA$K_COUNT0, ! Longword count
TPA$M_ABBREV), ! Allow abbreviations
BAD_CMD_DESC : BLOCK [8, BYTE], ! Descriptor for bad command field
COMMAND, ! Type of command we are doing
SHOW_TYPE, ! Type of show command
REM_TYPE, ! Type of REMOTE command
TAKE_DISPLAY, ! Display commands being TAKEn
!
! Output data area
!
OUTPUT_LINE : VECTOR [OUT_BFR_LENGTH, BYTE, UNSIGNED],
OUTPUT_DESC : BLOCK [8, BYTE],
OUTPUT_SIZE : WORD UNSIGNED,
! Misc constants.
Final_Status : LONG UNSIGNED INITIAL(SS$_NORMAL), ! Status from within condition handler routine.
TRANSACTION_NAME : VECTOR [CH$ALLOCATION(MAX_FILE_NAME)],
PROMPT_DESC : BLOCK [8, BYTE], ! Descriptor for prompt
PROMPT_TEXT : VECTOR [CH$ALLOCATION(TEMP_LENGTH)], ! Storage for prompt
CRC_TABLE : BLOCK [16, LONG], ! CRC-CCITT table
TAK_FIL_DESC : BLOCK [8, BYTE], ! Take file descriptor
TAK_FIL_NAME : BLOCK [CH$ALLOCATION(MAX_FILE_NAME)],
TEMP_DESC : BLOCK [8, BYTE], ! Temporary descriptor
TEMP_NAME : VECTOR [CH$ALLOCATION(TEMP_LENGTH)];
!<BLF/FORMAT>
%SBTTL 'External routines'
!
! EXTERNAL REFERENCES:
!
EXTERNAL ROUTINE
!
! Library routines
!
LIB$GET_INPUT : ADDRESSING_MODE (GENERAL),
LIB$PUT_OUTPUT : ADDRESSING_MODE (GENERAL),
LIB$TPARSE : ADDRESSING_MODE (GENERAL),
LIB$CRC_TABLE : ADDRESSING_MODE (GENERAL),
LIB$CRC : ADDRESSING_MODE (GENERAL),
LIB$SIGNAL : ADDRESSING_MODE (GENERAL) NOVALUE,
LIB$ESTABLISH : ADDRESSING_MODE (GENERAL),
LIB$ATTACH : ADDRESSING_MODE (GENERAL),
LIB$SPAWN : ADDRESSING_MODE (GENERAL),
!
! KERMSG - KERMIT Message processing routines
!
SEND_SWITCH, ! Send a file
REC_SWITCH, ! Receive a file
DO_GENERIC, ! Send generic functions
SERVER, ! Server mode processing
SND_ERROR : NOVALUE, ! Send E packet to remote
MSG_INIT : NOVALUE, ! Initialization routine
!
! KERFIL - File processing.
!
FILE_INIT : NOVALUE, ! Initialization routine
!
! KERSYS - System subroutines for KERMSG
!
SY_INIT : NOVALUE, ! Initialization routine
!
! KERTRM - Terminal processing.
!
TERM_INIT : NOVALUE, ! Initialize the terminal processing
TERM_OPEN, ! Open the terminal line
TERM_CLOSE, ! Close the terminal line
TERM_CONNECT, ! Impliments CONNECT command
SET_TRANS_TERM, ! Set new transfer terminal
COMND_TRANSMIT, ! Transmit command code in module KERTRM
!
! KERTT - Text processing
!
TT_INIT : NOVALUE, ! Initialization routine
TT_TEXT : NOVALUE, ! Output a text string
TT_NUMBER : NOVALUE, ! Output a number
TT_CHAR : NOVALUE, ! Output a single character
TT_OUTPUT : NOVALUE, ! Routine to dump the current
! text line.
TT_CRLF : NOVALUE; ! Output the line
%SBTTL 'External storage'
!
! EXTERNAL Storage:
!
EXTERNAL
!
! KERMSG storage
!
! Receive parameters
RCV_PKT_SIZE, ! Receive packet size
RCV_NPAD, ! Padding length
RCV_PADCHAR, ! Padding character
RCV_TIMEOUT, ! Time out
RCV_EOL, ! EOL character
RCV_QUOTE_CHR, ! Quote character
RCV_8QUOTE_CHR, ! 8-bit quoting character
RCV_SOH, ! Start of packet header
!
! Send parameters
!
SND_PKT_SIZE, ! Send packet size
SND_NPAD, ! Padding length
SND_PADCHAR, ! Padding character
SND_TIMEOUT, ! Time out
SND_EOL, ! EOL character
SND_QUOTE_CHR, ! Quote character
SND_SOH, ! Packet start of header
!
! Server parameters
!
SRV_TIMEOUT, ! Time between idle naks in server
!
! Misc. packet parameters
!
SET_REPT_CHR, ! Desired repeat character
!
! Statistics
!
SND_TOTAL_CHARS, ! Total characters sent
RCV_TOTAL_CHARS, ! Total characters received
SND_DATA_CHARS, ! Total number of data characters sent
RCV_DATA_CHARS, ! Total number of data characters received
SMSG_TOTAL_CHARS, ! Total chars sent this file xfer
RMSG_TOTAL_CHARS, ! Total chars rcvd this file xfer
SMSG_DATA_CHARS, ! Total data chars this file xfer
RMSG_DATA_CHARS, ! Total data chars this file xfer
RCV_NAKS, ! Total number of NAKs received
SND_NAKS, ! Total number of NAKs sent
RMSG_NAKS, ! Number of NAKs received
SMSG_NAKS, ! Number of NAKs sent
RCV_COUNT, ! Total number of packets received
SND_COUNT, ! Total number of packets sent
RMSG_COUNT, ! Number of packets received
SMSG_COUNT, ! Number of packets sent
XFR_TIME, ! Amount of time the last transfer took
TOTAL_TIME, ! Total time the transfers have taken
LAST_ERROR : VECTOR [CH$ALLOCATION (MAX_MSG + 1)], ! Last error message
TY_PKT, ! Flag that packet numbers should be typed
TY_FIL, ! Flag that file names should be typed
GEN_1DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Data for generic command
GEN_1SIZE, ! Size of data in GEN_1DATA
GEN_2DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Second argument for generic command
GEN_2SIZE, ! Size of data in GEN_2DATA
GEN_3DATA : VECTOR [CH$ALLOCATION (MAX_MSG)], ! Third arg for generic command
GEN_3SIZE, ! Size of data in GEN_3DATA
!
! Misc constants.
!
FILE_SIZE, ! Number of characters in FILE_NAME
FILE_NAME : VECTOR [CH$ALLOCATION (MAX_FILE_NAME)],
SI_RETRIES, ! Initial connection max retries
PKT_RETRIES, ! Packet max retries
DELAY, ! Amount of time to delay
DEBUG_FLAG, ! Debugging mode on/off
CHKTYPE, ! Type of block-check-type wanted
ABT_FLAG, ! Aborted file disposition
! IBM_FLAG, ! IBM mode flag
IBM_CHAR, ! Handshaking character
WARN_FLAG, ! File warning flag
FIL_NORMAL_FORM, ! File name type to send
PARITY_TYPE, ! Type of parity we are using
ECHO_FLAG, ! Local echo flag
CONNECT_FLAG; ! True if SYS$OUTPUT and line
! xfering over are the same.
!
! KERFIL storage
!
EXTERNAL
file_blocksize, ! Blocksize for FIXED files
file_blocksize_set, ! Flag indicating a blocksize has been specified by the user.
FILE_TYPE, ! Type of file being processed
FILE_DESC : BLOCK [8, BYTE]; ! Descriptor for the file name
!
! KERTRM storage
!
EXTERNAL
SESSION_DESC : BLOCK [8, BYTE], ! Session log file name
DEBUG_DESC : BLOCK [8, BYTE], ! Debugging log file name
TERM_DESC : BLOCK [8, BYTE], ! Terminal name descriptor
TRANS_ECHO_FLAG, ! Transmit echo on/off
TRANS_DELAY, ! Transmit delay
TERM_FLAG; ! Terminal open flag
%SBTTL 'Command parsing tables'
!<BLF/NOFORMAT>
!++
!
!The following are the command state tables for the KERMIT-32
!command processing.
!
!--
$INIT_STATE (KERMIT_STATE, KERMIT_KEY);
$STATE (START,
('BYE', DONE_STATE, , CMD_BYE, COMMAND),
('CONNECT', CONN_STATE, , CMD_CONN, COMMAND),
('EXIT', DONE_STATE, , CMD_EXIT, COMMAND),
('FINISH', DONE_STATE, , CMD_FINISH, COMMAND),
('GET', GET_STATE, , CMD_GET, COMMAND),
('HELP', HELP_STATE, , CMD_HELP, COMMAND),
('LOCAL', REM_STATE, , CMD_LOCAL, COMMAND),
('LOG', LOG_STATE, , CMD_NULL, COMMAND),
('LOGOUT', DONE_STATE, , CMD_LOGOUT, COMMAND),
('PUSH', DONE_STATE, , CMD_PUSH, COMMAND),
('QUIT', DONE_STATE, , CMD_EXIT, COMMAND),
('RECEIVE', REC_STATE, , CMD_RECEIVE, COMMAND),
('REMOTE', REM_STATE, , CMD_REMOTE, COMMAND),
('SET', SET_STATE, , CMD_SET, COMMAND),
('SEND', SEND_STATE, , CMD_SEND, COMMAND),
('SERVER', DONE_STATE, , CMD_SERVER, COMMAND),
('SHOW', SHOW_STATE, , CMD_SHOW, COMMAND),
('STATUS', DONE_STATE, , CMD_STATUS, COMMAND),
('TAKE', TAKE_STATE, , CMD_TAKE, COMMAND),
('@', TAKE_STATE, , CMD_TAKE, COMMAND),
('TRANSMIT', TRANSMIT_STATE, , CMD_TRANSMIT, COMMAND), !
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
! CONNECT command. Format is:
!
! Kermit-32>CONNECT device
!
! Where:
! Device - Terminal line to connect to
!
!--
$STATE (CONN_STATE,
(TPA$_EOS, DONE_STATE),
(TPA$_LAMBDA, SET_LIN_STATE)
)
!++
! EXIT command. Format is:
!
! Kermit-32>EXIT
!
! Just exit back to VMS.
!
!--
!++
! HELP command. Format is:
!
! Kermit-32>HELP
!
! Do HELP processing for KERMIT-32.
!
!--
$STATE (HELP_STATE,
(TPA$_ANY, HELP_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE)
)
%SBTTL 'QUIT command table'
!++
! QUIT command. Format is:
!
! Kermit-32>QUIT
!
! This command will just exit back to VMS.
!
!--
%SBTTL 'GET command table'
!++
! GET command. Format is:
!
! Kermit-32>GET file-specification
!
! This command will cause KERMIT to get a file from the micro.
! It will assume that it is to used what ever line it currently is
! associated with (CONNECT or SET LINE).
!
!--
$STATE (GET_STATE,
(TPA$_ANY, GET_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_DESC, , ,FILE_DESC)
)
%SBTTL 'RECEIVE command table'
!++
! RECEIVE command. Format is:
!
! Kermit-32>RECEIVE file-specification
!
! This command will cause KERMIT to receive a file from the micro.
! It will assume that it is to used what ever line it currently is
! associated with (CONNECT or SET LINE).
!
!--
$STATE (REC_STATE,
(TPA$_ANY, REC1_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE)
)
$STATE (REC1_STATE,
(TPA$_ANY, REC1_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_ALT_FILE)
)
%SBTTL 'REMOTE command tables'
!++
! REMOTE command. This command will allow the local Kermit user to
! request the server Kermit to perform some action.
!
! Kermit-32>REMOTE keyword arguments
!
! Where:
!
! Keyword is one of:
! DELETE
! DIRECTORY
! DISK_USAGE
! HELP
! SPACE
! TYPE
!--
$STATE (REM_STATE,
('COPY', REM2_STATE, ,GC_COPY, REM_TYPE),
('CWD', REM1_STATE, ,GC_CONNECT, REM_TYPE),
('DELETE', REM2_STATE, ,GC_DELETE, REM_TYPE),
('DIRECTORY', REM1_STATE, ,GC_DIRECTORY, REM_TYPE),
('DISK_USAGE', REM1_STATE, ,GC_DISK_USAGE, REM_TYPE),
('EXIT', DONE_STATE, ,GC_EXIT, REM_TYPE),
('HELP', REM1_STATE, ,GC_HELP, REM_TYPE),
('HOST', REM2_STATE, ,GC_COMMAND, REM_TYPE),
('LOGIN', REM2_STATE, ,GC_LGN, REM_TYPE),
('LOGOUT', DONE_STATE, ,GC_LOGOUT, REM_TYPE),
('RENAME', REM2_STATE, ,GC_RENAME, REM_TYPE),
('SEND_MESSAGE',REM2_STATE, ,GC_SEND_MSG, REM_TYPE),
('SPACE', REM1_STATE, ,GC_DISK_USAGE, REM_TYPE),
('STATUS', DONE_STATE, ,GC_STATUS, REM_TYPE),
('TYPE', REM2_STATE, ,GC_TYPE, REM_TYPE),
('WHO', REM1_STATE, ,GC_WHO, REM_TYPE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
! State to allow for either no arguments or a text string
$STATE (REM1_STATE,
(TPA$_ANY, REM2_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE)
)
! State to require a text string argument
$STATE (REM2_STATE,
(TPA$_ANY, REM2_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_GEN_1DATA)
)
%SBTTL 'SET command tables'
!++
! SET command. Format is:
!
! Kermit-32>SET parameter
!
! Where:
! Parameter - One of many keywords
!
!--
$STATE (SET_STATE,
('BLOCK_CHECK_TYPE', SET_CHK_STATE),
('DEBUGGING', SET_DEB_STATE),
('DELAY', SET_DEL_STATE),
('ESCAPE', SET_ESC_STATE),
('FILE', SET_FIL_STATE),
('HANDSHAKE', SET_HAN_STATE),
('IBM_MODE', SET_IBM_STATE),
('INCOMPLETE_FILE_DISPOSITION', SET_ABT_STATE),
('LINE', SET_LIN_STATE),
('LOCAL_ECHO', SET_ECH_STATE),
('MESSAGE', SET_MSG_STATE),
('PARITY', SET_PAR_STATE),
('PROMPT', SET_PMT_STATE),
('RECEIVE', SET_REC_STATE),
('REPEAT_QUOTE',SET_RPT_STATE),
('RETRY', SET_RTY_STATE),
('SEND', SET_SND_STATE),
('SERVER_TIMER',SET_SRV_STATE),
('TRANSMIT', SET_TRN_STATE), !
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET INCOMPLETE_FILE [disposition] command. The possible arguments are
! KEEP or DISCARD.
!
!--
$STATE (SET_ABT_STATE,
('DISCARD', DONE_STATE, STORE_ABT,, ,TRUE),
('KEEP', DONE_STATE, STORE_ABT,, ,FALSE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET BLOCK_CHECK_TYPE [type] command. The format is:
!
! Kermit-32>SET BLOCK_CHECK_TYPE [1_CHARACTER_CHECKSUM | ....]
!
!--
$STATE (SET_CHK_STATE,
('1_CHARACTER_CHECKSUM', DONE_STATE, STORE_CHK,, ,CHK_1CHAR),
('2_CHARACTER_CHECKSUM', DONE_STATE, STORE_CHK,, ,CHK_2CHAR),
('3_CHARACTER_CRC_CCITT', DONE_STATE, STORE_CHK,, ,CHK_CRC),
('ONE_CHARACTER_CHECKSUM', DONE_STATE, STORE_CHK,, ,CHK_1CHAR),
('THREE_CHARACTER_CRC_CCITT', DONE_STATE, STORE_CHK,, ,CHK_CRC),
('TWO_CHARACTER_CHECKSUM', DONE_STATE, STORE_CHK,, ,CHK_2CHAR),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET DEBUGGING command. The format is:
!
! Kermit-32>SET DEBUGGING (on/off)
!
! Where:
! on/off is either the ON or OFF keyword.
!
!--
$STATE (SET_DEB_STATE,
('OFF', DONE_STATE, STORE_DEBUG, , ,FALSE),
('ON', DONE_STATE, STORE_DEBUG, , ,TRUE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET IBM_MODE command. The format is:
!
! Kermit-32>SET IBM_MODE (on/off)
!
! Where:
! on/off is either the ON or OFF keyword.
!
!--
$STATE (SET_IBM_STATE,
('OFF', DONE_STATE, STORE_IBM, , ,FALSE),
('ON', DONE_STATE, STORE_IBM, , ,TRUE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET HANDSHAKE command. The format is:
!
! Kermit-32>SET HANDSHAKE <octal>
!
! Where:
! <octal> is the octal number representing the handshake character
! for file transfers.
!
! Negative values indicate no handshaking.
!--
$STATE (SET_HAN_STATE,
('NONE', DONE_STATE, , -1 ,IBM_CHAR),
(TPA$_OCTAL, DONE_STATE, , ,IBM_CHAR)
)
!++
!
! SET DELAY command. The format is:
!
! Kermit-32>SET DELAY <dec>
!
! Where:
! <dec> is the number of seconds to delay before sending the
! SEND-INIT packet.
!--
$STATE (SET_DEL_STATE,
(TPA$_DECIMAL, DONE_STATE, , ,DELAY)
)
!++
!
! SET FILE BLOCKSIZE command. The format is:
!
! Kermit-32>SET FILE BLOCKSIZE <size>
!
! Where:
! <size> is the number of bytes per fixed-length record for BINARY
! and FIXED files.
!--
$STATE (SET_BLK_STATE,
(TPA$_DECIMAL, DONE_STATE, store_blocksize, , file_blocksize)
)
!++
!
! SET ESCAPE command. The format is:
!
! Kermit-32>SET ESCAPE <octal>
!
! Where:
! <octal> is the octal number representing the escape character
! for the CONNECT command processing. The default escape character
! is Control-].
!--
$STATE (SET_ESC_STATE,
(TPA$_OCTAL, DONE_STATE, , ,ESCAPE_CHR)
)
!++
!
! SET FILE xxx command. The format is:
!
! Kermit-32>SET FILE <item> <args>
!
! Where:
! <item> is one of:
! NAMING - Type of file name to send
! TYPE - Type of file to create on receive (or send in certain cases)
! BLOCKSIZE - Size of blocks (in bytes) for (FIXED and BINARY
! type) output files.
!
!--
$STATE (SET_FIL_STATE,
('NAMING', SET_FNM_STATE),
('TYPE', SET_FTP_STATE),
('BLOCKSIZE', SET_BLK_STATE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET FILE NAMING command. The format is:
!
! Kermit-32>SET FILE NAMING <type>
!
! Where:
! <type> is one of:
! FULL - Send complete file specification, including device and
! directory
! NORMAL_FORM - Send only name.type
! UNTRANSLATED - Send name.type, but don't do any fixups on it
!--
$STATE (SET_FNM_STATE,
('FULL', DONE_STATE, STORE_FNM, , ,FNM_FULL),
('NORMAL_FORM', DONE_STATE, STORE_FNM, , ,FNM_NORMAL),
('UNTRANSLATED',DONE_STATE, STORE_FNM, , ,FNM_UNTRAN),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET FILE TYPE command. The format is:
!
! Kermit-32>SET FILE TYPE <type>
!
! Where:
! <Type> is one of the following:
! ASCII - Normal ASCII file (stream ascii)
! BINARY - Micro binary file.
!--
$STATE (SET_FTP_STATE,
('ASCII', DONE_STATE, STORE_FTP, , ,FILE_ASC),
('BINARY', DONE_STATE, STORE_FTP, , ,FILE_BIN),
('BLOCK', DONE_STATE, STORE_FTP, , ,FILE_BLK),
('FIXED', DONE_STATE, STORE_FTP, , ,FILE_FIX),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
! SET LINE command. Format is:
!
! Kermit-32>SET LINE terminal-device:
!
! Where:
! Terminal-device: is the terminal line to use to the transfer of
! the data and to use in the CONNECT command.
!
!--
$STATE (SET_LIN_STATE,
(TPA$_ANY, SET_LIN_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_TERM_NAME)
)
!++
! SET LOCAL-ECHO command. Format is:
!
! Kermit-32>SET LOCAL-ECHO state
!
! Where:
! STATE is either the keyword ON or OFF.
!
!-
$STATE (SET_ECH_STATE,
('OFF', DONE_STATE, STORE_ECHO, , ,FALSE),
('ON', DONE_STATE, STORE_ECHO, , ,TRUE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
! SET MESSAGE command. Format is:
!
! Kermit-32>SET MESSAGE <keyword>
!
! Where the keyword is:
!
! FILE_NAMES - Type out file names being transferred
! PACKET_NUMBERS - Type out packet counts
!--
$STATE (SET_MSG_STATE,
('FILE_NAMES', SET_MSG_FIL_STATE),
('PACKET_NUMBERS', SET_MSG_PKT_STATE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
$STATE (SET_MSG_FIL_STATE,
('OFF', DONE_STATE, STORE_MSG_FIL, , ,FALSE),
('ON', DONE_STATE, STORE_MSG_FIL, , ,TRUE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
$STATE (SET_MSG_PKT_STATE,
('OFF', DONE_STATE, STORE_MSG_PKT, , ,FALSE),
('ON', DONE_STATE, STORE_MSG_PKT, , ,TRUE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
! SET PROMPT command.
!
! Kermit-32>SET PROMPT new-prompt-text
!
!--
$STATE (SET_PMT_STATE,
(TPA$_ANY, SET_PMT_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_DESC, , ,PROMPT_DESC)
)
!++
! SET REPEAT_QUOTE command. Format is:
!
! Kermit-32>SET REPEAT_QUOTE <character value>
!
!--
$STATE (SET_RPT_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_QUOTE, ,SET_REPT_CHR)
)
!++
! SET RETRY command. Format is:
!
! Kermit-32>SET RETRY <keyword>
!
! Where the keyword is:
!
! INITIAL_CONNECTION - set number of initial connection retries.
! PACKET - set the number of packet retries.
!--
$STATE (SET_RTY_STATE,
('INITIAL_CONNECTION', SET_RTY_INI_STATE),
('PACKET', SET_RTY_PKT_STATE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
$STATE (SET_RTY_INI_STATE,
(TPA$_DECIMAL, DONE_STATE, , ,SI_RETRIES)
)
$STATE (SET_RTY_PKT_STATE,
(TPA$_DECIMAL, DONE_STATE, , ,PKT_RETRIES)
)
%SBTTL 'SET PARITY type'
!++
! SET PARITY command. Format is:
!
! Kermit-32>SET PARITY type
!
! The type can be:
!
! NONE - No parity processing
! MARK - Mark parity
! SPACE - Space parity
! EVEN - Even parity
! ODD - Odd parity
!
!--
$STATE (SET_PAR_STATE,
('EVEN', DONE_STATE, STORE_PARITY, , ,PR_EVEN),
('MARK', DONE_STATE, STORE_PARITY, , ,PR_MARK),
('NONE', DONE_STATE, STORE_PARITY, , ,PR_NONE),
('ODD', DONE_STATE, STORE_PARITY, , ,PR_ODD),
('SPACE', DONE_STATE, STORE_PARITY, , ,PR_SPACE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
%SBTTL 'SET RECEIVE table'
!++
! SET RECEIVE command. Format is:
!
! Kermit-32>SET RECEIVE item
!
! Where:
! Item - One of the following:
! PACKET-LENGTH <dec>
! PADDING <dec>
! PADCHAR <chr>
! TIMEOUT <dec>
! END-OF-LINE <oct>
! QUOTE <chr>
!
!--
$STATE (SET_REC_STATE,
('EIGHT-BIT-QUOTE', SR_8QU_STATE),
('END_OF_LINE', SR_EOL_STATE),
('PACKET_LENGTH', SR_PKT_STATE),
('PADCHAR', SR_PDC_STATE),
('PADDING', SR_PAD_STATE),
('QUOTE', SR_QUO_STATE),
('START_OF_PACKET', SR_SOH_STATE),
('TIMEOUT', SR_TIM_STATE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET RECEIVE PACKET-LENGTH command. Format is:
!
! Kermit-32>SET RECEIVE PACKET-LENGTH <dec>
!
! Where:
! <Dec> is a decimal number that specifies the length of a
! receive packet.
!
!--
$STATE (SR_PKT_STATE,
(TPA$_DECIMAL, DONE_STATE, CHECK_PACKET_LEN, ,RCV_PKT_SIZE)
)
!++
!
! SET RECEIVE PADDING command. The format of this command is:
!
! Kermit-32>SET RECEIVE PADDING <dec>
!
! Where:
! <dec> is the decimal number of padding characters to output.
!
!--
$STATE (SR_PAD_STATE,
(TPA$_DECIMAL, DONE_STATE, CHECK_NPAD, ,RCV_NPAD)
)
!++
!
! SET RECEIVE PADCHAR command. Format is:
!
! Kermit-32>SET RECEIVE PADCHAR <oct>
!
! Where:
! <oct> is the octal representation of the padding character
! that is to be used.
!
!--
$STATE (SR_PDC_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_PAD_CHAR, ,RCV_PADCHAR)
)
!++
!
! SET RECEIVE START_OF_PACKET command. Format is:
!
! Kermit-32>SET RECEIVE START_OF_PACKET <oct>
!
! Where:
! <oct> is the octal representation of the padding character
! that is to be used.
!
!--
$STATE (SR_SOH_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_SOH, ,RCV_SOH)
)
!++
!
! SET RECEIVE TIMEOUT command. The format is:
!
! Kermit-32>SET RECEIVE TIMEOUT <dec>
!
! Where:
! <dec> is the number of seconds before KERMIT-32 should time out
! attempting to receive a correct message.
!
!--
$STATE (SR_TIM_STATE,
(TPA$_DECIMAL, DONE_STATE, , ,RCV_TIMEOUT)
)
!++
! SET END-OF-LINE command. Format is:
!
! Kermit-32>SET RECEIVE END-OF-LINE <octal>
!
! Where:
! <octal> is the octal number representation of the character
! that is the end of line character.
!
!--
$STATE (SR_EOL_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_EOL, ,RCV_EOL)
)
!++
! SET RECEIVE QUOTE command. The format is:
!
! Kermit-32>SET RECEIVE QUOTE <octal>
!
! Where:
! <octal> is the octal number representing the quoting character.
!
!--
$STATE (SR_QUO_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_QUOTE, ,RCV_QUOTE_CHR)
)
%SBTTL 'SET RECEIVE EIGHT-BIT-QUOTE'
!++
! This routine will handle the setting of the eight bit quoting character.
!
! Kermit-32>SET RECEIVE EIGHT-BIT-QUOTE <octal>
!
! Where:
! <octal> is the octal number representing the quoting character.
!
!--
$STATE (SR_8QU_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_QUOTE, ,RCV_8QUOTE_CHR)
)
%SBTTL 'SET SEND tables'
!++
! SET SEND command. Format is:
!
! Kermit-32>SET SEND item
!
! Where:
! Item - One of the following:
! PACKET-LENGTH <dec>
! PADDING <dec>
! PADCHAR <chr>
! TIMEOUT <dec>
! END-OF-LINE <oct>
! QUOTE <chr>
!
!--
$STATE (SET_SND_STATE,
('END_OF_LINE', SS_EOL_STATE),
('PACKET_LENGTH', SS_PKT_STATE),
('PADCHAR', SS_PDC_STATE),
('PADDING', SS_PAD_STATE),
('QUOTE', SS_QUO_STATE),
('START_OF_PACKET', SS_SOH_STATE),
('TIMEOUT', SS_TIM_STATE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
!++
!
! SET SEND PACKET-LENGTH command. Format is:
!
! Kermit-32>SET SEND PACKET-LENGTH <dec>
!
! Where:
! <Dec> is a decimal number that specifies the length of a
! receive packet.
!
!--
$STATE (SS_PKT_STATE,
(TPA$_DECIMAL, DONE_STATE, CHECK_PACKET_LEN, ,SND_PKT_SIZE)
)
!++
!
! SET SEND PADDING command. The format of this command is:
!
! Kermit-32>SET SEND PADDING <dec>
!
! Where:
! <dec> is the decimal number of padding characters to output.
!
!--
$STATE (SS_PAD_STATE,
(TPA$_DECIMAL, DONE_STATE, CHECK_NPAD, ,SND_NPAD)
)
!++
!
! SET SEND PADCHAR command. Format is:
!
! Kermit-32>SET SEND PADCHAR <oct>
!
! Where:
! <oct> is the octal representation of the padding character
! that is to be used.
!
!--
$STATE (SS_PDC_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_PAD_CHAR, ,SND_PADCHAR)
)
!++
!
! SET RECEIVE START_OF_PACKET command. Format is:
!
! Kermit-32>SET RECEIVE START_OF_PACKET <oct>
!
! Where:
! <oct> is the octal representation of the padding character
! that is to be used.
!
!--
$STATE (SS_SOH_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_SOH, ,SND_SOH)
)
!++
!
! SET SEND TIMEOUT command. The format is:
!
! Kermit-32>SET SEND TIMEOUT <dec>
!
! Where:
! <dec> is the number of seconds before KERMIT-32 should time out
! attempting to receive a correct message.
!
!--
$STATE (SS_TIM_STATE,
(TPA$_DECIMAL, DONE_STATE, , ,SND_TIMEOUT)
)
!++
! SET SEND END-OF-LINE command. Format is:
!
! Kermit-32>SET SEND END-OF-LINE <octal>
!
! Where:
! <octal> is the octal number representation of the character
! that is the end of line character.
!
!--
$STATE (SS_EOL_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_EOL, ,SND_EOL)
)
!++
! SET SEND QUOTA command. The format is:
!
! Kermit-32>SET SEND QUOTA <octal>
!
! Where:
! <octal> is the octal number representing the quoting character.
!
!--
$STATE (SS_QUO_STATE,
(TPA$_OCTAL, DONE_STATE, CHECK_QUOTE, ,SND_QUOTE_CHR)
)
!++
! SET SERVER_TIMER command.
!
! This sets the time between naks send when server is idle.
!--
$STATE (SET_SRV_STATE,
(TPA$_DECIMAL, DONE_STATE, , ,SRV_TIMEOUT)
)
!++
!
! SET TRANSMIT xxx command. The format is: ! and below
!
! Kermit-32>SET TRANSMIT <item> <args>
!
! Where:
! <item> is one of:
! DELAY - Time to delay after each carriage return
! ECHO - Echo from terminal line or just print line numbers
!
!--
$STATE (SET_TRN_STATE, !
('DELAY', SET_TRD_STATE), !
('ECHO', SET_TRE_STATE), !
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR) !
) !
!++
!
! SET TRANSMIT DELAY command. Format is: ! and below
!
! Kermit-32>SET TRANSMIT DELAY <digit>
!
! Where:
! <digit> is a decimal digit that specifies the length of time in
! tenths of a second to delay after transmitting a carriage return.
!
!--
$STATE (SET_TRD_STATE, !
(TPA$_DIGIT, DONE_STATE, STORE_TR_DELAY, ,TRANS_DELAY) !
) !
!++
!
! SET TRANSMIT ECHO command. The format is: ! and below
!
! Kermit-32>SET TRANSMIT ECHO (on/off)
!
! Where:
! on/off is either the ON or OFF keyword.
!
!--
$STATE (SET_TRE_STATE, !
('ON', DONE_STATE, STORE_TR_ECHO, , ,TRUE), !
('OFF', DONE_STATE, STORE_TR_ECHO, , ,FALSE),!
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR) !
) !
%SBTTL 'SEND command'
!++
! SEND command. The format is:
!
! Kermit-32>SEND file-specification
!
! Where:
! FILE-SPECIFICATION is any valid VAX/VMS file specification.
!
!--
$STATE (SEND_STATE,
(TPA$_ANY, SEND_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_DESC, , ,FILE_DESC)
)
%SBTTL 'SHOW command'
!++
! SHOW command. The format is:
!
! Kermit-32>SHOW <parameter>
!
! Where:
! <Parameter> is one of the following:
! SEND - Send parameters
! RECEIVE - Receive parameters
! DEBUGGING - State of the debugging flag
! FILE-TYPE - Type of the file
! LOCAL-ECHO - Local echo flag
! LINE - Current line associated
! ESCAPE - Current escape character
! DELAY - Delay parameter.
!
!--
$STATE (SHOW_STATE,
('ALL', DONE_STATE, ,SHOW_ALL, SHOW_TYPE),
('BLOCK_CHECK_TYPE', DONE_STATE, ,SHOW_CHK, SHOW_TYPE),
('COMMUNICATIONS', DONE_STATE, ,SHOW_COM, SHOW_TYPE),
('DEBUGGING', DONE_STATE, ,SHOW_DEB, SHOW_TYPE),
('DELAY', DONE_STATE, ,SHOW_DEL, SHOW_TYPE),
('ESCAPE', DONE_STATE, ,SHOW_ESC, SHOW_TYPE),
('FILE_PARAMETERS', DONE_STATE, ,SHOW_FIL, SHOW_TYPE),
('INCOMPLETE_FILE_DISPOSITION',DONE_STATE, ,SHOW_ABT, SHOW_TYPE),
('LINE', DONE_STATE, ,SHOW_LIN, SHOW_TYPE),
('LOCAL_ECHO', DONE_STATE, ,SHOW_ECH, SHOW_TYPE),
('PACKET', DONE_STATE, ,SHOW_PAC, SHOW_TYPE),
('PARITY', DONE_STATE, ,SHOW_PAR, SHOW_TYPE),
('SEND', DONE_STATE, ,SHOW_SEN, SHOW_TYPE),
('TIMING', DONE_STATE, ,SHOW_TIM, SHOW_TYPE),
('RECEIVE', DONE_STATE, ,SHOW_REC, SHOW_TYPE),
('RETRY', DONE_STATE, ,SHOW_RTY, SHOW_TYPE),
('VERSION', DONE_STATE, ,SHOW_VER, SHOW_TYPE),
('TRANSMIT', DONE_STATE, ,SHOW_TRN, SHOW_TYPE), !
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
%SBTTL 'LOG command'
!++
! The LOG command allows the specification of a session or transaction
!log file.
!--
$STATE (LOG_STATE,
('DEBUGGING', DBG_STATE),
('SESSION', SES_STATE),
('TRANSACTIONS',TRN_STATE),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
$STATE (DBG_STATE,
(TPA$_ANY, DBG_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_DESC, , ,DEBUG_DESC)
)
$STATE (SES_STATE,
(TPA$_ANY, SES_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_DESC, , ,SESSION_DESC)
)
$STATE (TRN_STATE,
(TPA$_ANY, TRN_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_DESC, , ,TRANSACTION_DESC)
)
%SBTTL 'Take command tables'
!++
! The following describes the TAKE (or @) command.
!--
$STATE (TAKE_STATE,
('/', TAK_SWT_STATE, COPY_DESC, , ,TAK_FIL_DESC),
(TPA$_ANY, TAKE_STATE, STORE_TEXT),
(TPA$_LAMBDA, DONE_STATE, COPY_DESC, , ,TAK_FIL_DESC)
)
$STATE (TAK_SWT_STATE,
('DISPLAY', DONE_STATE, ,TRUE, TAKE_DISPLAY),
(TPA$_SYMBOL, TPA$_FAIL, KEY_ERROR)
)
%SBTTL 'TRANSMIT command' !
!
!++ !
! TRANSMIT command. The format is: !
! !
! Kermit-32>TRANSMIT file-specification !
! !
! Where: !
! FILE-SPECIFICATION is any valid VAX/VMS file specification. !
! !
!-- !
!
$STATE (TRANSMIT_STATE, !
(TPA$_ANY, TRANSMIT_STATE, STORE_TEXT), !
(TPA$_LAMBDA, DONE_STATE, COPY_DESC, , ,FILE_DESC) !
) !
%SBTTL 'Done state'
!++
! This is the single state that is the required CONFIRM for the end
! of the commands.
!--
$STATE (DONE_STATE,
(TPA$_EOS, TPA$_EXIT)
)
!++
!
! End of the KERMIT-32 command definitions
!
!--
PSECT OWN = $OWN$;
PSECT GLOBAL = $GLOBAL$;
!<BLF/FORMAT>
ROUTINE MAIN_ROUTINE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This is the main routine for KERMIT-32. This routine will
! initialize the various parameters and then call the command
! scanner to process commands.
!
! FORMAL PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! ROUTINE VALUE and
! COMPLETION CODES:
!
! Return status from last command.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
LOCAL
STATUS, ! Returned status
CRC_BIT_MASK, ! Bit mask for CRC initialization
LOOP_FLAG;
!
! Initialize some variables
!
STATUS = LIB$PUT_OUTPUT (IDENT_STRING); ! Say who we are
MSG_INIT (); ! Initialize message processing
TERM_INIT (); ! Init terminal processing
TT_INIT (); ! Init text processing
FILE_INIT (); ! Init file processing
SY_INIT (); ! Init system routines
ESCAPE_CHR = CHR_ESCAPE;
!
! Initialize some VAX/VMS interface items
!
CRC_BIT_MASK = %O'102010'; ! CRC bit mask
LIB$CRC_TABLE (CRC_BIT_MASK, CRC_TABLE);
LIB$ESTABLISH (KERM_HANDLER);
!
! Initialize transaction log file descriptor
!
INIT_STR_DESC (TRANSACTION_DESC, TRANSACTION_NAME, 0);
!
! Initialize take file descriptor
!
INIT_STR_DESC (TAK_FIL_DESC, TAK_FIL_NAME, 0);
!
! Initialize prompt descriptor
!
INIT_STR_DESC (PROMPT_DESC, PROMPT_TEXT, 0);
!
! Take initialization file
!
COMND_FILE (%ASCID'VMSKERMIT', %ASCID'.INI;0', TRUE, FALSE);
!
! Main command loop
!
Status = COMND ();
RETURN .Final_Status OR STS$M_INHIB_MSG;
END; ! end of routine MAIN_ROUTINE
%SBTTL 'COMND'
ROUTINE COMND =
!++
! FUNCTIONAL DESCRIPTION:
! This routine will do the command scanning for KERMIT-32. It
! will call the correct routines to process the commands.
!
! CALLING SEQUENCE:
!
! COMND();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! Return status from last command.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
EXTERNAL ROUTINE
GET_COMMAND, ! Get line from SYS$COMMAND
LIB$GET_FOREIGN : ADDRESSING_MODE (GENERAL); ! Get command which started program
LOCAL
DESC : BLOCK [8, BYTE],
CMD_BUF : VECTOR [80, BYTE, UNSIGNED],
CMD_SIZE : UNSIGNED WORD,
ONE_COMMAND, ! Only do one command
STATUS : UNSIGNED LONG;
ONE_COMMAND = FALSE; ! And many commands
!
! Initialize the command string descriptor
!
INIT_STR_DESC (DESC, CMD_BUF, 80);
!
! Get the first command string. If we get something, then we will only
! want to perform one command, then exit. Otherwise, we will do commands
! until something one tells us to exit.
!
STATUS = LIB$GET_FOREIGN (DESC, 0, CMD_SIZE, 0);
IF .STATUS EQL RMS$_EOF THEN RETURN SS$_NORMAL;
IF NOT .STATUS
THEN
BEGIN
LIB$SIGNAL (.STATUS);
RETURN .STATUS;
END;
IF .CMD_SIZE GTR 0 THEN ONE_COMMAND = TRUE;
WHILE TRUE DO
BEGIN
IF .CMD_SIZE GTR 0
THEN
BEGIN
DESC [DSC$W_LENGTH] = .CMD_SIZE;
IF .STATUS THEN STATUS = DO_COMND (DESC);
IF .STATUS EQL KER_EXIT THEN RETURN SS$_NORMAL;
IF NOT .STATUS AND .STATUS NEQ KER_TAKE_ERROR THEN COMND_ERROR (.STATUS);
END;
!
! If we were given command when run, just exit after doing it
!
IF .ONE_COMMAND THEN RETURN SS$_NORMAL;
!
! Initialize prompt if null
!
IF .PROMPT_DESC [DSC$W_LENGTH] LEQ 0
THEN
BEGIN
CH$COPY (.DEFAULT_PROMPT [DSC$W_LENGTH], CH$PTR (.DEFAULT_PROMPT [DSC$A_POINTER]), 0,
TEMP_LENGTH, CH$PTR (PROMPT_TEXT));
PROMPT_DESC = .DEFAULT_PROMPT [DSC$W_LENGTH];
END;
DESC [DSC$W_LENGTH] = 80; ! Reset length
STATUS = GET_COMMAND (DESC, PROMPT_DESC, CMD_SIZE, TRUE);
IF .STATUS EQL RMS$_EOF THEN RETURN SS$_NORMAL;
!
! If there was an error then return the error code to the upper level
!
IF NOT .STATUS ! Failing status?
THEN
RETURN .STATUS; ! Yes, return it
END; ! End of WHILE TRUE DO BEGIN
RETURN SS$_NORMAL;
END; ! End of COMND
%SBTTL 'COMND_FILE - Perform take (indirect) file'
ROUTINE COMND_FILE (TAKE_DESC, DEFAULT_DESC, OK_NONE, DISPLAY_FLAG) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will read a file of commands and perform them. If any
! error occurs, it will abort the command processing.
!
! CALLING SEQUENCE:
!
! STATUS = COMND_FILE (TAKE_DESC, DEFAULT_DESC, OK_NONE, DISPLAY_FLAG)
!
! INPUT PARAMETERS:
!
! TAKE_DESC - String descriptor of file specification
! DEFAULT_DESC - Default file specification
! OK_NONE - If true, return EOF if file does not exist, otherwise
! return error if file does not exist.
! DISPLAY_FLAG - If true display commands being executed
!
! IMPLICIT INPUTS:
!
! None.
!
! OUPTUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! Standard status values
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
EXTERNAL ROUTINE
STR$UPCASE : ADDRESSING_MODE (GENERAL), ! Upcase a string
LIB$GET_VM : ADDRESSING_MODE (GENERAL) NOVALUE,
LIB$FREE_VM : ADDRESSING_MODE (GENERAL) NOVALUE;
MAP
TAKE_DESC : REF BLOCK [8, BYTE],
DEFAULT_DESC : REF BLOCK [8, BYTE]; ! The args are descriptors
LOCAL
TAKE_FILE_DESC : BLOCK [8, BYTE], ! Descriptor for take file
TAKE_FILE_NAME : VECTOR [CH$ALLOCATION (MAX_FILE_NAME)], ! Name of take file
TAKE_FILE_FAB : $FAB_DECL, ! FAB for take file
TAKE_FILE_RAB : $RAB_DECL, ! RAB for take file
TAKE_FILE_XABFHC : $XABFHC_DECL, ! XAB for file header items
TAKE_FILE_BADR, ! Address of take file buffer
TAKE_FILE_BSIZ, ! Size of take file buffer
TAKE_FILE_FADR, ! Address of fixed header buffer
TAKE_FILE_FSIZ, ! size of fixed header buffer
STATUS, ! Random status values
CMD_DESC : BLOCK [8, BYTE]; ! Descriptor for command
CH$COPY (.TAKE_DESC [DSC$W_LENGTH], CH$PTR (.TAKE_DESC [DSC$A_POINTER]), 0, MAX_FILE_NAME,
CH$PTR (TAKE_FILE_NAME));
INIT_STR_DESC (TAKE_FILE_DESC, TAKE_FILE_NAME, .TAKE_DESC [DSC$W_LENGTH]);
$FAB_INIT (FAB = TAKE_FILE_FAB, FNA = TAKE_FILE_NAME, FNS = .TAKE_FILE_DESC [DSC$W_LENGTH], FAC = GET,
XAB = TAKE_FILE_XABFHC, DNA = .DEFAULT_DESC [DSC$A_POINTER], DNS = .DEFAULT_DESC [DSC$W_LENGTH]);
$XABFHC_INIT (XAB = TAKE_FILE_XABFHC);
STATUS = $OPEN (FAB = TAKE_FILE_FAB);
IF NOT .STATUS
THEN
BEGIN
IF .STATUS EQL RMS$_FNF AND .OK_NONE THEN RETURN KER_TAKE_EOF;
LIB$SIGNAL (.STATUS);
RETURN KER_TAKE_ERROR;
END;
!
! Allocate a buffer
!
TAKE_FILE_BSIZ = .TAKE_FILE_XABFHC [XAB$W_LRL];
IF .TAKE_FILE_BSIZ EQL 0 THEN TAKE_FILE_BSIZ = MAX_REC_LENGTH;
LIB$GET_VM (TAKE_FILE_BSIZ, TAKE_FILE_BADR);
INIT_STR_DESC (CMD_DESC, .TAKE_FILE_BADR, .TAKE_FILE_BSIZ);
!
! Determine if we need a buffer for the fixed control area
!
TAKE_FILE_FSIZ = .TAKE_FILE_FAB [FAB$B_FSZ];
IF .TAKE_FILE_FSIZ NEQ 0 THEN LIB$GET_VM (TAKE_FILE_FSIZ, TAKE_FILE_FADR);
!
! Initialize the RAB for the $CONNECT RMS call
!
$RAB_INIT (RAB = TAKE_FILE_RAB, FAB = TAKE_FILE_FAB, RAC = SEQ, ROP = NLK, UBF = .TAKE_FILE_BADR,
USZ = .TAKE_FILE_BSIZ);
IF .TAKE_FILE_FSIZ NEQ 0 THEN TAKE_FILE_RAB [RAB$L_RHB] = .TAKE_FILE_FADR;
STATUS = $CONNECT (RAB = TAKE_FILE_RAB);
IF NOT .STATUS
THEN
BEGIN
LIB$SIGNAL (.STATUS);
LIB$FREE_VM (TAKE_FILE_BSIZ, TAKE_FILE_BADR);
IF .TAKE_FILE_FSIZ NEQ 0 THEN LIB$FREE_VM (TAKE_FILE_FSIZ, TAKE_FILE_FADR);
RETURN KER_TAKE_ERROR;
END;
WHILE (STATUS = $GET (RAB = TAKE_FILE_RAB)) DO
BEGIN
IF .TAKE_FILE_RAB [RAB$W_RSZ] GTR 0
THEN
BEGIN
CMD_DESC [DSC$W_LENGTH] = .TAKE_FILE_RAB [RAB$W_RSZ];
STATUS = STR$UPCASE (CMD_DESC, CMD_DESC);
IF .DISPLAY_FLAG THEN LIB$PUT_OUTPUT (CMD_DESC);
STATUS = DO_COMND (CMD_DESC);
IF NOT .STATUS
THEN
BEGIN
IF .STATUS NEQ KER_TAKE_ERROR
THEN
BEGIN
COMND_ERROR (.STATUS);
LIB$PUT_OUTPUT (CMD_DESC);
STATUS = KER_TAKE_ERROR; ! Indicate we should abort back
END;
EXITLOOP;
END;
END;
END; ! End of WHILE TRUE DO BEGIN
!
! When the loop exits, we got some kind of error. Complain unless end of file.
!
IF .STATUS EQL RMS$_EOF THEN STATUS = KER_TAKE_EOF;
IF .STATUS NEQ KER_EXIT AND .STATUS NEQ KER_TAKE_EOF AND .STATUS NEQ KER_TAKE_ERROR
THEN
LIB$SIGNAL (.STATUS);
!
! Close the file
!
$DISCONNECT (RAB = TAKE_FILE_RAB);
$CLOSE (FAB = TAKE_FILE_FAB);
!
! Return any buffers
!
LIB$FREE_VM (TAKE_FILE_BSIZ, TAKE_FILE_BADR);
IF .TAKE_FILE_FSIZ NEQ 0 THEN LIB$FREE_VM (TAKE_FILE_FSIZ, TAKE_FILE_FADR);
RETURN .STATUS;
END; ! End of COMND_FILE
%SBTTL 'COMND_ERROR - Give error message for command'
ROUTINE COMND_ERROR (STATUS) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will issue an error message for a command parsing error.
!
! CALLING SEQUENCE:
!
! COMND_ERROR (.STATUS);
!
! INPUT PARAMETERS:
!
! STATUS - The status value returned from DO_COMND
!
! IMPLICIT INPUTS:
!
! None.
!
! OUPTUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
IF .STATUS EQL KER_AMBIGKEY OR .STATUS EQL KER_UNKNOWKEY
THEN
LIB$SIGNAL (.STATUS, 1,
TPARSE_BLOCK [TPA$L_TOKENCNT])
ELSE
BEGIN
EXTERNAL LITERAL
LIB$_SYNTAXERR;
IF .STATUS EQL LIB$_SYNTAXERR
THEN
LIB$SIGNAL (KER_CMDERR, 1, TPARSE_BLOCK [TPA$L_STRINGCNT])
ELSE
LIB$SIGNAL (.STATUS);
END;
END; ! End of COMND_ERROR
%SBTTL 'DO_COMND'
ROUTINE DO_COMND (CMD_DESC) =
!++
! FUNCTIONAL DESCRIPTION:
! This routine will parse and process one Kermit command.
!
! CALLING SEQUENCE:
!
! STATUS = DO_COMND(CMD_DESC);
!
! INPUT PARAMETERS:
!
! CMD_DESC - Descriptor of command string
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
BIND
SERVER_TEXT = %ASCID'Kermit Server running on VAX/VMS host. Please type your escape sequence to',
SERVER_TEXT_1 = %ASCID' return to your local machine. Shut down the server by typing the Kermit BYE',
SERVER_TEXT_2 = %ASCID' command on your local machine.',
PUSH_TEXT = %ASCID' Type LOGOUT to return to VMS Kermit';
MAP
CMD_DESC : REF BLOCK [8, BYTE]; ! Descriptor for command
LOCAL
STATUS : UNSIGNED LONG;
! Initialize some per-command data areas.
INIT_STR_DESC (TEMP_DESC, TEMP_NAME, 0);
COMMAND = 0;
SHOW_TYPE = 0;
REM_TYPE = 0;
FILE_SIZE = 0;
ALT_FILE_SIZE = 0;
GEN_1SIZE = 0;
GEN_2SIZE = 0;
GEN_3SIZE = 0;
CONNECT_FLAG = FALSE; ! Assume not connected
TAKE_DISPLAY = 0;
TPARSE_BLOCK [TPA$L_STRINGCNT] = .CMD_DESC [DSC$W_LENGTH];
TPARSE_BLOCK [TPA$L_STRINGPTR] = .CMD_DESC [DSC$A_POINTER];
TPARSE_BLOCK [TPA$V_BLANKS] = 0; ! Ignore blanks
STATUS = LIB$TPARSE (TPARSE_BLOCK, KERMIT_STATE, KERMIT_KEY);
IF .STATUS
THEN
BEGIN
FILE_SIZE = .FILE_DESC [DSC$W_LENGTH]; ! Copy length in case needed
CASE .COMMAND FROM CMD_MIN TO CMD_MAX OF
SET
[CMD_BYE] :
BEGIN
IF (STATUS = TERM_OPEN (TRUE)) ! Open the terminal
THEN
BEGIN
IF NOT .CONNECT_FLAG THEN DO_GENERIC (GC_LOGOUT) ELSE STATUS = KER_LOCONLY;
TERM_CLOSE ()
END;
IF NOT .STATUS THEN RETURN .STATUS ELSE RETURN KER_EXIT;
END;
[CMD_CONN] :
TERM_CONNECT ();
[CMD_EXIT] :
RETURN KER_EXIT;
[CMD_FINISH] :
IF (STATUS = TERM_OPEN (TRUE)) ! Open the terminal
THEN
BEGIN
IF NOT .CONNECT_FLAG THEN DO_GENERIC (GC_EXIT) ELSE STATUS = KER_LOCONLY;
TERM_CLOSE ()
END;
[CMD_GET] :
IF (STATUS = TERM_OPEN (TRUE)) ! Open the terminal
THEN
BEGIN
IF NOT .CONNECT_FLAG THEN REC_SWITCH () ELSE STATUS = KER_LOCONLY;
TERM_CLOSE ();
END;
[CMD_HELP] :
COMND_HELP ();
[CMD_LOGOUT] :
IF (STATUS = TERM_OPEN (TRUE)) ! Open the terminal
THEN
BEGIN
IF NOT .CONNECT_FLAG THEN DO_GENERIC (GC_LOGOUT) ELSE STATUS = KER_LOCONLY;
TERM_CLOSE ()
END;
[CMD_RECEIVE] :
IF (STATUS = TERM_OPEN (TRUE)) ! Open the terminal
THEN
BEGIN
FILE_SIZE = 0; ! No file to request
REC_SWITCH ();
TERM_CLOSE ();
END;
[CMD_REMOTE] :
COMND_REMOTE ();
[CMD_LOCAL] :
COMND_LOCAL ();
[CMD_PUSH] :
BEGIN
OWN
PID : INITIAL (0);
LIB$PUT_OUTPUT (PUSH_TEXT);
IF .PID NEQ 0
THEN
BEGIN
STATUS = LIB$ATTACH (PID);
IF NOT .STATUS THEN PID = 0;
END;
IF .PID EQL 0
THEN STATUS = LIB$SPAWN (0, 0, 0, 0, 0, PID); ! Just spawn a DCL
END;
[CMD_SEND] :
BEGIN
EXTERNAL ROUTINE
FILE_OPEN, ! Open file routine
FILE_CLOSE; ! Close file routine
LOCAL
SAVE_FILE_NAME : VECTOR [CH$ALLOCATION (MAX_FILE_NAME)],
SAVE_FILE_SIZE,
SAVE_TY_FIL;
SAVE_TY_FIL = .TY_FIL; ! Save current type out flag
TY_FIL = FALSE; ! Suppress type out of names
SAVE_FILE_SIZE = .FILE_SIZE; ! Save the file name size
CH$MOVE((.FILE_SIZE),CH$PTR(FILE_NAME),
CH$PTR(SAVE_FILE_NAME));
IF FILE_OPEN (FNC_READ)
THEN
BEGIN
FILE_SIZE = .SAVE_FILE_SIZE; ! Reset the file name size
CH$MOVE(.FILE_SIZE,CH$PTR(SAVE_FILE_NAME),
CH$PTR(FILE_NAME));
FILE_CLOSE (FALSE);
TY_FIL = .SAVE_TY_FIL; ! Reset type out flag
IF (STATUS = TERM_OPEN (TRUE)) ! Open the terminal
THEN
BEGIN
SEND_SWITCH ();
TERM_CLOSE ();
END;
END
ELSE
TY_FIL = .SAVE_TY_FIL; ! Reset type out flag
END;
[CMD_SERVER] :
BEGIN
LIB$PUT_OUTPUT (SERVER_TEXT);
LIB$PUT_OUTPUT (SERVER_TEXT_1);
LIB$PUT_OUTPUT (SERVER_TEXT_2);
IF (STATUS = TERM_OPEN (TRUE)) ! Open the terminal
THEN
BEGIN
STATUS = SERVER ();
TERM_CLOSE ();
RETURN KER_NORMAL;
END;
END;
[CMD_SHOW] :
COMND_SHOW ();
[CMD_STATUS] :
COMND_STATUS ();
[CMD_TAKE] :
STATUS = COMND_FILE (TAK_FIL_DESC, %ASCID'.COM;0', FALSE, .TAKE_DISPLAY);
[CMD_TRANSMIT]: !
COMND_TRANSMIT (); !
[INRANGE] :
TES;
END;
RETURN .STATUS;
END; ! End of DO_COMND
%SBTTL 'Command execution -- COMND_HELP'
ROUTINE COMND_HELP : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will do the HELP command processing for KERMIT. It
! will call the library routines.
!
! CALLING SEQUENCE:
!
! COMND_HELP();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
LOCAL
Help_File : VECTOR [2],
STATUS : UNSIGNED LONG;
EXTERNAL ROUTINE
LBR$OUTPUT_HELP : ADDRESSING_MODE (GENERAL);
!
! Do the help processing.
!
Status = $TRNLNM(TABNAM = %ASCID 'LNM$FILE_DEV',
LOGNAM = %ASCID 'KERMIT_HELP');
IF .Status
THEN
BEGIN
Help_File [0] = %CHARCOUNT(%ASCII 'KERMIT_HELP');
Help_File [1] = UPLIT BYTE(%ASCII 'KERMIT_HELP');
STATUS = LBR$OUTPUT_HELP (LIB$PUT_OUTPUT,
0,
TEMP_DESC,
%ASCID'KERMIT_HELP',
UPLIT (HLP$M_PROMPT +
HLP$M_PROCESS +
HLP$M_GROUP +
HLP$M_SYSTEM),
LIB$GET_INPUT);
END
ELSE
BEGIN
Help_File [0] = %CHARCOUNT(%ASCII 'KERMIT_HELP');
Help_File [1] = UPLIT BYTE(%ASCII 'KERMIT_HELP');
STATUS = LBR$OUTPUT_HELP (LIB$PUT_OUTPUT,
0,
TEMP_DESC,
%ASCID'KERMIT',
UPLIT (HLP$M_PROMPT +
HLP$M_PROCESS +
HLP$M_GROUP +
HLP$M_SYSTEM),
LIB$GET_INPUT);
END;
IF NOT .STATUS THEN LIB$SIGNAL (.STATUS);
END;
%SBTTL 'Command execution -- Support routines -- OUTPUT_LONG_WORD'
ROUTINE OUTPUT_LONG_WORD (MSG_ADDR, LONG_VALUE) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
! This routine is used to output the various long word parameters
! that are shown by the SHOW command. All text is defined in the level
! 0 of this program.
!
! CALLING SEQUENCE:
!
! OUTPUT_LONG_WORD( MSG_ASCID, LONG_WORD_VALUE_TO_OUTPUT);
!
! INPUT PARAMETERS:
!
! MSG_ASCID - %ASCID of the text to use for the $FAO call.
!
! LONG_WORD_VALUE_TO_OUTPUT - Value of the long word to pass to the $FAO.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
MAP
LONG_VALUE : LONG UNSIGNED,
MSG_ADDR : LONG UNSIGNED;
LOCAL
STATUS : UNSIGNED; ! Status return by LIB$xxx
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
$FAO (.MSG_ADDR, OUTPUT_SIZE, OUTPUT_DESC, .LONG_VALUE);
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
END;
%SBTTL 'Command Execution -- COMND_REMOTE'
ROUTINE COMND_REMOTE : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will handle the REMOTE commands. It will call KERMSG
!to perform the command.
!
! CALLING SEQUENCE:
!
! COMND_REMOTE ();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! REM_TYPE - type of command to be executed
! GEN_xDATA/GEN_xSIZE - arguments for the commands
!
! OUPTUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
IF GET_REM_ARGS (FALSE)
THEN
IF TERM_OPEN (TRUE) ! Open the terminal to determine if local
THEN
BEGIN
IF NOT .CONNECT_FLAG
THEN DO_GENERIC (.REM_TYPE)
ELSE LIB$SIGNAL (KER_LOCONLY);
TERM_CLOSE ();
END;
END; ! End of COMND_REMOTE
%SBTTL 'Command Execution -- COMND_LOCAL'
ROUTINE COMND_LOCAL : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will handle the LOCAL commands. It will call the generic
!command processor to perform the command, and type the result.
!
! CALLING SEQUENCE:
!
! COMND_LOCAL ();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! REM_TYPE - type of command to be executed
! GEN_xDATA/GEN_xSIZE - arguments for the commands
!
! OUPTUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
LOCAL
SAVED_TY_FIL, ! Saved value from TY_FIL
STATUS, ! Status values
FILE_FLAG, ! Flag whether file is open
CHARACTER, ! Character from get-a-char routine
STR_LENGTH, ! Length of string
STR_ADDRESS, ! Address of string
GET_CHR_RTN; ! Address of routine to get a character
EXTERNAL ROUTINE
SY_GENERIC, ! Do a generic command
GET_FILE, ! Get a character from a file
FILE_OPEN, ! Open a file
FILE_CLOSE; ! Close a file
!
! First get any extra arguments needed
!
STATUS = GET_REM_ARGS (TRUE);
IF NOT .STATUS THEN RETURN;
!
! Initialize arguments for SY_GENERIC
!
GET_CHR_RTN = 0; ! No routine
STR_LENGTH = 0; ! No length
STR_ADDRESS = 0; ! No address
!
! Have generic routine do the command
!
STATUS = SY_GENERIC (.REM_TYPE, STR_ADDRESS, STR_LENGTH, GET_CHR_RTN);
IF NOT .STATUS
THEN
LIB$SIGNAL (.STATUS)
ELSE
BEGIN
!
! If we got a string, type it out
!
IF .STR_LENGTH NEQ 0
THEN
BEGIN
LOCAL
POINTER;
POINTER = CH$PTR (.STR_ADDRESS);
DECR I FROM .STR_LENGTH TO 1 DO
TT_CHAR (CH$RCHAR_A (POINTER));
TT_CRLF (); ! Make sure it gets dumped
END
ELSE
!
! Here if we didn't get a string. Either we need to call the supplied routine
! or open a file and call GET_FILE for each character.
!
BEGIN
IF .GET_CHR_RTN NEQ 0
THEN
FILE_FLAG = FALSE ! No file open
ELSE
BEGIN
FILE_FLAG = TRUE; ! Have a file
GET_CHR_RTN = GET_FILE; ! This is our get-a-char routine
SAVED_TY_FIL = .TY_FIL; ! Save current type out flag
TY_FIL = FALSE; ! Make sure we don't have name typed
STATUS = FILE_OPEN (FNC_READ); ! Open the file
TY_FIL = .SAVED_TY_FIL; ! Restore type out value
IF NOT .STATUS ! If we couldn't open the file
THEN
RETURN; ! Just return, (FILE_OPEN reported it)
END;
DO
BEGIN
STATUS = (.GET_CHR_RTN) (CHARACTER); ! Get a character
IF .STATUS AND NOT .STATUS EQL KER_EOF ! Did we get one?
THEN
TT_CHAR (.CHARACTER) ! Yes, type it
ELSE
!
! If no character returned, check for EOF and close file if we opened it
!
IF .STATUS EQL KER_EOF AND .FILE_FLAG THEN FILE_CLOSE ();
END
UNTIL NOT .STATUS OR .STATUS EQL KER_EOF; ! Loop until we are done
TT_OUTPUT (); ! Force out last buffer
END;
END;
END; ! End of COMND_LOCAL
%SBTTL 'Command execution -- COMND_SHOW'
ROUTINE COMND_SHOW : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will process the SHOW command. This routine
! expects that the command has already been processed and that
! the type of SHOW command is stored in SHOW_TYPE.
!
! CALLING SEQUENCE:
!
! COMND_SHOW();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
LOCAL
STATUS : WORD; ! Status returned
! Bind some addresses to text
BIND
OFF_TEXT = %ASCID'OFF', ! Item is off
ON_TEXT = %ASCID'ON', ! Item is on
SHOW_ABT_MSG = %ASCID' Incomplete file disposition !AS',
ABT_DISCARD = %ASCID'Discard',
ABT_KEEP = %ASCID'Keep',
SHOW_CHK_MSG = %ASCID' Block check type !AS',
CHK_1CHAR_MSG = %ASCID'One character checksum',
CHK_2CHAR_MSG = %ASCID'Two character checksum',
CHK_CRC_MSG = %ASCID'Three character CRC-CCITT',
SHOW_DEB_MSG = %ASCID' Debugging !AS',
SHOW_DEL_MSG = %ASCID' Delay !ZL (sec)',
SHOW_SRV_MSG = %ASCID' Server sends NAKs every !ZL seconds while waiting for a command',
SHOW_ESC_MSG = %ASCID' Escape character !3OL (octal)',
SHOW_FTP_MSG = %ASCID' File type !AS',
SHOW_BLK_MSG = %ASCID' BINARY and FIXED record size !UL (bytes)',
FTP_ASCII = %ASCID'ASCII',
FTP_BINARY = %ASCID'BINARY',
FTP_BLOCK = %ASCID'BLOCK',
FTP_FIXED = %ASCID'FIXED',
SHOW_FNM_MSG = %ASCID' File naming !AS',
FNM_MSG_FULL = %ASCID'Full file specifcation',
FNM_MSG_NORMAL = %ASCID'Normal form',
FNM_MSG_UNTRAN = %ASCID'Untranslated',
! SHOW_IBM_MSG = %ASCID' IBM mode !AS',
SHOW_HAN_MSG = %ASCID' Handshaking character !3OL (octal)',
SHOW_HAN_MSG_NONE = %ASCID' Handshaking character None',
SHOW_LIN_MSG = %ASCID' Line used !AS',
SHOW_ECH_MSG = %ASCID' Local echo !AS',
SHOW_PAR_MSG = %ASCID' Parity type !AS',
PAR_EVEN = %ASCID'Even',
PAR_ODD = %ASCID'Odd',
PAR_MARK = %ASCID'Mark',
PAR_SPACE = %ASCID'Space',
PAR_NONE = %ASCID'None',
SHOW_RTY_HDR = %ASCID' Retry maximums',
SHOW_RTY_INI_MSG = %ASCID' Initial connection !ZL (dec)',
SHOW_RTY_PKT_MSG = %ASCID' Sending a packet !ZL (dec)',
SHOW_REC_HDR = %ASCID' Receive parameters',
SHOW_SND_HDR = %ASCID' Send parameters',
SHOW_PKT_MSG = %ASCID' Packet length !ZL (dec)',
SHOW_PAD_MSG = %ASCID' Padding length !ZL (dec)',
SHOW_PDC_MSG = %ASCID' Padding character !3OL (octal)',
SHOW_TIM_MSG = %ASCID' Time out !ZL (sec)',
SHOW_EOL_MSG = %ASCID' End of line character !3OL (octal)',
SHOW_QUO_MSG = %ASCID' Quoting character !3OL (octal)',
SHOW_SOH_MSG = %ASCID' Start of packet !3OL (octal)',
SHOW_8QU_MSG = %ASCID' 8-bit quoting character !3OL (octal)',
SHOW_TRN_HDR = %ASCID' Transmit parameters', !
SHOW_TRD_MSG = %ASCID' Delay 0.!AD (sec)', !
SHOW_TRE_MSG = %ASCID' Echo !AS', !
SHOW_RPT_MSG = %ASCID' Repeat quoting character !3OL (octal)';
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine is used to output the keywords TRUE or FALSE.
! All text that this routine uses is defined in the level 0 BEGIN/END
! of the program.
!
! CALLING SEQUENCE:
!
! OUTPUT_TRUE_FALSE( MSG_ASCID, FLAG_WORD);
!
! INPUT PARAMETERS:
!
! MSG_ASCID - %ASCID of the text to use for the $FAO call.
!
! FLAG_WORD - Long word containing the value of either TRUE or FALSE.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
ROUTINE OUTPUT_TRUE_FALSE (MSG_ADDR, FLAG_ADDR) : NOVALUE =
BEGIN
MAP
FLAG_ADDR : LONG UNSIGNED,
MSG_ADDR : LONG UNSIGNED;
LOCAL
STATUS : UNSIGNED; ! Status return by LIB$xxx
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
$FAO (.MSG_ADDR, OUTPUT_SIZE, OUTPUT_DESC,
(SELECTONE ..FLAG_ADDR OF
SET
[TRUE] : ON_TEXT;
[FALSE] : OFF_TEXT;
TES));
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
END;
SELECT .SHOW_TYPE OF
SET
!
! Show version
!
[SHOW_ALL, SHOW_VER] :
STATUS = LIB$PUT_OUTPUT (IDENT_STRING); ! Type our name and version
[SHOW_ALL, SHOW_CHK, SHOW_PAC] :
BEGIN
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
$FAO (SHOW_CHK_MSG, OUTPUT_SIZE, OUTPUT_DESC,
(SELECTONE .CHKTYPE OF
SET
[CHK_1CHAR] : CHK_1CHAR_MSG;
[CHK_2CHAR] : CHK_2CHAR_MSG;
[CHK_CRC] : CHK_CRC_MSG;
TES));
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
END;
[SHOW_ALL, SHOW_DEB] :
OUTPUT_TRUE_FALSE (SHOW_DEB_MSG, DEBUG_FLAG);
[SHOW_ALL, SHOW_DEL, SHOW_COM, SHOW_TIM] :
OUTPUT_LONG_WORD (SHOW_DEL_MSG, .DELAY);
[SHOW_ALL, SHOW_TIM] :
OUTPUT_LONG_WORD (SHOW_SRV_MSG, .SRV_TIMEOUT);
[SHOW_ALL, SHOW_ESC, SHOW_COM] :
OUTPUT_LONG_WORD (SHOW_ESC_MSG, .ESCAPE_CHR);
[SHOW_ALL, SHOW_FIL] : !
BEGIN
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
$FAO (SHOW_FTP_MSG,
OUTPUT_SIZE,
OUTPUT_DESC,
(SELECTONE .FILE_TYPE OF
SET
[FILE_ASC] : FTP_ASCII;
[FILE_BIN] : FTP_BINARY;
[FILE_FIX] : FTP_FIXED;
[FILE_BLK] : FTP_BLOCK;
TES));
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
!
! Display the file name format
!
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
$FAO (SHOW_FNM_MSG, OUTPUT_SIZE, OUTPUT_DESC,
(SELECTONE .FIL_NORMAL_FORM OF
SET
[FNM_FULL] : FNM_MSG_FULL;
[FNM_NORMAL] : FNM_MSG_NORMAL;
[FNM_UNTRAN] : FNM_MSG_UNTRAN;
TES));
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
! Display file block size
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
$FAO(SHOW_BLK_MSG, OUTPUT_SIZE, OUTPUT_DESC, .file_blocksize);
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
END;
[SHOW_ALL, SHOW_COM] :
IF .IBM_CHAR GEQ 0
THEN
OUTPUT_LONG_WORD (SHOW_HAN_MSG, .IBM_CHAR)
ELSE
STATUS = LIB$PUT_OUTPUT (SHOW_HAN_MSG_NONE);
[SHOW_ALL, SHOW_ABT, SHOW_FIL] :
BEGIN
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
$FAO (SHOW_ABT_MSG, OUTPUT_SIZE, OUTPUT_DESC, (IF .ABT_FLAG THEN ABT_DISCARD ELSE ABT_KEEP));
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
END;
[SHOW_ALL, SHOW_LIN, SHOW_COM] :
BEGIN
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
IF .TERM_DESC [DSC$W_LENGTH] GTR 0
THEN
$FAO (SHOW_LIN_MSG, OUTPUT_SIZE, OUTPUT_DESC, TERM_DESC)
ELSE
$FAO (SHOW_LIN_MSG, OUTPUT_SIZE, OUTPUT_DESC, %ASCID'none');
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
END;
[SHOW_ALL, SHOW_ECH, SHOW_COM] :
OUTPUT_TRUE_FALSE (SHOW_ECH_MSG, ECHO_FLAG);
[SHOW_ALL, SHOW_PAR, SHOW_COM] :
BEGIN
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
$FAO (SHOW_PAR_MSG, OUTPUT_SIZE, OUTPUT_DESC,
(SELECTONE .PARITY_TYPE OF
SET
[PR_EVEN] : PAR_EVEN;
[PR_ODD] : PAR_ODD;
[PR_NONE] : PAR_NONE;
[PR_MARK] : PAR_MARK;
[PR_SPACE] : PAR_SPACE;
TES));
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
END;
[SHOW_ALL, SHOW_RTY, SHOW_PAC] :
BEGIN
STATUS = LIB$PUT_OUTPUT (SHOW_RTY_HDR);
OUTPUT_LONG_WORD (SHOW_RTY_INI_MSG, .SI_RETRIES);
OUTPUT_LONG_WORD (SHOW_RTY_PKT_MSG, .PKT_RETRIES);
END;
[SHOW_ALL, SHOW_SEN, SHOW_PAC] :
BEGIN
STATUS = LIB$PUT_OUTPUT (SHOW_SND_HDR);
OUTPUT_LONG_WORD (SHOW_PKT_MSG, ABS (.SND_PKT_SIZE));
OUTPUT_LONG_WORD (SHOW_PAD_MSG, ABS (.SND_NPAD));
OUTPUT_LONG_WORD (SHOW_PDC_MSG, ABS (.SND_PADCHAR));
OUTPUT_LONG_WORD (SHOW_TIM_MSG, ABS (.SND_TIMEOUT));
OUTPUT_LONG_WORD (SHOW_EOL_MSG, ABS (.SND_EOL));
OUTPUT_LONG_WORD (SHOW_QUO_MSG, ABS (.SND_QUOTE_CHR));
OUTPUT_LONG_WORD (SHOW_SOH_MSG, ABS (.SND_SOH));
END;
[SHOW_ALL, SHOW_REC, SHOW_PAC] :
BEGIN
STATUS = LIB$PUT_OUTPUT (SHOW_REC_HDR);
OUTPUT_LONG_WORD (SHOW_PKT_MSG, .RCV_PKT_SIZE);
OUTPUT_LONG_WORD (SHOW_PAD_MSG, .RCV_NPAD);
OUTPUT_LONG_WORD (SHOW_PDC_MSG, .RCV_PADCHAR);
OUTPUT_LONG_WORD (SHOW_TIM_MSG, .RCV_TIMEOUT);
OUTPUT_LONG_WORD (SHOW_EOL_MSG, .RCV_EOL);
OUTPUT_LONG_WORD (SHOW_QUO_MSG, .RCV_QUOTE_CHR);
OUTPUT_LONG_WORD (SHOW_8QU_MSG, .RCV_8QUOTE_CHR);
OUTPUT_LONG_WORD (SHOW_SOH_MSG, .RCV_SOH);
END;
[SHOW_ALL, SHOW_TRN] : !
BEGIN !
STATUS = LIB$PUT_OUTPUT (SHOW_TRN_HDR); !
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH); !
$FAO (SHOW_TRD_MSG, OUTPUT_SIZE, OUTPUT_DESC, 1, TRANS_DELAY); !
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE; !
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC); !
OUTPUT_TRUE_FALSE (SHOW_TRE_MSG, TRANS_ECHO_FLAG); !
END; !
[SHOW_ALL, SHOW_PAC] :
BEGIN
OUTPUT_LONG_WORD (SHOW_RPT_MSG, .SET_REPT_CHR);
END;
TES;
END; ! End of COMND_SHOW
%SBTTL 'Command execution -- COMND_STATUS'
ROUTINE COMND_STATUS : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will display the status of Kermit-32.
!
! CALLING SEQUENCE:
!
! COMND_STATUS ();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
LOCAL
STATUS, ! Status returned by system call
POINTER, ! Pointer to the LAST_ERROR text
CHAR_COUNT; ! Character count
BIND
TEXT_CR = %ASCID'',
TEXT_BAUD = %ASCID' Effective data rate !ZL baud',
TEXT_NAKS_SENT = %ASCID' NAKs received !ZL',
TEXT_NAKS_RCV = %ASCID' NAKs sent !ZL',
TEXT_PKTS_SENT = %ASCID' Packets sent !ZL',
TEXT_PKTS_RCV = %ASCID' Packets received !ZL',
TEXT_CHR_SENT = %ASCID' Characters sent !ZL',
TEXT_DATA_CHAR_SENT = %ASCID' Data characters sent !ZL',
TEXT_DATA_CHAR_RCV = %ASCID' Data characters received !ZL',
TEXT_CHR_RCV = %ASCID' Characters received !ZL',
TEXT_TOTAL_HDR = %ASCID'Totals since Kermit was started',
TEXT_XFR_HDR = %ASCID'Totals for the last transfer';
STATUS = LIB$PUT_OUTPUT (TEXT_CR);
STATUS = LIB$PUT_OUTPUT (TEXT_XFR_HDR);
OUTPUT_LONG_WORD (TEXT_CHR_SENT, .SMSG_TOTAL_CHARS);
OUTPUT_LONG_WORD (TEXT_DATA_CHAR_SENT, .SMSG_DATA_CHARS);
OUTPUT_LONG_WORD (TEXT_NAKS_SENT, .SMSG_NAKS);
OUTPUT_LONG_WORD (TEXT_PKTS_SENT, .SMSG_COUNT);
OUTPUT_LONG_WORD (TEXT_CHR_RCV, .RMSG_TOTAL_CHARS);
OUTPUT_LONG_WORD (TEXT_DATA_CHAR_RCV, .RMSG_DATA_CHARS);
OUTPUT_LONG_WORD (TEXT_NAKS_RCV, .RMSG_NAKS);
OUTPUT_LONG_WORD (TEXT_PKTS_RCV, .RMSG_COUNT);
IF .XFR_TIME NEQ 0
THEN
BEGIN
LOCAL
Data_Chars,
Baud_Rate;
IF .RMSG_DATA_CHARS LEQ .SMSG_DATA_CHARS
THEN Data_Chars = .SMSG_DATA_CHARS
ELSE Data_Chars = .RMSG_DATA_CHARS;
Baud_Rate = .Data_Chars * 10 / ((.Xfr_Time + 500) / 1000);
OUTPUT_LONG_WORD (TEXT_BAUD, .Baud_Rate);
END;
! OUTPUT_LONG_WORD (TEXT_BAUD, .Baud_Rate);
! (((IF .RMSG_DATA_CHARS LEQ .SMSG_DATA_CHARS THEN .SMSG_DATA_CHARS ELSE .RMSG_DATA_CHARS)*10)/((
! .XFR_TIME + 500)/1000)));
STATUS = LIB$PUT_OUTPUT (TEXT_CR);
STATUS = LIB$PUT_OUTPUT (TEXT_TOTAL_HDR);
OUTPUT_LONG_WORD (TEXT_CHR_SENT, .SND_TOTAL_CHARS);
OUTPUT_LONG_WORD (TEXT_DATA_CHAR_SENT, .SND_DATA_CHARS);
OUTPUT_LONG_WORD (TEXT_NAKS_SENT, .SND_NAKS);
OUTPUT_LONG_WORD (TEXT_PKTS_SENT, .SND_COUNT);
OUTPUT_LONG_WORD (TEXT_CHR_RCV, .RCV_TOTAL_CHARS);
OUTPUT_LONG_WORD (TEXT_DATA_CHAR_RCV, .RCV_DATA_CHARS);
OUTPUT_LONG_WORD (TEXT_NAKS_RCV, .RCV_NAKS);
OUTPUT_LONG_WORD (TEXT_PKTS_RCV, .RCV_COUNT);
IF .TOTAL_TIME NEQ 0
THEN
OUTPUT_LONG_WORD (TEXT_BAUD,
(((.RCV_DATA_CHARS + .SND_DATA_CHARS)*10)/((.TOTAL_TIME + 500)/1000)));
!
! Output the error text if there is any
!
POINTER = CH$PTR (LAST_ERROR);
CHAR_COUNT = 0;
WHILE CH$RCHAR_A (POINTER) NEQ CHR_NUL DO
CHAR_COUNT = .CHAR_COUNT + 1;
IF .CHAR_COUNT NEQ 0
THEN
BEGIN
INIT_STR_DESC (OUTPUT_DESC, OUTPUT_LINE, OUT_BFR_LENGTH);
STATUS = $FAO (%ASCID'Last error: !AD', OUTPUT_SIZE, OUTPUT_DESC, .CHAR_COUNT, LAST_ERROR);
IF NOT .STATUS
THEN
LIB$SIGNAL (.STATUS)
ELSE
BEGIN
OUTPUT_DESC [DSC$W_LENGTH] = .OUTPUT_SIZE;
STATUS = LIB$PUT_OUTPUT (OUTPUT_DESC);
IF NOT .STATUS THEN LIB$SIGNAL (.STATUS);
END;
END;
END; ! End of SHOW_STATUS
%SBTTL 'GET_REM_ARGS - Get extra arguments for remote commands'
ROUTINE GET_REM_ARGS (LOCAL_FLAG) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will get any extra arguments required for remote commands.
!It will prompt the user and get the input from SYS$COMMAND:.
!
! CALLING SEQUENCE:
!
! STATUS = GET_REM_ARGS (LOCAL_FLAG);
!
! INPUT PARAMETERS:
!
! LOCAL_FLAG - If true, this is for a LOCAL xxx command. Only get the
! arguments we know we need for local commands. Otherwise
! get all possible arguments.
!
! IMPLICIT INPUTS:
!
! REM_TYPE - Type of remote command to get arguments for.
!
! OUPTUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! GEN_xDATA, GEN_xSIZE - Text and sizes of arguments
!
! COMPLETION CODES:
!
! Status values from subroutines called if in error.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
EXTERNAL ROUTINE
GET_COMMAND; ! Get line from SYS$COMMAND:
LOCAL
GEN_2DESC : BLOCK [8, BYTE], ! Descriptor for second argument
GEN_3DESC : BLOCK [8, BYTE], ! Descriptor for third argument
STATUS; ! Random status values
!
! Set up descriptors for second and third arguments
!
INIT_STR_DESC (GEN_2DESC, GEN_2DATA, MAX_MSG);
INIT_STR_DESC (GEN_3DESC, GEN_3DATA, MAX_MSG);
SELECTONE .REM_TYPE OF
SET
[GC_CONNECT] :
IF NOT .LOCAL_FLAG AND .GEN_1SIZE GTR 0
THEN
RETURN GET_COMMAND (GEN_2DESC, %ASCID'Password: ',
GEN_2SIZE, FALSE);
[GC_COPY, GC_RENAME] :
WHILE TRUE DO
BEGIN
STATUS = GET_COMMAND (GEN_2DESC, %ASCID'New file: ', GEN_2SIZE, TRUE);
IF NOT .STATUS OR .GEN_2SIZE NEQ 0 THEN RETURN .STATUS;
END;
[GC_LGN] :
BEGIN
STATUS = GET_COMMAND (GEN_3DESC, %ASCID'Account: ', GEN_3SIZE, TRUE);
IF NOT .STATUS THEN RETURN .STATUS;
RETURN GET_COMMAND (GEN_2DESC, %ASCID'Password: ', GEN_2SIZE, FALSE);
END;
[GC_SEND_MSG] :
RETURN GET_COMMAND (GEN_2DESC, %ASCID'Message: ', GEN_2SIZE, TRUE);
[GC_WHO] :
IF NOT .LOCAL_FLAG THEN RETURN GET_COMMAND (GEN_2DESC, %ASCID'Options: ', GEN_2SIZE, TRUE);
TES;
!
! If we fall out of the SELECT, we don't need any arguments
!
RETURN TRUE;
END; ! End of GET_REM_ARGS
%SBTTL 'TPARSE support -- STORE_BLOCKSIZE'
ROUTINE STORE_BLOCKSIZE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the blocksize to be used when creating
! BINARY and FIXED files.
!
! CALLING SEQUENCE:
!
! Standard LIB$TPARSE routine call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
! file_blocksize = .AP [TPA$L_PARAM];
file_blocksize_set = 1;
RETURN SS$_NORMAL;
END; ! End of STORE_BLOCKSIZE
%SBTTL 'TPARSE support -- STORE_DEBUG'
ROUTINE STORE_DEBUG =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the debug flag into the DEBUG_FLAG
! location.
!
! CALLING SEQUENCE:
!
! Standard LIB$TPARSE routine call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
DEBUG_FLAG = .AP [TPA$L_PARAM];
RETURN SS$_NORMAL;
END; ! End of STORE_DEBUG
%SBTTL 'TPARSE support -- STORE_TR_DELAY'
ROUTINE STORE_TR_DELAY = ! and below
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the transmit delay into the
! TRANS_DELAY location.
!
! CALLING SEQUENCE:
!
! Standard LIB$TPARSE routine call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN !
TPARSE_ARGS; !
TRANS_DELAY = .AP [TPA$L_PARAM]; !
RETURN SS$_NORMAL; !
END; ! End of STORE_TR_DELAY
%SBTTL 'TPARSE support -- STORE_TR_ECHO'
ROUTINE STORE_TR_ECHO = ! and below
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the transmit echo flag into the
! TRANS_ECHO_FLAG location.
!
! CALLING SEQUENCE:
!
! Standard LIB$TPARSE routine call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN !
TPARSE_ARGS; !
TRANS_ECHO_FLAG = .AP [TPA$L_PARAM]; !
RETURN SS$_NORMAL; !
END; ! End of STORE_TR_ECHO
%SBTTL 'TPARSE support -- STORE_IBM'
ROUTINE STORE_IBM =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the IBM flag into the IBM_FLAG
! location.
!
! CALLING SEQUENCE:
!
! Standard LIB$TPARSE routine call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
EXTERNAL LITERAL
IBM_MODE_ECHO : WEAK, ! IBM mode echo value
IBM_MODE_PARITY : WEAK, ! Default parity
IBM_MODE_CHARACTER : WEAK; ! And handshake character for
! IBM mode
TPARSE_ARGS;
IF .AP [TPA$L_PARAM]
THEN
BEGIN
IBM_CHAR = (IF IBM_MODE_CHARACTER NEQ 0 THEN IBM_MODE_CHARACTER ELSE CHR_DC1);
PARITY_TYPE = (IF IBM_MODE_PARITY NEQ 0 THEN IBM_MODE_PARITY ELSE PR_MARK);
ECHO_FLAG = (IF IBM_MODE_ECHO NEQ 0 THEN IBM_MODE_ECHO ELSE TRUE);
END
ELSE
BEGIN
IBM_CHAR = -1; ! Turn IBM mode off
ECHO_FLAG = FALSE; ! No local echo
PARITY_TYPE = PR_NONE; ! and no parity
END;
RETURN SS$_NORMAL;
END; ! End of STORE_IBM
%SBTTL 'TPARSE support -- STORE_ABT'
ROUTINE STORE_ABT =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the aborted file disposition into ABT_FLAG
!
! CALLING SEQUENCE:
!
! Standard LIB$TPARSE routine call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
ABT_FLAG = .AP [TPA$L_PARAM];
RETURN SS$_NORMAL;
END; ! End of STORE_ABT
%SBTTL 'TPARSE support -- STORE_CHK'
ROUTINE STORE_CHK =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the block check type into XXXX
! location.
!
! CALLING SEQUENCE:
!
! Standard LIB$TPARSE routine call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
CHKTYPE = .AP [TPA$L_PARAM];
RETURN SS$_NORMAL;
END; ! End of STORE_CHK
%SBTTL 'TPARSE support -- STORE_FTP - Store file type'
ROUTINE STORE_FTP =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the file type that was specified by the
! user for the KERFIL processing.
!
! CALLING SEQUENCE:
!
! Standard call from LIB$TPARSE.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
FILE_TYPE = .AP [TPA$L_PARAM];
IF (.FILE_TYPE EQL FILE_FIX) OR
(.FILE_TYPE EQL FILE_BIN)
THEN
BEGIN
TT_TEXT(UPLIT('Current block size for file transfer is ', 0));
TT_NUMBER(.file_blocksize);
TT_CRLF();
END;
RETURN SS$_NORMAL;
END; ! End of STORE_FTP
%SBTTL 'TPARSE support -- STORE_FNM - Store file type'
ROUTINE STORE_FNM =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the file type that was specified by the
! user for the KERFIL processing.
!
! CALLING SEQUENCE:
!
! Standard call from LIB$TPARSE.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
FIL_NORMAL_FORM = .AP [TPA$L_PARAM];
RETURN SS$_NORMAL;
END; ! End of STORE_FNM
%SBTTL 'TPARSE support -- STORE_PARITY - Store file type'
ROUTINE STORE_PARITY =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the type of parity to use for the transfer.
! If a parity type of other than NONE is specified then we will use
! eight-bit quoting to support the transfer.
!
! CALLING SEQUENCE:
!
! Standard call from LIB$TPARSE.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
PARITY_TYPE = .AP [TPA$L_PARAM];
RETURN SS$_NORMAL;
END; ! End of STORE_PARITY
%SBTTL 'TPARSE support -- STORE_ECHO - Store local echo flag'
ROUTINE STORE_ECHO =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the state of the local echo flag as the
! user set it.
!
! CALLING SEQUENCE:
!
! Standard TPARSE argument call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
ECHO_FLAG = .AP [TPA$L_PARAM];
RETURN SS$_NORMAL;
END; ! End of STORE_ECHO
%SBTTL 'TPARSE support -- STORE_MSG_FIL - Store file name typeout flag'
ROUTINE STORE_MSG_FIL =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the state of the file name typeout flag as the
! user set it.
!
! CALLING SEQUENCE:
!
! Standard TPARSE argument call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
TY_FIL = .AP [TPA$L_PARAM];
RETURN SS$_NORMAL;
END; ! End of STORE_MSG_FIL
%SBTTL 'TPARSE support -- STORE_MSG_PKT - Store packet number typeout flag'
ROUTINE STORE_MSG_PKT =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store the state of the packet number flag as the
! user set it.
!
! CALLING SEQUENCE:
!
! Standard TPARSE argument call.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
TY_PKT = .AP [TPA$L_PARAM];
RETURN SS$_NORMAL;
END; ! End of STORE_MSG_PKT
%SBTTL 'TPARSE support -- CHECK_EOL'
ROUTINE CHECK_EOL =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will valid the SEND and RECEIVE eol character that
! is being set by the user.
!
! CALLING SEQUENCE:
!
! Standard TPARSE routine calling sequence.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
IF (.AP [TPA$L_NUMBER] LSS %C' ') AND (.AP [TPA$L_NUMBER] GTR 0)
THEN
RETURN SS$_NORMAL
ELSE
RETURN KER_ILLEOL;
END; ! End of CHECK_EOL
%SBTTL 'TPARSE support -- CHECK_QUOTE'
ROUTINE CHECK_QUOTE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will validate the SEND and RECEIVE quoting character that
! is being set by the user.
!
! CALLING SEQUENCE:
!
! Standard TPARSE routine calling sequence.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! Error code or true value
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
IF (.AP [TPA$L_NUMBER] GEQ %C' ' AND .AP [TPA$L_NUMBER] LSS %C'?') OR (.AP [TPA$L_NUMBER] GEQ %C'`' AND
.AP [TPA$L_NUMBER] LSS CHR_DEL)
THEN
RETURN SS$_NORMAL
ELSE
RETURN KER_ILLQUO;
END; ! End of CHECK_QUO
%SBTTL 'TPARSE support -- CHECK_SOH'
ROUTINE CHECK_SOH =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will valid the SEND and RECEIVE START_OF_PACKET
! character that is being set by the user.
!
! CALLING SEQUENCE:
!
! Standard TPARSE routine calling sequence.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
IF (.AP [TPA$L_NUMBER] LSS %C' ') AND (.AP [TPA$L_NUMBER] GTR 0)
THEN
RETURN SS$_NORMAL
ELSE
RETURN KER_ILLSOH;
END; ! End of CHECK_SOH
%SBTTL 'TPARSE support -- CHECK_PAD_CHAR'
ROUTINE CHECK_PAD_CHAR =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will valid the SEND and RECEIVE eol character that
! is being set by the user.
!
! CALLING SEQUENCE:
!
! Standard TPARSE routine calling sequence.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
IF .AP [TPA$L_NUMBER] LSS %C' ' OR .AP [TPA$L_NUMBER] EQL CHR_DEL
THEN
RETURN SS$_NORMAL
ELSE
RETURN KER_ILLPADCHR;
END; ! End of CHECK_PAD_CHAR
%SBTTL 'TPARSE support -- CHECK_NPAD'
ROUTINE CHECK_NPAD =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will determine if the padding character specified by the
! user is valid.
!
! CALLING SEQUENCE:
!
! Standard TPARSE calling sequence.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
IF .AP [TPA$L_NUMBER] LSS 0 THEN RETURN KER_ILLNPAD ELSE RETURN SS$_NORMAL;
END; ! End of CHECK_NPAD
%SBTTL 'TPARSE support -- CHECK_PACKET_LEN'
ROUTINE CHECK_PACKET_LEN =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will determine if the packet length specified by the
! user is valid.
!
! CALLING SEQUENCE:
!
! Standard TPARSE calling sequence.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
IF .AP [TPA$L_NUMBER] LSS 10 OR .AP [TPA$L_NUMBER] GTR (MAX_MSG - 2)
THEN
RETURN KER_ILLPKTLEN
ELSE
RETURN SS$_NORMAL;
END; ! End of CHECK_PACKET_LEN
%SBTTL 'STORE_TEXT'
ROUTINE STORE_TEXT =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will store a single character of the file specification
! that the user gives to the SEND and RECEIVE commands.
!
! FORMAL PARAMETERS:
!
! Character that was parsed.
!
! IMPLICIT INPUTS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! Character stored into the file specification vector.
!
! ROUTINE VALUE and
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
IF (TEMP_DESC [DSC$W_LENGTH] = .TEMP_DESC [DSC$W_LENGTH] + 1) LSS TEMP_LENGTH
THEN
BEGIN
CH$WCHAR (.AP [TPA$B_CHAR], CH$PTR (TEMP_NAME, .TEMP_DESC [DSC$W_LENGTH] - 1));
AP [TPA$V_BLANKS] = 1; ! Blanks are significant
RETURN SS$_NORMAL;
END
ELSE
RETURN KER_LINTOOLNG;
END; ! End of STORE_TEXT
%SBTTL 'TPARSE support -- COPY_DESC - Copy string to a descriptor'
ROUTINE COPY_DESC =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will copy a string to the descriptor passed in the TPARSE
! argument.
!
! CALLING SEQUENCE:
!
! COPY_FILE();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! TEMP_DESC and TEMP_NAME set up with the device name and length
! in the descriptor.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! Descriptor fields set up.
! TEMP_DESC.
!
! COMPLETION CODES:
!
! 0 - Failure.
! 1 - Success.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
LOCAL
DESC_ADDR;
DESC_ADDR = .AP [TPA$L_PARAM];
BEGIN
MAP
DESC_ADDR : REF BLOCK [8, BYTE];
DESC_ADDR [DSC$W_LENGTH] = .TEMP_DESC [DSC$W_LENGTH];
CH$COPY (.TEMP_DESC [DSC$W_LENGTH], CH$PTR (TEMP_NAME), 0, .TEMP_DESC [DSC$W_LENGTH] + 1,
CH$PTR (.DESC_ADDR [DSC$A_POINTER]));
END;
RETURN SS$_NORMAL;
END; ! End of COPY_FILE
%SBTTL 'TPARSE support -- COPY_ALT_FILE - Copy file specification'
ROUTINE COPY_ALT_FILE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will copy the file name from the temporary
! descriptor to the descriptor that is used for the file name.
! (ALT_FILE_NAME).
! This is for use by the RECEIVE command so that the user may
! specify an alternate file name for the received file.
!
! CALLING SEQUENCE:
!
! COPY_ALT_FILE();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! TEMP_DESC and TEMP_NAME set up with the device name and length
! in the descriptor.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! ALT_FILE_NAME set up with what was in TEMP_NAME and
! TEMP_DESC.
!
! COMPLETION CODES:
!
! 0 - Failure.
! 1 - Success.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
ALT_FILE_SIZE = .TEMP_DESC [DSC$W_LENGTH];
CH$COPY (.TEMP_DESC [DSC$W_LENGTH], CH$PTR (TEMP_NAME), 0, .TEMP_DESC [DSC$W_LENGTH] + 1,
CH$PTR (ALT_FILE_NAME));
RETURN SS$_NORMAL;
END; ! End of COPY_ALT_FILE
%SBTTL 'TPARSE support -- COPY_GEN_1DATA - Copy generic command argument'
ROUTINE COPY_GEN_1DATA =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will copy the generic command argument from the
! temporary descriptor to the global storage for the argument
! (GEN_1DATA).
!
! CALLING SEQUENCE:
!
! COPY_GEN_1DATA();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! TEMP_DESC and TEMP_NAME set up with the device name and length
! in the descriptor.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! GEN_1DATA and GEN_1SIZE set up with what was in TEMP_NAME and
! TEMP_DESC.
!
! COMPLETION CODES:
!
! 0 - Failure.
! 1 - Success.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
GEN_1SIZE = .TEMP_DESC [DSC$W_LENGTH];
CH$COPY (.TEMP_DESC [DSC$W_LENGTH], CH$PTR (TEMP_NAME), 0, .TEMP_DESC [DSC$W_LENGTH] + 1,
CH$PTR (GEN_1DATA));
RETURN SS$_NORMAL;
END; ! End of COPY_GEN_1DATA
%SBTTL 'TPARSE support -- COPY_GEN_2DATA - Copy generic command argument'
ROUTINE COPY_GEN_2DATA =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will copy the generic command argument from the
! temporary descriptor to the global storage for the argument
! (GEN_2DATA).
!
! CALLING SEQUENCE:
!
! COPY_GEN_2DATA();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! TEMP_DESC and TEMP_NAME set up with the device name and length
! in the descriptor.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! GEN_2DATA and GEN_2SIZE set up with what was in TEMP_NAME and
! TEMP_DESC.
!
! COMPLETION CODES:
!
! 0 - Failure.
! 1 - Success.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
GEN_2SIZE = .TEMP_DESC [DSC$W_LENGTH];
CH$COPY (.TEMP_DESC [DSC$W_LENGTH], CH$PTR (TEMP_NAME), 0, .TEMP_DESC [DSC$W_LENGTH] + 1,
CH$PTR (GEN_2DATA));
RETURN SS$_NORMAL;
END; ! End of COPY_GEN_2DATA
%SBTTL 'TPARSE support -- COPY_GEN_3DATA - Copy generic command argument'
ROUTINE COPY_GEN_3DATA =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will copy the generic command argument from the
! temporary descriptor to the global storage for the argument
! (GEN_3DATA).
!
! CALLING SEQUENCE:
!
! COPY_GEN_3DATA();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! TEMP_DESC and TEMP_NAME set up with the device name and length
! in the descriptor.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! GEN_3DATA and GEN_3SIZE set up with what was in TEMP_NAME and
! TEMP_DESC.
!
! COMPLETION CODES:
!
! 0 - Failure.
! 1 - Success.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
GEN_3SIZE = .TEMP_DESC [DSC$W_LENGTH];
CH$COPY (.TEMP_DESC [DSC$W_LENGTH], CH$PTR (TEMP_NAME), 0, .TEMP_DESC [DSC$W_LENGTH] + 1,
CH$PTR (GEN_3DATA));
RETURN SS$_NORMAL;
END; ! End of COPY_GEN_3DATA
%SBTTL 'COPY_TERM_NAME'
ROUTINE COPY_TERM_NAME =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will copy the device name from the temporary
! descriptor to the descriptor that is used for the terminal name.
! (TERM_NAME and TERM_DESC).
! It will call KERTRM to validate the name as a usuable terminal.
!
! CALLING SEQUENCE:
!
! COPY_TERM_NAME();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! TEMP_DESC and TEMP_NAME set up with the device name and length
! in the descriptor.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! TERM_NAME and TERM_DESC set up with what was in TEMP_NAME and
! TEMP_DESC.
!
! COMPLETION CODES:
!
! 0 - Failure.
! 1 - Success.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
EXTERNAL
JOB_TERM_DESC : BLOCK [8, BYTE]; ! Descriptor for jobs contolling terminal
IF NOT CH$FAIL (CH$FIND_NOT_CH (.TEMP_DESC [DSC$W_LENGTH], CH$PTR (.TEMP_DESC [DSC$A_POINTER]), %C' '))
THEN
RETURN SET_TRANS_TERM (TEMP_DESC)
ELSE
IF NOT SET_TRANS_TERM (%ASCID'KER$COMM')
THEN
IF NOT SET_TRANS_TERM (%ASCID'SYS$INPUT')
THEN
IF NOT SET_TRANS_TERM (%ASCID'SYS$OUTPUT')
THEN
IF NOT SET_TRANS_TERM (%ASCID'SYS$COMMAND') THEN RETURN SET_TRANS_TERM (JOB_TERM_DESC);
RETURN SS$_NORMAL;
END; ! End of COPY_TERM_NAME
%SBTTL 'KEY_ERROR - Handle keyword errors'
ROUTINE KEY_ERROR =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine is called from the command parser (LIB$TPARSE) when a keyword
! does not match. It will just return the correct error code.
!
! CALLING SEQUENCE:
!
! STATUS = KEY_ERROR ();
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUPTUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
TPARSE_ARGS;
IF .AP [TPA$V_AMBIG] THEN RETURN KER_AMBIGKEY ELSE RETURN KER_UNKNOWKEY;
END; ! End of KEY_ERROR
%SBTTL 'XFR_STATUS - Return the transfer status'
GLOBAL ROUTINE XFR_STATUS (TYPE, SUB_TYPE) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine is called after either a packet has been received
! correctly at the receive level, a packet has been sent, or
! either a NAK has been sent or received.
!
! CALLING SEQUENCE:
!
! XFR_STATUS (Type);
!
! INPUT PARAMETERS:
!
! Type - ASCII Characters describing the type of transfer
!
! IMPLICIT INPUTS:
!
! None.
!
! OUPTUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
EXTERNAL ROUTINE
LOG_FAOL;
!
! If we have a journal file (transaction log), then say what we are doing.
!
IF .TRANSACTION_OPEN AND .TYPE EQL %C'F'
THEN
BEGIN
FILE_DESC [DSC$W_LENGTH] = .FILE_SIZE; ! Make sure size is right
SELECTONE .SUB_TYPE OF
SET
[%C'S'] :
LOG_FAOL (%ASCID'!%T!_Sending file !AS!/', UPLIT (0, FILE_DESC), TRANSACTION_RAB);
[%C'R'] :
LOG_FAOL (%ASCID'!%T!_Receiving file !AS!/', UPLIT (0, FILE_DESC), TRANSACTION_RAB);
[%C'C'] :
LOG_FAOL (%ASCID'!%T!_Closing file !AS!/', UPLIT (0, FILE_DESC), TRANSACTION_RAB);
[%C'X'] :
LOG_FAOL (%ASCID'!%T!_Aborting file !AS by user request!/', UPLIT (0, FILE_DESC),
TRANSACTION_RAB);
[%C'Z'] :
LOG_FAOL (%ASCID'!%T!_Aborting file group !AS by user request!/', UPLIT (0, FILE_DESC),
TRANSACTION_RAB);
[%C'D'] :
LOG_FAOL (%ASCID'!%T!_Aborting file !AS, partial file saved!/', UPLIT (0, FILE_DESC),
TRANSACTION_RAB);
[%C'A'] :
LOG_FAOL (%ASCID'!%T!_Aborting file !AS due to protocol error!/', UPLIT (0, FILE_DESC),
TRANSACTION_RAB);
TES;
END;
IF .TY_PKT
THEN
BEGIN
SELECTONE .TYPE OF
SET
[%ASCII'R'] :
BEGIN
IF .SUB_TYPE EQL %C'P'
THEN
BEGIN
TT_TEXT (UPLIT (%ASCIZ' R'));
TT_NUMBER (.RMSG_COUNT);
END;
IF .SUB_TYPE EQL %C'N'
THEN
BEGIN
TT_TEXT (UPLIT (%ASCIZ' R%'));
TT_NUMBER (.RMSG_NAKS);
END;
END;
[%ASCII'S'] :
BEGIN
IF .SUB_TYPE EQL %C'P'
THEN
BEGIN
TT_TEXT (UPLIT (%ASCIZ' S'));
TT_NUMBER (.SMSG_COUNT);
END;
IF .SUB_TYPE EQL %C'N'
THEN
BEGIN
TT_TEXT (UPLIT (%ASCIZ' S%'));
TT_NUMBER (.SMSG_NAKS);
END;
END;
TES;
TT_OUTPUT ();
END;
END; ! End of XFR_STATUS
%SBTTL 'CRCCLC - Calculate the CRC-CCITT for a message'
GLOBAL ROUTINE CRCCLC (POINTER, SIZE) =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will calculate the CRC for a message. It will use
! the VAX LIB$ routine to do all the work.
!
! CALLING SEQUENCE:
!
! CRC = CRCCLC(Pointer, Size)
!
! INPUT PARAMETERS:
!
! Pointer - Character pointer to the message.
! Size - Length of the message.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUPTUT PARAMETERS:
!
! CRC for the message.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
LOCAL
TEMP_DESC : BLOCK [8, BYTE], ! Temporary descriptor
CRC_INITIAL; ! Initial CRC value
CRC_INITIAL = 0; ! Set the initial value
INIT_STR_DESC (TEMP_DESC, .POINTER, .SIZE);
RETURN LIB$CRC (CRC_TABLE, CRC_INITIAL, TEMP_DESC);
END; ! End of CRCCLC
%SBTTL 'KRM_ERROR - Issue an error message given error code'
GLOBAL ROUTINE KRM_ERROR (ERROR_CODE) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! This routine will cause an error message to be issued to the
! user's terminal and/or a message to be sent to the remote KERMIT.
!
! CALLING SEQUENCE:
!
! KRM_ERROR(KER_xxxxxx);
!
! INPUT PARAMETERS:
!
! KER_xxxxxx - Error code from KERERR.REQ
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
LIB$SIGNAL (.ERROR_CODE);
END; ! End of KRM_ERROR
%SBTTL 'KERM_HANDLER - Condition handler'
ROUTINE KERM_HANDLER =
!++
! FUNCTIONAL DESCRIPTION:
!
! This is the condition handler for KERMIT-32.
!
! CALLING SEQUENCE:
!
! Called via LIB$SIGNAL.
!
! INPUT PARAMETERS:
!
! None.
!
! IMPLICIT INPUTS:
!
! None.
!
! OUTPUT PARAMETERS:
!
! None.
!
! IMPLICIT OUTPUTS:
!
! None.
!
! COMPLETION CODES:
!
! None.
!
! SIDE EFFECTS:
!
! None.
!
!--
BEGIN
BIND
FACILITY_DESC = %ASCID'KERMIT32';
BUILTIN
AP;
LOCAL
PUTMSG_VECTOR : VECTOR [10, LONG],
SIGARGLST; ! Address of the signal argument list
MAP
AP : REF BLOCK [, BYTE],
SIGARGLST : REF BLOCK [, BYTE];
!++
!
! Routine to do the actual output of the error message
!
!--
ROUTINE HANDLE_MSG =
BEGIN
EXTERNAL ROUTINE
LOG_FAOL;
BUILTIN
AP;
LOCAL
ERR_DESC, ! Address of the error descriptor
POINTER; ! Pointer to get characters
MAP
ERR_DESC : REF BLOCK [8, BYTE],
AP : REF BLOCK [, BYTE];
ERR_DESC = .AP [4, 0, 32, 0];
IF .TERM_FLAG THEN SND_ERROR (.ERR_DESC [DSC$W_LENGTH], .ERR_DESC [DSC$A_POINTER]);
IF .TRANSACTION_OPEN
THEN
BEGIN
OWN
TMP_DESC : BLOCK [8, BYTE];
INIT_STR_DESC (TMP_DESC, .ERR_DESC [DSC$A_POINTER], .ERR_DESC [DSC$W_LENGTH]);
LOG_FAOL (%ASCID'!%T!_!AS!/', UPLIT (0, TMP_DESC), TRANSACTION_RAB);
END;
IF NOT .CONNECT_FLAG
THEN
BEGIN
TT_CRLF ();
POINTER = CH$PTR (.ERR_DESC [DSC$A_POINTER]);
INCR I FROM 1 TO .ERR_DESC [DSC$W_LENGTH] DO
TT_CHAR (CH$RCHAR_A (POINTER));
TT_CRLF ();
END;
RETURN 0;
END;
SIGARGLST = .AP [CHF$L_SIGARGLST];
IF .SIGARGLST [CHF$L_SIG_NAME] GEQ %X'400' AND .SIGARGLST [CHF$L_SIG_NAME] LEQ %X'5FF'
THEN
RETURN SS$_RESIGNAL;
PUTMSG_VECTOR [0] = .SIGARGLST [CHF$L_SIG_ARGS] - 2; ! No PC and PSL
PUTMSG_VECTOR [1] = .SIGARGLST [CHF$L_SIG_NAME];
! PUTMSG_VECTOR [2] = .SIGARGLST [CHF$L_SIG_ARGS] - 3;
! INCR I FROM 0 TO .SIGARGLST [CHF$L_SIG_ARGS] - 4 DO
INCR I FROM 0 TO .SIGARGLST [CHF$L_SIG_ARGS] - 2 DO
PUTMSG_VECTOR [.I + 2] = .(SIGARGLST [CHF$L_SIG_ARG1] + (.I*4));
Final_Status = .Putmsg_Vector [1];
$PUTMSG (MSGVEC = PUTMSG_VECTOR, ACTRTN = HANDLE_MSG, FACNAM = FACILITY_DESC);
RETURN SS$_CONTINUE;
END; ! End of KERM_HANDLER
%SBTTL 'End of KERMIT.B32'
END ! End of module
ELUDOM