/** * Main command operations */ void CommandsSession::cmd_process() { binn *read_binn; read_binn = binn_open((void*)&m_read_msg[0]); unsigned char command; if (!binn_list_get_uint8(read_binn, 1, &command)) { response_msg(STATUS_ERROR, "Invalid Binn data: reading command failed", true); return; } switch (command) { case COMMAND_EXEC: { char * exec_command; char * work_dir; if (!binn_list_get_str(read_binn, 2, &exec_command)) { response_msg(STATUS_ERROR, "Invalid exec command", true); break; } if (!binn_list_get_str(read_binn, 3, &work_dir)) { response_msg(STATUS_ERROR, "Invalid work directory", true); break; } if (strlen(work_dir) == 0) { response_msg(STATUS_ERROR, "Empty work directory", true); break; } if (!fs::is_directory(work_dir)) { response_msg(STATUS_ERROR, "Invalid work directory", true); break; } fs::current_path(work_dir); std::cout << "Executing command: \"" << exec_command << "\"" << std::endl; std::string out; int exit_code = GameAP::exec(std::string(exec_command), out); binn *write_binn = binn_list(); binn_list_add_uint32(write_binn, STATUS_OK); binn_list_add_int32(write_binn, exit_code); binn_list_add_str(write_binn, &out[0]); m_write_msg = std::string(static_cast<char*>(binn_ptr(write_binn)), static_cast<uint>(binn_size(write_binn))); break; }; default: { std::cerr << "Unknown Command" << std::endl; response_msg(STATUS_UNKNOWN_COMMAND, "Unknown command", true); return; }; } do_write(); }
int dsm_receive_msg(int nodefd, dsm_message_t *msg) { binn *obj; int blob_size; void* buffer; int buffersize; //char buffer[BUFFER_LEN]; //void* ptr = (void *) &buffer; if(dsm_g->mem == NULL) { buffersize = MIN_BUFFERSIZE; } else { buffersize = MIN_BUFFERSIZE + dsm_g->mem->pagesize; } /* We cant receive a page if the mem struct isn't yet initialized anyway */ buffer = malloc(buffersize); if (buffer == NULL) { error("Could not allocate memory (malloc)\n"); } if(dsm_receive(nodefd, buffer) < 0) { debug("dsm_receive 0 byte, node disconnected\n"); return -1; } obj = binn_open(buffer); msg->type = binn_object_int32(obj, DSM_MSG_KEY_TYPE); switch (msg->type) { case CONNECT: msg->connect_args.bitness = binn_object_int32(obj, DSM_MSG_KEY_BITNESS); msg->connect_args.pagesize = binn_object_int32(obj, DSM_MSG_KEY_PAGESIZE); break; case CONNECT_ACK: msg->connect_ack_args.bitness_ok = binn_object_int16(obj, DSM_MSG_KEY_BITNESS); msg->connect_ack_args.pagesize_ok = binn_object_int16(obj, DSM_MSG_KEY_PAGESIZE); msg->connect_ack_args.page_count = binn_object_int32(obj, DSM_MSG_KEY_PAGECOUNT); break; case LOCKPAGE: msg->lockpage_args.page_id = binn_object_int32(obj, DSM_MSG_KEY_PAGEID); msg->lockpage_args.access_rights = binn_object_int16(obj, DSM_MSG_KEY_RIGHTS); break; case INVALIDATE: msg->invalidate_args.page_id = binn_object_int32(obj, DSM_MSG_KEY_PAGEID); break; case INVALIDATE_ACK: msg->invalidate_ack_args.page_id = binn_object_int32(obj, DSM_MSG_KEY_PAGEID); break; case GIVEPAGE: msg->givepage_args.page_id = binn_object_int32(obj, DSM_MSG_KEY_PAGEID); msg->givepage_args.access_rights = binn_object_int16(obj, DSM_MSG_KEY_RIGHTS); msg->givepage_args.data = binn_object_blob(obj, DSM_MSG_KEY_DATA, &blob_size); break; case SYNC_BARRIER: msg->sync_barrier_args.slave_to_wait = binn_object_int16(obj, DSM_MSG_KEY_BARRIER); break; case BARRIER_ACK: break; case TERMINATE: break; default: log("Unknown message type received !\n"); return -1; } binn_free(obj); free(buffer); return 0; }