55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			55 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (C) 2007 Slava Pestov.
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								IN: io.sockets
							 | 
						||
| 
								 | 
							
								USING: generic kernel io.backend namespaces continuations
							 | 
						||
| 
								 | 
							
								sequences arrays ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: local path ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <local> local
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: inet4 host port ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <inet4> inet4
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: inet6 host port ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <inet6> inet6
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: inet host port ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								C: <inet> inet
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: client-stream addr ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <client-stream> ( addrspec delegate -- stream )
							 | 
						||
| 
								 | 
							
								    { set-client-stream-addr set-delegate }
							 | 
						||
| 
								 | 
							
								    client-stream construct ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HOOK: (client) io-backend ( addrspec -- stream )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								GENERIC: <client> ( addrspec -- stream )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: array <client> [ (client) ] attempt-all ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: object <client> (client) ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HOOK: <server> io-backend ( addrspec -- server )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HOOK: accept io-backend ( server -- client )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HOOK: <datagram> io-backend ( addrspec -- datagram )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HOOK: receive io-backend ( datagram -- packet addrspec )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HOOK: send io-backend ( packet addrspec datagram -- )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HOOK: resolve-host io-backend ( host serv passive? -- seq )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								HOOK: host-name io-backend ( -- string )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: inet <client>
							 | 
						||
| 
								 | 
							
								    dup inet-host swap inet-port f resolve-host
							 | 
						||
| 
								 | 
							
								    dup empty? [ "Host name lookup failed" throw ] when
							 | 
						||
| 
								 | 
							
								    <client> ;
							 |