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