Module: FreeBSD

Extended by:
FreeBSD
Included in:
FreeBSD
Defined in:
lib/watchcat.rb

Overview

:nodoc:

Constant Summary collapse

INT_SIZE =
[0].pack("i_").size
INT32_SIZE =
4
SHORT_SIZE =
[0].pack("s_").size
CMGROUP_MAX =
16
ALIGNBYTES =
[0].pack("L_").size - 1

Instance Method Summary collapse

Instance Method Details

#sendmsg(fd, buf) ⇒ Object



212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/watchcat.rb', line 212

def sendmsg(fd, buf)
  iov = [buf, buf.length].pack("pL_")

  cmsg_space    = cmsg_space(CMSGCRED_SIZE)
  cmsg_data_len = cmsg_space - INT32_SIZE - 2*INT_SIZE

  cmsghdr = ([
    cmsg_len(CMSGCRED_SIZE), # cmsg_len
    SOL_SOCKET,              # cmsg_level
    SCM_CREDS                # cmsg_type
  ] + [0] * cmsg_data_len).pack("I_i_i_C#{cmsg_data_len}")

  msg_control_ptr = pointer(cmsghdr)
  msg_controllen = cmsg_space

  msghdr = [
    0,                # msg_name
    0,                # msg_namelen
    pointer(iov),     # msg_iov
    1,                # msg_iovlen
    pointer(cmsghdr), # msg_control
    cmsg_space,       # msg_controllen
    0                 # msg_flags
  ].pack("L_L_L_L_L_L_L_")

  syscall(SYS_SENDMSG, fd.fileno, pointer(msghdr), 0)
end