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