void send_fd( int fd, int fd_to_send )
{
struct iovec iov[1];
struct msghdr msg;
char buf[0];
int ret;
iov[0].iov_base = buf;
iov[0].iov_len = 1;
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
cmsghdr cm;
cm.cmsg_len = CONTROL_LEN;
cm.cmsg_level = SOL_SOCKET;
cm.cmsg_type = SCM_RIGHTS;
*(int *)CMSG_DATA( &cm ) = fd_to_send;
msg.msg_control = &cm;
msg.msg_controllen = CONTROL_LEN;
ret = sendmsg( fd, &msg, 0 );
if(ret < 0) {
printf("sendmsg error, errno is %d\n", errno);
printf("%s\n",strerror(errno));
printf ("ret = %d, filedescriptor = %d\n", ret, fd_to_send);
}
}
int recv_fd( int fd )
{
struct iovec iov[1];
struct msghdr msg;
char buf[0];
int ret;
iov[0].iov_base = buf;
iov[0].iov_len = 1;
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
cmsghdr cm;
msg.msg_control = &cm;
msg.msg_controllen = CONTROL_LEN;
ret = recvmsg( fd, &msg, 0 );
if( ret <= 0 ) {
printf("recvmsg error, errno is %d\n", errno);
printf("%s\n",strerror(errno));
printf ("ret = %d, filedescriptor = %d\n", ret, fd);
}
int fd_to_read = *(int *)CMSG_DATA( &cm );
return fd_to_read;
}