module Fluent::PluginHelper::SocketOption
def socket_option_set(sock, resolve_name: nil, nonblock: false, linger_timeout: nil, recv_timeout: nil, send_timeout: nil, receive_buffer_size: nil, send_keepalive_packet: nil)
def socket_option_set(sock, resolve_name: nil, nonblock: false, linger_timeout: nil, recv_timeout: nil, send_timeout: nil, receive_buffer_size: nil, send_keepalive_packet: nil) unless resolve_name.nil? sock.do_not_reverse_lookup = !resolve_name end if nonblock sock.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK) end if linger_timeout optval = [1, linger_timeout.to_i].pack(FORMAT_STRUCT_LINGER) socket_option_set_one(sock, :SO_LINGER, optval) end if recv_timeout optval = [recv_timeout.to_i, 0].pack(FORMAT_STRUCT_TIMEVAL) socket_option_set_one(sock, :SO_RCVTIMEO, optval) end if send_timeout optval = [send_timeout.to_i, 0].pack(FORMAT_STRUCT_TIMEVAL) socket_option_set_one(sock, :SO_SNDTIMEO, optval) end if receive_buffer_size socket_option_set_one(sock, :SO_RCVBUF, receive_buffer_size.to_i) end if send_keepalive_packet socket_option_set_one(sock, :SO_KEEPALIVE, true) end sock end
def socket_option_set_one(sock, option, value)
def socket_option_set_one(sock, option, value) sock.setsockopt(::Socket::SOL_SOCKET, option, value) rescue => e log.warn "failed to set socket option", sock: sock.class, option: option, value: value, error: e end
def socket_option_validate!(protocol, resolve_name: nil, linger_timeout: nil, recv_timeout: nil, send_timeout: nil, receive_buffer_size: nil, send_keepalive_packet: nil)
def socket_option_validate!(protocol, resolve_name: nil, linger_timeout: nil, recv_timeout: nil, send_timeout: nil, receive_buffer_size: nil, send_keepalive_packet: nil) unless resolve_name.nil? if protocol != :tcp && protocol != :udp && protocol != :tls raise ArgumentError, "BUG: resolve_name in available for tcp/udp/tls" end end if linger_timeout if protocol != :tcp && protocol != :tls raise ArgumentError, "BUG: linger_timeout is available for tcp/tls" end end if send_keepalive_packet if protocol != :tcp raise ArgumentError, "BUG: send_keepalive_packet is available for tcp" end end end