#include #include #include #include static int send_fd(int unix_fd, int fd) { struct msghdr msgh; struct cmsghdr *cmsg; char buf[CMSG_SPACE (sizeof (fd))]; memset(&msgh, 0, sizeof(msgh)); memset(buf, 0, sizeof(buf)); msgh.msg_control = buf; msgh.msg_controllen = sizeof (buf); cmsg = CMSG_FIRSTHDR(&msgh); cmsg->cmsg_len = CMSG_LEN(sizeof (fd)); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; msgh.msg_controllen = cmsg->cmsg_len; memcpy(CMSG_DATA(cmsg), &fd, sizeof (fd)); return (sendmsg(unix_fd, &msgh, 0)); } int main(void) { int fd[2], ff[2]; int target; if (socketpair(PF_UNIX, SOCK_SEQPACKET, 0, fd) == -1) return (1); for (;;) { if (socketpair(PF_UNIX, SOCK_SEQPACKET, 0, ff) == -1) return (2); send_fd(ff[0], fd[0]); send_fd(ff[0], fd[1]); close(fd[1]); close(fd[0]); fd[0] = ff[0]; fd[1] = ff[1]; } return (0); }