xref: /titanic_54/usr/src/test/os-tests/tests/sockfs/sockpair.c (revision e359ab8683e0e1152d9f40bc35e1096870d76f60)
1cbc6e898SGordon Ross /*
2cbc6e898SGordon Ross  * Copyright 2016 Jeremy Allison
3cbc6e898SGordon Ross  *
4cbc6e898SGordon Ross  * Permission is hereby granted, free of charge, to any person obtaining a
5cbc6e898SGordon Ross  * copy of this software and associated documentation files (the "Software"),
6cbc6e898SGordon Ross  * to deal in the Software without restriction, including without limitation
7cbc6e898SGordon Ross  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8cbc6e898SGordon Ross  * and/or sell copies of the Software, and to permit persons to whom the
9cbc6e898SGordon Ross  * Software is furnished to do so, subject to the following conditions:
10cbc6e898SGordon Ross  *
11cbc6e898SGordon Ross  * The above copyright notice and this permission notice shall be included
12cbc6e898SGordon Ross  * in all copies or substantial portions of the Software.
13cbc6e898SGordon Ross  *
14cbc6e898SGordon Ross  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15cbc6e898SGordon Ross  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16cbc6e898SGordon Ross  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17cbc6e898SGordon Ross  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18cbc6e898SGordon Ross  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19cbc6e898SGordon Ross  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20cbc6e898SGordon Ross  * DEALINGS IN THE SOFTWARE.
21cbc6e898SGordon Ross  */
22cbc6e898SGordon Ross 
23cbc6e898SGordon Ross #include <sys/param.h>
24cbc6e898SGordon Ross #include <sys/types.h>
25cbc6e898SGordon Ross #include <sys/stat.h>
26cbc6e898SGordon Ross #include <sys/socket.h>
27cbc6e898SGordon Ross #include <sys/un.h>
28cbc6e898SGordon Ross #include <stdio.h>
29cbc6e898SGordon Ross #include <unistd.h>
30cbc6e898SGordon Ross #include <string.h>
31cbc6e898SGordon Ross #include <errno.h>
32cbc6e898SGordon Ross #include <stdint.h>
33cbc6e898SGordon Ross #include <stdlib.h>
34cbc6e898SGordon Ross #include <pthread.h>
35cbc6e898SGordon Ross 
36*e359ab86SGordon Ross extern char *__progname;
37*e359ab86SGordon Ross 
38cbc6e898SGordon Ross static void *
server(void * varg)39cbc6e898SGordon Ross server(void *varg)
40cbc6e898SGordon Ross {
41cbc6e898SGordon Ross 	int *sfds = (int *)varg;
42cbc6e898SGordon Ross 	int ret;
43cbc6e898SGordon Ross 	int sock = sfds[0];
44cbc6e898SGordon Ross 	unsigned int i;
45cbc6e898SGordon Ross 
46cbc6e898SGordon Ross 	for (i = 0; i < 5; i++) {
47cbc6e898SGordon Ross 		struct iovec iov;
48cbc6e898SGordon Ross 		struct msghdr msg;
49cbc6e898SGordon Ross 		uint8_t buf[4096];
50cbc6e898SGordon Ross 
51cbc6e898SGordon Ross 		iov = (struct iovec) {
52cbc6e898SGordon Ross 			.iov_base = buf,
53cbc6e898SGordon Ross 			.iov_len = sizeof (buf)
54cbc6e898SGordon Ross 		};
55cbc6e898SGordon Ross 
56cbc6e898SGordon Ross 		msg = (struct msghdr) {
57cbc6e898SGordon Ross 			.msg_iov = &iov,
58cbc6e898SGordon Ross 			.msg_iovlen = 1,
59cbc6e898SGordon Ross 		};
60cbc6e898SGordon Ross 
61cbc6e898SGordon Ross 		ret = recvmsg(sock, &msg, 0);
62cbc6e898SGordon Ross 		if (ret == -1) {
63cbc6e898SGordon Ross 			fprintf(stderr, "server - recvmsg fail %s\n",
64cbc6e898SGordon Ross 			    strerror(errno));
65cbc6e898SGordon Ross 			exit(1);
66cbc6e898SGordon Ross 		}
67*e359ab86SGordon Ross 		if (ret == 0) {
68*e359ab86SGordon Ross 			printf("SERVER: got HUP\n");
69*e359ab86SGordon Ross 			break;
70*e359ab86SGordon Ross 		}
71cbc6e898SGordon Ross 
72cbc6e898SGordon Ross 		printf("SERVER:%s\n", (char *)msg.msg_iov->iov_base);
73cbc6e898SGordon Ross 		fflush(stdout);
74cbc6e898SGordon Ross 	}
75cbc6e898SGordon Ross 
76*e359ab86SGordon Ross 	close(sock);
77*e359ab86SGordon Ross 	return (NULL);
78cbc6e898SGordon Ross }
79cbc6e898SGordon Ross 
80*e359ab86SGordon Ross void
runtest(int sotype)81*e359ab86SGordon Ross runtest(int sotype)
82cbc6e898SGordon Ross {
83cbc6e898SGordon Ross 	int sfds[2];
84cbc6e898SGordon Ross 	int sock;
85*e359ab86SGordon Ross 	int ret;
86cbc6e898SGordon Ross 	unsigned int i;
87cbc6e898SGordon Ross 
88cbc6e898SGordon Ross 	/* Create socketpair */
89*e359ab86SGordon Ross 	ret = socketpair(AF_UNIX, sotype, 0, sfds);
90cbc6e898SGordon Ross 	if (ret == -1) {
91cbc6e898SGordon Ross 		fprintf(stderr, "%s - socketpair fail %s\n",
92*e359ab86SGordon Ross 		    __progname, strerror(errno));
93cbc6e898SGordon Ross 		exit(1);
94cbc6e898SGordon Ross 	}
95cbc6e898SGordon Ross 
96*e359ab86SGordon Ross 	/* Set up the server.  It closes sfds[0] when done. */
97cbc6e898SGordon Ross 	ret = pthread_create(NULL, NULL, server, sfds);
98cbc6e898SGordon Ross 	if (ret == -1) {
99cbc6e898SGordon Ross 		fprintf(stderr, "%s - thread create fail %s\n",
100*e359ab86SGordon Ross 		    __progname, strerror(errno));
101cbc6e898SGordon Ross 		exit(1);
102cbc6e898SGordon Ross 	}
103cbc6e898SGordon Ross 
104cbc6e898SGordon Ross 	sleep(1);
105cbc6e898SGordon Ross 
106cbc6e898SGordon Ross 	/* "Server" is sfds[0], "client" is sfds[1] */
107cbc6e898SGordon Ross 	sock = sfds[1];
108cbc6e898SGordon Ross 
109cbc6e898SGordon Ross 	/* Send some messages */
110*e359ab86SGordon Ross 	for (i = 0; i < 3; i++) {
111cbc6e898SGordon Ross 		struct iovec iov;
112cbc6e898SGordon Ross 		struct msghdr msg;
113cbc6e898SGordon Ross 		uint8_t buf[4096];
114cbc6e898SGordon Ross 
115cbc6e898SGordon Ross 		memcpy(buf, "TEST0", sizeof ("TEST0"));
116cbc6e898SGordon Ross 		buf[4] = '0' + i;
117cbc6e898SGordon Ross 
118cbc6e898SGordon Ross 		printf("CLIENT:%s\n", buf);
119cbc6e898SGordon Ross 
120cbc6e898SGordon Ross 		iov = (struct iovec) {
121cbc6e898SGordon Ross 			.iov_base = buf,
122cbc6e898SGordon Ross 			.iov_len = sizeof (buf),
123cbc6e898SGordon Ross 		};
124cbc6e898SGordon Ross 
125cbc6e898SGordon Ross 		msg = (struct msghdr) {
126cbc6e898SGordon Ross 			.msg_iov = &iov,
127cbc6e898SGordon Ross 			.msg_iovlen = 1,
128cbc6e898SGordon Ross 		};
129cbc6e898SGordon Ross 
130cbc6e898SGordon Ross 		ret = sendmsg(sock, &msg, 0);
131cbc6e898SGordon Ross 
132cbc6e898SGordon Ross 		if (ret == -1) {
133cbc6e898SGordon Ross 			fprintf(stderr, "%s - sendmsg fail %s\n",
134*e359ab86SGordon Ross 			    __progname, strerror(errno));
135cbc6e898SGordon Ross 			exit(1);
136cbc6e898SGordon Ross 		}
137cbc6e898SGordon Ross 
138cbc6e898SGordon Ross 		fflush(stdout);
139cbc6e898SGordon Ross 		sleep(1);
140cbc6e898SGordon Ross 	}
141cbc6e898SGordon Ross 
142*e359ab86SGordon Ross 	/*
143*e359ab86SGordon Ross 	 * Tell sever to terminate
144*e359ab86SGordon Ross 	 */
145*e359ab86SGordon Ross 	if (sotype == SOCK_STREAM) {
146*e359ab86SGordon Ross 		printf("CLIENT: close\n");
147cbc6e898SGordon Ross 		close(sock);
148*e359ab86SGordon Ross 	} else {
149*e359ab86SGordon Ross 		printf("CLIENT: send 0\n");
150*e359ab86SGordon Ross 		send(sock, "", 0, 0);
151*e359ab86SGordon Ross 	}
152*e359ab86SGordon Ross 	sleep(1);
153*e359ab86SGordon Ross }
154*e359ab86SGordon Ross 
155*e359ab86SGordon Ross int
main(int argc,char ** argv)156*e359ab86SGordon Ross main(int argc, char **argv)
157*e359ab86SGordon Ross {
158*e359ab86SGordon Ross 
159*e359ab86SGordon Ross 	printf("%s SOCK_STREAM test...\n", argv[0]);
160*e359ab86SGordon Ross 	runtest(SOCK_STREAM);
161*e359ab86SGordon Ross 
162*e359ab86SGordon Ross 	printf("%s SOCK_DGRAM test...\n", argv[0]);
163*e359ab86SGordon Ross 	runtest(SOCK_DGRAM);
164*e359ab86SGordon Ross 
165cbc6e898SGordon Ross 	return (0);
166cbc6e898SGordon Ross }
167