Advanced Programming in the UNIX® Environment

(lily) #1
ptg10805159

Section 17.4 Passing File Descriptors 645


Twoelements deal with the passing or receiving of control information. The
msg_controlfield points to acmsghdr(control message header) structure, and the
msg_controllenfield contains the number of bytes of control information.
struct cmsghdr {
socklen_t cmsg_len; /* data byte count, including header */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
/* followed by the actual control message data */
};

To send a file descriptor, we setcmsg_lento the size of thecmsghdrstructure,
plus the size of an integer (the descriptor). The cmsg_level field is set to
SOL_SOCKET,andcmsg_typeis set toSCM_RIGHTS, to indicate that we arepassing
access rights. (SCMstands forsocket-level control message.) Access rights can be passed
only across a UNIX domain socket. The descriptor is stored right after thecmsg_type
field, using the macroCMSG_DATAto obtain the pointer to this integer.
Three macros areused to access the control data, and one macro is used to help
calculate the value to be used forcmsg_len.

#include <sys/socket.h>

unsigned char *CMSG_DATA(struct cmsghdr *cp);

Returns: pointer to data associated withcmsghdrstructure

struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *mp);

Returns: pointer to firstcmsghdrstructureassociated
with themsghdrstructure, orNULLif none exists

struct cmsghdr *CMSG_NXTHDR(struct msghdr *mp,
struct cmsghdr *cp);

Returns: pointer to nextcmsghdrstructureassociated with
themsghdrstructuregiven the currentcmsghdr
structure, orNULLif we’re at the last one

unsigned int CMSG_LEN(unsigned intnbytes);

Returns: size to allocate for data objectnbyteslarge

The Single UNIX Specification defines the first three macros, but omitsCMSG_LEN.

TheCMSG_LENmacroreturns the number of bytes needed to storeadata object of size
nbytes,after adding the size of thecmsghdrstructure, adjusting for any alignment
constraints required by the processor architecture, and rounding up.
The program in Figure17.13 is thesend_fdfunction, which passes a file descriptor
over a UNIX domain socket. In thesendmsgcall, we send both the protocol data (the
null and the status byte) and the descriptor.
Free download pdf