Method: Netlink::Socket#recvmsg

Defined in:
lib/netlink/socket.rb

#recvmsg(maxmesglen = nil, flags = 0) ⇒ Array(String, Addrinfo, Integer, NlMsgHdr)

Receive a message

Parameters:

  • maxmesglen (Integer) (defaults to: nil)

    maximum number of bytes to receive as message

  • flags (Integer) (defaults to: 0)

    flags should be a bitwise OR of Socket::MSG_* constants

Returns:

  • (Array(String, Addrinfo, Integer, NlMsgHdr))

    [mesg, sender_addrinfo, rflags, controls] where:

    • mesg is the message as a String or a NlMsgError,

    • sender_addrinfo is a Addrinfo about sender,

    + controls is the ancillary data, here the header of message as a NlMsgHdr.

Raises:

  • (NlmsgError)


103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/netlink/socket.rb', line 103

def recvmsg(maxmesglen=nil, flags=0)
  maxmesglen ||= @default_buffer_size
  maxlen = maxmesglen + NlMsgHdr::SIZE
  mesg, sender_ai, = @socket.recvmsg(maxlen, flags)
  hdr = NlMsgHdr.from_string(mesg.slice!(0, NlMsgHdr::SIZE))
  if hdr.type == NLMSG_ERROR
    mesg = NlMsgError.from_string(mesg)
    raise Error, "Error #{mesg.error_code} for message with seq #{mesg.orig_header.seq} from pid #{mesg.orig_header.pid}" unless mesg.ack?
  end

  mesg = mesg[0, maxmesglen] if mesg.is_a?(String)
  [mesg, Addrinfo.new(sender_ai.to_sockaddr), hdr]
end