int gdbr_server_read(libgdbr_t *g, char *buf, size_t max_len) { bool loop_continue; int ret; if (!g) { return -1; } memset (buf, 0, max_len); do { loop_continue = false; read_packet (g); while (!*g->data) { read_packet (g); } if (r_str_startswith (g->data, "qSupported")) { loop_continue = true; if ((ret = _server_handle_qSupported (g)) < 0) { return ret; } } else if (r_str_startswith (g->data, "qTStatus")) { loop_continue = true; if ((ret = _server_handle_qTStatus (g)) < 0) { return ret; } } else if (r_str_startswith (g->data, "qC")) { if ((ret = _server_handle_qC (g, buf, max_len)) < 0) { return ret; } } } while (loop_continue); return ret; }
int gdbr_server_serve(libgdbr_t *g, gdbr_server_cmd_cb cmd_cb, void *core_ptr) { int ret; if (!g) { return -1; } while (1) { read_packet (g); if (g->data_len == 0) { continue; } if (r_str_startswith (g->data, "k")) { return _server_handle_k (g, cmd_cb, core_ptr); } if (r_str_startswith (g->data, "vKill")) { return _server_handle_vKill (g, cmd_cb, core_ptr); } if (r_str_startswith (g->data, "qSupported")) { if ((ret = _server_handle_qSupported (g)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "qTStatus")) { if ((ret = _server_handle_qTStatus (g)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "qC") && g->data_len == 2) { if ((ret = _server_handle_qC (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "qAttached")) { if ((ret = _server_handle_qAttached (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "vMustReplyEmpty")) { if ((ret = _server_handle_vMustReplyEmpty (g)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "qTfV")) { if ((ret = _server_handle_qTfV (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "qfThreadInfo")) { if ((ret = _server_handle_qfThreadInfo (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "qsThreadInfo")) { if ((ret = _server_handle_qsThreadInfo (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "Hg")) { if ((ret = _server_handle_Hg (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "Hc")) { if ((ret = _server_handle_Hc (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "?")) { if ((ret = _server_handle_ques (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "g") && g->data_len == 1) { if ((ret = _server_handle_g (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "vCont")) { if ((ret = _server_handle_vCont (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "qOffsets")) { if ((ret = _server_handle_qOffsets (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (g->data[0] == 'z' || g->data[0] == 'Z') { if ((ret = _server_handle_z (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (g->data[0] == 's') { if ((ret = _server_handle_s (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (g->data[0] == 'c') { if ((ret = _server_handle_c (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "m")) { if ((ret = _server_handle_m (g, cmd_cb, core_ptr)) < 0) { return ret; } continue; } if (r_str_startswith (g->data, "QStartNoAckMode")) { if (send_ack (g) < 0 || send_msg (g, "OK") < 0) { return -1; } g->no_ack = true; continue; } // Unrecognized packet if (send_ack (g) < 0 || send_msg (g, "") < 0) { g->data[g->data_len] = '\0'; eprintf ("Unknown packet: %s\n", g->data); return -1; } }; return ret; }