CMSG(3) Library Functions Manual CMSG(3) CMSG_ALIGN CMSG_SPACE CMSG_NXTHDR CMSG_FIRSTHDR - (ancillary data) (libc -lc) #include struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *msgh); struct cmsghdr *CMSG_NXTHDR(struct msghdr *msgh, struct cmsghdr *cmsg); size_t CMSG_ALIGN(size_t length); size_t CMSG_SPACE(size_t length); size_t CMSG_LEN(size_t length); unsigned char *CMSG_DATA(struct cmsghdr *cmsg); ( ) . UNIX. IP. sendmsg(2) recvmsg(2). . cmsghdr . . /proc/sys/net/core/optmem_max socket(7). cmsghdr : struct cmsghdr { size_t cmsg_len; /* Data byte count, including header (type is socklen_t in POSIX) */ int cmsg_level; /* Originating protocol */ int cmsg_type; /* Protocol-specific type */ /* followed by unsigned char cmsg_data[]; */ }; cmsghdr . : CMSG_FIRSTHDR() cmsghdr msghdr . NULL cmsghdr . CMSG_NXTHDR() cmsghdr cmsghdr . NULL . cmsghdr ( sendmsg(2)) CMSG_NXTHDR(). CMSG_ALIGN() . . CMSG_SPACE() . . CMSG_DATA() cmsghdr. . memcpy(3) . CMSG_LEN() cmsg_len cmsghdr . . . msg_controllen msghdr . CMSG_FIRSTHDR() msghdr CMSG_NXTHDR() . cmsg_len ( CMSG_LEN()) cmsghdr CMSG_DATA(). msg_controllen msghdr CMSG_SPACE() . msghdr recvmsg(2). . CMSG_LEN() CMSG_DATA() CMSG_ALIGN() ( ) . . CMSG_FIRSTHDR() CMSG_NXTHDR() CMSG_DATA() POSIX.1-2008. CMSG_SPACE() CMSG_LEN() CMSG_ALIGN() . POSIX.1g 4.4BSD-Lite API IPv6 RFC 2292 SUSv2. CMSG_SPACE() CMSG_LEN() POSIX ( 8). IP_TTL : struct msghdr msgh; struct cmsghdr *cmsg; int received_ttl; /* Receive auxiliary data in msgh */ for (cmsg = CMSG_FIRSTHDR(&msgh); cmsg != NULL; cmsg = CMSG_NXTHDR(&msgh, cmsg)) { if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_TTL) { memcpy(&receive_ttl, CMSG_DATA(cmsg), sizeof(received_ttl)); break; } } if (cmsg == NULL) { /* Error: IP_TTL not enabled or small buffer or I/O error */ } UNIX SCM_RIGHTS: struct msghdr msg = { 0 }; struct cmsghdr *cmsg; int myfds[NUM_FD]; /* Contains the file descriptors to pass */ char iobuf[1]; struct iovec io = { .iov_base = iobuf, .iov_len = sizeof(iobuf) }; union { /* Ancillary data buffer, wrapped in a union in order to ensure it is suitably aligned */ char buf[CMSG_SPACE(sizeof(myfds))]; struct cmsghdr align; } u; msg.msg_iov = &io; msg.msg_iovlen = 1; msg.msg_control = u.buf; msg.msg_controllen = sizeof(u.buf); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(sizeof(myfds)); memcpy(CMSG_DATA(cmsg), myfds, sizeof(myfds)); UNIX seccomp_unotify(2). recvmsg(2), sendmsg(2) RFC 2292 3 . . : . 6.18 8 2026 CMSG(3)