.TITLE SUB SUBMIT COMMAND FILE .IDENT /V01.03/ .ENABL LC ; ; VERSION V01.03 ; ; AUTHOR: ; ; ERIK ROSDOL SWS/VIENNA ; ; ; ; MODULE CONTENTS: ; ; THIS MODULE PROCESSES THE "SUBMIT COMMAND FILE FUNCTION" ; IN COOPERATION WITH THE VIRTUAL TERMINAL DRIVER (BY DAVE ; ELDERKIN) AND THE SUBMIT EXECUTOR TASK BAT... ; THIS CODE FIRST APPEARED IN THE 'SMALL BUFFER' VOLUME 424 ; 27-APR-78. ; THIS SOURCE FILE OMITS THE NETWORK FEATURES ORIGINALY PRESENT ; IN THE XEROX COPY. THIS IS DONE IN THE INTEREST OF SHORTENING ; THE AMOUNT OF TYPE IN. THOSE USERS WHO REQUIRE THE ABILITY OF SUBMITTING ; COMMAND COMMAND FILES FOR BATCH EXECUTION USING DECNET PHASE 2 ON AN ; RSX11M V3 SYSTEM, SHOULD TRY AND GET A XEROX COPY OF THE SMALL BUFFER ; ARTICLE MENTIONED ABOVE. ; ; MODULE MODIFICATION HISTORY: ; ; JGD01 23-MAY-78 CHANGED PARSING OF COMMAND LINE SO ; THAT THE COMMAND ENTERED INTO THE SEND ; BUFFER, STARTS WITH THE FIRST NON BLANK ; CHARACTER. THIS MAKES THE PARSING A BIT ; MORE FORGIVING, IE SUB COMMAND LINE ; AND SUBMIT COMMAND LINE ARE BOTH EQUALLY ; VALID. ; ; JGD02 18-JUL-78 FIXED ERROR RETURN, IF COMMAND ENTERED ALONE ; WITH NOTHING FOLLOWING, IE SUBMIT ; ; PSP01 17-Jun-80 Tidied up a bit. Tested under RSX11M V3.2. ; Changed Packet format slightly. ; ; PSP02 11-Nov-80 Added support for HELP and for special BAT files. ; ; THERE ARE SEVERAL KNOWN BUGS. ABORTING BAT...(OR ANYTHING USING ; VT0/1) CAN LEAVE ...AT. HUNG IN AN INDETERMINATE STATE. ; EVENTUALLY, TKTN CLEARS UP THE MESS, BUT THIS SHOULD NOT BE COUNTED ; ON TO WORK EVERY TIME. ; SINCE ...AT. REQUIRES TO BE ABLE TO DO OUTPUT AND EXPECTS A TERMINAL TO ; BE ABLE TO RECIEVE ITS DATA, BAT... BETTER BE ACTIVE, ELSE WHERE ; IS VTDRV GOING TO SEND THE DATA FROM ...AT. ; ; These problems should now be fixed by the newest version of VTDRV ; (If BAT... is aborted, just abort anything else started by it.) ; ; ; THE SUBMIT FUNCTION HAS THE FOLLOWING COMMAND FORMAT: ; ; >SUBMIT GROUP/OWNER/PASSWD FILNAM for running files under AT. ; >SUBMIT GROUP/OWNER/PASSWD $FILNAM for running files directly from BAT ; >SUBMIT HELP or /HELP to get help ; ; WHERE: ; GROUP UIC GROUP UNDER WHICH THE COMMAND FILE RESIDES ; OWNER UIC OWNER UNDER WHICH THE COMMAND FILE RESIDES ; PASSWD PASSWORD OF GROUP/OWNER IN THE ACCOUNT-FILE ; FILNAM 1-9 (6 for BAT files) CHARACTER FILENAME OF THE ; INDIRECT COMMAND FILE TO BE SUBMITTED. ; EXTENSION MUST NOT BE SPECIFIED. IT IS ALWAYS .CMD FOR ; ORDINARY COMMAND FILES, .DAT FOR BATCH-HANDLED ONES. ; ; The UIC specified for logging in need not be the same as that ; the user is running under. BAT will log in as specified, and then ; set the UIC to whatever the user was set to when he ran SUB. This ; avoids the need for creating new accounts just to use with BATCH. ; ; For files to be passed to AT., naturally only straight MCR and ; AT commands may be used - it is meaningless to expect AT, or another ; program, to prompt the user for input. ; However, the whole point of files handled directly by batch is to ; cover this very eventuality - these files may contain only commands ; to MCR and data lines (identified by a preceding !) which will be ; passed to any program requesting them. ; ; Packet format to BAT... is:- ; ; WD01-WD07 Command Line to HELLO ; WD08-WD10 Filename (in RAD50) ; WD11 TI: Device of User ; WD12 SY: Device of User ; WD13 UIC of User ; ; For files to be handled by BAT, WD10 contains -1 ; ; Note the format of the device in WDs 11 & 12 is a special one, viz. ; RAD50 representation of device mnemonic plus binary unit number. ; This will handle all devices up to Unit 50 (octal) on standard devices. ; The only place this might be a trouble would be TT, in which case you ; could drop the mnemonic altogether. ; ; MACRO CALL DEFINITIONS ; .MCALL QIOW$C,QIOW$,GMCR$,DIR$,RQST$C,WTSE$S .MCALL SDAT$,SPWN$,EXIT$S,ALUN$C,GLUN$S,GTSK$S ; S.SYM='$ ; Special symbol for BAT files ; ; LOCAL MACRO DEFINITIONS ; .MACRO PMSG M MOV #M,MSGDPB+Q.IOPL ;SETUP MESSAGE ADDRESS MOV #M'L,MSGDPB+Q.IOPL+2 ; AND COUNT DIR$ #MSGDPB ; EXECUTE QIO .ENDM .NLIST BEX ; ; DIRECTIVE PARAMETER BLOCKS ; MSGDPB: QIOW$ IO.WLB,1,1,,,,<0,0,40> BUF: .BLKW 13. BUF1: .BLKW 18. ; Used for GLUN$S etc. LINE: GMCR$ SEND: SDAT$ BAT...,BUF HLSPWN: SPWN$ MCR...,,,,,1,,,HELCMD,HELCML ; ; LOCAL DATA ; HELCMD: .ASCII /HELP SUB/ HELCML=.-HELCMD .EVEN ; ; LOCAL MESSAGES ; MSG1: .ASCII /SUB -- COMMAND SYNTAX ERROR/<7><7> MSG1L=.-MSG1 MSG2: .ASCII /SUB -- SEND DATA OR REQUEST ERROR/<7><7> MSG2L=.-MSG2 .EVEN ;+ ; **-$SUBMIT ; ; THIS ROUTINE FIRST TRIES TO GET A COMMAND LINE FROM MCR ; IT THEN CHECKS IT FOR POSSIBLE COMMAND ERRORS. IF NO ERROR ; IS FOUND, THEN THE COMMAND LINE IS SENT TO THE COMMAND ; FILE SUBMITTAL TASK BAT... AND EXECUTED ON VT0/1. ; SUBMIT IS AN EXTERNAL MCR TASK AND DOES NOT PROMPT ; FOR INPUT. THE CALL AND THE COMMAND MUST BE TYPED IN ; ON THE SAME LINE. ; .ENABLE LSB SUB:: ; REFERENCE LABEL ALUN$C 1,SY,0 ; ASSIGN TO SY: Device GLUN$S #1,#BUF1 ; Get the SY: device MOVB BUF1+2,BUF+22. ; Move in unit number CLR BUF1+2 ; Make sure $CAT5 terminates MOV #BUF1,R0 ; Get ASCII address CALL $CAT5 ; Convert it ADD R1,BUF+22. ; And add it in ALUN$C 1,TI,0 ; ASSIGN TO TI: TERMINAL GLUN$S #1,#BUF1 ; Get the TI: device MOVB BUF1+2,BUF+20. ; Move in unit number CLR BUF1+2 ; Make sure $CAT5 terminates MOV #BUF1,R0 ; Get ASCII address CALL $CAT5 ; Convert it ADD R1,BUF+20. ; And add it in GTSK$S #BUF1 ; Get Task Parameters (including UIC) MOV BUF1+14.,BUF+24. ; Move UIC to where it should be DIR$ #LINE,CMDERR ; GET AN MCRLINE TO PROCESS MOV $DSW,R0 ; GET NUMBER OF BYTES CLRB LINE+2(R0) ; TERMINATE COMMAND WITH ZERO ; ; First we find the start of the command to HELLO - i.e. the first ; non-blank charcter after the first blank character ; MOV #LINE+2,R1 ; GET START OF BUFFER MOV #BUF,R0 ; ADDR OF SEND BUFER ; 10$: TSTB (R1) ; IS FIRST CHARACTER 0 BEQ CMDERR ; WE HAVE AN END BEFORE WE START, BAD, BAD CMPB (R1)+,#40 ; IS IT A BLANK BNE 10$ ; IF NE, NO TRY AGAIN 15$: CMPB (R1),#40 ; IS THE NEXT CHARACTER A BLANK BNE 20$ ; IF NE, NO, FILL UP BUFFER INC R1 ; IF EQ YES SO SKIP ONE MORE CHARACTER AND LOOP BR 15$ ; CHECK FOR ANOTHER BLANK ; 20$: ; ; First we check to see if the user is after help ; MOV R1,-(SP) ; Save offset of where we are CMPB (R1),#'/ ; Initial slash? BNE 21$ ; If ne no - carry on INC R1 ; Yes - count it ; 21$: MOV #HELCMD,R2 ; Use the HELP at the start of the Help Message MOV #4,R3 ; Compare 4 characters ; 22$: CMPB (R1)+,(R2)+ ; Is he after HELP? BNE 23$ ; If NE no - carry on SOB R3,22$ ; Might be - keep checking DIR$ #HLSPWN ; Yes - ask for help WTSE$S #1 ; Wait for it to finish JMP 120$ ; Exit ; 23$: MOV (SP)+,R1 ; Get the command address back MOV #-2,R2 ; Initialise Slash Count ; ; Now we fill in the HELLO line - i.e. everything up to the first space. ; ; 24$: CMPB (R1),#40 ; Found a space? BEQ 30$ ; If eq yes - go for filename TSTB (R1) ; No - Hit the Sentinel byte? BEQ CMDERR ; If eq yes - no command file - error CMP R0,#BUF+14. ; Filled the slot for the HELLO command? BGE CMDERR ; If GE yes - error CMPB (R1),#'/ ; A slash? BNE 25$ ; If ne no - just store it INC R2 ; Yes - count it BGT CMDERR ; If GT we've had over two - error ; 25$: MOVB (R1)+,(R0)+ ; START FILLING IN BUF BR 24$ ; ELSE LOOP SOME MORE ; 30$: ; ; Now we fill in the filename. We keep an eye out for /s because that's ; another likely command line error. ; INC R2 ; Did we have any slashes? BLT CMDERR ; If LE no - Error CLRB (R0) ; Put Zero at end of Hello MOV #BUF1,R0 ; Get address for Filename CLR R4 ; Initialise BAT-files flag ; 40$: CMPB (R1),#40 ; Another space? BNE 50$ ; If ne no - start filling INC R1 ; Yes - skip it BR 40$ ; ; 50$: CMPB (R1),#S.SYM ; Next character the special symbol? BNE 55$ ; If NE no - carry on INC R4 ; Yes - flag it INC R1 ; And jump over it ; 55$: CMPB (R1),#'/ ; A slash in the wrong place? BEQ CMDERR ; Yes - illegal TSTB (R1) ; No - hit sentinel? BEQ 60$ ; Yes - at the end CMP R0,#BUF1+9. ; Filled the buffer? BGE CMDERR ; Yes - name too large MOVB (R1)+,(R0)+ ; No - copy it over BR 55$ ; And check the next one ; 60$: CMP R0,#BUF1 ; Anything there? BEQ CMDERR ; No - error CLRB (R0) ; Insert terminator (might need it) MOV #BUF1,R0 ; Get buffer address for conversion CLR R1 ; Period is illegal CALL $CAT5 ; Convert it MOV R1,BUF+14. ; Store it BCS 70$ ; If conversion error that's enough CLR R1 ; Period is illegal CALL $CAT5 ; Convert it MOV R1,BUF+16. ; Store it BCS 70$ ; If conversion error that's enough CLR R1 ; Period is illegal CALL $CAT5 ; Convert it MOV R1,BUF+18. ; Store it ; 70$: TST R4 ; BAT-type files? BEQ 80$ ; If EQ no - carry on MOV #-1,BUF+18. ; Yes - flag last word ; 80$: DIR$ #SEND ; SEND IT BCS SRQERR ; IF CS SEND ERROR RQST$C BAT... ; KICK THE BAT... TASK ON ; INGORE REQUEST ERRORS AT ALL 120$: EXIT$S ; AND LEAVE TASK .DSABLE LSB ;+ ; **-CMDERR ;**-SRQERR ; ; THESE ARE THE ERROR ROUTINES FOR COMMAND ERRORS AND ; SEND DATA ERRORS. ; AN APPROPRIATE ERROR MESSAGE IS PRINTED ON TI: ; AND A TASK EXIT IS EXECUTED ; ;- CMDERR: PMSG MSG1 ; SAY COMMAND SYNTAX ERROR EXIT$S ; AND RUN AWAY SRQERR: ; REF LABLE PMSG MSG2 ; SAY S/R ERROR EXIT$S ; AND LEAVE TASK .END SUB