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