xref: /dflybsd-src/test/testcases/io/sendfd_1/sendfd_1.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino #include <sys/socket.h>
286d7f5d3SJohn Marino #include <sys/uio.h>
386d7f5d3SJohn Marino #include <unistd.h>
486d7f5d3SJohn Marino #include <errno.h>
586d7f5d3SJohn Marino 
main(argc,argv)686d7f5d3SJohn Marino main(argc, argv)
786d7f5d3SJohn Marino 	int argc;
886d7f5d3SJohn Marino 	char **argv;
986d7f5d3SJohn Marino {
1086d7f5d3SJohn Marino 	int i;
1186d7f5d3SJohn Marino 	int j[2];
1286d7f5d3SJohn Marino 
1386d7f5d3SJohn Marino 	socketpair(AF_UNIX, SOCK_STREAM, 0, j);
1486d7f5d3SJohn Marino 
1586d7f5d3SJohn Marino 	i = fork();
1686d7f5d3SJohn Marino 	if (i == 0) {
1786d7f5d3SJohn Marino 		close(0);
1886d7f5d3SJohn Marino 		close(1);
1986d7f5d3SJohn Marino 		close(2);
2086d7f5d3SJohn Marino 
2186d7f5d3SJohn Marino 		int mysecretfd = recvfd(j[0]);
2286d7f5d3SJohn Marino 		write(mysecretfd, "hello\n", 7);
2386d7f5d3SJohn Marino 	} else {
2486d7f5d3SJohn Marino 		sendfd(j[1], 1);
2586d7f5d3SJohn Marino 
2686d7f5d3SJohn Marino 		pause();
2786d7f5d3SJohn Marino 	}
2886d7f5d3SJohn Marino 
2986d7f5d3SJohn Marino }
3086d7f5d3SJohn Marino 
3186d7f5d3SJohn Marino int
sendfd(int s,int fd)3286d7f5d3SJohn Marino sendfd(int s, int fd)
3386d7f5d3SJohn Marino {
3486d7f5d3SJohn Marino 	char buf[1];
3586d7f5d3SJohn Marino 	struct iovec iov;
3686d7f5d3SJohn Marino 	struct msghdr msg;
3786d7f5d3SJohn Marino 	struct cmsghdr *cmsg;
3886d7f5d3SJohn Marino 	int n;
3986d7f5d3SJohn Marino 	char cms[CMSG_SPACE(sizeof(int))];
4086d7f5d3SJohn Marino 
4186d7f5d3SJohn Marino 	buf[0] = 0;
4286d7f5d3SJohn Marino 	iov.iov_base = buf;
4386d7f5d3SJohn Marino 	iov.iov_len = 1;
4486d7f5d3SJohn Marino 
4586d7f5d3SJohn Marino 	memset(&msg, 0, sizeof msg);
4686d7f5d3SJohn Marino 	msg.msg_iov = &iov;
4786d7f5d3SJohn Marino 	msg.msg_iovlen = 1;
4886d7f5d3SJohn Marino 	msg.msg_control = (caddr_t)cms;
4986d7f5d3SJohn Marino 	msg.msg_controllen = CMSG_LEN(sizeof(int));
5086d7f5d3SJohn Marino 
5186d7f5d3SJohn Marino 	cmsg = CMSG_FIRSTHDR(&msg);
5286d7f5d3SJohn Marino 	cmsg->cmsg_len = CMSG_LEN(sizeof(int));
5386d7f5d3SJohn Marino 	cmsg->cmsg_level = SOL_SOCKET;
5486d7f5d3SJohn Marino 	cmsg->cmsg_type = SCM_RIGHTS;
5586d7f5d3SJohn Marino 	memmove(CMSG_DATA(cmsg), &fd, sizeof(int));
5686d7f5d3SJohn Marino 
5786d7f5d3SJohn Marino 	if((n=sendmsg(s, &msg, 0)) != iov.iov_len)
5886d7f5d3SJohn Marino 		return -1;
5986d7f5d3SJohn Marino 	return 0;
6086d7f5d3SJohn Marino }
6186d7f5d3SJohn Marino 
6286d7f5d3SJohn Marino int
recvfd(int s)6386d7f5d3SJohn Marino recvfd(int s)
6486d7f5d3SJohn Marino {
6586d7f5d3SJohn Marino 	int n;
6686d7f5d3SJohn Marino 	int fd;
6786d7f5d3SJohn Marino 	char buf[1];
6886d7f5d3SJohn Marino 	struct iovec iov;
6986d7f5d3SJohn Marino 	struct msghdr msg;
7086d7f5d3SJohn Marino 	struct cmsghdr *cmsg;
7186d7f5d3SJohn Marino 	char cms[CMSG_SPACE(sizeof(int))];
7286d7f5d3SJohn Marino 
7386d7f5d3SJohn Marino 	iov.iov_base = buf;
7486d7f5d3SJohn Marino 	iov.iov_len = 1;
7586d7f5d3SJohn Marino 
7686d7f5d3SJohn Marino 	memset(&msg, 0, sizeof msg);
7786d7f5d3SJohn Marino 	msg.msg_name = 0;
7886d7f5d3SJohn Marino 	msg.msg_namelen = 0;
7986d7f5d3SJohn Marino 	msg.msg_iov = &iov;
8086d7f5d3SJohn Marino 	msg.msg_iovlen = 1;
8186d7f5d3SJohn Marino 
8286d7f5d3SJohn Marino 	msg.msg_control = (caddr_t)cms;
8386d7f5d3SJohn Marino 	msg.msg_controllen = sizeof cms;
8486d7f5d3SJohn Marino 
8586d7f5d3SJohn Marino 	if((n=recvmsg(s, &msg, 0)) < 0)
8686d7f5d3SJohn Marino 		return -1;
8786d7f5d3SJohn Marino 	if(n == 0){
8886d7f5d3SJohn Marino 		return -1;
8986d7f5d3SJohn Marino 	}
9086d7f5d3SJohn Marino 	cmsg = CMSG_FIRSTHDR(&msg);
9186d7f5d3SJohn Marino 	memmove(&fd, CMSG_DATA(cmsg), sizeof(int));
9286d7f5d3SJohn Marino 	return fd;
9386d7f5d3SJohn Marino }
94