//Hanlde "all" requests to/from server, pass off to child funcs in // rcon-handlers.c for specific API hooking int root_handler(struct mg_connection *conn, json_t* jreq, json_t* jrsp){ //Get current "action" request json_t* action = json_object_get(jreq,"action"); if (!action){ //no action found, set error handling json_object_set_new(jrsp,"error",json_string("no 'action' key in request (please POST)")); return 400; } //test handler, echos back some basic data about the request if(cmpjstr(action,"version")){ return handle_version(conn,jreq,jrsp); } else if(cmpjstr(action,"api/hotkey")){ return handle_hotkey(jreq,jrsp); } else if(cmpjstr(action,"api/output")){ return handle_output(jreq,jrsp); } else if(cmpjstr(action,"plugin")){ for (size_t i=0; i < rcon_data.plugin_handlers.num; i++){ struct rcon_handler hndl = rcon_data.plugin_handlers.array[i]; if (cmpjstr(json_object_get(jreq,"plugin_action"),hndl.action)){ return hndl.handle_func(conn,jreq,jrsp); } } json_object_set_new(jrsp,"error",json_string("no matching 'plugin_action' found for request.")); return 400; } else { json_object_set_new(jrsp,"error",json_string("no matching 'action' found for request.")); if (jreq){ json_object_set(jrsp, "requestJSON", jreq); } else{ json_object_set_new(jrsp,"requestJSON", json_null()); } return 400; } }
int cr_service_work(int sk) { int ret = -1; CriuReq *msg = 0; more: if (recv_criu_msg(sk, &msg) == -1) { pr_perror("Can't recv request"); goto err; } if (chk_keepopen_req(msg)) goto err; switch (msg->type) { case CRIU_REQ_TYPE__DUMP: ret = dump_using_req(sk, msg->opts); break; case CRIU_REQ_TYPE__RESTORE: ret = restore_using_req(sk, msg->opts); break; case CRIU_REQ_TYPE__CHECK: ret = check(sk); break; case CRIU_REQ_TYPE__PRE_DUMP: ret = pre_dump_loop(sk, msg); break; case CRIU_REQ_TYPE__PAGE_SERVER: ret = start_page_server_req(sk, msg->opts, true); break; case CRIU_REQ_TYPE__PAGE_SERVER_CHLD: ret = start_page_server_req(sk, msg->opts, false); break; case CRIU_REQ_TYPE__WAIT_PID: ret = handle_wait_pid(sk, msg->pid); break; case CRIU_REQ_TYPE__CPUINFO_DUMP: case CRIU_REQ_TYPE__CPUINFO_CHECK: ret = handle_cpuinfo(sk, msg); break; case CRIU_REQ_TYPE__FEATURE_CHECK: ret = handle_feature_check(sk, msg); break; case CRIU_REQ_TYPE__VERSION: ret = handle_version(sk, msg); break; default: send_criu_err(sk, "Invalid req"); break; } if (!ret && msg->keep_open) { criu_req__free_unpacked(msg, NULL); ret = -1; goto more; } err: return ret; }
int command_handle(char *buf) { int cmd = command_interpret(buf); /* get the command index */ switch (cmd) { case 0: break; case 6: nand_query(); break; case 7: handle_nerase(); break; case 8: /* nread */ nand_read(NAND_READ); break; case 9: /* nreadraw */ nand_read(NAND_READ_RAW); break; case 10: /* nreadoob */ nand_read(NAND_READ_OOB); break; case 11: nand_prog(); break; case 12: handle_help(); break; case 13: handle_version(); break; case 14: debug_go(); break; case 16: /* exit */ printf(" exiting usbboot software\n"); return -1; /* return -1 to break the main.c while * then run usb_ingenic_cleanup*/ /*case 17: nand_read(NAND_READ_TO_RAM); */ break; case 18: handle_gpio(2); break; case 19: handle_gpio(3); break; case 20: boot(STAGE1_FILE_PATH, STAGE2_FILE_PATH); break; case 26: handle_nmark(); break; case 28: handle_load(); break; case 29: handle_memtest(); break; default: printf(" command not support or input error!\n"); break; } return 1; }