3 #include "poll_funcs/poll_funcs_tevent.h"
12 static void recv_cb(struct unix_msg_ctx
*ctx
,
13 uint8_t *msg
, size_t msg_len
,
16 static void expect_messages(struct tevent_context
*ev
, struct cb_state
*state
,
19 state
->num_received
= 0;
21 while (state
->num_received
< num_msgs
) {
24 ret
= tevent_loop_once(ev
);
26 fprintf(stderr
, "tevent_loop_once failed: %s\n",
35 struct poll_funcs
*funcs
;
37 struct sockaddr_un addr1
, addr2
;
38 struct unix_msg_ctx
*ctx1
, *ctx2
;
39 struct tevent_context
*ev
;
43 static uint8_t buf
[1755];
45 struct cb_state state
;
47 addr1
= (struct sockaddr_un
) { .sun_family
= AF_UNIX
};
48 strlcpy(addr1
.sun_path
, "sock1", sizeof(addr1
.sun_path
));
49 unlink(addr1
.sun_path
);
51 addr2
= (struct sockaddr_un
) { .sun_family
= AF_UNIX
};
52 strlcpy(addr2
.sun_path
, "sock2", sizeof(addr2
.sun_path
));
53 unlink(addr2
.sun_path
);
55 ev
= tevent_context_init(NULL
);
57 perror("tevent_context_init failed");
61 funcs
= poll_funcs_init_tevent(ev
);
63 fprintf(stderr
, "poll_funcs_init_tevent failed\n");
66 tevent_handle
= poll_funcs_tevent_register(ev
, funcs
, ev
);
67 if (tevent_handle
== NULL
) {
68 fprintf(stderr
, "poll_funcs_register_tevent failed\n");
72 ret
= unix_msg_init(&addr1
, funcs
, 256, 1,
73 recv_cb
, &state
, &ctx1
);
75 fprintf(stderr
, "unix_msg_init failed: %s\n",
80 ret
= unix_msg_init(&addr1
, funcs
, 256, 1,
81 recv_cb
, &state
, &ctx1
);
83 fprintf(stderr
, "unix_msg_init succeeded unexpectedly\n");
86 if (ret
!= EADDRINUSE
) {
87 fprintf(stderr
, "unix_msg_init returned %s, expected "
88 "EADDRINUSE\n", strerror(ret
));
92 ret
= unix_msg_init(&addr2
, funcs
, 256, 1,
93 recv_cb
, &state
, &ctx2
);
95 fprintf(stderr
, "unix_msg_init failed: %s\n",
100 printf("sending a 0-length message\n");
105 ret
= unix_msg_send(ctx1
, &addr2
, NULL
, 0);
107 fprintf(stderr
, "unix_msg_send failed: %s\n",
112 expect_messages(ev
, &state
, 1);
114 printf("sending a small message\n");
118 iov
.iov_len
= sizeof(msg
);
120 state
.buflen
= sizeof(msg
);
122 ret
= unix_msg_send(ctx1
, &addr2
, &iov
, 1);
124 fprintf(stderr
, "unix_msg_send failed: %s\n",
129 expect_messages(ev
, &state
, 1);
131 printf("sending six large, interleaved messages\n");
133 for (i
=0; i
<sizeof(buf
); i
++) {
138 iov
.iov_len
= sizeof(buf
);
140 state
.buflen
= sizeof(buf
);
142 for (i
=0; i
<3; i
++) {
143 ret
= unix_msg_send(ctx1
, &addr2
, &iov
, 1);
145 fprintf(stderr
, "unix_msg_send failed: %s\n",
149 ret
= unix_msg_send(ctx2
, &addr2
, &iov
, 1);
151 fprintf(stderr
, "unix_msg_send failed: %s\n",
157 expect_messages(ev
, &state
, 6);
159 printf("sending a few messages in small pieces\n");
161 for (i
= 0; i
<5; i
++) {
162 struct iovec iovs
[20];
163 const size_t num_iovs
= ARRAY_SIZE(iovs
);
167 for (j
=0; j
<num_iovs
-1; j
++) {
168 size_t chunk
= (random() % ((sizeof(buf
) * 2) / num_iovs
));
169 size_t space
= (sizeof(buf
) - (p
- buf
));
175 chunk
= MIN(chunk
, space
);
177 iovs
[j
].iov_base
= p
;
178 iovs
[j
].iov_len
= chunk
;
182 if (p
< (buf
+ sizeof(buf
))) {
183 iovs
[j
].iov_base
= p
;
184 iovs
[j
].iov_len
= (sizeof(buf
) - (p
- buf
));
188 ret
= unix_msg_send(ctx1
, &addr1
, iovs
, j
);
190 fprintf(stderr
, "unix_msg_send failed: %s\n",
196 expect_messages(ev
, &state
, 5);
198 printf("Filling send queues before freeing\n");
200 for (i
=0; i
<5; i
++) {
201 ret
= unix_msg_send(ctx1
, &addr2
, &iov
, 1);
203 fprintf(stderr
, "unix_msg_send failed: %s\n",
207 ret
= unix_msg_send(ctx1
, &addr1
, &iov
, 1);
209 fprintf(stderr
, "unix_msg_send failed: %s\n",
215 expect_messages(ev
, &state
, 1); /* Read just one msg */
219 talloc_free(tevent_handle
);
226 static void recv_cb(struct unix_msg_ctx
*ctx
,
227 uint8_t *msg
, size_t msg_len
,
230 struct cb_state
*state
= (struct cb_state
*)private_data
;
232 if (msg_len
!= state
->buflen
) {
233 fprintf(stderr
, "expected %u bytes, got %u\n",
234 (unsigned)state
->buflen
, (unsigned)msg_len
);
237 if ((msg_len
!= 0) && (memcmp(msg
, state
->buf
, msg_len
) != 0)) {
238 fprintf(stderr
, "message content differs\n");
241 state
->num_received
+= 1;