home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 3
/
TheARMClub_PDCD3.iso
/
programs
/
programming
/
osclid
/
Source
(
.txt
)
< prev
Wrap
RISC OS BBC BASIC V Source
|
1998-01-25
|
17KB
|
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%