]>
git.proxmox.com Git - mirror_frr.git/blob - tests/lib/test_zmq.c
3 * Copyright (C) 2017 David Lamparter, for NetDEF, Inc.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the Free
7 * Software Foundation; either version 2 of the License, or (at your option)
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along
16 * with this program; see the file COPYING; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 DEFINE_MTYPE_STATIC(LIB
, TESTBUF
, "zmq test buffer")
27 static struct thread_master
*master
;
29 static void msg_buf_free(void *data
, void *hint
)
31 XFREE(MTYPE_TESTBUF
, data
);
34 static void run_client(int syncfd
)
42 read(syncfd
, &dummy
, 1);
44 zmqctx
= zmq_ctx_new();
45 zmq_ctx_set(zmqctx
, ZMQ_IPV6
, 1);
47 zmqsock
= zmq_socket(zmqctx
, ZMQ_REQ
);
48 if (zmq_connect(zmqsock
, "tcp://127.0.0.1:17171")) {
49 perror("zmq_connect");
54 for (i
= 0; i
< 8; i
++) {
55 snprintf(buf
, sizeof(buf
), "msg #%d %c%c%c",
56 i
, 'a' + i
, 'b' + i
, 'c' + i
);
57 printf("client send: %s\n", buf
);
59 zmq_send(zmqsock
, buf
, strlen(buf
) + 1, 0);
60 zmq_recv(zmqsock
, buf
, sizeof(buf
), 0);
61 printf("client recv: %s\n", buf
);
65 for (i
= 2; i
< 5; i
++) {
69 for (j
= 1; j
<= i
; j
++) {
71 char *dyn
= XMALLOC(MTYPE_TESTBUF
, 32);
73 snprintf(dyn
, 32, "part %d/%d", j
, i
);
74 printf("client send: %s\n", dyn
);
77 zmq_msg_init_data(&part
, dyn
, strlen(dyn
) + 1,
79 zmq_msg_send(&part
, zmqsock
, j
< i
? ZMQ_SNDMORE
: 0);
86 zmq_msg_recv(&part
, zmqsock
, 0);
87 data
= zmq_msg_data(&part
);
88 more
= zmq_msg_more(&part
);
89 printf("client recv (more: %d): %s\n", more
, data
);
97 static struct frrzmq_cb
*cb
;
99 static void serverpartfn(void *arg
, void *zmqsock
, zmq_msg_t
*msg
,
102 int more
= zmq_msg_more(msg
);
103 char *in
= zmq_msg_data(msg
);
108 printf("server recv part %u (more: %d): %s\n", partnum
, more
, in
);
110 /* REQ-REP doesn't allow sending a reply here */
114 out
= XMALLOC(MTYPE_TESTBUF
, strlen(in
) + 1);
115 for (i
= 0; i
< strlen(in
); i
++)
116 out
[i
] = toupper(in
[i
]);
118 zmq_msg_init_data(&reply
, out
, strlen(out
) + 1, msg_buf_free
, NULL
);
119 zmq_msg_send(&reply
, zmqsock
, ZMQ_SNDMORE
);
121 out
= XMALLOC(MTYPE_TESTBUF
, 32);
122 snprintf(out
, 32, "msg# was %u", partnum
);
123 zmq_msg_init_data(&reply
, out
, strlen(out
) + 1, msg_buf_free
, NULL
);
124 zmq_msg_send(&reply
, zmqsock
, 0);
127 static void serverfn(void *arg
, void *zmqsock
)
133 zmq_recv(zmqsock
, buf
, sizeof(buf
), 0);
135 printf("server recv: %s\n", buf
);
137 for (i
= 0; i
< strlen(buf
); i
++)
138 buf
[i
] = toupper(buf
[i
]);
139 zmq_send(zmqsock
, buf
, strlen(buf
) + 1, 0);
144 /* change to multipart callback */
145 frrzmq_thread_cancel(cb
);
147 cb
= frrzmq_thread_add_read_part(master
, serverpartfn
, NULL
, zmqsock
);
150 static void sigchld(void)
152 printf("child exited.\n");
153 frrzmq_thread_cancel(cb
);
156 static struct quagga_signal_t sigs
[] = {
163 static void run_server(int syncfd
)
169 master
= thread_master_create(NULL
);
170 signal_init(master
, array_size(sigs
), sigs
);
173 zmqsock
= zmq_socket(frrzmq_context
, ZMQ_REP
);
174 if (zmq_bind(zmqsock
, "tcp://*:17171")) {
179 cb
= frrzmq_thread_add_read_msg(master
, serverfn
, NULL
, zmqsock
);
181 write(syncfd
, &dummy
, sizeof(dummy
));
182 while (thread_fetch(master
, &t
))
187 thread_master_free(master
);
188 log_memstats_stderr("test");
196 if (pipe(syncpipe
)) {
205 } else if (child
== 0) {
206 run_client(syncpipe
[0]);
210 run_server(syncpipe
[1]);