From: Alexis Laferrière Date: Sat, 27 Dec 2014 17:02:50 +0000 (-0500) Subject: lib/socket: report errors on `setsockopt` and close socked when raised X-Git-Tag: v0.7.1~37^2 X-Git-Url: http://nitlanguage.org lib/socket: report errors on `setsockopt` and close socked when raised Signed-off-by: Alexis Laferrière --- diff --git a/lib/socket/socket.nit b/lib/socket/socket.nit index 26d9937..77acfbe 100644 --- a/lib/socket/socket.nit +++ b/lib/socket/socket.nit @@ -66,7 +66,11 @@ class TCPStream closed = true return end - socket.setsockopt(new NativeSocketOptLevels.socket, new NativeSocketOptNames.reuseaddr, 1) + if not socket.setsockopt(new NativeSocketOptLevels.socket, new NativeSocketOptNames.reuseaddr, 1) then + end_reached = true + closed = true + return + end var hostname = socket.gethostbyname(host) addrin = new NativeSocketAddrIn.with_hostent(hostname, port) @@ -174,8 +178,10 @@ class TCPStream # Send the data present in the socket buffer fun flush do - socket.setsockopt(new NativeSocketOptLevels.tcp, new NativeSocketOptNames.tcp_nodelay, 1) - socket.setsockopt(new NativeSocketOptLevels.tcp, new NativeSocketOptNames.tcp_nodelay, 0) + if not socket.setsockopt(new NativeSocketOptLevels.tcp, new NativeSocketOptNames.tcp_nodelay, 1) or + not socket.setsockopt(new NativeSocketOptLevels.tcp, new NativeSocketOptNames.tcp_nodelay, 0) then + closed = true + end end end @@ -193,7 +199,10 @@ class TCPServer socket = new NativeSocket.socket(new NativeSocketAddressFamilies.af_inet, new NativeSocketTypes.sock_stream, new NativeSocketProtocolFamilies.pf_null) assert not socket.address_is_null - socket.setsockopt(new NativeSocketOptLevels.socket, new NativeSocketOptNames.reuseaddr, 1) + if not socket.setsockopt(new NativeSocketOptLevels.socket, new NativeSocketOptNames.reuseaddr, 1) then + closed = true + return + end addrin = new NativeSocketAddrIn.with(port, new NativeSocketAddressFamilies.af_inet) address = addrin.address diff --git a/lib/socket/socket_c.nit b/lib/socket/socket_c.nit index ba76860..44aff9e 100644 --- a/lib/socket/socket_c.nit +++ b/lib/socket/socket_c.nit @@ -145,12 +145,14 @@ extern class NativeSocket `{ int* `} `} # Sets an option for the socket - fun setsockopt(level: NativeSocketOptLevels, option_name: NativeSocketOptNames, option_value: Int) `{ + # + # Returns `true` on success. + fun setsockopt(level: NativeSocketOptLevels, option_name: NativeSocketOptNames, option_value: Int): Bool `{ int err = setsockopt(*recv, level, option_name, &option_value, sizeof(int)); if(err != 0){ - perror("Error on setsockopts: "); - exit(1); + return 0; } + return 1; `} fun bind(addrIn: NativeSocketAddrIn): Int `{ return bind(*recv, (struct sockaddr*)addrIn, sizeof(*addrIn)); `}