]> gitweb.factorcode.org Git - factor.git/commitdiff
added with-local-address to bind the local address of a socket to a specific IP or...
authorSascha Matzke <sascha.matzke@didolo.org>
Sun, 27 Sep 2009 15:31:02 +0000 (17:31 +0200)
committerSascha Matzke <sascha.matzke@didolo.org>
Fri, 23 Oct 2009 06:10:03 +0000 (08:10 +0200)
basis/io/sockets/sockets.factor
basis/io/sockets/unix/unix.factor
basis/io/sockets/windows/windows.factor

index a542575446d4717ebc2339b841b55797f56565c6..e45224fcc20fba3b07abeaa9551a3e9ff76095b9 100755 (executable)
@@ -173,6 +173,8 @@ GENERIC: (get-remote-address) ( handle remote -- sockaddr )
         [ <input-port> |dispose ] [ <output-port> |dispose ] bi
     ] with-destructors ;
 
+SYMBOL: bind-local-address
+
 GENERIC: establish-connection ( client-out remote -- )
 
 GENERIC: ((client)) ( remote -- handle )
@@ -321,6 +323,18 @@ M: invalid-inet-server summary
 M: inet (server)
     invalid-inet-server ;
 
+ERROR: invalid-local-address addrspec ;
+
+M: invalid-local-address summary
+    drop "Cannot use with-local-address with <inet>; use <inet4> or <inet6> instead" ;
+
+: with-local-address ( addr quot -- )
+    [
+        [ ] [ inet4? ] [ inet6? ] tri or
+        [ bind-local-address ]
+        [ invalid-local-address ] if
+    ] dip with-variable ; inline
+
 {
     { [ os unix? ] [ "io.sockets.unix" require ] }
     { [ os winnt? ] [ "io.sockets.windows.nt" require ] }
index fa46a71ca087525c763e2e9ad73d34749cf09a82..3564b3289002eac773526dedacdca14cd17071cf 100755 (executable)
@@ -69,8 +69,12 @@ M: object establish-connection ( client-out remote -- )
         [ (io-error) ]
     } cond ;
 
+: ?bind-client ( socket -- )
+    bind-local-address get [ [ fd>> ] dip make-sockaddr/size bind io-error ] [ drop ] if* ; inline
+
 M: object ((client)) ( addrspec -- fd )
-    protocol-family SOCK_STREAM socket-fd dup init-client-socket ;
+    protocol-family SOCK_STREAM socket-fd
+    [ init-client-socket ] [ ?bind-client ] [ ] tri ;
 
 ! Server sockets - TCP and Unix domain
 : init-server-socket ( fd -- )
index ccf86ca3087b5155c946eeb92d78e69dc54dff93..fa5e3833bc29103c3ca7411d4fd91183c8a81e66 100755 (executable)
@@ -55,7 +55,11 @@ M: object (get-remote-address) ( socket addrspec -- sockaddr )
 \r
 M: object ((client)) ( addrspec -- handle )\r
     [ SOCK_STREAM open-socket ] keep\r
-    [ unspecific-sockaddr/size bind-socket ] [ drop ] 2bi ;\r
+    [\r
+        bind-local-address get\r
+        [ nip make-sockaddr/size ]\r
+        [ unspecific-sockaddr/size ] if* bind-socket\r
+    ] [ drop ] 2bi ;\r
 \r
 : server-socket ( addrspec type -- fd )\r
     [ open-socket ] [ drop ] 2bi\r