From 5435dc638df9aa5916305cb38803f6825c73f8a1 Mon Sep 17 00:00:00 2001 From: clfreville2 Date: Fri, 20 Oct 2023 11:13:55 +0200 Subject: [PATCH] Read the image from the request --- CMakeLists.txt | 2 +- src/main.cpp | 32 ++++++++++++++++++++++++-------- src/network.cpp | 10 ++++++++++ src/network.hpp | 7 +++++++ 4 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 src/network.cpp create mode 100644 src/network.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0482a7d..9ae1f0e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,7 +15,7 @@ FetchContent_MakeAvailable(tomlplusplus) list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/libzmq-pkg-config) find_package(ZeroMQ QUIET) -add_executable(planificador src/host.cpp src/runner.cpp src/config.cpp src/main.cpp) +add_executable(planificador src/host.cpp src/runner.cpp src/network.cpp src/config.cpp src/main.cpp) if (NOT ZeroMQ_FOUND) message(STATUS "ZeroMQ not found, using bundled version") FetchContent_Declare( diff --git a/src/main.cpp b/src/main.cpp index 9737048..d761217 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,5 @@ #include "config.hpp" +#include "network.hpp" #include "program.hpp" #include "runner.hpp" #include @@ -13,6 +14,9 @@ #include "host.hpp" #include "zmq_addon.hpp" +static constexpr uint32_t JOB_ID_LEN = 32; +static constexpr uint32_t MIN_MESSAGE_LEN = JOB_ID_LEN + sizeof(uint32_t) * 2; + sk::runner_backend detect_backend() { const char *const argv[] = {"docker", "stats", "--no-stream", nullptr}; pid_t pid; @@ -53,15 +57,27 @@ int main() { while (true) { zmq::message_t request; receiver.recv(request); - if (request.size() < 32) { + if (request.size() < MIN_MESSAGE_LEN) { + std::cerr << "Invalid request" << std::endl; + break; + } + std::string_view jobId(static_cast(request.data()), JOB_ID_LEN); + uint32_t imageLen = + sk::read_uint32(static_cast(request.data()) + JOB_ID_LEN); + uint32_t codeLen = + sk::read_uint32(static_cast(request.data()) + JOB_ID_LEN + sizeof(uint32_t)); + if (request.size() < MIN_MESSAGE_LEN + imageLen + codeLen) { std::cerr << "Invalid request" << std::endl; break; } - std::string_view jobId(static_cast(request.data()), 32); - std::string requestString(static_cast(request.data()) + 32, - request.size() - 32); + std::string imageString(static_cast(request.data()) + + MIN_MESSAGE_LEN, + imageLen); + std::string requestString(static_cast(request.data()) + + MIN_MESSAGE_LEN + imageLen, + codeLen); - std::cout << "Executing " << request.size() << " bytes code.\n"; + std::cout << "Executing " << codeLen << " bytes code.\n"; sk::program program{requestString, "ghcr.io/moshell-lang/moshell:master"}; sk::run_result result = runner.run_blocking(program); @@ -69,9 +85,9 @@ int main() { std::cout << "Result: " << result.out << std::endl; // Send the job id and result.out to sink - zmq::message_t reply(32 + result.out.size()); - memcpy(reply.data(), jobId.data(), 32); - memcpy(static_cast(reply.data()) + 32, result.out.data(), + zmq::message_t reply(JOB_ID_LEN + result.out.size()); + memcpy(reply.data(), jobId.data(), JOB_ID_LEN); + memcpy(static_cast(reply.data()) + JOB_ID_LEN, result.out.data(), result.out.size()); sender.send(reply, zmq::send_flags::none); } diff --git a/src/network.cpp b/src/network.cpp new file mode 100644 index 0000000..8aaa451 --- /dev/null +++ b/src/network.cpp @@ -0,0 +1,10 @@ +#include "network.hpp" + +namespace sk { +uint32_t read_uint32(const char *buffer) { + return static_cast(buffer[3]) | + static_cast(buffer[2]) << 8 | + static_cast(buffer[1]) << 16 | + static_cast(buffer[0]) << 24; +} +} diff --git a/src/network.hpp b/src/network.hpp new file mode 100644 index 0000000..db7ab6c --- /dev/null +++ b/src/network.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include + +namespace sk { +uint32_t read_uint32(const char *buffer); +}