*DECK NETXFR *IF DEF,XFR USETEXT AIPDEF USETEXT NP$NWL USETEXT NP$GETS USETEXT NP$STAT USETEXT NP$DB USETEXT NP$TAA USETEXT NX$ACBF USETEXT NX$ACBX USETEXT NX$MSG PROC NETXFR(ACN,FILENAME,CODE,STATIS,NOWAIT,DATADEC,TIMEOUT,ABL,FACIL, BSIZE,CWS,ICKVAL); # TITLE NETXFR - INITIATE TRANSFER OF A FILE. # BEGIN # NETXFR # # ** NETXFR - INITIATE TRANSFER OF A FILE. * * NETXFR INITIATES DATA-TRANSFERS TO A REMOTE APPLICATION AND * UNLESS IMMEDIATE RETURN IS REQUESTED, CALLS NETXFRC UNTIL THE * TRANSFER IS COMPLETE. * * PROC NETXFR(ACN,FILENAME,CODE,STATIS,NOWAIT,DATADEC,TIMEOUT, * ABL,FACIL,BSIZE,CWS,ICKVAL * * ENTRY ACN - APPLICATION CONNECTION NUMBER. * FILENAME - FILE NAME TO BE TRANSFERRED, IN DISPLAY * CODE, 7 CHARACTERS MAXIMUM. * CODE = 0, FILE TO BE RECEIVED FROM THE NETWORK * = 1, FILE TO BE SENT TO THE NETWORK. * STATIS - CALLING PROGRAM REPLY STATUS WORD * NOWAIT = 0, RETURN FROM NETXFR CALL WHEN THE FILE * TRANSFER IS COMPLETED. * = 1, RETURN FROM NETXFR CALL IMMEDIATELY. * DATADEC - FORMAT OF THE DATA THAT IS TO BE * TRANSFERRED. * = 0, UH - THE FILE CONTAINS BINARY DATA * WITH EMBEDDED CONTROL WORDS. * 1, UU - THE FILE CONTAINS BINARY DATA IN * AN UNSTRUCTURED (NO EOR/EOFS) * FORMAT. * 2, US - THE FILE CONTAINS BINARY DATA IN * A STRUCTURED FORMAT. * 3, C6 - THE FILE CONTAINS 6-BIT DISPLAY * CODE DATA WITH Z-BYTE RECORDS AND * PHYSICAL BOUNDARIES (EOR/EOFS). * 4, C8 - THE FILE CONTAINS 8-BIT ASCII IN * 12-BIT BYTES, 5 CHARACTERS TO A * WORD. LINES ARE TERMINATED BY * Z-BYTES. PHYSICAL BOUNDAARIES MAY * EXIST. * NOTE: CODED FILES (C6 AND C8) ARE CON- * VERTED TO A FILE STRUCTURE KNOWN * INTERNALLY BY FIP AS CN. CN * FILES ARE 8-BIT ASCII IN 12-BIT * BYTES USING UNIT SEPARATOR * CHARACTERS FOR END OF LINES. THE * CN FORMAT IS HOW ALL CODED FILES * ARE TRANSMITTED/RECEIVED BY FIP * TO/FROM THE NETWORK DRIVER (NDR). * CN MUST NOT BE SPECIFIED BY AN * APPLICATION. * TIMEOUT - TIME IN SECONDS TO WAIT FOR A FUNCTION * RESPONSE BEFORE TIMING OUT. * ABL - APPLICATION BLOCK LIMIT. * * FACIL - OPTIONS AVAILABLE DURING DATA TRANSFER. * * CWS - CHECKMARKING WINDOW SIZE * * ICKVAL - INITIAL CHECK MARK WINDOW. * * EXIT STATIS -2 = TERMINATING. * -1 = INITIATING. * 00 = IN PROCESS. * 01 = COMPLETE, NO ERROR. * 02 = UNDEFINED ERROR. * 03 = CONNECTION BROKEN DETECTED. (APPLICATION * IS EXPECTED TO SEND CON/END/R RESPONSE.) * 04 = PROTOCOL ERROR. * 05 = TIMED OUT WAITING FOR RESPONSE FROM * NETWORK. * 06 = OUTPUT BLOCK NOT DELIVERED AFTER THREE * RETRIES. * 07 = TOO MANY FILE TRANSFERS HAVE BEEN INITIATED. * 08 = ACN NOT WITHIN ALLOWABLE RANGE. * 09 = SECOND FILE TRANSFER ATTEMPTED ON ACN. * 10 = CIO ERROR DETECTED. * 11 = PREMATURE TERMINATION RECEIVED FROM * REMOTE APPLICATION. * 12 = CONTROL WORD FORMAT ERROR. * 13 = INVALID DEVICE TYPE. * 14 = EMPTY FILE. * 15 = BLOCK SEQUENCE NUMBERS ARE NON-CONSECUTIVE * AND NOT RECOVERABLE IN N RETRIES (DEFAULT 3) * 16 = BLOCK LEADER NOT RECOGNIZABLE OR PRU * BOUNDARY VIOLATION AND NOT RECOVERABLE IN * N RETRIES ( DEFAULT 3 ). * 17 = BINARY FILE TRANSFER ON PRU CONNECTION. * * * PROCESS * VALIDATE DATA DECLARATION. * VALIDATE CODE. * VALIDATE CONNECTION NUMBER. * IF NUMFILEXFR LQ 4 * THEN * SWITCH CONNECTION TO LIST NUMBER 1. * INITIALIZE THE FTT AND OPEN FILE. * IF NOT WAIT * THEN (* COMPLETE THEN RETURN *) * LOOP UNTIL STATUS IS COMPLETE OR ERROR OCURRED * IF STATE[FTTINDEX] IS STATEX (* CIO NOTOCOMP *) * AND STORD[FTTINDEX] IS NOT FOR PRU * THEN * RECALL (NP$RCL). * REVALIDATE THE FILE. * ELSE * IF S BIT IS ON * GET THIS SM. * ELSE * CALL NETWAIT FOR CONTINUING FILE TRANSFER. * END OF LOOP * * ELSE (* RETURN TO APPLICATION *) * RETURN. * * * RETURN. * * NOTE - AN OVERLAY WHICH REFERENECES THIS MODULE MUST REMAIN * IN CM UNTIL ALL FILE TRANSFERS ARE COMPLETE. * # XREF BEGIN PROC NP$STPR ; # STATE TABLE PROCESSOR # PROC NP$GET; # GET SUPERVISORY MESSAGE # PROC NP$GJO ; # GET ORIGIN OF JOB # *IF DEF,STAT,1 PROC NP$SN ; # STATISTIC PROCESSOR # PROC NP$PUT; # NETPUT SWH/LST/R MESSAGE # PROC NETWTQ; # TRANSFER FILE THR. QUICK NETWAIT# PROC NP$ERR ; PROC NP$MSG; # SEND MESSAGE TO DAYFILE # PROC NP$RCL ; # TO DO RECALL # PROC NP$RTIM ; PROC NP$S63 ; PROC NP$VALF ; PROC NP$XFR ; PROC NP$INIT; FUNC NP$CS63 B; FUNC NP$CDD C(10) ; # CONVERT INTEGER TO DISPLAY CODE # END LABEL RETURNX ; LABEL SENDMSG ; ITEM ACN I; # APPLICATION CONNECTION NUMBER # ITEM FILENAME C(7); # FILE NAME # ITEM CODE I; # OPERATION CODE # ITEM STATIS I; # CALLER-S STATUS WORD # ITEM NOWAIT B; # RETURN ASAP FLAG # ITEM DATADEC I; # DATA DECLARATION # ITEM TIMEOUT I; # TIME TO WAIT FOR RESPONSE # ITEM ABL I; # APPLICATION BLOCK LIMIT # ITEM FACIL C(10) ; ITEM BSIZE U; # BLOCK SIZE FOR TRANSMITTING # ITEM CWS U; # CHECK MARK WINDOW SIZE # ITEM ICKVAL U; # INITIAL CHECKMARK VALUE # ITEM I ; ITEM SCRATCH ; ITEM LOOPI; # LOOP INDEX # ITEM FACODE; # FACILITY CODE # ITEM INDEX I ; # LOCAL INDEX OF THE FTT ENTRY # CONTROL EJECT; *IF DEF,STAT,1 NP$SN(TYPE"XFR"); # KEEP STATISTIC COUNT # # * IF THIS IS THE FIRST TIME APPLICATION CALL NETXFR ( TIME$UP * IS ZERO ), THEN CHECK FOR THE CHARACTER SET OF APPLICATION. * FUNCTION NP$CS63 IS BOOLEAN FUNCTION, VALUE IS SET AT ASSEMBLY * TIME. IF CHARACTER SET 63 IS USED FOR APPLICATION, NP$CS63 IS * TRUE. # IF TIME$UP EQ 0 THEN BEGIN # FIRST TIME XFR INITIATED # NP$RTIM(TIME$WORD) ; # TAKE CURRENT TIME # TIME$UP = TIME$SEC[0] ; IF NP$CS63 THEN NP$S63 ; # RESET THE CHARACTER SET FOR TRANSLATION # END # FIRST TIME XFR INITIATED # P = LOC (STATIS); NET$AWL$XFR = 0 ; # CLEAR THE FLAG # NP$XFR ; # SEND XFR WORKLIST FOR VALIDA# IF NET$AWL$XFR EQ 0 THEN BEGIN # APPL. IS NOT VALIDATED TO CALL # STATUSWD = XFRNOTALLOW ; # NETXFR # GOTO SENDMSG ; END IF IDLEDOWN THEN BEGIN # GRADUALLY IDLE-DOWN # STATUSWD = DISABLE ; # ALLOW NO MORE TRANSFERRING # GOTO SENDMSG ; END # RETURN TO APPLICATION # STATUSWD = INITIAT ; # ASSUMING EVERYTHING IS O.K. # IF DATADEC LS MINDD OR DATADEC GR MAXDD THEN BEGIN # INVALID DATA DECLARATION # NP$ERR("46") ; # WRITE DAYFILE MSG, ABORT THE C.P. # END IF CODE LS RECEIVE OR CODE GR SEND THEN BEGIN # INVALID CODE # NP$ERR("47") ; # WRITE DAYFILE MSG, ABORT THE C.P. # END NP$GJO(I) ; # GET THE ORIGIN OF JOB # IF I EQ JOT$TXOT # INTERACTIVE JOB TYPE # AND FILENAME EQ "INPUT" # FILE NAME IS INPUT # THEN BEGIN # JOB TYPE AND FILE NAME CAN NOT # STATUSWD = ILL$JOT ; # BE TRANSFERRED # GOTO RETURNX ; END IF ACN LS MINIACN OR ACN GR MAXIACN THEN BEGIN # ACN OUT OF RANGE # STATUSWD = ACN$NWR ; # REYURN STATUS BACK TO APPL. # GOTO RETURNX; END IF ABL LQ 0 OR ABL GR ABLLIMIT THEN BEGIN # ABL NOT IN THE RANGE # STATUSWD = ABL$ERR ; GOTO RETURNX; END P = LOC(FACIL); # PULL TEMPLATE TO FACIL WORD # FACODE = B<0,6>FACILITY; # GET FIRST FACILITY CODE # FOR LOOPI = 6 STEP 6 WHILE ((FACODE NQ BLANK) AND (FACODE NQ 0)) DO BEGIN IF FACODE NQ SFACIL AND # NOT -S- FACILITY # FACODE NQ RFACIL AND # NOT -R- FACILITY # FACODE NQ MFACIL # NOT -M- FACILITY # THEN BEGIN STATUSWD = BAD$FAC; # BAD FACILITY CODE USED # FACILWD[0] = 0; # CLEAR BIT MASK # GOTO RETURNX; # EXIT # END ELSE BEGIN BFACILWD[0] = 1; # SET FLAG FOR FACILITY CODE # FACODE = BFACILITY; # EXTRACT NEXT FACILITY CODE # END END IF DATADEC GQ C6 THEN BEGIN IF BSIZE LQ 0 OR BSIZE GR IVT$MAX$BSZ THEN BEGIN # ERROR IN BLOCK SIZE # STATUSWD = BSXALOW ; # BLOCKSIZE NOT IN RANGE # GOTO RETURNX; END # ERROR IN BLOCK SIZE # END # IVT MODE # ELSE BEGIN # PRU MODE # IF BSIZE NQ ONE$PRU AND BSIZE NQ TWO$PRU AND BSIZE NQ THREE$PRU THEN BEGIN # BSIZE IS NOT 1,2 OR 3 PRU # STATUSWD = BSXALOW ; GOTO RETURNX; END END # PRU MODE # IF CWS LS 1 OR CWS GR MXCWS # IF CWS OUT OF RANGE # THEN BEGIN STATUSWD = ILL$CWSZ; GOTO RETURNX; END IF ICKVAL LS 0 OR ICKVAL GR MXICKVAL # IF ICKVAL OUT OF RANGE # THEN BEGIN STATUSWD = ILL$ICKZ; GOTO RETURNX; END IF NUMFILEXFR LS MAXFILEXFR THEN BEGIN # INITIATE A FILE TRANSFER # NUMFILEXFR = NUMFILEXFR + 1 ; LASTXFRACN = ACN ; # * INITIATE THE FILE TRANSFER. # IDFM$LFN[INITIAT] = FILENAME ; NP$MSG(IDFM$MSG[INITIAT],XFRDTYPE); NP$INIT(ACN,FILENAME,CODE,STATUSWORD,DATADEC,TIMEOUT,ABL, BSIZE,CWS,ICKVAL) ; INDEX = FTTINDEX ; # LOCAL INDEX FOR THIS FTT ENTRY # IF STATUSWD NQ INITIAT THEN GOTO RETURNX; # ERROR FOUND DURING INITIALIZATION # # * SWITCH THIS CONNECTION ONTO LIST 1. # LST$ACN[0] = ACN; LST$NLIST[0] = XFR$LIST ; OUT$ABHTLC[0] = 1 ; LOC$HA = LOC(OUT$ABH) ; LOC$TA = LOC(LST$SWH) ; OPCODE = OP$PUT ; *IF DEF,STAT,1 IAM = TYPE"PUT" ; NP$PUT ; # NETPUT LST/SHW TO SWITCH TO LIST 1 # # SWITCHING ICT OF THIS CONN. TO CHARACTER TYPE 2. # DC$ACN[0] = ACN ; DC$ACT[0] = CT8ASCII ; LOC$HA = LOC(OUT$ABH) ; LOC$TA = LOC(DC$CICT) ; NP$PUT ; # CALL STATE TABLE PROCESSOR FOR APPROPRIATE INITIAL ACTION ( EFFECTED PRU MODE ONLY ) # NP$STPR(FTTINDEX,NSPTOCM,0) ; IF NOT NOWAIT THEN BEGIN # COMPLETE THIS FILE TRANSFER AND CONTINUE ALL OTHERS # FOR I = I WHILE STATIS LQ IN$PROG DO BEGIN FTTINDEX = INDEX ; # RESET THE LOCAL INDEX OF FTT # IF FTTSTATE[FTTINDEX] EQ STATX THEN BEGIN # CIO OUTSTANDING # NP$RCL(CIOCALL); NP$VALF ; # RE-VALIDATE THE FILE # END # CIO OUTSTANDING # ELSE BEGIN # OK, PROCEED XFR # IF (SD$FLAG NQ 0) OR # SUP MSGS QUEUED IN NIP # (HEAD NQ FOOT) # SUP MSGS QUEUED IN AIP # THEN BEGIN # GET SUPERVISORY MESSAGE # ACLN = 0 ; # ACN = 0 # LOC$HA = LOC(DATA$WORD[0]);# HEADER LOCATION # LOC$TA = LOC(DATA$WORD[1]);# TEXT LOCATION # TLMX = MXIVT$SIZE ; # TEXT LENGTH # OPCODE = OP$GET ; # OPCODE IS GET # NWL[NEXT] = 0 ; # CLEAR THE NWL OPCODE # NWL$TA[NEXT] = LOC$TA ; BS = OPABHSIZ ; NP$GET ; END # GET SUPERVISORY MESSAGE # IF XFR$COM # IF FILE XFR COMPLETED # THEN BEGIN XFR$COM = FALSE; # RESET FLAG TO FASLE # END ELSE BEGIN NETWTQ(TIMEOUT,0); # QUICK NETWAIT OTHERWISE # END END END END ELSE BEGIN # RETURN CONTROL TO APPLICATION # STATUSWD = IN$PROG ; GOTO RETURNX ; END # CONTINUE FILE TRANSFER LATER # END ELSE BEGIN STATUSWD = GTMAXFR ; RETURNX: IDFM$LFN[STATUSWD] = FILENAME ; SENDMSG: NP$MSG(IDFM$MSG[STATUSWD],XFRDTYPE); # DAYFILE MESSAGE # END RETURN; END # NETXFR # TERM *ENDIF