Skip to content
Merged
1 change: 1 addition & 0 deletions _typos.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ RPC_S_CALL_FAILED_DNE = "RPC_S_CALL_FAILED_DNE"
SEH = "SEH"
setup_seh_handler = "setup_seh_handler"
usri4_parms = "usri4_parms"
msg_controllen = "msg_controllen"

[default]
extend-ignore-re = [
Expand Down
30 changes: 30 additions & 0 deletions src/crystal/event_loop/polling.cr
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,36 @@ abstract class Crystal::EventLoop::Polling < Crystal::EventLoop
end
end

# Extension to support Kernel TLS in OpenSSL::BIO.
def recvmsg(socket : ::Socket, message : Pointer(LibC::Msghdr), flags : Int32) : Int32 | Errno
loop do
ret = LibC.recvmsg(socket.fd, message, flags)
return ret.to_i unless ret == -1

if Errno.value == Errno::EAGAIN
wait_readable(socket, socket.@read_timeout) { return Errno::ETIMEDOUT }
return Errno::EBADF if socket.closed?
else
return Errno.value
end
end
end

# Extension to support Kernel TLS in OpenSSL::BIO.
def sendmsg(socket : ::Socket, message : Pointer(LibC::Msghdr), flags : Int32) : Int32 | Errno
loop do
ret = LibC.sendmsg(socket.fd, message, flags)
return ret.to_i unless ret == -1

if Errno.value == Errno::EAGAIN
wait_writable(socket, socket.@write_timeout) { return Errno::ETIMEDOUT }
return Errno::EBADF if socket.closed?
else
return Errno.value
end
end
end

def shutdown(socket : ::Socket) : Nil
# perform cleanup before LibC.close. Using a file descriptor after it has
# been closed is never defined and can always lead to undefined results
Expand Down
1 change: 1 addition & 0 deletions src/lib_c/aarch64-linux-android/c/linux/tls.cr
9 changes: 5 additions & 4 deletions src/lib_c/aarch64-linux-android/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
22 changes: 22 additions & 0 deletions src/lib_c/aarch64-linux-android/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 0o2000000
SOCK_NONBLOCK = 0o0004000
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt32
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,23 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : SizeT
msg_control : Void*
msg_controllen : SizeT
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SizeT
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT*) : Int
fun accept4(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT*, __flags : Int) : Int
fun bind(__fd : Int, __addr : Sockaddr*, __addr_length : SocklenT) : Int
Expand All @@ -58,7 +78,9 @@ lib LibC
fun listen(__fd : Int, __backlog : Int) : Int
fun recv(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int) : SSizeT
fun recvfrom(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int, __src_addr : Sockaddr*, __src_addr_length : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(__fd : Int, __buf : Void*, __n : SizeT, __flags : Int, __dst_addr : Sockaddr*, __dst_addr_length : SocklenT) : SSizeT
fun setsockopt(__fd : Int, __level : Int, __option : Int, __value : Void*, __value_length : SocklenT) : Int
fun shutdown(__fd : Int, __how : Int) : Int
Expand Down
6 changes: 6 additions & 0 deletions src/lib_c/aarch64-linux-android/c/sys/uio.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
lib LibC
struct Iovec
iov_base : Void*
iov_len : SizeT
end
end
1 change: 1 addition & 0 deletions src/lib_c/aarch64-linux-gnu/c/linux/tls.cr
9 changes: 5 additions & 4 deletions src/lib_c/aarch64-linux-gnu/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
22 changes: 22 additions & 0 deletions src/lib_c/aarch64-linux-gnu/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 524288
SOCK_NONBLOCK = 2048
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,23 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : SizeT
msg_control : Void*
msg_controllen : SizeT
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SizeT
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(fd : Int, addr : Sockaddr*, addr_len : SocklenT*) : Int
fun accept4(fd : Int, addr : Sockaddr*, addr_len : SocklenT*, flags : Int) : Int
fun bind(fd : Int, addr : Sockaddr*, len : SocklenT) : Int
Expand All @@ -58,7 +78,9 @@ lib LibC
fun listen(fd : Int, n : Int) : Int
fun recv(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun recvfrom(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT) : SSizeT
fun setsockopt(fd : Int, level : Int, optname : Int, optval : Void*, optlen : SocklenT) : Int
fun shutdown(fd : Int, how : Int) : Int
Expand Down
6 changes: 6 additions & 0 deletions src/lib_c/aarch64-linux-gnu/c/sys/uio.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
lib LibC
struct Iovec
iov_base : Void*
iov_len : SizeT
end
end
1 change: 1 addition & 0 deletions src/lib_c/aarch64-linux-musl/c/linux/tls.cr
9 changes: 5 additions & 4 deletions src/lib_c/aarch64-linux-musl/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
25 changes: 25 additions & 0 deletions src/lib_c/aarch64-linux-musl/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 0o2000000
SOCK_NONBLOCK = 0o0004000
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,26 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : Int
__pad1 : Int
msg_control : Void*
msg_controllen : SocklenT
__pad2 : Int
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SocklenT
__pad1 : Int
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(x0 : Int, x1 : Sockaddr*, x2 : SocklenT*) : Int
fun accept4(x0 : Int, x1 : Sockaddr*, x2 : SocklenT*, x3 : Int) : Int
fun bind(x0 : Int, x1 : Sockaddr*, x2 : SocklenT) : Int
Expand All @@ -58,7 +81,9 @@ lib LibC
fun listen(x0 : Int, x1 : Int) : Int
fun recv(x0 : Int, x1 : Void*, x2 : SizeT, x3 : Int) : SSizeT
fun recvfrom(x0 : Int, x1 : Void*, x2 : SizeT, x3 : Int, x4 : Sockaddr*, x5 : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(x0 : Int, x1 : Void*, x2 : SizeT, x3 : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(x0 : Int, x1 : Void*, x2 : SizeT, x3 : Int, x4 : Sockaddr*, x5 : SocklenT) : SSizeT
fun setsockopt(x0 : Int, x1 : Int, x2 : Int, x3 : Void*, x4 : SocklenT) : Int
fun shutdown(x0 : Int, x1 : Int) : Int
Expand Down
6 changes: 6 additions & 0 deletions src/lib_c/aarch64-linux-musl/c/sys/uio.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
lib LibC
struct Iovec
iov_base : Void*
iov_len : SizeT
end
end
1 change: 1 addition & 0 deletions src/lib_c/arm-linux-gnueabihf/c/linux/tls.cr
9 changes: 5 additions & 4 deletions src/lib_c/arm-linux-gnueabihf/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
22 changes: 22 additions & 0 deletions src/lib_c/arm-linux-gnueabihf/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 524288
SOCK_NONBLOCK = 2048
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,23 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : SizeT
msg_control : Void*
msg_controllen : SizeT
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SizeT
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(fd : Int, addr : Sockaddr*, addr_len : SocklenT*) : Int
fun accept4(fd : Int, addr : Sockaddr*, addr_len : SocklenT*, flags : Int) : Int
fun bind(fd : Int, addr : Sockaddr*, len : SocklenT) : Int
Expand All @@ -58,7 +78,9 @@ lib LibC
fun listen(fd : Int, n : Int) : Int
fun recv(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun recvfrom(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT) : SSizeT
fun setsockopt(fd : Int, level : Int, optname : Int, optval : Void*, optlen : SocklenT) : Int
fun shutdown(fd : Int, how : Int) : Int
Expand Down
6 changes: 6 additions & 0 deletions src/lib_c/arm-linux-gnueabihf/c/sys/uio.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
lib LibC
struct Iovec
iov_base : Void*
iov_len : SizeT
end
end
1 change: 1 addition & 0 deletions src/lib_c/i386-linux-gnu/c/linux/tls.cr
9 changes: 5 additions & 4 deletions src/lib_c/i386-linux-gnu/c/netinet/tcp.cr
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib LibC
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_NODELAY = 1
TCP_KEEPIDLE = 4
TCP_KEEPINTVL = 5
TCP_KEEPCNT = 6
TCP_ULP = 31
end
22 changes: 22 additions & 0 deletions src/lib_c/i386-linux-gnu/c/sys/socket.cr
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
require "./types"
require "./uio"

lib LibC
SOCK_DGRAM = 2
Expand Down Expand Up @@ -28,6 +29,8 @@ lib LibC
SHUT_WR = 1
SOCK_CLOEXEC = 524288
SOCK_NONBLOCK = 2048
SOL_TCP = 6
SOL_TLS = 282

alias SocklenT = UInt
alias SaFamilyT = UShort
Expand All @@ -48,6 +51,23 @@ lib LibC
l_linger : Int
end

struct Msghdr
msg_name : Void*
msg_namelen : SocklenT
msg_iov : Iovec*
msg_iovlen : SizeT
msg_control : Void*
msg_controllen : SizeT
msg_flags : Int
end

struct Cmsghdr
cmsg_len : SizeT
cmsg_level : Int
cmsg_type : Int
cmsg_data : Char[0]
end

fun accept(fd : Int, addr : Sockaddr*, addr_len : SocklenT*) : Int
fun accept4(fd : Int, addr : Sockaddr*, addr_len : SocklenT*, flags : Int) : Int
fun bind(fd : Int, addr : Sockaddr*, len : SocklenT) : Int
Expand All @@ -58,7 +78,9 @@ lib LibC
fun listen(fd : Int, n : Int) : Int
fun recv(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun recvfrom(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT*) : SSizeT
fun recvmsg(Int, Msghdr*, Int) : Int
fun send(fd : Int, buf : Void*, n : SizeT, flags : Int) : SSizeT
fun sendmsg(Int, Msghdr*, Int) : Int
fun sendto(fd : Int, buf : Void*, n : SizeT, flags : Int, addr : Sockaddr*, addr_len : SocklenT) : SSizeT
fun setsockopt(fd : Int, level : Int, optname : Int, optval : Void*, optlen : SocklenT) : Int
fun shutdown(fd : Int, how : Int) : Int
Expand Down
Loading
Loading