home *** CD-ROM | disk | FTP | other *** search
RISC OS BBC BASIC V Source | 1998-01-25 | 16.7 KB | 653 lines |
- > OscliD.Source
- > Provides an OSCLI daemon
- Chris Rutter 1997
- $+" at line "+
- code% 8192
- constants
- v_bit=1<<28
- PF_INET=2
- AF_INET=2
- SOCK_DGRAM=2
- FIOASYNC=&8004667D
- FIONBIO=&8004667E
- MSG_DONTWAIT=&80
- MAX_ALLOW=32
- MAX_DENY=32
- MAX_QUEUE=64
- port%=8805
- workspace allocation
- count%=0
- wk_wkspace=
- wk_socket=
- wk_task_handle=
- wk_queue_size=
- wk_allow_size=
- wk_deny_size=
- wk_ip_buffer=
- ws(32)
- (wk_queue=
- ws(256) :
- =64 queue items
- "wk_allow=
- ws(256) :
- =32 items
- wk_deny=
- ws(256) :
- wk_buffer=
- ws(256)
- wk_stack=
- ws(256)
- wk_stack_end=count%
- pass%=4
- P%=&00
- O%=code%
- [ Opt pass%
- Equd start
- Equd initialise
- Equd finalise
- Equd 0
- Equd title
- Equd help
- Equd command_table
- Equd 0
- Equd 0
- Equd 0
- Equd 0
- .title
- string("OscliD")
- 9 .help
- string("OscliD"+
- 9+"1.06 (25 Jan 1998)
- Chris Rutter")
- .command_table
- command("OscliD_Task",star_task_help,star_task,0
- 255<<16)
- command("OscliD_Allow",star_allow_help,star_allow,0
- 1<<8
- 1<<16)
- command("OscliD_Deny",star_deny_help,star_deny,0
- 1<<8
- 1<<16)
- Equd 0
- .start
- Ldr r12,[r12]
- D) Add r13,r12,#wk_stack_end
- E+ Add r13,r13,#wk_stack_end
- &ff00
- ;initialise wimp task
- Mov r0,#256
- Add r0,r0,#310-256
- Ldr r1,task
- AdrL r2,task_name
- Mov r3,#0
- Swi "Wimp_Initialise"
- N& Str r1,[r12,#wk_task_handle]
- P .poll
- Q$ Swi "OS_ReadMonotonicTime"
- Add r2,r0,#50
- Mov r0,#0
- T& Add r1,r12,#wk_buffer ;safe?
- Swi "Wimp_PollIdle"
- Teq r0,#17
- TeqNe r0,#18
- BNe poll_check_queue
- [& Ldr r0,[r12,#wk_task_handle]
- Ldr r1,task
- Swi "Wimp_CloseDown"
- Mov r0,#0
- `8 Str r0,[r12,#wk_task_handle] ;prevent re-entry
- Swi "OS_Exit"
- .poll_check_queue
- d% Ldr r6,[r12,#wk_queue_size]
- Teq r6,#0
- BEq poll
- ;items in queue
- i! Mov r7,#0 ;=item number
- j( Add r8,r12,#wk_queue ;->item[]
- l .loop
- Ldr r9,[r8,r7,Lsl #2]
- ;execute task
- Mov r0,r9
- Swi "XWimp_StartTask"
- ;free rma block
- Mov r0,#7
- Mov r2,r9
- Swi "OS_Module"
- Add r7,r7,#1
- yB Ldr r6,[r12,#wk_queue_size] ;incase new requests arrived
- z2 Teq r7,r6 ;have we reached end of queue?
- BNe loop
- Mov r0,#0
- ~% Str r0,[r12,#wk_queue_size]
- B poll
- .initialise
- StmFd r13!,{r7-r11,r14}
- Mov r0,#6
- " Mov r3,#(count%+4)
- ' Orr r3,r3,#(count%+4)
- &FF00
- + Swi "XOS_Module" ;claim workspace
- LdmVsFd r13!,{r7-r11,Pc}
- Str r2,[r12]
- , Mov r11,r12 ;preserve for OS_Claim
- Ldr r12,[r12]
- " Str r2,[r12,#wk_wkspace]
- #;nullify queue, task handle &c.
- Mov r0,#0
- % Str r0,[r12,#wk_queue_size]
- & Str r0,[r12,#wk_task_handle]
- % Str r0,[r12,#wk_allow_size]
- $ Str r0,[r12,#wk_deny_size]
- ;nullify socket
- Mvn r0,#0
- ! Str r0,[r12,#wk_socket]
- ;create udp socket
- Mov r0,#PF_INET
- Mov r1,#SOCK_DGRAM
- Mov r2,#0
- Swi "XSocket_Creat"
- LdmVsFd r13!,{r7-r11,Pc}
- ! Str r0,[r12,#wk_socket]
- ;bind it locally
- AdrL r1,sockaddr
- Mov r2,#16
- Swi "XSocket_Bind"
- BlVs socket_close
- LdmVsFd r13!,{r7-r11,Pc}
- ';mark it for asynchronous operation
- ! Ldr r0,[r12,#wk_socket]
- & Mov r1,#FIOASYNC
- &ff000000
- ) Orr r1,r1,#FIOASYNC
- &00ff0000
- ) Orr r1,r1,#FIOASYNC
- &0000ff00
- ) Orr r1,r1,#FIOASYNC
- &000000ff
- AdrL r2,argp
- Swi "XSocket_Ioctl"
- BlVs socket_close
- LdmVsFd r13!,{r7-r11,Pc}
- ;mark it non-blocking
- ! Ldr r0,[r12,#wk_socket]
- % Mov r1,#FIONBIO
- &ff000000
- ( Orr r1,r1,#FIONBIO
- &00ff0000
- ( Orr r1,r1,#FIONBIO
- &0000ff00
- ( Orr r1,r1,#FIONBIO
- &000000ff
- AdrL r2,argp
- Swi "XSocket_Ioctl"
- BlVs socket_close
- LdmVsFd r13!,{r7-r11,Pc}
- ;claim the event vector
- Mov r0,#&10 ;EventV
- AdrL r1,eventv
- Mov r2,r11
- Swi "XOS_Claim"
- BlVs socket_close
- LdmVsFd r13!,{r7-r11,Pc}
- ;enable the Internet event
- Mov r0,#14
- Mov r1,#19
- Swi "XOS_Byte"
- BlVs socket_close
- LdmVsFd r13!,{r7-r11,Pc}
- LdmFd r13!,{r7-r11,Pc}^
- .finalise
- StmFd r13!,{r7-r11,r14}
- . Mov r11,r12 ;preserve for OS_Release
- Ldr r12,[r12]
- ;disable the Internet event
- Mov r0,#13
- Mov r1,#19
- Swi "XOS_Byte"
- ;release the event vector
- Mov r0,#&10
- AdrL r1,eventv
- Mov r2,r11
- Swi "XOS_Release"
- LdmVsFd r13!,{r7-r11,Pc}
- ;close the socket
- Bl socket_close
- ;shutdown wimp task
- & Ldr r0,[r12,#wk_task_handle]
- Ldr r1,task
- Teq r0,#0
- SwiNe "XWimp_CloseDown"
- ;release workspace
- Mov r0,#7
- Mov r2,r12
- Swi "XOS_Module"
- LdmFd r13!,{r7-r11,Pc}^
- .star_task ;r0->command tail
- StmFd r13!,{r14}
- Ldr r12,[r12]
- Mov r6,r0
- % Ldr r4,[r12,#wk_queue_size]
- / Teq r4,#MAX_QUEUE ;is the queue full?
- LdmEqFd r13!,{Pc}^
- ;claim memory for string
- Mov r0,#6
- Mov r3,#256
- % Swi "XOS_Module" ;r2->block
- LdmVsFd r13!,{Pc}
- ;copy out string into block
- Mov r1,#0
- .loop
- LdrB r3,[r6,r1]
- StrB r3,[r2,r1]
- Add r1,r1,#1
- Cmp r3,#32
- BGe loop
- ;insert pointer into queue
- Add r5,r12,#wk_queue
- 5 Add r5,r5,r4,Lsl #2 ;r5->pointer to command
- * Str r2,[r5] ;store pointer in r5
- ;expand queue size
- Add r4,r4,#1
- % Str r4,[r12,#wk_queue_size]
- LdmFd r13!,{Pc}^
- $.star_allow ;r0->host/network ip
- StmFd r13!,{r14}
- Ldr r12,[r12]
- Mov r6,r0
- &;see if we should display the list
- Teq r1,#0
- BEq star_allow_display
- (;check if we have space in the table
- % Ldr r1,[r12,#wk_allow_size]
- Cmp r1,#MAX_ALLOW
- AdrGeL r0,error_max_allow
- LdmGeFd r13!,{r14}
- OrrGeS Pc,r14,#v_bit
- "*;read in number of dots (i.e. netmask)
- Bl terminate_string
- Bl count_dots
- check number of dots are valid
- Cmp r0,#3
- ($ AdrGtL r0,error_too_many_dots
- LdmGtFd r13!,{r14}
- OrrGtS Pc,r14,#v_bit
- ,1;load up netmask word for this address length
- AdrL r2,netmasks
- Ldr r2,[r2,r0,Lsl #2]
- 0!;decode the dotted quad in r6
- Mov r0,r6
- Bl ip_quad_to_bits
- 4';store this at the end of the table
- Add r3,r12,#wk_allow
- 61 Add r4,r3,r1,Lsl #3 ;r1 = size of table
- Str r0,[r4,#0]
- Str r2,[r4,#4]
- :!;add one to number of entries
- Add r1,r1,#1
- <% Str r1,[r12,#wk_allow_size]
- LdmFd r13!,{Pc}^
- .star_allow_display
- StmFd r13!,{r7-r10}
- B6 Add r10,r12,#wk_allow ;r10->allow table base
- C6 Ldr r9,[r12,#wk_allow_size] ;number of hosts
- Teq r9,#0
- E% BEq star_allow_display_none
- Swi "OS_WriteS"
- G3 Equs "Trusted hosts and networks:"+
- Align
- AdrL r0,txt_ip_header
- Swi "OS_Write0"
- K! Mov r8,#0 ;current host
- L$ B star_deny_display_loop
- .star_allow_display_none
- Swi "OS_WriteS"
- PP Equs "There are no entries in the table of trusted networks and hosts."
- Equs
- Align
- LdmFd r13!,{r7-r10}
- LdmFd r13!,{Pc}^
- V#.star_deny ;r0->host/network ip
- StmFd r13!,{r14}
- Ldr r12,[r12]
- Mov r6,r0
- [&;see if we should display the list
- Teq r1,#0
- BEq star_deny_display
- _(;check if we have space in the table
- `$ Ldr r1,[r12,#wk_deny_size]
- Cmp r1,#MAX_DENY
- AdrGeL r0,error_max_deny
- LdmGeFd r13!,{r14}
- OrrGeS Pc,r14,#v_bit
- f*;read in number of dots (i.e. netmask)
- Bl terminate_string
- Bl count_dots
- j#;check number of dots are valid
- Cmp r0,#3
- l$ AdrGtL r0,error_too_many_dots
- LdmGtFd r13!,{r14}
- OrrGtS Pc,r14,#v_bit
- p1;load up netmask word for this address length
- AdrL r2,netmasks
- Ldr r2,[r2,r0,Lsl #2]
- t!;decode the dotted quad in r6
- Mov r0,r6
- Bl ip_quad_to_bits
- x';store this at the end of the table
- Add r3,r12,#wk_deny
- z1 Add r4,r3,r1,Lsl #3 ;r1 = size of table
- Str r0,[r4,#0]
- Str r2,[r4,#4]
- ~!;add one to number of entries
- Add r1,r1,#1
- $ Str r1,[r12,#wk_deny_size]
- LdmFd r13!,{Pc}^
- .star_deny_display
- StmFd r13!,{r7-r10}
- 4 Add r10,r12,#wk_deny ;r10->deny table base
- 5 Ldr r9,[r12,#wk_deny_size] ;number of hosts
- Teq r9,#0
- $ BEq star_deny_display_none
- Swi "OS_WriteS"
- 7 Equs "Blacklisted hosts and networks:"+
- Align
- AdrL r0,txt_ip_header
- Swi "OS_Write0"
- ! Mov r8,#0 ;current host
- .star_deny_display_loop
- Add r1,r10,r8,Lsl #3
- / Ldr r6,[r1,#0] ;r6=address of host r4
- / Ldr r7,[r1,#4] ;r7=netmask of host r4
- Mov r0,r6
- Bl ip_write_quad
- Mov r1,r0
- Rsb r1,r1,#24
- .loop
- Swi 256+
- (" ")
- SubS r1,r1,#1
- BNe loop
- Mov r0,r7 ;netmask
- " Add r1,r12,#wk_ip_buffer
- Mov r2,#16
- Swi "OS_ConvertHex8"
- Swi "OS_Write0"
- Swi "OS_NewLine"
- Add r8,r8,#1
- Teq r8,r9
- $ BNe star_deny_display_loop
- LdmFd r13!,{r7-r10}
- LdmFd r13!,{Pc}^
- .star_deny_display_none
- Swi "OS_WriteS"
- T Equs "There are no entries in the table of blacklisted networks and hosts."
- Equs
- Align
- LdmFd r13!,{r7-r10}
- LdmFd r13!,{Pc}^
- 8.ip_write_quad ;r0=ip ... r0=length of output string
- StmFd r13!,{r1-r4,r14}
- Mov r4,r0
- % Mov r3,#3 ;length of string
- And r0,r4,#&000000ff
- " Add r1,r12,#wk_ip_buffer
- Mov r2,#16
- " Swi "OS_ConvertInteger4"
- Rsb r2,r2,#16
- Add r3,r3,r2
- Swi "OS_Write0"
- Swi 256+
- (".")
- And r0,r4,#&0000ff00
- Mov r0,r0,Lsr #8
- " Add r1,r12,#wk_ip_buffer
- Mov r2,#16
- " Swi "OS_ConvertInteger4"
- Rsb r2,r2,#16
- Add r3,r3,r2
- Swi "OS_Write0"
- Swi 256+
- (".")
- And r0,r4,#&00ff0000
- Mov r0,r0,Lsr #16
- " Add r1,r12,#wk_ip_buffer
- Mov r2,#16
- " Swi "OS_ConvertInteger4"
- Rsb r2,r2,#16
- Add r3,r3,r2
- Swi "OS_Write0"
- Swi 256+
- (".")
- And r0,r4,#&ff000000
- Mov r0,r0,Lsr #24
- " Add r1,r12,#wk_ip_buffer
- Mov r2,#16
- " Swi "OS_ConvertInteger4"
- Rsb r2,r2,#16
- Add r3,r3,r2
- Swi "OS_Write0"
- Mov r0,r3
- LdmFd r13!,{r1-r4,Pc}^
- /.ip_quad_to_bits ;r0->string ... r0=ip bits
- StmFd r13!,{r1-r5,r14}
- LdrB r1,[r0]
- Teq r1,#
- ("*")
- MovEq r0,#0
- LdmEqFd r13!,{r1-r5,Pc}^
- Mov r2,#0 ;ip address
- ' Mov r3,#0 ;shift of next byte
- .loop
- C Bl ip_extract_nibble ;extract the nibble from the string
- ; Orr r2,r2,r1,Lsl r3 ;merge it into the ip address
- @ Add r3,r3,#8 ;shift over to the right for the next one
- LdrB r1,[r0]
- : Cmp r1,#32 ;are we at the end of the string yet?
- BGt loop
- Mov r0,r2
- LdmFd r13!,{r1-r5,Pc}^
- @.ip_extract_nibble ;r0->string ... r0->next nibble r1=nibble
- StmFd r13!,{r2-r5,r14}
- Mov r4,r0
- .loop
- LdrB r2,[r4],#1
- Teq r2,#0
- TeqNe r2,#
- (".")
- TeqNe r2,#32
- BNe loop
- Mov r3,#0
- StrB r3,[r4,#-1]
- " Add r1,r12,#wk_ip_buffer
- Mov r2,#32
- % Swi "OS_EvaluateExpression"
- ' Teq r1,#0 ;0=integer returned
- MovEq r1,r2
- MovNe r1,#0
- Mov r0,r4
- LdmFd r13!,{r2-r5,Pc}^
- !.terminate_string ;r0->string
- StmFd r13!,{r0-r3,r14}
- Mov r1,#0
- Mov r3,#0
- .loop
- LdrB r2,[r0],#1
- Teq r2,#32
- StrEqB r3,[r0,#-1]
- MovEq r2,#0
- Teq r2,#0
- BNe loop
- LdmFd r13!,{r0-r3,Pc}^
- 0.count_dots ;r0->string ... r0=number of "."
- StmFd r13!,{r1-r3,r14}
- LdrB r2,[r0]
- Teq r2,#
- ("*")
- MvnEq r0,#0
- LdmEqFd r13!,{r1-r3,Pc}^
- Mov r1,#0
- ! .loop
- LdrB r2,[r0],#1
- Teq r2,#
- (".")
- AddEq r1,r1,#1
- Teq r2,#0
- BNe loop
- Mov r0,r1
- LdmFd r13!,{r1-r3,Pc}^
- .socket_close
- StmFd r13!,{r0,r14}
- ,! Ldr r0,[r12,#wk_socket]
- Cmn r0,#1
- MvnNe r1,#0
- /! StrNe r1,[r12,#wk_socket]
- SwiNe "XSocket_Close"
- LdmFd r13!,{r0,Pc}^
- 3<.eventv ;r0 = event, (r1 = type, r2 = socket descriptor)
- Teq r0,#19
- MovNeS Pc,r14
- StmFd r13!,{r0-r6,r14}
- Ldr r12,[r12]
- 8! Ldr r3,[r12,#wk_socket]
- Teq r3,r2
- LdmNeFd r13!,{r0-r6,Pc}^
- .read_from_socket
- =! Ldr r0,[r12,#wk_socket]
- AdrW r1,wk_buffer
- Mov r2,#256
- Mov r3,#MSG_DONTWAIT
- Adr r4,from
- Adr r5,from_size
- Mov r6,#16
- Str r6,[r5]
- E6 Swi "XSocket_Recvfrom" ;data is in wk_buffer
- LdmVsFd r13!,{r0-r6,Pc}^
- Teq r0,#0
- LdmEqFd r13!,{r0-r6,Pc}^
- ;check allow, deny lists
- Ldr r6,from_addr
- Mov r5,#0
- AdrW r4,wk_allow
- N% Ldr r2,[r12,#wk_allow_size]
- Teq r2,#0
- BEq check_deny
- Q .loop
- R1 Add r3,r4,r5,Lsl #3 ;r3->address record
- S! Ldr r0,[r3,#4] ;netmask
- T/ And r0,r0,r6 ;r0=corrected ip address
- U! Ldr r1,[r3,#0] ;address
- V0 Teq r0,r1 ;have we hit an allow entry?
- BEq allow
- Add r5,r5,#1
- Teq r5,r2
- BNe loop
- .check_deny
- Mov r5,#0
- AdrW r4,wk_deny
- _$ Ldr r2,[r12,#wk_deny_size]
- Teq r2,#0
- BEq allow
- b .loop
- Add r3,r4,r5,Lsl #3
- d! Ldr r0,[r3,#4] ;netmask
- e/ And r0,r0,r6 ;r0=corrected ip address
- f! Ldr r1,[r3,#0] ;address
- g. Teq r0,r1 ;have we hit a deny entry?
- BEq deny
- Add r5,r5,#1
- Teq r5,r2
- BNe loop
- .allow
- AdrW r0,wk_buffer
- Swi "XOS_CLI"
- q .deny
- B read_from_socket
- t .from
- .sockaddr
- v) Equd AF_INET
- htons(port%)<<16
- .from_addr
- Equd &00000000
- Equd 0
- Equd 0
- .from_size
- Equd 16
- .argp
- Equd 1
- .star_task_help
- L Equs "*OscliD_Task adds an OSCLI command to OscliD's Wimp command "
- Equs "queue."+
- 1 Equs "Syntax: *OscliD_Task <command>"+
- Align
- .star_allow_help
- N Equs "*OscliD_Allow adds a host or network to the trusted list that "
- - Equs "may execute commands."+
- 7 Equs "Syntax: *OscliD_Allow <host|network>"+
- Align
- .star_deny_help
- J Equs "*OscliD_Deny adds a host or network to the blacklist that "
- 1 Equs "may not execute commands."+
- 6 Equs "Syntax: *OscliD_Deny <host|network>"+
- Align
- .txt_ip_header
- : Equs "IP address Netmask"+
- Align
- .task
- Equs "TASK"
- .task_name
- Equs "OscliD"+
- Align
- Equd &00000000
- .netmasks
- Equd &000000FF
- Equd &0000FFFF
- Equd &00FFFFFF
- Equd &FFFFFFFF
- .error_max_allow
- error("The maximum number of items in the trusted list has been reached")
- .error_max_deny
- error("The maximum number of items in the blacklist has been reached")
- .error_too_many_dots
- error("I don't understand this address format")
- pass%
- "OS_File",10,"<Obey$Dir>.!OscliD.OscliD",&FFA,,code%,O%
- string(string$)
- [ Opt pass%
- Equs string$
- Equb 0
- Align
- =pass%
- count%+=4
- =count%-4
- ws(a%)
- count%+=a%
- =count%-a%
- htons(n%)
- &=(n%
- &ff00)>>8
- (n%
- &00ff)<<8
- command(command$,help%,code%,flags%)
- flags%=-1
- flags%=0
- (0<<8)
- (0<<8)
- [ Opt pass%
- Equs command$+
- Align
- Equd code%
- Equd flags%
- Equd 0
- Equd help%
- =pass%
- error(string$)
- [ Opt pass%
- Equd 0
- Equs string$+
- Align
- =pass%
- space(a%)
- P%+=a%
- O%+=a%
- =pass%
-