;-*-MIDAS-*- TITLE IFILE SERVER ;MODIFIED FOR ITS/OZ FTP. from MINIC from MINI. ; ; 2-Sep-85 17:54:14, GZ - use SOPEN, fix EOF handling ;Contact name is IFILE ; ;Protocol: (all you can do is read files) ;Initial packet contains filename, ala SIMPLE connection. ;Server returns data packets containing stuff, followed by eof. A=1 B=2 C=3 D=4 E=5 T=6 TT=7 P=17 CHIC=10 CHOC=11 DKIC=12 ERRC=13 DEBUG: 0 PDL: -20,,. BLOCK 22 .INSRT SYSTEM;CHSDEF > $$CHAOS==1 $$CONNECT==1 .INSRT SYSENG;NETWRK > PKTBUF: BLOCK %CPMXW+%CPKDT BUF1==PKTBUF BUF1L==<%CPMXW+%CPKDT>*5 BUF2: BLOCK /4 WINSIZ: 5 GO: .CLOSE 1, ;Close load channel MOVE P,PDL MOVEI T,TSINT MOVEM T,42 .SUSET [.SMASK,,[%PIIOC]] MOVEI A,CHIC MOVEI B,0 MOVEI C,[ASCIZ/IFILE/] MOVE D,WINSIZ PUSHJ P,NETWRK"CHALSN JSR LOSE .SUSET [.SSNAME,,[SIXBIT/IFILE/]] ;Give peekers a clue OPEN: LDB B,[$CPKNB+NETWRK"PKTBUF] MOVE C,[440800,,%CPKDT+NETWRK"PKTBUF] OPEN1: SOJL B,OPEN2 ILDB A,C CAIE A,40 JRST OPEN1 OPEN2: MOVE D,[440700,,BUF2] OPEN3: SOJL B,OPEN4 ILDB A,C IDPB A,D JRST OPEN3 OPEN4: SETZ A, IDPB A,D MOVE A,[.UAI,,DKIC] .CALL [ SETZ ? SIXBIT/SOPEN/ ? A ? [440700,,BUF2]] JRST OPENLS ; JRST XMITA XMITA: MOVE A,[440700,,BUF1] ;HAVE TO DELETE ^C'S AND ^L'S AT EOF MOVEI B,5 ;GET BUFFERED-BACK WORD .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI DKIC ? A ? SETZ B] .LOSE %LSFIL XMITA0: MOVE A,[440700,,BUF1+1] MOVEI B,BUF1L-5 MOVE C,B .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI DKIC ? A ? SETZ B] .LOSE %LSFIL PUSH P,C IDIVI B,5 ;ROUND TO WORD BOUNDARY IMULI B,5 JUMPG C,[ MOVEI D,0 ;IF PARTIAL WORD TRANSFER, MAKE SURE FILLED WITH NULLS IDPB D,A SOJA C,. ] POP P,C SUB C,B JUMPE C,XMITA9 ;NOTHING TRANSFERRED, EOF XMITA3: MOVE A,[440700,,BUF1] ;NOW MOVE AND CONVERT BYTE-SIZE. DON'T MOVE LAST 5 CHARS MOVE E,[440800,,BUF2] MOVEI D,0 ZIPCO: ILDB T,A IDPB T,E ADDI D,1 XMITA2: SOJG C,ZIPCO MOVE A,[440800,,BUF2] .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI CHOC ? A ? SETZ D] JSR LOSE XMITA9: JUMPL B,XMITA7 ;HERE B HAS NUMBER CHARS NOT XFERRED LAST SIOT OR -1 FLAG MOVEI C,BUF1L-5 SUB C,B ADDI C,4 IDIVI C,5 ;NUMBER OF VALID WORDS IN BUFFER (NOT COUNTING FIRST ONE) MOVE D,BUF1(C) ;MOVE LAST WORD UP TO FIRST POSITION (REST HAVE BEEN XMTED) MOVEM D,BUF1 JUMPE B,XMITA0 ;NO EOF YET ;D HAS LAST WORD IN FILE, COUNT VALID CHARS MOVEI C,5 LSH D,-1 XMITA8: MOVE A,D ANDI A,177 JUMPE A,.+3 ;Nulls appear from someplace CAIE A,^C CAIN A,^L SOJG C,[ LSH D,-7 ? JRST XMITA8] SETO B, JUMPN C,XMITA3 ;GO TRANSMIT LAST WORD, SUCH AS IT IS XMITA7: .CALL [ SETZ ? SIXBIT/FORCE/ ? SETZI CHOC] JSR LOSE ; JRST XMTEOF XMTEOF: MOVSI B,(<.BYTE 8 ? %COEOF ? 0>) MOVEM B,PKTBUF .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF] JSR LOSE .CALL [SETZ ? 'FINISH ? SETZI CHOC] JSR LOSE .CLOSE DKIC, MOVSI B,(<.BYTE 8 ? %COCLS ? 0>) MOVEM B,PKTBUF .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF] JSR LOSE SKIPN DEBUG .LOGOUT 1, .VALUE .LOGOUT 1, ;;XMITB: MOVE A,[444400,,%CPKDT+PKTBUF] ; MOVEI B,%CPMXC/4 ; MOVE C,B ; .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI DKIC ? A ? SETZ B] ; .LOSE %LSFIL ; SUB C,B ; JUMPE C,XMTEOF ; IMULI C,4 ; DPB C,[$CPKNB+PKTBUF] ; MOVEI A,300 ; DPB A,[$CPKOP+PKTBUF] ; .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF] ; JSR LOSE ; JUMPE B,XMITB]; END IF IFNE 0, TSINT: 0 ? 0 JSR LOSE LOSE: 0 SKIPE DEBUG .VALUE .LOGOUT JRST .-2 ;FAILURE, RETURN ERROR MESSAGE OPENLS: MOVEI A,203 DPB A,[$CPKOP+PKTBUF] .CALL [ SETZ ? SIXBIT/OPEN/ ? [.UAI,,ERRC] ? [SIXBIT/ERR/] ? MOVEI 1 ? SETZI 0] .LOSE %LSFIL MOVE A,[440800,,%CPKDT+PKTBUF] MOVEI B,%CPMXC .CALL [ SETZ ? SIXBIT/SIOT/ ? MOVEI ERRC ? A ? SETZ B] .LOSE %LSFIL MOVEI B,0 IDPB B,A OPENL1: MOVE A,[440800,,%CPKDT+PKTBUF] OPENL2: ILDB TT,A CAIL TT,40 AOJA B,OPENL2 DPB B,[$CPKNB+PKTBUF] .CALL [ SETZ ? 'PKTIOT ? MOVEI CHOC ? SETZI PKTBUF] JSR LOSE SKIPN DEBUG .LOGOUT 1, .VALUE END GO