]> gitweb.factorcode.org Git - factor.git/commitdiff
Fix io.servers -- if it doesn't start up, don't throw an error when it's stopped...
authorDoug Coleman <doug.coleman@gmail.com>
Mon, 20 Sep 2010 02:35:52 +0000 (21:35 -0500)
committerDoug Coleman <doug.coleman@gmail.com>
Mon, 20 Sep 2010 02:35:52 +0000 (21:35 -0500)
basis/io/servers/connection/connection.factor
basis/io/sockets/windows/windows.factor
basis/windows/winsock/winsock.factor

index b44aa943b8d95cd7867ecba9a2712a26b7cf1445..a6e13090a188e5b1469db946e811b82c523c55c9 100644 (file)
@@ -44,7 +44,7 @@ ERROR: server-not-running threaded-server ;
     running-servers get adjoin ;
 
 : remove-running-server ( threaded-server -- )
-    must-be-running
+    must-be-running
     running-servers get delete ;
 
 PRIVATE>
@@ -72,6 +72,8 @@ GENERIC: handle-client* ( threaded-server -- )
 GENERIC: (>insecure) ( obj -- obj )
 
 M: inet (>insecure) ;
+M: inet4 (>insecure) ;
+M: inet6 (>insecure) ;
 M: local (>insecure) ;
 M: integer (>insecure) internet-server ;
 M: string (>insecure) internet-server ;
@@ -224,6 +226,12 @@ PRIVATE>
 
 : insecure-port ( -- n/f ) [ addr>> secure? not ] first-port ;
 
+: secure-addr ( -- inet )
+    threaded-server get servers>> [ addr>> secure? ] filter random ;
+
+: insecure-addr ( -- inet )
+    threaded-server get servers>> [ addr>> secure? not ] filter random addr>> ;
+    
 : server. ( threaded-server -- )
     [ [ "=== " write name>> ] [ ] bi write-object nl ]
     [ servers>> [ addr>> present print ] each ] bi ;
@@ -231,6 +239,9 @@ PRIVATE>
 : all-servers ( -- sequence )
     running-servers get-global members ;
 
+: get-servers-named ( string -- sequence )
+    [ all-servers ] dip '[ name>> _ = ] filter ;
+    
 : servers. ( -- )
     all-servers [ server. ] each ;
 
index b617519fced1d1a34a5f48aebeba4f87fffeb666..ade64485db3b5488d604e6b44b3d86d69e522364 100755 (executable)
@@ -100,7 +100,7 @@ M: winnt WSASocket-flags ( -- DWORD )
         f\r
         f\r
         WSAIoctl SOCKET_ERROR = [\r
-            winsock-error-string throw\r
+            maybe-winsock-exception throw\r
         ] when\r
     ] with-out-parameters ;\r
 \r
@@ -134,7 +134,7 @@ TUPLE: ConnectEx-args port
     int\r
     { SOCKET void* int PVOID DWORD LPDWORD void* }\r
     stdcall alien-indirect drop\r
-    winsock-error-string [ throw ] when* ; inline\r
+    winsock-error ; inline\r
 \r
 M: object establish-connection ( client-out remote -- )\r
     make-sockaddr/size <ConnectEx-args>\r
@@ -164,6 +164,7 @@ TUPLE: AcceptEx-args port
         f >>lpdwBytesReceived\r
         (make-overlapped) >>lpOverlapped ; inline\r
 \r
+! AcceptEx return value is useless\r
 : call-AcceptEx ( AcceptEx -- )\r
     {\r
         [ sListenSocket>> ]\r
@@ -174,8 +175,7 @@ TUPLE: AcceptEx-args port
         [ dwRemoteAddressLength>> ]\r
         [ lpdwBytesReceived>> ]\r
         [ lpOverlapped>> ]\r
-    } cleave AcceptEx drop\r
-    winsock-error-string [ throw ] when* ; inline\r
+    } cleave AcceptEx drop winsock-error ; inline\r
 \r
 : (extract-remote-address) ( lpOutputBuffer dwReceiveDataLength dwLocalAddressLength dwRemoteAddressLength -- sockaddr )\r
     f <void*> 0 <int> f <void*> [ 0 <int> GetAcceptExSockaddrs ] keep *void* ;\r
index 4dd7d7385c9ee94d3ead654665497c4abd9aefdd..99e5e49295942821994e2e50a7416ad44ed3a935 100644 (file)
@@ -7,7 +7,7 @@ classes.struct windows.com.syntax init ;
 FROM: alien.c-types => short ;
 IN: windows.winsock
 
-TYPEDEF: void* SOCKET
+TYPEDEF: int* SOCKET
 
 : <wsadata> ( -- byte-array )
     HEX: 190 <byte-array> ;
@@ -394,35 +394,40 @@ CONSTANT: SIO_GET_EXTENSION_FUNCTION_POINTER -939524090
 
 CONSTANT: WSAID_CONNECTEX GUID: {25a207b9-ddf3-4660-8ee9-76e58c74063e}
 
+ERROR: winsock-exception n string ;
+
 : winsock-expected-error? ( n -- ? )
     ${ ERROR_IO_PENDING ERROR_SUCCESS WSA_IO_PENDING } member? ;
 
-: (winsock-error-string) ( n -- str )
+: (maybe-winsock-exception) ( n -- winsock-exception/f )
     ! #! WSAStartup returns the error code 'n' directly
     dup winsock-expected-error?
-    [ drop f ] [ n>win32-error-string ] if ;
+    [ drop f ] [ [ ] [ n>win32-error-string ] bi \ winsock-exception boa ] if ;
 
-: winsock-error-string ( -- string/f )
-    WSAGetLastError (winsock-error-string) ;
+: maybe-winsock-exception ( -- winsock-exception/f )
+    WSAGetLastError (maybe-winsock-exception) ;
 
 : winsock-error ( -- )
-    winsock-error-string [ throw ] when* ;
+    maybe-winsock-exception [ throw ] when* ;
+
+: (throw-winsock-error) ( n -- * )
+    [ ] [ n>win32-error-string ] bi winsock-exception ;
 
+: throw-winsock-error ( -- * )
+    WSAGetLastError (throw-winsock-error) ;
+    
 : winsock-error=0/f ( n/f -- )
-    { 0 f } member? [
-        winsock-error-string throw
-    ] when ;
+    { 0 f } member? [ throw-winsock-error ] when ;
 
 : winsock-error!=0/f ( n/f -- )
-    { 0 f } member? [
-        winsock-error-string throw
-    ] unless ;
+    { 0 f } member? [ throw-winsock-error ] unless ;
 
+! WSAStartup and WSACleanup return the error code directly
 : winsock-return-check ( n/f -- )
     dup { 0 f } member? [
         drop
     ] [
-        (winsock-error-string) throw
+        [ ] [ n>win32-error-string ] bi winsock-exception
     ] if ;
 
 : socket-error* ( n -- )
@@ -431,7 +436,7 @@ CONSTANT: WSAID_CONNECTEX GUID: {25a207b9-ddf3-4660-8ee9-76e58c74063e}
         dup WSA_IO_PENDING = [
             drop
         ] [
-            (winsock-error-string) throw
+            (maybe-winsock-exception) throw
         ] if
     ] when ;