From 7482059a661cdfccc6e016495a8870a0838eb1a1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Alexis=20Laferri=C3=A8re?= Date: Sat, 27 Dec 2014 12:02:50 -0500 Subject: [PATCH] lib/socket: report errors on `setsockopt` and close socked when raised MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Alexis Laferrière --- lib/socket/socket.nit | 17 +++++++++++++---- lib/socket/socket_c.nit | 8 +++++--- 2 files changed, 18 insertions(+), 7 deletions(-) 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)); `} -- 1.7.9.5