From 254b681b2b2c53709e94682c1ad9294394ff418b Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Sat, 9 Mar 2013 07:07:18 +0100 Subject: econproxy: First try on sending a frame [untested] --- econproxy.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/econproxy.c b/econproxy.c index 5a77905..fb03376 100644 --- a/econproxy.c +++ b/econproxy.c @@ -218,6 +218,69 @@ create_data_sockets(struct ep *ep, const char *beamer) return 0; } +static int +ep_read_ack(struct ep *ep) +{ + size_t len; + + init_iov(ep); + + len = readv(ep->ec_fd, ep->iov, 2); + if (len < ep->iov[0].iov_len + ep->iov[1].iov_len) { + fprintf(stderr, "error: command received is to short\n"); + return -1; + } + + switch (ep->ehdr.commandID) { + /* cack for connection video sockets */ + case E_CMD_22: + break; + case E_CMD_DISCONCLIENT: + fprintf(stderr, + "connection failed: probably incorrect version?\n"); + return -1; + default: + fprintf(stderr, + "unexpected command: %d while waiting for socket ack.\n", + ep->ehdr.commandID); + return -1; + } + + init_iov(ep); + init_header(&ep->ehdr, E_CMD_REQCONNECT); + + set_ip(ep->ehdr.IPaddress, sock_get_ipv4_addr(ep->ec_fd)); + ep->ehdr.datasize = sizeof ep->ecmd; + + memset(&ep->ecmd, 0, sizeof ep->ecmd); + + ep->ehdr.commandID = 25; + ep->ecmd.command.cmd25.unknown_field1 = 1; + ep->ecmd.command.cmd25.unknown_field2 = 1; + + writev(ep->ec_fd, ep->iov, 1); + + return 0; +} + +static int +ep_send_frame(struct ep *ep, char *buf, int size) +{ + struct econ_header hdr; + memset(&hdr, 0, sizeof hdr); + + strncpy(hdr.magicnum, "EPRD", ECON_MAGICNUM_SIZE); + strncpy(hdr.version, "0600", ECON_PROTOVER_MAXLEN); + + hdr.commandID = 0; + hdr.datasize = size; + + write(ep->video_fd, (void *) &hdr, sizeof hdr); + write(ep->video_fd, buf, size); + + return 0; +} + static int create_beamer_sockets(struct ep *ep, const char *beamer) { @@ -412,6 +475,14 @@ main(int argc, char *argv[]) if (create_data_sockets(&ep, beamer) < 0) exit(EXIT_FAILURE); + ep_keepalive(&ep); + + if (ep_read_ack(&ep) < 0) + exit(EXIT_FAILURE); + + if (ep_send_frame(&ep, buf, bufsiz) < 0) + exit(EXIT_FAILURE); + while (1) { ep_keepalive(&ep); sleep(5); -- cgit