Module: Fluent::PluginHelper::SocketOption

Included in:
Server, Socket
Defined in:
lib/fluent/plugin_helper/socket_option.rb

Constant Summary collapse

FORMAT_STRUCT_LINGER =

{ int l_onoff; int l_linger; }

'I!I!'
FORMAT_STRUCT_TIMEVAL =

{ time_t tv_sec; suseconds_t tv_usec; }

'L!L!'

Instance Method Summary collapse

Instance Method Details

#socket_option_set(sock, resolve_name: nil, nonblock: false, linger_timeout: nil, recv_timeout: nil, send_timeout: nil) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/fluent/plugin_helper/socket_option.rb', line 40

def socket_option_set(sock, resolve_name: nil, nonblock: false, linger_timeout: nil, recv_timeout: nil, send_timeout: 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
  sock
end

#socket_option_set_one(sock, option, value) ⇒ Object



62
63
64
65
66
# File 'lib/fluent/plugin_helper/socket_option.rb', line 62

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

#socket_option_validate!(protocol, resolve_name: nil, linger_timeout: nil, recv_timeout: nil, send_timeout: nil) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/fluent/plugin_helper/socket_option.rb', line 27

def socket_option_validate!(protocol, resolve_name: nil, linger_timeout: nil, recv_timeout: nil, send_timeout: 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
end