Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion lib/std/net/os/common.c3
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,39 @@ const AIFamily AF_APPLETALK = PLATFORM_AF_APPLETALK;

const O_NONBLOCK = PLATFORM_O_NONBLOCK;


<*
The getaddrinfo() function is used to get a list of IP addresses and port numbers for host hostname and service servname.

@param [in] nodename
@param [in] servname
@param [in] hints
@param [out] res
@require (void*)nodename || (void*)servname : "One the names must be non-null"
*>
extern fn CInt getaddrinfo(ZString nodename, ZString servname, AddrInfo* hints, AddrInfo** res) @if(SUPPORTS_INET);

<*
freeaddrinfo() frees an AddrInfo created by getaddrinfo.

@param [&in] res
*>
extern fn void freeaddrinfo(AddrInfo* res) @if(SUPPORTS_INET);

<*
Set options on a socket.

@param [out] optval
*>
extern fn CInt setsockopt(NativeSocket socket, CInt level, CInt optname, void* optval, Socklen_t optlen) @if(SUPPORTS_INET);
extern fn CInt getsockopt(NativeSocket socket, CInt level, CInt optname, void* optval, Socklen_t optlen) @if(SUPPORTS_INET);

<*
Get options on a socket

@param [in] optval
@param [inout] optlen
*>
extern fn CInt getsockopt(NativeSocket socket, CInt level, CInt optname, void* optval, Socklen_t* optlen) @if(SUPPORTS_INET);

module std::net::os @if(!env::LIBC || !(env::WIN32 || env::DARWIN || env::LINUX || env::ANDROID || env::OPENBSD));

Expand Down
3 changes: 2 additions & 1 deletion lib/std/net/socket.c3
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ fn void? Socket.set_option(&self, SocketOption option, bool value)
fn bool? Socket.get_option(&self, SocketOption option)
{
CInt flag;
int errcode = os::setsockopt(self.sock, os::SOL_SOCKET, option.value, &flag, CInt.sizeof);
Socklen_t socklen = CInt.sizeof;
int errcode = os::getsockopt(self.sock, os::SOL_SOCKET, option.value, &flag, &socklen);
if (errcode != 0) return SOCKOPT_FAILED?;
return (bool)flag;
}
Expand Down
1 change: 1 addition & 0 deletions releasenotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
- Fix incorrect panic message when slicing with negative size.
- Incorrect type checking when &[] and [] return optional values.
- Failed to find subscript overloading on optional values.
- `Socket.get_option` didn't properly call `getsockopt`, and `getsockopt` had an invalid signature.

### Stdlib changes
- Add `==` to `Pair`, `Triple` and TzDateTime. Add print to `Pair` and `Triple`.
Expand Down
Loading