xref: /openbmc/libmctp/utils/mctp-pipe.c (revision 435670d619ff69dde7b135de37d0b2b9abb27e5c)
13d36ee2eSJeremy Kerr /* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
2bd4e3628SJeremy Kerr 
35ab78259SAndrew Jeffery #include "compiler.h"
45ab78259SAndrew Jeffery #include "libmctp.h"
55ab78259SAndrew Jeffery #include "libmctp-serial.h"
65ab78259SAndrew Jeffery 
7bd4e3628SJeremy Kerr #include <assert.h>
8bd4e3628SJeremy Kerr #include <err.h>
9bd4e3628SJeremy Kerr #include <stdio.h>
10bd4e3628SJeremy Kerr #include <stdlib.h>
11bd4e3628SJeremy Kerr #include <unistd.h>
12bd4e3628SJeremy Kerr #include <sys/poll.h>
13bd4e3628SJeremy Kerr #include <sys/socket.h>
14bd4e3628SJeremy Kerr 
rx_message(uint8_t eid __unused,bool tag_owner __unused,uint8_t msg_tag __unused,void * data __unused,void * msg,size_t len)15*435670d6SAndrew Jeffery static void rx_message(uint8_t eid __unused, bool tag_owner __unused,
16*435670d6SAndrew Jeffery 		       uint8_t msg_tag __unused, void *data __unused, void *msg,
17*435670d6SAndrew Jeffery 		       size_t len)
18bd4e3628SJeremy Kerr {
19f967c709SAndrew Jeffery 	ssize_t rc;
20f967c709SAndrew Jeffery 
21f967c709SAndrew Jeffery 	rc = write(STDOUT_FILENO, msg, len);
22f967c709SAndrew Jeffery 	if (rc < 0)
23f967c709SAndrew Jeffery 		warn("Write failed");
24f967c709SAndrew Jeffery 	else if ((size_t)rc < len)
25f967c709SAndrew Jeffery 		warnx("Short write of length %zd, requested %zd", rc, len);
26bd4e3628SJeremy Kerr }
27bd4e3628SJeremy Kerr 
main(void)28bd4e3628SJeremy Kerr int main(void)
29bd4e3628SJeremy Kerr {
30bd4e3628SJeremy Kerr 	struct mctp_binding_serial *serial[2];
31bd4e3628SJeremy Kerr 	mctp_eid_t eids[] = { 8, 9 };
32bd4e3628SJeremy Kerr 	struct pollfd pollfds[3];
33bd4e3628SJeremy Kerr 	int rc, n, mctp_fds[2];
34bd4e3628SJeremy Kerr 	struct mctp *mctp[2];
35bd4e3628SJeremy Kerr 
36bd4e3628SJeremy Kerr 	mctp[0] = mctp_init();
37bd4e3628SJeremy Kerr 	mctp[1] = mctp_init();
38bd4e3628SJeremy Kerr 
39bd4e3628SJeremy Kerr 	assert(mctp[0] && mctp[1]);
40bd4e3628SJeremy Kerr 
41bd4e3628SJeremy Kerr 	serial[0] = mctp_serial_init();
42bd4e3628SJeremy Kerr 	serial[1] = mctp_serial_init();
43bd4e3628SJeremy Kerr 
44bd4e3628SJeremy Kerr 	assert(serial[0] && serial[1]);
45bd4e3628SJeremy Kerr 
46bd4e3628SJeremy Kerr 	rc = socketpair(AF_UNIX, SOCK_STREAM, 0, mctp_fds);
47bd4e3628SJeremy Kerr 	if (rc)
48bd4e3628SJeremy Kerr 		err(EXIT_FAILURE, "Can't create sockets");
49bd4e3628SJeremy Kerr 
50bd4e3628SJeremy Kerr 	mctp_serial_open_fd(serial[0], mctp_fds[0]);
51bd4e3628SJeremy Kerr 	mctp_serial_open_fd(serial[1], mctp_fds[1]);
52bd4e3628SJeremy Kerr 
53*435670d6SAndrew Jeffery 	mctp_register_bus(mctp[0], mctp_binding_serial_core(serial[0]),
54*435670d6SAndrew Jeffery 			  eids[0]);
55*435670d6SAndrew Jeffery 	mctp_register_bus(mctp[1], mctp_binding_serial_core(serial[1]),
56*435670d6SAndrew Jeffery 			  eids[1]);
57bd4e3628SJeremy Kerr 
58bd4e3628SJeremy Kerr 	mctp_set_rx_all(mctp[1], rx_message, NULL);
59bd4e3628SJeremy Kerr 
60bd4e3628SJeremy Kerr 	pollfds[0].fd = mctp_fds[0];
61bd4e3628SJeremy Kerr 	pollfds[0].events = POLLIN;
62bd4e3628SJeremy Kerr 	pollfds[1].fd = mctp_fds[1];
63bd4e3628SJeremy Kerr 	pollfds[1].events = POLLIN;
64bd4e3628SJeremy Kerr 	pollfds[2].fd = STDIN_FILENO;
65bd4e3628SJeremy Kerr 	pollfds[2].events = POLLIN;
66bd4e3628SJeremy Kerr 	n = 3;
67bd4e3628SJeremy Kerr 
68bd4e3628SJeremy Kerr 	for (;;) {
69bd4e3628SJeremy Kerr 		uint8_t buf[1024];
70bd4e3628SJeremy Kerr 
71bd4e3628SJeremy Kerr 		rc = poll(pollfds, n, -1);
72bd4e3628SJeremy Kerr 		if (rc < 0)
73bd4e3628SJeremy Kerr 			return EXIT_FAILURE;
74bd4e3628SJeremy Kerr 
75bd4e3628SJeremy Kerr 		if (pollfds[0].revents) {
76bd4e3628SJeremy Kerr 			rc = mctp_serial_read(serial[0]);
77bd4e3628SJeremy Kerr 			if (rc)
78bd4e3628SJeremy Kerr 				pollfds[0].fd = -1;
79bd4e3628SJeremy Kerr 		}
80bd4e3628SJeremy Kerr 
81bd4e3628SJeremy Kerr 		if (pollfds[1].revents) {
82bd4e3628SJeremy Kerr 			rc = mctp_serial_read(serial[1]);
83bd4e3628SJeremy Kerr 			if (rc)
84bd4e3628SJeremy Kerr 				pollfds[1].fd = -1;
85bd4e3628SJeremy Kerr 		}
86bd4e3628SJeremy Kerr 
87bd4e3628SJeremy Kerr 		if (n > 2 && pollfds[2].revents) {
88bd4e3628SJeremy Kerr 			rc = read(STDIN_FILENO, buf, sizeof(buf));
89bd4e3628SJeremy Kerr 			if (rc == 0) {
90bd4e3628SJeremy Kerr 				n = 2;
91bd4e3628SJeremy Kerr 				close(mctp_fds[0]);
92bd4e3628SJeremy Kerr 				pollfds[0].fd = -1;
93bd4e3628SJeremy Kerr 			} else if (rc < 0) {
94bd4e3628SJeremy Kerr 				err(EXIT_FAILURE, "read");
95bd4e3628SJeremy Kerr 			} else {
96f39c3857SSumanth Bhat 				mctp_message_tx(mctp[0], eids[1],
97f39c3857SSumanth Bhat 						MCTP_MESSAGE_TO_SRC, 0, buf,
98f39c3857SSumanth Bhat 						rc);
99bd4e3628SJeremy Kerr 			}
100bd4e3628SJeremy Kerr 		}
101bd4e3628SJeremy Kerr 
102bd4e3628SJeremy Kerr 		if (n == 2 && pollfds[0].fd < 0 && pollfds[1].fd < 0)
103bd4e3628SJeremy Kerr 			break;
104bd4e3628SJeremy Kerr 	}
105bd4e3628SJeremy Kerr 
106bd4e3628SJeremy Kerr 	return EXIT_SUCCESS;
107bd4e3628SJeremy Kerr }
108