/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */

#include "compiler.h"
#include "libmctp.h"
#include "libmctp-serial.h"

#include <assert.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/poll.h>
#include <sys/socket.h>

static void
rx_message(uint8_t eid __unused, bool tag_owner __unused,
	   uint8_t msg_tag __unused, void *data __unused, void *msg, size_t len)
{
	ssize_t rc;

	rc = write(STDOUT_FILENO, msg, len);
	if (rc < 0)
		warn("Write failed");
	else if ((size_t)rc < len)
		warnx("Short write of length %zd, requested %zd", rc, len);
}

int main(void)
{
	struct mctp_binding_serial *serial[2];
	mctp_eid_t eids[] = {8, 9};
	struct pollfd pollfds[3];
	int rc, n, mctp_fds[2];
	struct mctp *mctp[2];

	mctp[0] = mctp_init();
	mctp[1] = mctp_init();

	assert(mctp[0] && mctp[1]);

	serial[0] = mctp_serial_init();
	serial[1] = mctp_serial_init();

	assert(serial[0] && serial[1]);

	rc = socketpair(AF_UNIX, SOCK_STREAM, 0, mctp_fds);
	if (rc)
		err(EXIT_FAILURE, "Can't create sockets");

	mctp_serial_open_fd(serial[0], mctp_fds[0]);
	mctp_serial_open_fd(serial[1], mctp_fds[1]);

	mctp_register_bus(mctp[0], mctp_binding_serial_core(serial[0]), eids[0]);
	mctp_register_bus(mctp[1], mctp_binding_serial_core(serial[1]), eids[1]);

	mctp_set_rx_all(mctp[1], rx_message, NULL);

	pollfds[0].fd = mctp_fds[0];
	pollfds[0].events = POLLIN;
	pollfds[1].fd = mctp_fds[1];
	pollfds[1].events = POLLIN;
	pollfds[2].fd = STDIN_FILENO;
	pollfds[2].events = POLLIN;
	n = 3;

	for (;;) {
		uint8_t buf[1024];

		rc = poll(pollfds, n, -1);
		if (rc < 0)
			return EXIT_FAILURE;

		if (pollfds[0].revents) {
			rc = mctp_serial_read(serial[0]);
			if (rc)
				pollfds[0].fd = -1;
		}

		if (pollfds[1].revents) {
			rc = mctp_serial_read(serial[1]);
			if (rc)
				pollfds[1].fd = -1;
		}

		if (n > 2 && pollfds[2].revents) {
			rc = read(STDIN_FILENO, buf, sizeof(buf));
			if (rc == 0) {
				n = 2;
				close(mctp_fds[0]);
				pollfds[0].fd = -1;
			} else if (rc < 0) {
				err(EXIT_FAILURE, "read");
			} else {
				mctp_message_tx(mctp[0], eids[1],
						MCTP_MESSAGE_TO_SRC, 0, buf,
						rc);
			}
		}

		if (n == 2 && pollfds[0].fd < 0 && pollfds[1].fd < 0)
			break;
	}

	return EXIT_SUCCESS;

}
