A2osX/LIB/LIBCIFS.S.IO.txt
burniouf 447ce4b142 CIFS:Fixes
TCPIP:SEQPKT faster ACK
2022-03-18 18:59:39 +01:00

1316 lines
19 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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