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