X-Git-Url: http://nitlanguage.org?ds=sidebyside diff --git a/lib/socket/socket_c.nit b/lib/socket/socket_c.nit index 793b1c5..fbf2923 100644 --- a/lib/socket/socket_c.nit +++ b/lib/socket/socket_c.nit @@ -37,6 +37,7 @@ in "C" `{ # Wrapper for the data structure PollFD used for polling on a socket class PollFD + super FinalizableOnce # The PollFD object private var poll_struct: NativeSocketPollFD @@ -76,6 +77,10 @@ class PollFD return response & mask; `} + redef fun finalize_once + do + poll_struct.free + end end # Data structure used by the poll function @@ -127,25 +132,31 @@ extern class NativeSocket `{ int* `} return write(*recv, (char*)String_to_cstring(buffer), String_length(buffer)); `} - fun read: String import NativeString.to_s_with_length `{ + # Write `value` as a single byte + fun write_byte(value: Int): Int `{ + unsigned char byt = (unsigned char)value; + return write(*recv, &byt, 1); + `} + + fun read: String import NativeString.to_s_with_length, NativeString.to_s_with_copy `{ static char c[1024]; - int n = read(*recv, c, 1024); + int n = read(*recv, c, 1023); if(n < 0) { return NativeString_to_s_with_length("",0); } - char* ret = malloc(n + 1); - memcpy(ret, c, n); - ret[n] = '\0'; - return NativeString_to_s_with_length(ret, n); + c[n] = 0; + return NativeString_to_s_with_copy(c); `} # 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)); `} @@ -231,7 +242,7 @@ extern class NativeSocketAddrIn `{ struct sockaddr_in* `} return sai; `} - new with(port: Int, family: NativeSocketAddressFamilies) `{ + new with_port(port: Int, family: NativeSocketAddressFamilies) `{ struct sockaddr_in *sai = NULL; sai = malloc(sizeof(struct sockaddr_in)); sai->sin_family = family;