void handle_message_from_agent() { struct client_header hdr; struct server_header s_hdr, untrusted_s_hdr; read_all_vchan_ext(&untrusted_s_hdr, sizeof untrusted_s_hdr); /* sanitize start */ sanitize_message_from_agent(&untrusted_s_hdr); s_hdr = untrusted_s_hdr; /* sanitize end */ // fprintf(stderr, "got %x %x %x\n", s_hdr.type, s_hdr.client_id, // s_hdr.len); if (s_hdr.type == MSG_AGENT_TO_SERVER_TRIGGER_CONNECT_EXISTING) { handle_execute_predefined_command(); return; } if (s_hdr.type == MSG_XOFF) { clients[s_hdr.client_id].state |= CLIENT_DONT_READ; return; } if (s_hdr.type == MSG_XON) { clients[s_hdr.client_id].state &= ~CLIENT_DONT_READ; return; } switch (s_hdr.type) { case MSG_AGENT_TO_SERVER_STDOUT: hdr.type = MSG_SERVER_TO_CLIENT_STDOUT; break; case MSG_AGENT_TO_SERVER_STDERR: hdr.type = MSG_SERVER_TO_CLIENT_STDERR; break; case MSG_AGENT_TO_SERVER_EXIT_CODE: hdr.type = MSG_SERVER_TO_CLIENT_EXIT_CODE; break; default: /* cannot happen, already sanitized */ fprintf(stderr, "from agent: type=%d\n", s_hdr.type); exit(1); } hdr.len = s_hdr.len; if (clients[s_hdr.client_id].state == CLIENT_INVALID) { // benefit of doubt - maybe client exited earlier // just eat the packet data and continue char buf[MAX_DATA_CHUNK]; read_all_vchan_ext(buf, s_hdr.len); return; } get_packet_data_from_agent_and_pass_to_client(s_hdr.client_id, &hdr); if (s_hdr.type == MSG_AGENT_TO_SERVER_EXIT_CODE) terminate_client_and_flush_data(s_hdr.client_id); }
static void handle_message_from_agent(void) { struct msg_header hdr, untrusted_hdr; if (libvchan_recv(vchan, &untrusted_hdr, sizeof(untrusted_hdr)) < 0) handle_vchan_error("recv hdr"); /* sanitize start */ sanitize_message_from_agent(&untrusted_hdr); hdr = untrusted_hdr; /* sanitize end */ // fprintf(stderr, "got %x %x %x\n", hdr.type, hdr.client_id, // hdr.len); switch (hdr.type) { case MSG_TRIGGER_SERVICE: handle_execute_service(); return; case MSG_CONNECTION_TERMINATED: handle_connection_terminated(); return; } }