NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF lib/libcifs *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/mli.e.i .INB inc/eth.i .INB inc/libtcpip.i .INB inc/net.smb.i *-------------------------------------- .DUMMY .OR ZPLIB ZS.START ZPReqPtr .BS 2 ZPReqLen .BS 2 ZPCtxPtr .BS 2 ZPRespPtr .BS 2 ZPPtr1 .BS 2 ZPPtr2 .BS 2 ZS.END .ED *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START .DA 0 .DA 0 .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA LIB.LOAD .DA LIB.UNLOAD .DA CIFS.Negotiate .DA CIFS.SessionSetup .DA CIFS.TreeConnect .DA CIFS.Mount .DA CIFS.UMount *-------------------------------------- L.CALLBACK .DA CIFS.CallBack *-------------------------------------- J.CIFS .DA CIFS.ChTyp .DA CIFS.ChMod .DA CIFS.FStat .DA CIFS.Stat .DA CIFS.MKDir .DA CIFS.MKNod .DA CIFS.MKFIFO .DA CIFS.Pipe .DA CIFS.OpenDir .DA CIFS.ReadDir .DA CIFS.CloseDir .DA CIFS.Open .DA CIFS.Close .DA CIFS.Read .DA CIFS.Write .DA CIFS.ChOwn J.CIFS2 .DA CIFS2.ChTyp .DA CIFS2.ChMod .DA CIFS2.FStat .DA CIFS2.Stat .DA CIFS2.MKDir .DA CIFS2.MKNod .DA CIFS2.MKFIFO .DA CIFS2.Pipe .DA CIFS2.OpenDir .DA CIFS2.ReadDir .DA CIFS2.CloseDir .DA CIFS2.Open .DA CIFS2.Close .DA CIFS2.Read .DA CIFS2.Write .DA CIFS2.ChOwn L.LIBTCPIP .DA LIBTCPIP L.SMB.TRANSPORT .DA SMB.TRANSPORT .DA 0 *-------------------------------------- LIB.LOAD >LDYA L.LIBTCPIP >SYSCALL2 LoadLib bcs .9 sta hLIBTCPIP >SYSCALL2 GetMemPtr >STYA pLIBTCPIP >LDYAI 256 >SYSCALL2 GetMem bcs .9 stx hReq * clc .9 rts *-------------------------------------- LIB.UNLOAD lda hReq beq .1 >SYSCALL2 FreeMem .1 lda hLIBTCPIP beq .8 >SYSCALL2 UnloadLib .8 clc rts *-------------------------------------- * >PUSHB hSocket * >PUSHBI 0 * >LIBCALL Negotiate * A = hSMBContext *-------------------------------------- CIFS.Negotiate lda (pStack) bne .1 dec sta (pStack) >PUSHWI SMB.NegReq.end-SMB.TRANSPORT >PUSHW L.SMB.TRANSPORT ldy #1+4 hSocket lda (pStack),y ldx #LIBTCPIP.Send jsr GO.LIBTCPIP bcs .99 lda #0 sec rts .1 dec sta (pStack) beq .98 ldy #1 hSocket lda (pStack),y ldx #LIBTCPIP.Recv jsr GO.LIBTCPIP bcc .3 cmp #E.NODATA bne .99 inc rts .3 jsr GetRespData ldy #S.NETBIOS+S.SMB.H.STATUS lda (ZPRespPtr),y bne .97 ldy #3 lda (ZPRespPtr),y clc adc #4 + NETBIOS header sta ZPPtr1 tay lda #0 >SYSCALL2 GetMem bcs .99 >STYA ZPCtxPtr ldy ZPPtr1 .4 dey lda (ZPRespPtr),y sta (ZPCtxPtr),y tya bne .4 ldy #S.NETBIOS+S.SMB.H.FLAGS sta (ZPCtxPtr),y phx lda hResp >SYSCALL2 FreeMem pla clc >RET 2 .97 lda hResp >SYSCALL2 FreeMem .98 lda #MLI.E.IO .99 >RET 2 *-------------------------------------- * >PUSHB hSocket * >PUSHB hSMBContext * >PUSHW username * >PUSHW password * >PUSHBI 0 * >LIBCALL SessionSetup * (SMBContext updated with UID) *-------------------------------------- CIFS.SessionSetup lda (pStack) bne .5 dec sta (pStack) ldy #5 hSMBContext jsr GetSMBContext ldx #S.SMB.H.CMD.SESSION.SETUP.ANDX jsr RequestSetupX ldx #0 .2 lda SMB.SessionSetup.H,x sta (ZPReqPtr),y iny inx cpx #SMB.SessionSetup.H.Len bne .2 phy save Y = LEN iny iny ldx #0 .3 lda SMB.SessionSetup.Guest,x sta (ZPReqPtr),y iny inx cpx #SMB.SessionSetup.Guest.Len bne .3 ldx #0 .4 lda SMB.SessionSetup.T,x sta (ZPReqPtr),y iny inx cpx #SMB.SessionSetup.T.Len bne .4 pla jsr SetReqLenYAtA >PUSHYA >PUSHW ZPReqPtr ldy #6+4 hSocket lda (pStack),y ldx #LIBTCPIP.Send jsr GO.LIBTCPIP bcs .99 lda #0 sec rts .5 dec sta (pStack) beq .98 ldy #6 hSocket lda (pStack),y ldx #LIBTCPIP.Recv jsr GO.LIBTCPIP bcc .6 cmp #E.NODATA bne .99 inc rts .6 jsr GetRespData ldy #S.NETBIOS+S.SMB.H.STATUS lda (ZPRespPtr),y bne .97 ldy #5 hSMBContext jsr GetSMBContext ldy #S.NETBIOS+S.SMB.H.UID lda (ZPRespPtr),y sta (ZPCtxPtr),y iny lda (ZPRespPtr),y sta (ZPCtxPtr),y .8 lda hResp >SYSCALL2 FreeMem clc >RET 7 .97 lda hResp >SYSCALL2 FreeMem .98 lda #MLI.E.IO sec .99 >RET 7 *-------------------------------------- * >PUSHB hSocket * >PUSHB hSMBContext * >PUSHW pathname * >PUSHBI 0 * >LIBCALL TreeConnect * (SMBContext updated with TID) *-------------------------------------- CIFS.TreeConnect lda (pStack) bne .5 dec sta (pStack) ldy #1 pathname lda (pStack),y sta ZPPtr1 iny lda (pStack),y sta ZPPtr1+1 iny hSMBContext jsr GetSMBContext ldx #S.SMB.H.CMD.TREE.CONNECT.ANDX jsr RequestSetupX ldx #0 .1 lda SMB.TreeConnect.H,x sta (ZPReqPtr),y iny inx cpx #SMB.TreeConnect.H.Len bne .1 phy save Y = LEN iny iny lda #0 sta (ZPReqPtr),y PASSWORD = "\0" iny .2 lda (ZPPtr1) inc ZPPtr1 bne .3 inc ZPPtr1+1 .3 sta (ZPReqPtr),y iny tax bne .2 ldx #0 .4 lda SMB.TreeConnect.T,x sta (ZPReqPtr),y iny inx cpx #SMB.TreeConnect.T.Len bne .4 pla jsr SetReqLenYAtA >PUSHYA >PUSHW ZPReqPtr ldy #4+4 hSocket lda (pStack),y ldx #LIBTCPIP.Send jsr GO.LIBTCPIP bcs .99 lda #0 sec rts .5 dec sta (pStack) beq .98 ldy #4 hSocket lda (pStack),y ldx #LIBTCPIP.Recv jsr GO.LIBTCPIP bcc .6 cmp #E.NODATA bne .99 inc rts .6 jsr GetRespData ldy #S.NETBIOS+S.SMB.H.STATUS lda (ZPRespPtr),y bne .97 ldy #3 hSMBContext jsr GetSMBContext ldy #S.NETBIOS+S.SMB.H.TID lda (ZPRespPtr),y sta (ZPCtxPtr),y iny lda (ZPRespPtr),y sta (ZPCtxPtr),y .8 lda hResp >SYSCALL2 FreeMem clc >RET 5 .97 lda hResp >SYSCALL2 FreeMem .98 lda #MLI.E.IO sec .99 >RET 5 *-------------------------------------- * >PUSHB hSocket * >PUSHB hSMBContext * >PUSHW MountPoint * >LIBCALL Mount *-------------------------------------- CIFS.Mount ldy #1 lda (pStack),y MP HI >PUSHA lda (pStack),y MP LO >PUSHA >PUSHW L.CALLBACK >SYSCALL2 Mount bcs .9 pha hMount ldx #0 .1 >PULLB MountTable,x inx cpx #4 bne .1 clc pla .9 >RET 4 *-------------------------------------- CIFS.UMount clc rts *-------------------------------------- CIFS.CallBack bit CIFS.Status bmi .1 jmp (J.CIFS,x) .1 ldy #S.PS.PID lda (pPS),y cmp CIFS.PID bne .8 jmp (J.CIFS2,x) .8 lda #0 sec rts *-------------------------------------- CIFS.ChTyp CIFS2.ChTyp *-------------------------------------- CIFS.ChMod CIFS2.ChMod *-------------------------------------- CIFS.FStat *-------------------------------------- CIFS2.FStat lda #MLI.E.BADCALL sec rts *-------------------------------------- CIFS.Stat >STYA ZPPtr1 resolved path lda MountTable+2 >SYSCALL2 GetMemPtr >STYA ZPCtxPtr ldx #S.SMB.H.CMD.TRANS2 jsr RequestSetupX ldx #0 .1 lda SMB.Trans2.H,x sta (ZPReqPtr),y iny inx cpx #SMB.Trans2.H.Len bne .1 ldx #0 .2 lda SMB.QueryPathInfo,x sta (ZPReqPtr),y iny inx cpx #SMB.QueryPathInfo.Len bne .2 .3 lda (ZPPtr1) inc ZPPtr1 bne .4 inc ZPPtr1+1 .4 sta (ZPReqPtr),y iny tax bne .3 jsr SetT2ReqLenYA >PUSHYA >PUSHW ZPReqPtr lda MountTable+3 hSocket ldx #LIBTCPIP.Send jsr GO.LIBTCPIP bcs .9 ldy #S.PS.PID lda (pPS),y sta CIFS.PID dec CIFS.Status lda #0 sec rts lda #MLI.E.INVPATH sec .9 >RET 4 *-------------------------------------- CIFS2.Stat lda MountTable+3 hSocket ldx #LIBTCPIP.Recv jsr GO.LIBTCPIP bcs .9 jsr GetRespData ldy #S.NETBIOS+S.SMB.H.STATUS lda (ZPRespPtr),y beq .1 lda #MLI.E.FNOTFND bra .99 .1 >PULLW ZPPtr1 inc pStack inc pStack stz CIFS.Status clc rts .9 cmp #E.NODATA bne .99 dec CIFS.Retries beq .90 lda #0 sec rts .90 lda #MLI.E.IO .99 sec stz CIFS.Status >RET 4 *-------------------------------------- CIFS.MKDir CIFS2.MKDir *-------------------------------------- CIFS.MKNod CIFS2.MKNod *-------------------------------------- CIFS.MKFIFO CIFS2.MKFIFO *-------------------------------------- CIFS.Pipe CIFS2.Pipe lda #MLI.E.BADCALL sec rts *-------------------------------------- CIFS.OpenDir >STYA ZPPtr1 resolved path >SYSCALL2 PutS >LDYAI S.FD.DIR >SYSCALL2 GetMem bcs .9 >STYA ZPPtr2 lda #S.FD.T.DIR sta (ZPPtr2) >PUSHW ZPPtr1 >PUSHWI 0 txa >PUSHA >SYSCALL2 mknod .9 rts CIFS2.OpenDir lda #MLI.E.BADCALL sec rts *-------------------------------------- CIFS.ReadDir CIFS2.ReadDir lda #MLI.E.INVPATH sec rts *-------------------------------------- CIFS.CloseDir CIFS2.CloseDir *-------------------------------------- CIFS.Open CIFS2.Open *-------------------------------------- CIFS.Close CIFS2.Close *-------------------------------------- CIFS.Read CIFS2.Read *-------------------------------------- CIFS.Write CIFS2.Write *-------------------------------------- CIFS.ChOwn CIFS2.ChOwn lda #MLI.E.BADCALL sec rts *-------------------------------------- GetSMBContext lda (pStack),y >SYSCALL2 GetMemPtr >STYA ZPCtxPtr rts *-------------------------------------- RequestSetupX phx lda hReq >SYSCALL2 GetMemPtr >STYA ZPReqPtr plx ldy #0 .1 lda (ZPCtxPtr),y cpy #S.NETBIOS+S.SMB.H.CMD bne .2 txa .2 sta (ZPReqPtr),y iny cpy #S.NETBIOS+S.SMB.H bne .1 rts *-------------------------------------- * Y = LEN from S.NETBIOS.TYPE * A = Ptr to LEN Word *-------------------------------------- SetReqLenYAtA sty ZPReqLen stz ZPReqLen+1 sta ZPPtr1 pha tya dec dec sec sbc ZPPtr1 ply sta (ZPReqPtr),y iny lda #0 sta (ZPReqPtr),y bra SetReqLenNETBIOS *-------------------------------------- SetT2ReqLenYA sty ZPReqLen stz ZPReqLen+1 tya sec sbc #S.NETBIOS+S.SMB.H+SMB.Trans2.H.Len+7 ldy #S.NETBIOS+S.SMB.H+1 sta (ZPReqPtr),y ldy #S.NETBIOS+S.SMB.H+19 sta (ZPReqPtr),y inc inc inc ldy #S.NETBIOS+S.SMB.H+SMB.Trans2.H.Len+2 sta (ZPReqPtr),y SetReqLenNETBIOS lda ZPReqLen sec sbc #S.NETBIOS ldy #S.NETBIOS.LEN+2 sta (ZPReqPtr),y lda ZPReqLen+1 sec sbc /S.NETBIOS dey sta (ZPReqPtr),y >LDYA ZPReqLen rts *-------------------------------------- GetRespData sta hResp >SYSCALL2 GetMemPtr pha tya * clc adc #S.TCP sta ZPRespPtr pla adc /S.TCP sta ZPRespPtr+1 rts *-------------------------------------- GO.LIBTCPIP jmp (pLIBTCPIP) *-------------------------------------- CS.END *-------------------------------------- LIBTCPIP .AZ "libtcpip" hLIBTCPIP .BS 1 pLIBTCPIP .BS 2 hSocket .BS 1 hReq .BS 1 hResp .BS 1 *-------------------------------------- CIFS.Status .BS 1 CIFS.PID .BS 1 CIFS.Retries .BS 1 *-------------------------------------- MountTable .BS 2 pMountPoint .BS 1 hSMBContext .BS 1 hSocket *-------------------------------------- SMB.TRANSPORT .DA #0 DIRECT TCP TRANSPORT .DA #0 24 BITS LENGTH .DA /SMB.NegReq.end-SMB.H .DA #SMB.NegReq.end-SMB.H *-------------------------------------- SMB.H .DA #$FF .AS "SMB" .DA #S.SMB.H.CMD.NEGOTIATE .HS 00000000 .DA #0 S.SMB.H.FLAGS .DA S.SMB.H.FLAGS2.LONGNAMES .DA 0 PIDHI .HS 0000000000000000 SECFEAT .DA 0 RSVD .DA $FFFF TID .DA $FFFE PIDLO .BS 2 UID .DA 0 MID *-------------------------------------- SMB.NegReq .DA #0 WORD COUNT .DA #SMB.NegReq.end-2-* ByteCount .DA #0 * .DA #2 * .AZ "PC NETWORK PROGRAM 1.0" * .DA #2 * .AZ "LANMAN1.0" * .DA #2 * .AZ "Windows for Workgroups 3.1a" * .DA #2 * .AZ "LM1.2X002" * .DA #2 * .AZ "LANMAN2.1" .DA #2 .AZ "NT LM 0.12" * .DA #2 * .AZ "SMB 2.002" * .DA #2 * .AZ "SMB 2.???" SMB.NegReq.end .EQ * *-------------------------------------- SMB.SessionSetup.H .DA #13 WORD COUNT .HS FF000000 NO MORE CMD .DA 1280 MAX BUFFER .DA 2 MAX MPX COUNT .HS 0000 VC NUMBER .HS 00000000 SESSION KEY .DA 0 CI PASS LEN (ANSI) .DA 0 CS PASS LEN (UNICODE) .HS 00000000 .HS 00000000 CAPABILITIES SMB.SessionSetup.H.Len .EQ *-SMB.SessionSetup.H * .BS 2 ByteCount SMB.SessionSetup.Guest * .AZ "" Password .AZ "Guest" Account Name .AZ "?" Primary Domain SMB.SessionSetup.Guest.Len .EQ *-SMB.SessionSetup.Guest SMB.SessionSetup.T .AZ "A2osX" Native OS .AZ "A2osX-CIFSD" Native LANMAN SMB.SessionSetup.T.Len .EQ *-SMB.SessionSetup.T *-------------------------------------- SMB.TreeConnect.H .DA #4 WORD COUNT .HS FF000000 NO MORE CMD .DA 0 .DA 1 PASSWORD LEN (1 for "\0") SMB.TreeConnect.H.Len .EQ *-SMB.TreeConnect.H * .BS 2 ByteCount * .AZ "" PASSWORD * .AZ "_temp" PATH SMB.TreeConnect.T .AZ "A:" Disk Share SMB.TreeConnect.T.Len .EQ *-SMB.TreeConnect.T *-------------------------------------- SMB.Trans2.H .DA #15 WORD COUNT .BS 2 TotalParamCount .DA 0 TotalDataCount .DA 2 MaxParameterCount .DA 40 MaxDataCount .DA #0 MaxSetupCount .HS 00 Reserved1 .DA 0 Flags .HS 00000000 Timeout .HS 0000 Reserved2 .BS 2 ParameterCount .DA 68 ParameterOffset .HS 0000 DataCount .HS 0000 DataOffset .DA #1 SetupCount .HS 00 Reserved3 SMB.Trans2.H.Len .EQ *-SMB.Trans2.H *-------------------------------------- SMB.QueryPathInfo .DA 5 TRANS2_QUERY_PATH_INFORMATION .BS 2 PrmCnt .HS 000000 Padding .DA SMB_INFO_STANDARD InformationLevel .HS 00000000 SearchStorageType * .AZ "file" FileName SMB.QueryPathInfo.Len .EQ *-SMB.QueryPathInfo *-------------------------------------- SMB.FindFirst .DA 1 TRANS2_FIND_FIRST2 .BS 2 PrmCnt .HS 00 Padding .DA $0016 SearchAttributes .DA 1024 SearchCount .DA 2 Flags .DA SMB_INFO_STANDARD InformationLevel * .AZ "*.*" FileName SMB.FindFirst.end .EQ *-SMB.FindFirst *-------------------------------------- SMB.FindNext .DA 2 TRANS2_FIND_NEXT2 .BS 2 PrmCnt .HS 00 Padding .BS 2 SID .DA 1024 SearchCount .DA SMB_INFO_STANDARD InformationLevel .HS 00000000 ResumeKey .DA 2 Flags * .AZ "*.*" FileName SMB.FindNext.end .EQ *-SMB.FindNext *-------------------------------------- MAN SAVE usr/src/lib/libcifs.s ASM