view level1/cmds/inetd.a @ 2758:e4a0f58a5f9b

Found that people who do not have the envirornment variable NITROS9DIR set before building the project get a error missing file "/rules.mak". Found this is caused do to the fact that the code to set this envirornment variable is in the rules.mak which can't get loaded. To fix this the code needed to set the envirornment variable that is in the rules.mak is now in the makefile(s) right before the include for the rules.mak file. This should fix the problem for those who do not have the NITROS9DIR envirornment variable preset.
author drencor-xeen
date Mon, 14 Jan 2013 14:37:46 -0600
parents 2b4283c91c98
children 2bd966ffd6d5
line wrap: on
line source

********************************************************************
* inetd - internet daemon
*
* $Id$
*
* Edt/Rev  YYYY/MM/DD  Modified by
* Comment
* ------------------------------------------------------------------
*   1      2010/01/08  Boisy G. Pitre
* Started.
*
*   2      2010/01/22  Boisy G. Pitre
* Now reads inetd.conf file.
*
*   3      2011/08/07  Boisy G. Pitre
* Fixed bug where conf file wasn't being processed correctly.

               nam       inetd
               ttl       internet daemon

tylg           set       $01       Prgrm+Objct
atrv           set       $80+rev   ReEnt+rev
rev            set       $00
edition        set       3

               psect     inetd_a,$01,$80,1,200,start

DEBUG          equ       1

               vsect
targetport     rmb       2
netdatardy     rmb       1
nbufferl       equ       128
nbuffer        rmb       nbufferl
lbufferl       equ       128
lbuffer        rmb       lbufferl
nnext          rmb       2
token          rmb       2
orgstdin       rmb       1
orgstdout      rmb       1
orgstderr      rmb       1
childnetpath   rmb       1
netpath        rmb       1
targetprog     rmb       128
targetparams   rmb       128
tmodeparamlen  rmb       1
tmodeparams    rmb       128
               endsect

NetSig         equ       2

tmode          fcs       /tmode/

* signal intercept routine
sigint         cmpb      #NetSig
               bne       sigex
               inc       netdatardy,u
sigex          rti       

**** Entry Point ****
start:
* setup signal intercept
               leax      sigint,pcr
               os9       F$Icpt

               clr       netdatardy,u

               leax      nbuffer,u
               stx       nnext,u

* open the path to the control channel
               lbsr      TCPOpen
               lbcs      errex
               sta       netpath,u

               leax      SetupPorts,pcr
               lbsr      ProcInetd
               lbcs      errex
               
               IFNE      DEBUG
               lbsr      PRINTS
               fcc       /Got netpath and setup ports/
               fcb       C$CR
               fcb       $00
               ENDC

ssignetpath
               IFNE      DEBUG
               lbsr      PRINTS
               fcc       /SS.SSig on NetPath/
               fcb       C$CR
               fcb       $00
               ENDC

               lda       netpath,u
               ldb       #SS.SSig            send signal on data ready
               ldx       #NetSig
               os9       I$SetStt
               lbcs      errex

**** MAIN LOOP ****
mainloop
               pshs      cc
               orcc      #IntMasks
               tst       netdatardy,u
               bne       gotdata
               
* wait for a child to die (or wake up via signal)
               os9       F$Wait
               bcc       chkrdy
               cmpb      #E$NoChld
               bne       chkrdy			got error other than "no children"
* if no children, go to sleep
               ldx       #$0000
               os9       F$Sleep

chkrdy         puls      cc
               bra       ssignetpath
               
gotdata        puls      cc
               dec       netdatardy,u
* read the data from netpath
               IFNE      DEBUG
               lbsr      PRINTS
               fcc       /Reading data from netpath/
               fcb       C$CR
               fcb       $00
               ENDC

               lda       netpath,u
               ldb       #SS.Ready
               os9       I$GetStt
               bcs       ssignetpath
               
               clra
               tfr       d,y
               lda       netpath,u
               ldx       nnext,u
               os9       I$Read
               lbcs      errex
               tfr       y,d
               leax      d,x
               stx       nnext,u
               lda       -1,x
               cmpa      #C$CR
               lbne      ssignetpath
               
               leax      nbuffer,u
               stx       nnext,u

               lda       #1
               ldy       #256
               os9       I$WritLn 

* determine response
               lda       ,x
               cmpa      #'9
               ble       incoming
               
               cmpa      #'F
               lbra      ssignetpath
 
* get token number
incoming
               lbsr      DEC_BIN
               std       token,u
               IFNE      DEBUG
               pshs      d
               lbsr      PRINTS
               fcc       /Got token /
               fcb       $00
               puls      d
               lbsr      PRINT_DEC
               lbsr      PRINTS
               fcb       C$CR
               fcb       $00
               ENDC

* skip over token number
               IFNE      DEBUG
               lbsr      PRINTS
               fcc       /To Space.../
               fcb       C$CR
               fcb       $00
               ENDC
               lbsr      TO_SP
               IFNE      DEBUG
               lbsr      PRINTS
               fcc       /To Non-Space.../
               fcb       C$CR
               fcb       $00
               ENDC
               lbsr      TO_NON_SP

* get port number
               lbsr      DEC_BIN
               std       targetport,u
               
               IFNE      DEBUG
               pshs      d
               lbsr      PRINTS
               fcc       /Got request for port /
               fcb       $00
               ldd       ,s
               lbsr      PRINT_DEC
               lbsr      PRINTS
               fcb       C$CR
               fcb       $00
               puls      d
               ENDC

               leax      ForkProcForPort,pcr
               lbsr      ProcInetd
               lbra      ssignetpath            we may want to tell server we have no app

errex          os9       F$Exit


* Process inetd.conf file
*
* Entry: X = processor routine
*
* - open conf file
* - read each line and get first parameter (port number)
* - send it to the processor routine at x
* - if error or end of file, close and return
ProcInetd      pshs      x
               leax      inetdconf,pcr
               lda       #READ.
               os9       I$Open
               bcs       adex
               IFNE      DEBUG
               pshs      d
               lbsr      PRINTS
               fcc       /Opened inetd.conf ok/
               fcb       C$CR
               fcb       $00
               puls      d
               ENDC
nextline       leax      lbuffer,u
               ldy       #lbufferl-1
               lbsr      FGETS
               bcs       closeup
               lbsr      TO_NON_SP        skip any leading spaces
               ldb       ,x               check for EOL or comment
               cmpb      #C$CR
               beq       nextline
               cmpb      #'#
               beq       nextline
               IFNE      DEBUG
               pshs      d,x
               lbsr      PRINTS
               fcc       /Reading line: /
               fcb       $00
               ldx       2,s
               lbsr      PUTS
               puls      d,x
               ENDC
               pshs      a
               jsr       [1,s]
               puls      a
               bcc       nextline
closeup        cmpb      #E$EOF
               bne       closeandex
               clrb
closeandex     pshs      b,cc
               os9       I$Close
               puls      b,cc
adex           puls      x,pc

               
* Setup ports
* Extract first parameter at X and send to server
SetupPorts     lbsr      DEC_BIN
               cmpd      #0
               beq       ret0
* find comma and change it to nul
               tfr       x,y
setuploop      lda       ,y+
               cmpa      #C$CR
               beq       ret0
               cmpa      #',
               bne       setuploop
setuplisten 
               clr       -1,y
               IFNE      DEBUG
               pshs      d,x
               lbsr      PRINTS
               fcc       /Send listen/
               fcb       C$CR
               fcb       $00
               puls      d,x
               ENDC
               lda       netpath,u
               lbsr      TCPListen
ret0           rts

retcc          clrb
               rts

* Fork Proccess that matches target port
* Extract first parameter at X and see if it matches target port
* if so, read rest of line and fork the process
* Line looks like this:  portnumberplusoptions,prog,params,path opts
ForkProcForPort
* get port number
               lbsr      DEC_BIN
               IFNE      DEBUG
               pshs      d
               lbsr      PRINTS
               fcc       /Reading port /
               fcb       $00
               ldd       ,s
               lbsr      PRINT_DEC
               lbsr      PRINTS
               fcb       C$CR
               fcb       $00
               lbsr      PRINTS
               fcc       /Comparing to port /
               fcb       $00
               ldd       targetport,u
               lbsr      PRINT_DEC
               lbsr      PRINTS
               fcb       C$CR
               fcb       $00
               puls      d
               ENDC
               cmpd      targetport,u
               lbne      retcc
* point Y to byte after comma
portloop       lda       ,y+
               cmpa      #C$CR
               beq       ret0
               cmpa      #',
               bne       portloop
               tfr       y,x
* copy bytes up to comma at X
               leay      targetprog,u
prgloop        lda       ,x+
               cmpa      #',
               beq       sethi
               cmpa      #C$CR
               lbeq      ret
               sta       ,y+
               bra       prgloop
sethi          lda       -1,y
               ora       #$80
               sta       -1,y
copypar        clr       tmodeparamlen,u
               leay      targetparams,u
parloop        lda       ,x+
               sta       ,y+
               cmpa      #',
               beq       procopts
               cmpa      #C$CR
               beq       gotprocparms

procopts
               leay      tmodeparams,u
procoptsloop   lda       ,x+
               sta       ,y+
               inc       targetparams,u
               cmpa      #C$CR
               beq       procoptsloop

gotprocparms
               IFNE      DEBUG
               pshs      d
               lbsr      PRINTS
               fcc       /Got proc and params to fork/
               fcb       C$CR
               fcb       $00
               puls      d
               ENDC

* ignore client port number and hostname for now
               lbsr      TCPOpen
               bcc       savechild

               ldd       token,u
               leas      -8,s
               leax      ,s
               lbsr      BIN_DEC
               lda       netpath,u
               tfr       x,y
               lbsr      TCPKill
               leas      8,s
               lbra      forkex

savechild
               sta       childnetpath,u
               ldd       token,u
               leas      -8,s
               leax      ,s
               lbsr      BIN_DEC
               lda       childnetpath,u               
               tfr       x,y
               lbsr      TCPJoin
               leas      8,s
               bcc       turnonechoalf
               os9       I$Close
               lbra      forkex
 
turnonechoalf
               IFNE      DEBUG
               pshs      d
               lbsr      PRINTS
               fcc       /Turning on PD.EKO and PD.ALF/
               fcb       C$CR
               fcb       $00
               puls      d
               ENDC
               lbsr      SetEcho
               lbcs      ret
               lbsr      SetAutoLF
               lbcs      ret

* dup paths
duper
               IFNE      DEBUG
               pshs      d
               lbsr      PRINTS
               fcc       /Duping paths/
               fcb       C$CR
               fcb       $00
               puls      d
               ENDC

               clra
               os9       I$Dup
               lbcs      errex
               sta       orgstdin,u
               lda       #1
               os9       I$Dup
               lbcs      errex
               sta       orgstdout,u
               lda       #2
               os9       I$Dup
               lbcs      errex
               sta       orgstderr,u

* close original stdin/out/err paths
               clra 
               os9       I$Close                     
               inca 
               os9       I$Close                     
               inca 
               os9       I$Close                     

* Dup child net path to stdin/stdout/stderr
               lda       childnetpath,u
               os9       I$Dup
               lbcs      errex
               os9       I$Dup
               lbcs      errex
               os9       I$Dup
               lbcs      errex

* fork tmode process if tmode param length > 0
               tst       tmodeparamlen,u
               beq       forkchild
               pshs      u 
               leax      tmode,pcr
               leau      tmodeparams,u
               lda       #Objct
               clrb
               ldy       #256
               os9       F$Fork
               puls      u
               os9       F$Wait

* fork child process
forkchild
               pshs      u 
               leax      targetprog,u
               leau      targetparams,u
               lda       #Objct
               clrb
               ldy       #256
               os9       F$Fork
               puls      u
* If our F$Fork fails, do not error out...
*              bcs       ret2

* restore orginal paths
               clra
               os9       I$Close
               inca
               os9       I$Close
               inca
               os9       I$Close

               lda       orgstdin,u
               os9       I$Dup
               lbcs      errex
               lda       orgstdout,u
               os9       I$Dup
               lbcs      errex
               lda       orgstderr,u
               os9       I$Dup
               lbcs      errex
               lda       orgstdin,u
               os9       I$Close
               lda       orgstdout,u
               os9       I$Close
               lda       orgstderr,u
               os9       I$Close
               lda       childnetpath,u
               os9       I$Close

               IFNE      DEBUG
               pshs      d
               lbsr      PRINTS
               fcc       /Proc forked/
               fcb       C$CR
               fcb       $00
               puls      d
               ENDC

forkex         comb
               ldb       #E$EOF
ret            rts

inetdconf      fcc       "....../SYS/inetd.conf"
               fcb       C$CR
               endsect