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