/* handle data received from one of qrexec_client processes */ void handle_message_from_client(int fd) { struct server_header s_hdr; char buf[MAX_DATA_CHUNK]; int len, ret; if (clients[fd].state == CLIENT_CMDLINE) { handle_cmdline_message_from_client(fd); return; } // We have already passed cmdline from client. // Now the client passes us raw data from its stdin. len = buffer_space_vchan_ext(); if (len <= sizeof s_hdr) return; /* Read at most the amount of data that we have room for in vchan */ ret = read(fd, buf, len - sizeof(s_hdr)); if (ret < 0) { perror("read client"); terminate_client_and_flush_data(fd); return; } s_hdr.client_id = fd; s_hdr.len = ret; s_hdr.type = MSG_SERVER_TO_AGENT_INPUT; write_all_vchan_ext(&s_hdr, sizeof(s_hdr)); write_all_vchan_ext(buf, ret); if (ret == 0) // EOF - so don't select() on this client clients[fd].state |= CLIENT_DONT_READ; }
/* handle data received from one of qrexec_client processes */ static void handle_message_from_client(int fd) { char buf[MAX_DATA_CHUNK]; switch (clients[fd].state) { case CLIENT_HELLO: handle_client_hello(fd); return; case CLIENT_CMDLINE: handle_cmdline_message_from_client(fd); return; case CLIENT_RUNNING: // expected EOF if (read(fd, buf, sizeof(buf)) != 0) { fprintf(stderr, "Unexpected data received from client %d\n", fd); } terminate_client(fd); return; default: fprintf(stderr, "Invalid client state %d\n", clients[fd].state); exit(1); } }