NEW AUTO 3,1 *-------------------------------------- CIFS.ChTyp CIFS2.ChTyp *-------------------------------------- CIFS.ChMod CIFS2.ChMod *-------------------------------------- CIFS.FStat *-------------------------------------- CIFS2.FStat lda #MLI.E.BADCALL sec rts *-------------------------------------- CIFS.Stat >STYA pPath resolved path * jsr ClearSocket jsr GetCTX jsr RequestT2SetupX ldx #0 .1 lda SMB.QueryPathInfo,x sta (ZPReqPtr),y iny inx cpx #SMB.QueryPathInfo.Len bne .1 jsr ReqT2SetupPtr2 jsr AppendPathPtr2 jsr AddYReqLenPtr2 jsr SetT2ReqLen jsr WriteSocket bcs .9 jmp Sleep .9 >RET 4 *-------------------------------------- CIFS2.Stat jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus lda #MLI.E.INVPATH Return this for stat() match ProDOS Behavior bcs .90 jsr GetRespDataPtr1 jsr FileInfo2StatBuf >PULLW ZPPtr2 Stat Buffer inc pStack Skip Filename inc pStack jsr StatBuf2Ptr2 jmp Exit.OK .9 jsr Exit.NODATA beq .99 .90 >POP 4 .99 rts *-------------------------------------- CIFS.MKDir >STYA pPath resolved path * jsr ClearSocket jsr GetCtx jsr RequestT2SetupX ldx #0 .1 lda SMB.CreateDirectory,x sta (ZPReqPtr),y iny inx cpx #SMB.CreateDirectory.Len bne .1 jsr AppendPath lda #0 sta (ZPReqPtr),y iny jsr SetT2ReqLenYA jsr WriteSocket bcs .9 jmp Sleep .9 >RET 4 *-------------------------------------- CIFS2.MKDir jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus bcs .90 jmp Exit.OK .9 jsr Exit.NODATA beq .99 .90 >POP 4 .99 rts *-------------------------------------- CIFS.OpenDir >STYA pPath resolved path jsr CIFS.NewFD bcs .9 lda #S.FD.T.DIR sta (pFD) lda #0 ldy #S.FD.DIR.EPB sta (pFD),y EOF Flag iny sta (pFD),y iny sta (pFD),y >PUSHW pPath >PUSHWZ >PUSHB hFD >SYSCALL2 mknod bcc .9 jsr CIFS.FreeFD stz CIFS.Status sec .9 rts *-------------------------------------- CIFS2.OpenDir lda #MLI.E.BADCALL sec rts *-------------------------------------- CIFS.ReadDir jsr CIFS.GetFD * jsr ClearSocket jsr GetCtx ldy #S.FD.DIR.EPB lda (pFD),y beq .1 lda #MLI.E.EOF sec rts .1 iny lda (pFD),y iny ora (pFD),y bne CIFS.ReadDir.Next jsr RequestT2SetupX ldx #0 .2 lda SMB.FindFirst2,x sta (ZPReqPtr),y iny inx cpx #SMB.FindFirst2.Len bne .2 bra CIFS.ReadDir.Send CIFS.ReadDir.Next jsr RequestT2SetupX ldx #0 .2 lda SMB.FindNext2,x sta (ZPReqPtr),y iny inx cpx #SMB.FindNext2.Len bne .2 phy ldy #S.FD.DIR.FC+1 lda (pFD),y tax dey lda (pFD),y ldy #S.NETBIOS+S.SMB.H+SMB.Trans2.H.Len+7 Search ID sta (ZPReqPtr),y txa iny sta (ZPReqPtr),y ply CIFS.ReadDir.Send lda (pPath) beq .1 jsr AppendPath lda #'\' sta (ZPReqPtr),y iny .1 lda #'*' sta (ZPReqPtr),y iny lda #0 sta (ZPReqPtr),y iny jsr SetT2ReqLenYA jsr WriteSocket bcs .9 jmp Sleep .9 rts *-------------------------------------- CIFS2.ReadDir jsr CIFS.GetFD jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus bcs .90 ldy #S.FD.DIR.FC lda (pFD),y iny ora (pFD),y sta bFlag bne .2 ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H+1 Search ID lda (ZPRespPtr),y tax dey ora (ZPRespPtr),y beq .90 lda (ZPRespPtr),y ldy #S.FD.DIR.FC sta (pFD),y iny txa sta (pFD),y .2 jsr GetRespDataPtr1 jsr CIFS2.ReadDir.GetBuf bcs .99 jsr GetRespDataPtr1 jsr CIFS2.ReadDir.FillBuf jsr Exit.OK >LDYA BufPtr ldx hBuf clc .90 rts .9 jmp Exit.NODATA .99 stz CIFS.Status jmp FreeRespData *-------------------------------------- CIFS2.ReadDir.GetBuf ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H Search Count lda bFlag bne .10 iny iny .10 iny iny lda (ZPRespPtr),y End Of Search phy ldy #S.FD.DIR.EPB sta (pFD),y ply dey dey lda (ZPRespPtr),y Search Count beq .99 tax lda #1 +Ending 0 sta ZPPtr2 stz ZPPtr2+1 .1 jsr AddSTAT2Ptr2 lda #22 clc jsr AddA2Ptr1 lda (ZPPtr1) Filename Len sec +\0 jsr AddA2Ptr2 lda (ZPPtr1) Filename Len inc +1 skip Filename Len sec +\0 jsr AddA2Ptr1 dex bne .1 >LDYA ZPPtr2 >SYSCALL2 GetMem bcs .9 >STYA BufPtr >STYA ZPPtr2 stx hBuf .9 rts .99 lda #MLI.E.EOF sec rts *-------------------------------------- CIFS2.ReadDir.FillBuf ldy #S.NETBIOS+S.SMB.H+S.TRANS2.H Search Count lda bFlag bne .10 iny iny .10 lda (ZPRespPtr),y tax .1 phx jsr FileInfo2StatBuf lda #22 clc jsr AddA2Ptr1 lda (ZPPtr1) tax Save Filename Len inc ZPPtr1 Skip Filename Len bne .2 inc ZPPtr1+1 .2 ldy #$ff .3 iny lda (ZPPtr1),y sta (ZPPtr2),y bne .3 txa sec jsr AddA2Ptr1 txa sec sbc #4 "x.EXT" ? bcc .7 tay lda (ZPPtr2),y cmp #'.' bne .7 ldx #0 .4 phy Y = '.' offset phx .5 iny lda (ZPPtr2),y beq .51 cmp #'A' bcc .50 cmp #'Z'+1 bcs .50 eor #$20 .50 cmp PRODOS.FT.TXT,x bne .6 inx bra .5 .51 pla lsr lsr tax lda PRODOS.FT.HEX,x sta StatBuf+S.STAT.P.TYPE ply lda #0 sta (ZPPtr2),y tya bra .70 .6 pla clc adc #4 tax ply cpx #PRODOS.FT.END bne .4 tya * sec adc #3 bra .70 .7 txa .70 sec +\0 jsr AddA2Ptr2 jsr StatBuf2Ptr2 jsr AddSTAT2Ptr2 .8 plx dex bne .1 lda #0 sta (ZPPtr2) rts *-------------------------------------- CIFS.CloseReg CIFS.CloseDir tax lda hFDs.hName-1,x beq .1 phx stz hFDs.hName-1,x >SYSCALL2 FreeMem plx .1 lda hFDs-1,x stz hFDs-1,x >SYSCALL2 FreeMem stz CIFS.Status clc rts *-------------------------------------- CIFS2.CloseDir lda #MLI.E.INVPATH sec rts *-------------------------------------- CIFS.ChOwn CIFS2.ChOwn lda #MLI.E.BADCALL sec rts *-------------------------------------- CIFS.FOpen >STYA pPath resolved path jsr GetCtx ldx #S.SMB.H.CMD.NT.CREATE.ANDX jsr RequestSetupX ldx #0 .1 lda SMB.ComCreate.H,x sta (ZPReqPtr),y iny inx cpx #SMB.ComCreate.H.Len bne .1 jsr ReqSetupPtr2 ldy #2 lda (pStack),y TYPE pha jsr AppendPathPtr2 pla beq .2 jsr AppendTypePtr2 .2 jsr AddYReqLen tya ldy #S.NETBIOS+S.SMB.H+6 NameLength sta (ZPReqPtr),y inc +1 for \0 jsr Add2ByteCount ldx #1 FILE_OPEN ldy #3 fopen flags lda (pStack),y bit #O.WRONLY beq .8 bit #O.CREATE bne .3 ldx #3 FILE_OPEN_IF .3 bit #O.APPEND bne .8 ldx #5 FILE_OVERWRITE_IF .8 txa ldy #S.NETBIOS+S.SMB.H+SMB.Trans2.H.Len+7 CreateDisposition sta (ZPReqPtr),y jsr SetReqLen jsr WriteSocket bcs .9 jmp Sleep .9 >RET 6 *-------------------------------------- CIFS2.FOpen jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus bcs .90 jsr CIFS.NewFD bcs .91 lda #S.FD.T.REG sta (pFD) ldy #S.NETBIOS+S.SMB.H+6 FileID lda (ZPRespPtr),y pha iny lda (ZPRespPtr),y ldy #S.FD.REG.REF+1 sta (pFD),y dey pla sta (pFD),y ldy #3 fopen flags lda (pStack),y bit #O.APPEND beq .3 ldy #S.NETBIOS+S.SMB.H+56+3 EOF ldx #4 .1 lda (ZPRespPtr),y pha dey dex bne .1 ldx #4 ldy #S.FD.REG.REF+2 .2 pla sta (pFD),y iny dex bne .2 bra .8 .3 jsr CIFS.Seek0 .8 ldy #4 path lda (pStack),y >PUSHA lda (pStack),y >PUSHA >PUSHWZ mod >PUSHB hFD >SYSCALL2 mknod bcc .91 jsr CIFS.FreeFD sec .91 stz CIFS.Status jsr FreeRespData bra .90 .9 jsr Exit.NODATA beq .99 .90 >POP 6 .99 rts *-------------------------------------- CIFS.FClose jsr CIFS.GetFD jsr GetCtx ldx #S.SMB.H.CMD.CLOSE jsr RequestSetupX ldx #0 .1 lda SMB.ComClose.H,x sta (ZPReqPtr),y iny inx cpx #SMB.ComClose.H.Len bne .1 sty ZPReqLen stz ZPReqLen+1 ldy #S.FD.REG.REF lda (pFD),y pha iny lda (pFD),y ldy #S.NETBIOS+S.SMB.H+2 FileID sta (ZPReqPtr),y pla dey sta (ZPReqPtr),y jsr SetReqLen jsr WriteSocket bcs .9 jmp Sleep .9 rts *-------------------------------------- CIFS2.FClose sta hFILE jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus bcs .99 lda hFILE jsr CIFS.CloseReg jmp Exit.OK .9 jmp Exit.NODATA .99 rts *-------------------------------------- CIFS.FRead ldy #4 hFILE lda (pStack),y jsr CIFS.GetFD jsr GetCtx ldx #S.SMB.H.CMD.READ.ANDX jsr RequestSetupX ldx #0 .1 lda SMB.ComRead.H,x sta (ZPReqPtr),y iny inx cpx #SMB.ComRead.H.Len bne .1 jsr ReqSetupPtr2 jsr CIFS.RWGetFidOfs ldy #1 DataLen HI lda (pStack),y beq .2 lda #0 ldx #1 256 bytes to read bra .3 .2 lda (pStack) DataLen LO ldx #0 .3 ldy #S.NETBIOS+S.SMB.H+11 MaxCountOfBytesToReturn sta (ZPReqPtr),y iny txa sta (ZPReqPtr),y jsr SetReqLen jsr WriteSocket bcs .9 jmp Sleep .9 >RET 5 *-------------------------------------- CIFS2.FRead jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus bcs .90 ldy #S.NETBIOS+S.SMB.H+11 DataLength LO lda (ZPRespPtr),y iny ora (ZPRespPtr),y bne .10 jsr Exit.OK lda #MLI.E.EOF sec bra .90 .10 ldy #S.NETBIOS+S.SMB.H+13 DataOffset LO lda (ZPRespPtr),y * clc adc #4 S.NETBIOS * clc adc ZPRespPtr sta ZPPtr1 lda #0 adc ZPRespPtr+1 sta ZPPtr1+1 ldy #3 DataPtr HI lda (pStack),y sta ZPPtr2+1 dey DataPtr LO lda (pStack),y sta ZPPtr2 ldy #S.NETBIOS+S.SMB.H+11 DataLength LO lda (ZPRespPtr),y tax jsr CIFS.CopyX ldy #S.NETBIOS+S.SMB.H+11 jsr CIFS2.RWSetOfsY ldy #S.NETBIOS+S.SMB.H+12 DataLength HI lda (ZPRespPtr),y beq .2 less than 256 inc CIFS.Cnt+1 ldy #1 DataLen HI lda (pStack),y dec sta (pStack),y ldy #3 DataPtr HI lda (pStack),y inc sta (pStack),y bra .7 .2 dey DataLength LO lda (ZPRespPtr),y sta CIFS.Cnt lda #0 sta (pStack) DataLen LO .7 jsr Exit.OK ldy #1 DataLen HI lda (pStack),y ora (pStack) DataLen LO bne .8 >LDYA CIFS.Cnt bra .90 .8 jmp Sleep2 Back to CIFS.FRead for next chunk .9 jsr Exit.NODATA beq .99 .90 >POP 5 .99 rts *-------------------------------------- CIFS.FWrite ldy #4 hFILE lda (pStack),y jsr CIFS.GetFD jsr GetCtx ldx #S.SMB.H.CMD.WRITE.ANDX jsr RequestSetupX ldx #0 .1 lda SMB.ComWrite.H,x sta (ZPReqPtr),y iny inx cpx #SMB.ComWrite.H.Len bne .1 jsr ReqSetupPtr2 jsr CIFS.RWGetFidOfs ldy #3 DataPtr HI lda (pStack),y sta ZPPtr1+1 dey DataPtr LO lda (pStack),y sta ZPPtr1 dey DataLen HI lda (pStack),y beq .5 lda #0 ldx #1 write $100 bra .6 .5 dey DataLen LO lda (pStack),y ldx #0 write $0xx .6 pha ldy #S.NETBIOS+S.SMB.H+21 DataLength sta (ZPReqPtr),y iny txa sta (ZPReqPtr),y pla pha clc adc ZPReqLen sta ZPReqLen txa adc ZPReqLen+1 sta ZPReqLen+1 pla pha ldy ByteCountOfs sta (ZPReqPtr),y txa iny sta (ZPReqPtr),y plx jsr CIFS.CopyX jsr SetReqLen jsr WriteSocket bcs .9 ldy #1 DataLen HI lda (pStack),y beq .7 dec DataLen - $100 sta (pStack),y ldy #3 DataPtr HI lda (pStack),y inc DataPtr + $100 sta (pStack),y jmp Sleep .7 lda #0 sta (pStack) DataLen = 0 jmp Sleep .9 >RET 5 *-------------------------------------- CIFS2.FWrite jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus bcs .90 ldy #S.NETBIOS+S.SMB.H+5 Count LO jsr CIFS2.RWSetOfsY ldy #S.NETBIOS+S.SMB.H+5 Count LO lda (ZPRespPtr),y bne .1 inc CIFS.Cnt+1 bra .7 .1 sta CIFS.Cnt lda #0 sta (pStack) DataLen LO .7 jsr Exit.OK ldy #1 DataLen HI lda (pStack),y ora (pStack) DataLen LO bne .8 >LDYA CIFS.Cnt clc bra .90 .8 jmp Sleep2 .9 jsr Exit.NODATA beq .99 .90 >POP 5 .99 rts *-------------------------------------- CIFS.FFlush clc Nothing to do rts *-------------------------------------- CIFS2.FFlush *-------------------------------------- CIFS.FSeek ldy #5 hFILE lda (pStack),y jsr CIFS.GetFD >PULLA tax whence >PULLL ZPPtr1 ZPPtr2 inc pStack clc rts *-------------------------------------- CIFS2.FSeek *-------------------------------------- CIFS.FTell *-------------------------------------- CIFS2.FTell *-------------------------------------- CIFS.FEOF *-------------------------------------- CIFS2.FEOF lda #MLI.E.BADCALL sec rts *-------------------------------------- CIFS.Remove >STYA pPath resolved path * jsr ClearSocket jsr GetCTX ldx #S.SMB.H.CMD.DELETE jsr RequestSetupX ldx #0 .1 lda SMB.ComDelete.H,x sta (ZPReqPtr),y iny inx cpx #SMB.ComDelete.H.Len bne .1 jsr ReqSetupPtr2 lda #$04 BufferFormat jsr PutBytePtr2 jsr AppendPathPtr2 jsr AddYReqLen tya inc +1 for BufferFormat inc +1 for \0 ldy ByteCountOfs sta (ZPReqPtr),y jsr SetReqLen jsr WriteSocket bcs .9 jmp Sleep .9 rts *-------------------------------------- CIFS2.Remove jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus bcs .99 jmp Exit.OK .9 jmp Exit.NODATA .99 rts *-------------------------------------- CIFS.Rename >STYA pPath resolved src path * jsr ClearSocket jsr GetCTX ldx #S.SMB.H.CMD.RENAME jsr RequestSetupX ldx #0 .1 lda SMB.ComRename.H,x sta (ZPReqPtr),y iny inx cpx #SMB.ComRename.H.Len bne .1 jsr ReqSetupPtr2 lda #$04 BufferFormat jsr PutBytePtr2 jsr AppendPathPtr2 tya inc +1 for BufferFormat inc +1 for \0 jsr Add2ByteCount lda (pStack) sta pPath ldy #1 lda (pStack),y sta pPath+1 .2 inc pPath skip /mount bne .3 inc pPath+1 .3 lda (pPath) cmp #'/' bne .2 lda #$04 BufferFormat jsr PutBytePtr2 jsr AppendPathPtr2 tya inc +1 for BufferFormat inc +1 for \0 ldy ByteCountOfs sta (ZPReqPtr),y jsr SetReqLen jsr WriteSocket bcs .9 jmp Sleep .9 >RET 4 *-------------------------------------- CIFS2.Rename jsr ReadSocket bcs .9 jsr GetRespData jsr CheckSMBStatus bcs .99 jsr Exit.OK bra .99 .9 jmp Exit.NODATA .99 >RET 4 *-------------------------------------- CIFS.NewFD ldx #1 .1 lda hFDs-1,x beq .2 inx cpx #K.hFD.MAX+1 bne .1 lda #E.OOH * sec rts .2 stx hFILE >LDYAI 16 S.FD.REG = S.FD.DIR = 16 >SYSCALL2 GetMem bcs .9 >STYA pFD stx hFD txa ldx hFILE sta hFDs-1,x stz hFDs.hName-1,x lda hHandler ldy #S.FD.PFT sta (pFD),y * clc .9 rts *-------------------------------------- CIFS.GetFD sta hFILE tax phx lda hFDs.hName-1,x >SYSCALL2 GetMemPtr >STYA pPath plx lda hFDs-1,x >SYSCALL2 GetMemPtr >STYA pFD rts *-------------------------------------- CIFS.FreeFD pha lda hFD >SYSCALL2 FreeMem ldx hFILE stz hFDs-1,x pla rts *-------------------------------------- CIFS.RWGetFidOfs ldx #6 ldy #S.FD.REG.REF .1 lda (pFD),y pha iny dex bne .1 ldx #6 ldy #S.NETBIOS+S.SMB.H+5+5 .2 pla sta (ZPReqPtr),y dey dex bne .2 rts *-------------------------------------- CIFS2.RWSetOfsY phy ldy #4 hFILE lda (pStack),y jsr CIFS.GetFD ply Count LO phy lda (ZPRespPtr),y ldy #S.FD.REG.REF+2 clc adc (pFD),y sta (pFD),y ply iny Count HI lda (ZPRespPtr),y ldy #S.FD.REG.REF+3 adc (pFD),y sta (pFD),y bcc .8 iny lda (pFD),y inc sta (pFD),y bne .8 iny lda (pFD),y inc sta (pFD),y .8 rts *-------------------------------------- CIFS.CopyX ldy #0 .1 lda (ZPPtr1),y sta (ZPPtr2),y iny dex bne .1 rts *-------------------------------------- CIFS.Seek0 ldx #4 ldy #S.FD.REG.REF+2 lda #0 .1 sta (pFD),y iny dex bne .1 rts *-------------------------------------- MAN SAVE usr/src/lib/libcifs.io.s LOAD usr/src/lib/libcifs.s ASM