xref: /dflybsd-src/test/unix/unconn_dgram/unconn_dgram.c (revision 8e40b0f9eba778056e6cc85803be57f4910fc58a)
1*8e40b0f9SSepherosa Ziehau #include <sys/types.h>
2*8e40b0f9SSepherosa Ziehau #include <sys/socket.h>
3*8e40b0f9SSepherosa Ziehau #include <sys/un.h>
4*8e40b0f9SSepherosa Ziehau #include <sys/wait.h>
5*8e40b0f9SSepherosa Ziehau 
6*8e40b0f9SSepherosa Ziehau #include <err.h>
7*8e40b0f9SSepherosa Ziehau #include <stdio.h>
8*8e40b0f9SSepherosa Ziehau #include <stdlib.h>
9*8e40b0f9SSepherosa Ziehau #include <string.h>
10*8e40b0f9SSepherosa Ziehau #include <unistd.h>
11*8e40b0f9SSepherosa Ziehau 
12*8e40b0f9SSepherosa Ziehau #define UNCONN_DGRAM_PATH	"/tmp/unconn_dgram.sock"
13*8e40b0f9SSepherosa Ziehau 
14*8e40b0f9SSepherosa Ziehau static void
test_send_unconn_dgram(void)15*8e40b0f9SSepherosa Ziehau test_send_unconn_dgram(void)
16*8e40b0f9SSepherosa Ziehau {
17*8e40b0f9SSepherosa Ziehau 	struct sockaddr_un un;
18*8e40b0f9SSepherosa Ziehau 	int s, n;
19*8e40b0f9SSepherosa Ziehau 
20*8e40b0f9SSepherosa Ziehau 	s = socket(AF_LOCAL, SOCK_DGRAM, 0);
21*8e40b0f9SSepherosa Ziehau 	if (s < 0)
22*8e40b0f9SSepherosa Ziehau 		err(1, "send socket failed");
23*8e40b0f9SSepherosa Ziehau 
24*8e40b0f9SSepherosa Ziehau 	memset(&un, 0, sizeof(un));
25*8e40b0f9SSepherosa Ziehau 	un.sun_family = AF_LOCAL;
26*8e40b0f9SSepherosa Ziehau 	strlcpy(un.sun_path, UNCONN_DGRAM_PATH, sizeof(un.sun_path));
27*8e40b0f9SSepherosa Ziehau 
28*8e40b0f9SSepherosa Ziehau 	n = sendto(s, UNCONN_DGRAM_PATH, sizeof(UNCONN_DGRAM_PATH), 0,
29*8e40b0f9SSepherosa Ziehau 	    (const struct sockaddr *)&un, sizeof(un));
30*8e40b0f9SSepherosa Ziehau 	if (n < 0)
31*8e40b0f9SSepherosa Ziehau 		err(1, "sendto failed");
32*8e40b0f9SSepherosa Ziehau 	else if (n != sizeof(UNCONN_DGRAM_PATH))
33*8e40b0f9SSepherosa Ziehau 		err(1, "sendto size mismatch");
34*8e40b0f9SSepherosa Ziehau }
35*8e40b0f9SSepherosa Ziehau 
36*8e40b0f9SSepherosa Ziehau int
main(void)37*8e40b0f9SSepherosa Ziehau main(void)
38*8e40b0f9SSepherosa Ziehau {
39*8e40b0f9SSepherosa Ziehau 	struct sockaddr_un un;
40*8e40b0f9SSepherosa Ziehau 	char buf[64];
41*8e40b0f9SSepherosa Ziehau 	pid_t pid;
42*8e40b0f9SSepherosa Ziehau 	int s, n, status;
43*8e40b0f9SSepherosa Ziehau 
44*8e40b0f9SSepherosa Ziehau 	s = socket(AF_LOCAL, SOCK_DGRAM, 0);
45*8e40b0f9SSepherosa Ziehau 	if (s < 0)
46*8e40b0f9SSepherosa Ziehau 		err(1, "socket failed");
47*8e40b0f9SSepherosa Ziehau 
48*8e40b0f9SSepherosa Ziehau 	memset(&un, 0, sizeof(un));
49*8e40b0f9SSepherosa Ziehau 	un.sun_family = AF_LOCAL;
50*8e40b0f9SSepherosa Ziehau 	strlcpy(un.sun_path, UNCONN_DGRAM_PATH, sizeof(un.sun_path));
51*8e40b0f9SSepherosa Ziehau 	unlink(un.sun_path);
52*8e40b0f9SSepherosa Ziehau 
53*8e40b0f9SSepherosa Ziehau 	if (bind(s, (const struct sockaddr *)&un, sizeof(un)) < 0)
54*8e40b0f9SSepherosa Ziehau 		err(1, "bind failed");
55*8e40b0f9SSepherosa Ziehau 
56*8e40b0f9SSepherosa Ziehau 	pid = fork();
57*8e40b0f9SSepherosa Ziehau 	if (pid < 0) {
58*8e40b0f9SSepherosa Ziehau 		err(1, "fork failed");
59*8e40b0f9SSepherosa Ziehau 	} else if (pid == 0) {
60*8e40b0f9SSepherosa Ziehau 		close(s);
61*8e40b0f9SSepherosa Ziehau 		test_send_unconn_dgram();
62*8e40b0f9SSepherosa Ziehau 		exit(0);
63*8e40b0f9SSepherosa Ziehau 	}
64*8e40b0f9SSepherosa Ziehau 	waitpid(pid, &status, 0);
65*8e40b0f9SSepherosa Ziehau 	if (!WIFEXITED(status))
66*8e40b0f9SSepherosa Ziehau 		err(1, "child did not exit");
67*8e40b0f9SSepherosa Ziehau 	if (WEXITSTATUS(status) != 0)
68*8e40b0f9SSepherosa Ziehau 		err(WEXITSTATUS(status), "child failed");
69*8e40b0f9SSepherosa Ziehau 
70*8e40b0f9SSepherosa Ziehau 	n = read(s, buf, sizeof(buf));
71*8e40b0f9SSepherosa Ziehau 	if (n < 0) {
72*8e40b0f9SSepherosa Ziehau 		err(1, "read failed");
73*8e40b0f9SSepherosa Ziehau 	} else if (n != sizeof(UNCONN_DGRAM_PATH)) {
74*8e40b0f9SSepherosa Ziehau 		warnx("dgram size mismatch");
75*8e40b0f9SSepherosa Ziehau 		abort();
76*8e40b0f9SSepherosa Ziehau 	}
77*8e40b0f9SSepherosa Ziehau 	fprintf(stderr, "%s\n", buf);
78*8e40b0f9SSepherosa Ziehau 
79*8e40b0f9SSepherosa Ziehau 	exit(0);
80*8e40b0f9SSepherosa Ziehau }
81