NEW PREFIX AUTO 4,1 .LIST OFF .OP 65C02 .OR $2000 .TF SBIN/TELNETD *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/ETH.I .INB INC/LIBTCPIP.I .INB INC/NET.TELNET.I *-------------------------------------- CONN.MAX .EQ 16 TIMEOUT.MAX .EQ 30 30 sec. *-------------------------------------- ZPIPCfgPtr .EQ ZPBIN ZPSktPtr .EQ ZPBIN+2 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA #S.PS.F.EVENT S.PS.F .DA #0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #4 ZP SS .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.LIBTCPIP .DA LIBTCPIP L.SA.LOCAL .DA SA.LOCAL L.MSG.TCPWAIT .DA MSG.TCPWAIT L.MSG.INITOK .DA MSG.INITOK L.MSG.TCPIPERR .DA MSG.TCPIPERR L.MSG.SKTERR .DA MSG.SKTERR L.MSG.ABORT .DA MSG.ABORT L.MSG.INCOMING .DA MSG.INCOMING L.MSG.EXECERR .DA MSG.EXECERR L.NOD.Template .DA NOD.Template L.CMD.Template .DA CMD.Template .DA 0 *-------------------------------------- CS.INIT >LDYA L.LIBTCPIP >SYSCALL LoadLib bcs .9 sta hLIBTCPIP .9 rts *-------------------------------------- CS.RUN jsr Init.Timeout >LDYA L.MSG.TCPWAIT >SYSCALL puts .1 >LIBCALL hLIBTCPIP,LIBTCPIP.GET.IPCFG is TCPIP loaded ? bcs .99 >STYA ZPIPCfgPtr lda (ZPIPCfgPtr) Configured ? bmi CS.RUN.INIT >SLEEP jsr Wait.Timeout bcc .1 >SYSCALL GetChar bcs .1 cmp #$03 bne .1 jmp CS.RUN.ABORT .99 pha >LDYA L.MSG.TCPIPERR >SYSCALL puts pla sec rts CS.RUN.INIT ldx #3 ldy #S.IPCFG.IP+3 .1 lda (ZPIPCfgPtr),y sta SA.LOCAL+S.SOCKADDR.ADDR,x dey dex bpl .1 >PUSHBI 0 no protocol lda #S.SOCKET.T.STREAM >LIBCALL hLIBTCPIP,LIBTCPIP.Socket bcs .9 >STA.G hSrvSocket pha >PUSHW L.SA.LOCAL pla >LIBCALL hLIBTCPIP,LIBTCPIP.Bind bcs .9 >LDA.G hSrvSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Listen bcs .9 >LDYA L.MSG.INITOK >SYSCALL puts .2 >SLEEP jsr CS.RUN.SERVER bcs CS.RUN.ERR * >SYSCALL GetChar * bcs .2 * cmp #$03 * beq CS.RUN.ABORT bra .2 .9 pha >LDYA L.MSG.SKTERR >SYSCALL puts pla sec rts CS.RUN.ABORT >LDYA L.MSG.ABORT >SYSCALL puts lda #3 CS.RUN.ERR sec rts *-------------------------------------- CS.RUN.SERVER >LDA.G hSrvSocket >LIBCALL hLIBTCPIP,LIBTCPIP.Accept bcs .8 pha ldy #hSockets ldx #CONN.MAX .1 lda (pData),y bne .2 pla sta (pData),y bra CS.RUN.CLIENT .2 iny dex bne .1 pla >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown .8 clc rts *-------------------------------------- CS.RUN.CLIENT >STA.G hClientSocket >SYSCALL GetMemPtr >STYA ZPSktPtr >PUSHB.G hClientSocket ldx #3 ldy #S.SOCKET.REM.ADDR+3 .3 >PUSHB (ZPSktPtr),y dey dex bpl .3 >PUSHBI 5 >LDYA L.MSG.INCOMING >SYSCALL printf >PUSHB.G hClientSocket >PUSHBI 1 >PUSHW L.NOD.Template >LEA.G NodBuf >SYSCALL sprintf >PUSHB.G hClientSocket >PUSHW 0 >LEA.G NodBuf >SYSCALL mknod bcs .9 >STA.G hClientFile >PUSHEA.G NodBuf >PUSHBI 2 >PUSHW L.CMD.Template >LEA.G CmdBuf >SYSCALL sprintf >LEA.G CmdBuf >SYSCALL puts >PUSHBI S.PS.F.DUPENV >LEA.G CmdBuf >SYSCALL execl bcc .8 >PUSHA >PUSHBI 1 >LDYA L.MSG.EXECERR >SYSCALL printf .8 clc .9 rts *-------------------------------------- CS.DOEVENT lda (pEvent) bpl .9 is it a TIMER event? >LDA.G TimeOut beq .9 dec sta (pData),y .9 sec do not discard TIMER event rts *-------------------------------------- CS.QUIT ldx #CONN.MAX ldy #hSockets .1 lda (pData),y beq .2 phx phy >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown ply plx .2 iny dex bne .1 >LDA.G hSrvSocket beq .3 >LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown .3 lda hLIBTCPIP beq .8 >SYSCALL UnloadLib .8 clc rts *-------------------------------------- Init.Timeout lda #TIMEOUT.MAX >STA.G TimeOut rts *-------------------------------------- Wait.TimeOut sec >LDA.G TimeOut beq .9 clc .9 rts *-------------------------------------- CS.END *-------------------------------------- hLIBTCPIP .BS 1 LIBTCPIP .AZ "libtcpip" MSG.TCPWAIT .AZ "TELNETD:Waiting for TCP/IP initializing..." MSG.INITOK .AZ "TELNETD:Init Ok, Listening." MSG.TCPIPERR .AZ "TELNETD:TCP/IP Not initialized properly" MSG.SKTERR .AZ "TELNETD:Listen Error." MSG.ABORT .AZ "TELNETD:User Aborted." MSG.INCOMING .AZ "TELNETD:Incoming Connection [SKT=%h] From : %d.%d.%d.%d\r\n" MSG.EXECERR .AZ "TELNETD:ExecL failed $%h." *-------------------------------------- NOD.Template .AZ "/DEV/TTY%h" CMD.Template .AZ "${ROOT}SBIN/GETTY -E %s ${ROOT}SBIN/LOGIN" *-------------------------------------- SA.LOCAL .DA #AF.INET S.SOCKADDR.AF .BS 1 .BS 4 S.SOCKADDR.ADDR .DA TCP.PORT.TELNET *-------------------------------------- .DUMMY .OR 0 DS.START hSockets .BS CONN.MAX pData SktIndex .BS 1 hSrvSocket .BS 1 hClientSocket .BS 1 hClientFile .BS 1 TimeOut .BS 1 NodBuf .BS 11 CmdBuf .BS 65 DS.END .ED *-------------------------------------- MAN SAVE USR/SRC/SBIN/TELNETD.S ASM