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

  1.  > OscliD.Source
  2.  > Provides an OSCLI daemon
  3.  Chris Rutter 1997
  4. $+" at line "+
  5.  code% 8192
  6.  constants
  7. v_bit=1<<28
  8. PF_INET=2
  9. AF_INET=2
  10. SOCK_DGRAM=2
  11. FIOASYNC=&8004667D
  12. FIONBIO=&8004667E
  13. MSG_DONTWAIT=&80
  14. MAX_ALLOW=32
  15. MAX_DENY=32
  16. MAX_QUEUE=64
  17. port%=8805
  18.  workspace allocation
  19. count%=0
  20. wk_wkspace=
  21. wk_socket=
  22. wk_task_handle=
  23. wk_queue_size=
  24. wk_allow_size=
  25. wk_deny_size=
  26. wk_ip_buffer=
  27. ws(32)
  28. (wk_queue=
  29. ws(256) :
  30.  =64 queue items
  31.  "wk_allow=
  32. ws(256) :
  33.  =32 items
  34. wk_deny=
  35. ws(256)  :
  36. wk_buffer=
  37. ws(256)
  38. wk_stack=
  39. ws(256)
  40. wk_stack_end=count%
  41.  pass%=4 
  42. P%=&00
  43. O%=code%
  44. [ Opt     pass%
  45.   Equd    start
  46.   Equd    initialise
  47.   Equd    finalise
  48.   Equd    0
  49.   Equd    title
  50.   Equd    help
  51.   Equd    command_table
  52.   Equd    0
  53.   Equd    0
  54.   Equd    0
  55.   Equd    0
  56. .title
  57. string("OscliD")
  58. 9    .help
  59. string("OscliD"+
  60. 9+"1.06 (25 Jan 1998) 
  61.  Chris Rutter")
  62. .command_table
  63. command("OscliD_Task",star_task_help,star_task,0 
  64.  255<<16)
  65. command("OscliD_Allow",star_allow_help,star_allow,0 
  66.  1<<8 
  67.  1<<16)
  68. command("OscliD_Deny",star_deny_help,star_deny,0 
  69.  1<<8 
  70.  1<<16)
  71.   Equd    0
  72. .start
  73.   Ldr     r12,[r12]
  74. D)  Add     r13,r12,#wk_stack_end 
  75. E+  Add     r13,r13,#wk_stack_end 
  76.  &ff00
  77. ;initialise wimp task
  78.   Mov     r0,#256
  79.   Add     r0,r0,#310-256
  80.   Ldr     r1,task
  81.   AdrL    r2,task_name
  82.   Mov     r3,#0
  83.   Swi     "Wimp_Initialise"
  84. N&  Str     r1,[r12,#wk_task_handle]
  85. P    .poll
  86. Q$  Swi     "OS_ReadMonotonicTime"
  87.   Add     r2,r0,#50
  88.   Mov     r0,#0
  89. T&  Add     r1,r12,#wk_buffer ;safe?
  90.   Swi     "Wimp_PollIdle"
  91.   Teq     r0,#17
  92.   TeqNe   r0,#18
  93.   BNe     poll_check_queue
  94. [&  Ldr     r0,[r12,#wk_task_handle]
  95.   Ldr     r1,task
  96.   Swi     "Wimp_CloseDown"
  97.   Mov     r0,#0
  98. `8  Str     r0,[r12,#wk_task_handle] ;prevent re-entry
  99.   Swi     "OS_Exit"
  100. .poll_check_queue
  101. d%  Ldr     r6,[r12,#wk_queue_size]
  102.   Teq     r6,#0
  103.   BEq     poll
  104. ;items in queue
  105. i!  Mov     r7,#0 ;=item number
  106. j(  Add     r8,r12,#wk_queue ;->item[]
  107. l    .loop
  108.   Ldr     r9,[r8,r7,Lsl #2]
  109. ;execute task
  110.   Mov     r0,r9
  111.   Swi     "XWimp_StartTask"
  112. ;free rma block
  113.   Mov     r0,#7
  114.   Mov     r2,r9
  115.   Swi     "OS_Module"
  116.   Add     r7,r7,#1
  117. yB  Ldr     r6,[r12,#wk_queue_size] ;incase new requests arrived
  118. z2  Teq     r7,r6 ;have we reached end of queue?
  119.   BNe     loop
  120.   Mov     r0,#0
  121. ~%  Str     r0,[r12,#wk_queue_size]
  122.   B       poll
  123. .initialise
  124.   StmFd   r13!,{r7-r11,r14}
  125.   Mov     r0,#6
  126. "  Mov     r3,#(count%+4) 
  127. '  Orr     r3,r3,#(count%+4) 
  128.  &FF00
  129. +  Swi     "XOS_Module" ;claim workspace
  130.   LdmVsFd r13!,{r7-r11,Pc}
  131.   Str     r2,[r12]
  132. ,  Mov     r11,r12 ;preserve for OS_Claim
  133.   Ldr     r12,[r12]
  134. "  Str     r2,[r12,#wk_wkspace]
  135. #;nullify queue, task handle &c.
  136.   Mov     r0,#0
  137. %  Str     r0,[r12,#wk_queue_size]
  138. &  Str     r0,[r12,#wk_task_handle]
  139. %  Str     r0,[r12,#wk_allow_size]
  140. $  Str     r0,[r12,#wk_deny_size]
  141. ;nullify socket
  142.   Mvn     r0,#0
  143. !  Str     r0,[r12,#wk_socket]
  144. ;create udp socket
  145.   Mov     r0,#PF_INET
  146.   Mov     r1,#SOCK_DGRAM
  147.   Mov     r2,#0  
  148.   Swi     "XSocket_Creat"
  149.   LdmVsFd r13!,{r7-r11,Pc}
  150. !  Str     r0,[r12,#wk_socket]
  151. ;bind it locally
  152.   AdrL    r1,sockaddr
  153.   Mov     r2,#16
  154.   Swi     "XSocket_Bind"
  155.   BlVs    socket_close
  156.   LdmVsFd r13!,{r7-r11,Pc}
  157. ';mark it for asynchronous operation
  158. !  Ldr     r0,[r12,#wk_socket]
  159. &  Mov     r1,#FIOASYNC 
  160.  &ff000000
  161. )  Orr     r1,r1,#FIOASYNC 
  162.  &00ff0000
  163. )  Orr     r1,r1,#FIOASYNC 
  164.  &0000ff00
  165. )  Orr     r1,r1,#FIOASYNC 
  166.  &000000ff
  167.   AdrL    r2,argp
  168.   Swi     "XSocket_Ioctl"
  169.   BlVs    socket_close
  170.   LdmVsFd r13!,{r7-r11,Pc}
  171. ;mark it non-blocking
  172. !  Ldr     r0,[r12,#wk_socket]
  173. %  Mov     r1,#FIONBIO 
  174.  &ff000000
  175. (  Orr     r1,r1,#FIONBIO 
  176.  &00ff0000
  177. (  Orr     r1,r1,#FIONBIO 
  178.  &0000ff00
  179. (  Orr     r1,r1,#FIONBIO 
  180.  &000000ff
  181.   AdrL    r2,argp
  182.   Swi     "XSocket_Ioctl"
  183.   BlVs    socket_close
  184.   LdmVsFd r13!,{r7-r11,Pc}
  185. ;claim the event vector
  186.   Mov     r0,#&10 ;EventV
  187.   AdrL    r1,eventv
  188.   Mov     r2,r11
  189.   Swi     "XOS_Claim"
  190.   BlVs    socket_close
  191.   LdmVsFd r13!,{r7-r11,Pc}
  192. ;enable the Internet event
  193.   Mov     r0,#14
  194.   Mov     r1,#19
  195.   Swi     "XOS_Byte"
  196.   BlVs    socket_close
  197.   LdmVsFd r13!,{r7-r11,Pc}
  198.   LdmFd   r13!,{r7-r11,Pc}^
  199. .finalise
  200.   StmFd   r13!,{r7-r11,r14}
  201. .  Mov     r11,r12 ;preserve for OS_Release
  202.   Ldr     r12,[r12]
  203. ;disable the Internet event
  204.   Mov     r0,#13
  205.   Mov     r1,#19
  206.   Swi     "XOS_Byte"
  207. ;release the event vector
  208.   Mov     r0,#&10
  209.   AdrL    r1,eventv
  210.   Mov     r2,r11
  211.   Swi     "XOS_Release"
  212.   LdmVsFd r13!,{r7-r11,Pc}
  213. ;close the socket
  214.   Bl      socket_close
  215. ;shutdown wimp task
  216. &  Ldr     r0,[r12,#wk_task_handle]
  217.   Ldr     r1,task
  218.   Teq     r0,#0
  219.   SwiNe   "XWimp_CloseDown"
  220. ;release workspace
  221.   Mov     r0,#7
  222.   Mov     r2,r12
  223.   Swi     "XOS_Module"
  224.   LdmFd   r13!,{r7-r11,Pc}^
  225.  .star_task ;r0->command tail
  226.   StmFd   r13!,{r14}
  227.   Ldr     r12,[r12]
  228.   Mov     r6,r0
  229. %  Ldr     r4,[r12,#wk_queue_size]
  230. /  Teq     r4,#MAX_QUEUE ;is the queue full?
  231.   LdmEqFd r13!,{Pc}^
  232. ;claim memory for string
  233.   Mov     r0,#6
  234.   Mov     r3,#256
  235. %  Swi     "XOS_Module" ;r2->block
  236.   LdmVsFd r13!,{Pc}
  237. ;copy out string into block
  238.   Mov     r1,#0
  239.     .loop
  240.   LdrB    r3,[r6,r1]
  241.   StrB    r3,[r2,r1]
  242.   Add     r1,r1,#1
  243.   Cmp     r3,#32
  244.   BGe     loop
  245. ;insert pointer into queue
  246.   Add     r5,r12,#wk_queue
  247.     5  Add     r5,r5,r4,Lsl #2 ;r5->pointer to command
  248. *  Str     r2,[r5] ;store pointer in r5
  249. ;expand queue size
  250.   Add     r4,r4,#1
  251. %  Str     r4,[r12,#wk_queue_size]
  252.   LdmFd   r13!,{Pc}^
  253. $.star_allow ;r0->host/network ip
  254.   StmFd   r13!,{r14}
  255.   Ldr     r12,[r12]
  256.   Mov     r6,r0
  257. &;see if we should display the list
  258.   Teq     r1,#0
  259.    BEq     star_allow_display
  260. (;check if we have space in the table
  261. %  Ldr     r1,[r12,#wk_allow_size]
  262.   Cmp     r1,#MAX_ALLOW
  263.    AdrGeL  r0,error_max_allow
  264.   LdmGeFd r13!,{r14}
  265.   OrrGeS  Pc,r14,#v_bit
  266. "*;read in number of dots (i.e. netmask)
  267.   Bl      terminate_string
  268.   Bl      count_dots
  269. &#;check number of dots are valid
  270.   Cmp     r0,#3
  271. ($  AdrGtL  r0,error_too_many_dots
  272.   LdmGtFd r13!,{r14}
  273.   OrrGtS  Pc,r14,#v_bit
  274. ,1;load up netmask word for this address length
  275.   AdrL    r2,netmasks
  276.   Ldr     r2,[r2,r0,Lsl #2]
  277. 0!;decode the dotted quad in r6
  278.   Mov     r0,r6
  279.   Bl      ip_quad_to_bits
  280. 4';store this at the end of the table
  281.   Add     r3,r12,#wk_allow
  282. 61  Add     r4,r3,r1,Lsl #3 ;r1 = size of table
  283.   Str     r0,[r4,#0]
  284.   Str     r2,[r4,#4]
  285. :!;add one to number of entries
  286.   Add     r1,r1,#1
  287. <%  Str     r1,[r12,#wk_allow_size]
  288.   LdmFd   r13!,{Pc}^
  289. .star_allow_display
  290.   StmFd   r13!,{r7-r10}
  291. B6  Add     r10,r12,#wk_allow ;r10->allow table base
  292. C6  Ldr     r9,[r12,#wk_allow_size] ;number of hosts
  293.   Teq     r9,#0
  294. E%  BEq     star_allow_display_none
  295.   Swi     "OS_WriteS"
  296. G3  Equs    "Trusted hosts and networks:"+
  297.   Align
  298.   AdrL    r0,txt_ip_header
  299.   Swi     "OS_Write0"
  300. K!  Mov     r8,#0 ;current host
  301. L$  B       star_deny_display_loop
  302. .star_allow_display_none
  303.   Swi     "OS_WriteS"
  304. PP  Equs    "There are no entries in the table of trusted networks and hosts."
  305.   Equs    
  306.   Align
  307.   LdmFd   r13!,{r7-r10}
  308.   LdmFd   r13!,{Pc}^
  309. V#.star_deny ;r0->host/network ip
  310.   StmFd   r13!,{r14}
  311.   Ldr     r12,[r12]
  312.   Mov     r6,r0
  313. [&;see if we should display the list
  314.   Teq     r1,#0
  315.   BEq     star_deny_display
  316. _(;check if we have space in the table
  317. `$  Ldr     r1,[r12,#wk_deny_size]
  318.   Cmp     r1,#MAX_DENY
  319.   AdrGeL  r0,error_max_deny
  320.   LdmGeFd r13!,{r14}
  321.   OrrGeS  Pc,r14,#v_bit
  322. f*;read in number of dots (i.e. netmask)
  323.   Bl      terminate_string
  324.   Bl      count_dots
  325. j#;check number of dots are valid
  326.   Cmp     r0,#3
  327. l$  AdrGtL  r0,error_too_many_dots
  328.   LdmGtFd r13!,{r14}
  329.   OrrGtS  Pc,r14,#v_bit
  330. p1;load up netmask word for this address length
  331.   AdrL    r2,netmasks
  332.   Ldr     r2,[r2,r0,Lsl #2]
  333. t!;decode the dotted quad in r6
  334.   Mov     r0,r6
  335.   Bl      ip_quad_to_bits
  336. x';store this at the end of the table
  337.   Add     r3,r12,#wk_deny
  338. z1  Add     r4,r3,r1,Lsl #3 ;r1 = size of table
  339.   Str     r0,[r4,#0]
  340.   Str     r2,[r4,#4]
  341. ~!;add one to number of entries
  342.   Add     r1,r1,#1
  343. $  Str     r1,[r12,#wk_deny_size]
  344.   LdmFd   r13!,{Pc}^
  345. .star_deny_display
  346.   StmFd   r13!,{r7-r10}
  347. 4  Add     r10,r12,#wk_deny ;r10->deny table base
  348. 5  Ldr     r9,[r12,#wk_deny_size] ;number of hosts
  349.   Teq     r9,#0
  350. $  BEq     star_deny_display_none
  351.   Swi     "OS_WriteS"
  352. 7  Equs    "Blacklisted hosts and networks:"+
  353.   Align
  354.   AdrL    r0,txt_ip_header
  355.   Swi     "OS_Write0"
  356. !  Mov     r8,#0 ;current host
  357. .star_deny_display_loop
  358.   Add     r1,r10,r8,Lsl #3
  359. /  Ldr     r6,[r1,#0] ;r6=address of host r4
  360. /  Ldr     r7,[r1,#4] ;r7=netmask of host r4
  361.   Mov     r0,r6
  362.   Bl      ip_write_quad
  363.   Mov     r1,r0
  364.   Rsb     r1,r1,#24
  365.     .loop
  366.   Swi     256+
  367. (" ")
  368.   SubS    r1,r1,#1
  369.   BNe     loop
  370.   Mov     r0,r7 ;netmask
  371. "  Add     r1,r12,#wk_ip_buffer
  372.   Mov     r2,#16
  373.   Swi     "OS_ConvertHex8"
  374.   Swi     "OS_Write0"
  375.   Swi     "OS_NewLine"
  376.   Add     r8,r8,#1
  377.   Teq     r8,r9
  378. $  BNe     star_deny_display_loop
  379.   LdmFd   r13!,{r7-r10}
  380.   LdmFd   r13!,{Pc}^
  381. .star_deny_display_none
  382.   Swi     "OS_WriteS"
  383. T  Equs    "There are no entries in the table of blacklisted networks and hosts."
  384.   Equs    
  385.   Align
  386.   LdmFd   r13!,{r7-r10}
  387.   LdmFd   r13!,{Pc}^
  388. 8.ip_write_quad ;r0=ip ... r0=length of output string
  389.   StmFd   r13!,{r1-r4,r14}
  390.   Mov     r4,r0
  391. %  Mov     r3,#3 ;length of string
  392.   And     r0,r4,#&000000ff
  393. "  Add     r1,r12,#wk_ip_buffer
  394.   Mov     r2,#16
  395. "  Swi     "OS_ConvertInteger4"
  396.   Rsb     r2,r2,#16
  397.   Add     r3,r3,r2
  398.   Swi     "OS_Write0"
  399.   Swi     256+
  400. (".")
  401.   And     r0,r4,#&0000ff00
  402.   Mov     r0,r0,Lsr #8
  403. "  Add     r1,r12,#wk_ip_buffer
  404.   Mov     r2,#16
  405. "  Swi     "OS_ConvertInteger4"
  406.   Rsb     r2,r2,#16
  407.   Add     r3,r3,r2
  408.   Swi     "OS_Write0"
  409.   Swi     256+
  410. (".")
  411.   And     r0,r4,#&00ff0000
  412.   Mov     r0,r0,Lsr #16
  413. "  Add     r1,r12,#wk_ip_buffer
  414.   Mov     r2,#16
  415. "  Swi     "OS_ConvertInteger4"
  416.   Rsb     r2,r2,#16
  417.   Add     r3,r3,r2
  418.   Swi     "OS_Write0"
  419.   Swi     256+
  420. (".")
  421.   And     r0,r4,#&ff000000
  422.   Mov     r0,r0,Lsr #24
  423. "  Add     r1,r12,#wk_ip_buffer
  424.   Mov     r2,#16
  425. "  Swi     "OS_ConvertInteger4"
  426.   Rsb     r2,r2,#16
  427.   Add     r3,r3,r2
  428.   Swi     "OS_Write0"
  429.   Mov     r0,r3
  430.   LdmFd   r13!,{r1-r4,Pc}^
  431. /.ip_quad_to_bits ;r0->string ... r0=ip bits
  432.   StmFd   r13!,{r1-r5,r14}
  433.   LdrB    r1,[r0]
  434.   Teq     r1,#
  435. ("*")
  436.   MovEq   r0,#0
  437.   LdmEqFd r13!,{r1-r5,Pc}^
  438.   Mov     r2,#0 ;ip address
  439. '  Mov     r3,#0 ;shift of next byte
  440.     .loop
  441. C  Bl      ip_extract_nibble ;extract the nibble from the string
  442. ;  Orr     r2,r2,r1,Lsl r3 ;merge it into the ip address
  443. @  Add     r3,r3,#8 ;shift over to the right for the next one
  444.   LdrB    r1,[r0]
  445. :  Cmp     r1,#32 ;are we at the end of the string yet?
  446.   BGt     loop
  447.   Mov     r0,r2
  448.   LdmFd   r13!,{r1-r5,Pc}^
  449. @.ip_extract_nibble ;r0->string ... r0->next nibble r1=nibble
  450.   StmFd   r13!,{r2-r5,r14}
  451.   Mov     r4,r0
  452.     .loop
  453.   LdrB    r2,[r4],#1
  454.   Teq     r2,#0
  455.   TeqNe   r2,#
  456. (".")
  457.   TeqNe   r2,#32
  458.   BNe     loop
  459.   Mov     r3,#0
  460.   StrB    r3,[r4,#-1]
  461. "  Add     r1,r12,#wk_ip_buffer
  462.   Mov     r2,#32
  463. %  Swi     "OS_EvaluateExpression"
  464. '  Teq     r1,#0 ;0=integer returned
  465.   MovEq   r1,r2
  466.   MovNe   r1,#0
  467.   Mov     r0,r4
  468.   LdmFd   r13!,{r2-r5,Pc}^
  469. !.terminate_string ;r0->string
  470.   StmFd   r13!,{r0-r3,r14}
  471.   Mov     r1,#0
  472.   Mov     r3,#0
  473.     .loop
  474.   LdrB    r2,[r0],#1
  475.   Teq     r2,#32
  476.   StrEqB  r3,[r0,#-1]
  477.   MovEq   r2,#0
  478.   Teq     r2,#0
  479.   BNe     loop
  480.   LdmFd   r13!,{r0-r3,Pc}^
  481. 0.count_dots ;r0->string ... r0=number of "."
  482.   StmFd   r13!,{r1-r3,r14}
  483.   LdrB    r2,[r0]
  484.   Teq     r2,#
  485. ("*")
  486.   MvnEq   r0,#0
  487.   LdmEqFd r13!,{r1-r3,Pc}^
  488.   Mov     r1,#0
  489. !    .loop
  490.   LdrB    r2,[r0],#1
  491.   Teq     r2,#
  492. (".")
  493.   AddEq   r1,r1,#1
  494.   Teq     r2,#0
  495.   BNe     loop
  496.   Mov     r0,r1
  497.   LdmFd   r13!,{r1-r3,Pc}^
  498. .socket_close
  499.   StmFd   r13!,{r0,r14}
  500. ,!  Ldr     r0,[r12,#wk_socket]
  501.   Cmn     r0,#1
  502.   MvnNe   r1,#0
  503. /!  StrNe   r1,[r12,#wk_socket]
  504.   SwiNe   "XSocket_Close"
  505.   LdmFd   r13!,{r0,Pc}^
  506. 3<.eventv ;r0 = event, (r1 = type, r2 = socket descriptor)
  507.   Teq     r0,#19
  508.   MovNeS  Pc,r14
  509.   StmFd   r13!,{r0-r6,r14}
  510.   Ldr     r12,[r12]
  511. 8!  Ldr     r3,[r12,#wk_socket]
  512.   Teq     r3,r2
  513.   LdmNeFd r13!,{r0-r6,Pc}^
  514. .read_from_socket
  515. =!  Ldr     r0,[r12,#wk_socket]
  516.   AdrW    r1,wk_buffer
  517.   Mov     r2,#256
  518.   Mov     r3,#MSG_DONTWAIT
  519.   Adr     r4,from
  520.   Adr     r5,from_size
  521.   Mov     r6,#16
  522.   Str     r6,[r5]
  523. E6  Swi     "XSocket_Recvfrom" ;data is in wk_buffer
  524.   LdmVsFd r13!,{r0-r6,Pc}^
  525.   Teq     r0,#0
  526.   LdmEqFd r13!,{r0-r6,Pc}^
  527. ;check allow, deny lists
  528.   Ldr     r6,from_addr
  529.   Mov     r5,#0
  530.   AdrW    r4,wk_allow
  531. N%  Ldr     r2,[r12,#wk_allow_size]
  532.   Teq     r2,#0
  533.   BEq     check_deny
  534. Q    .loop
  535. R1  Add     r3,r4,r5,Lsl #3 ;r3->address record
  536. S!  Ldr     r0,[r3,#4] ;netmask
  537. T/  And     r0,r0,r6 ;r0=corrected ip address
  538. U!  Ldr     r1,[r3,#0] ;address
  539. V0  Teq     r0,r1 ;have we hit an allow entry?
  540.   BEq     allow
  541.   Add     r5,r5,#1
  542.   Teq     r5,r2
  543.   BNe     loop
  544. .check_deny
  545.   Mov     r5,#0
  546.   AdrW    r4,wk_deny
  547. _$  Ldr     r2,[r12,#wk_deny_size]
  548.   Teq     r2,#0
  549.   BEq     allow
  550. b    .loop
  551.   Add     r3,r4,r5,Lsl #3
  552. d!  Ldr     r0,[r3,#4] ;netmask
  553. e/  And     r0,r0,r6 ;r0=corrected ip address
  554. f!  Ldr     r1,[r3,#0] ;address
  555. g.  Teq     r0,r1 ;have we hit a deny entry?
  556.   BEq     deny
  557.   Add     r5,r5,#1
  558.   Teq     r5,r2
  559.   BNe     loop
  560. .allow
  561.   AdrW    r0,wk_buffer
  562.   Swi     "XOS_CLI"
  563. q    .deny
  564.   B       read_from_socket
  565. t    .from
  566. .sockaddr
  567. v)  Equd    AF_INET 
  568. htons(port%)<<16
  569. .from_addr
  570.   Equd    &00000000
  571.   Equd    0
  572.   Equd    0
  573. .from_size
  574.   Equd    16
  575.     .argp
  576.   Equd    1
  577. .star_task_help
  578. L  Equs    "*OscliD_Task adds an OSCLI command to OscliD's Wimp command "
  579.   Equs    "queue."+
  580. 1  Equs    "Syntax: *OscliD_Task <command>"+
  581.   Align
  582. .star_allow_help
  583. N  Equs    "*OscliD_Allow adds a host or network to the trusted list that "
  584. -  Equs    "may execute commands."+
  585. 7  Equs    "Syntax: *OscliD_Allow <host|network>"+
  586.   Align
  587. .star_deny_help
  588. J  Equs    "*OscliD_Deny adds a host or network to the blacklist that "
  589. 1  Equs    "may not execute commands."+
  590. 6  Equs    "Syntax: *OscliD_Deny <host|network>"+
  591.   Align
  592. .txt_ip_header
  593. :  Equs    "IP address              Netmask"+
  594.   Align
  595.     .task
  596.   Equs    "TASK"
  597. .task_name
  598.   Equs    "OscliD"+
  599.   Align
  600.   Equd    &00000000
  601. .netmasks
  602.   Equd    &000000FF
  603.   Equd    &0000FFFF
  604.   Equd    &00FFFFFF
  605.   Equd    &FFFFFFFF
  606. .error_max_allow
  607. error("The maximum number of items in the trusted list has been reached")
  608. .error_max_deny
  609. error("The maximum number of items in the blacklist has been reached")
  610. .error_too_many_dots
  611. error("I don't understand this address format")
  612.  pass%
  613.  "OS_File",10,"<Obey$Dir>.!OscliD.OscliD",&FFA,,code%,O%
  614. string(string$)
  615. [ Opt     pass%
  616.   Equs    string$
  617.   Equb    0
  618.   Align
  619. =pass%
  620. count%+=4
  621. =count%-4
  622. ws(a%)
  623. count%+=a%
  624. =count%-a%
  625. htons(n%)
  626. &=(n% 
  627.  &ff00)>>8 
  628.  (n% 
  629.  &00ff)<<8
  630. command(command$,help%,code%,flags%)
  631.  flags%=-1 
  632.  flags%=0 
  633.  (0<<8) 
  634.  (0<<8)
  635. [ Opt     pass%
  636.   Equs command$+
  637.   Align
  638.   Equd code%
  639.   Equd flags%
  640.   Equd 0
  641.   Equd help%
  642. =pass%
  643. error(string$)
  644. [ Opt     pass%
  645.   Equd    0
  646.   Equs    string$+
  647.   Align
  648. =pass%
  649. space(a%)
  650. P%+=a%
  651. O%+=a%
  652. =pass%
  653.