/** * Response message * * @param snum message code (1 - error, 2 - critical error, 3 - unknown command, 100 - okay) * @param sdesc text message * @param write */ void CommandsSession::response_msg(unsigned int snum, const char * sdesc, bool write) { binn *write_binn = binn_list(); binn_list_add_uint32(write_binn, snum); binn_list_add_str(write_binn, (char *)sdesc); m_write_msg = std::string(static_cast<char*>(binn_ptr(write_binn)), static_cast<uint>(binn_size(write_binn))); }
static bool write_list(binn* parent, object_t* object) { for (size_t i = 0; i < object->l; ++i) { object_t* value = object->children + i; switch (value->type) { case type_nil: if (!binn_list_add_null(parent)) return false; break; case type_bool: if (!binn_list_add_bool(parent, (BOOL)value->b)) return false; break; case type_double: if (!binn_list_add_double(parent, value->d)) return false; break; case type_int: if (!binn_list_add_int64(parent, value->i)) return false; break; case type_uint: if (!binn_list_add_uint64(parent, value->u)) return false; break; case type_str: if (!binn_list_add_str(parent, CONST_CAST(value->str))) return false; break; case type_array: { binn child; binn_create_list(&child); bool ok = write_list(&child, value); if (ok) ok = binn_list_add_object(parent, &child); binn_free(&child); if (!ok) return false; } break; case type_map: { binn child; binn_create_object(&child); bool ok = write_object(&child, value); if (ok) ok = binn_list_add_object(parent, &child); binn_free(&child); if (!ok) return false; } break; default: return false; } } return true; }
/** * 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(); }