diff options
Diffstat (limited to 'src/protocol.c')
-rw-r--r-- | src/protocol.c | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/protocol.c b/src/protocol.c new file mode 100644 index 0000000..0b6e74e --- /dev/null +++ b/src/protocol.c @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2023 Egor Tensin <Egor.Tensin@gmail.com> + * This file is part of the "cimple" project. + * For details, see https://github.com/egor-tensin/cimple. + * Distributed under the MIT License. + */ + +#include "protocol.h" +#include "const.h" +#include "log.h" +#include "msg.h" +#include "process.h" +#include "run_queue.h" +#include "string.h" + +#include <stddef.h> +#include <stdio.h> + +static int check_msg_length(const struct msg *msg, size_t expected) +{ + size_t actual = msg_get_length(msg); + + if (actual != expected) { + log_err("Invalid number of arguments for a message: %zu\n", actual); + msg_dump(msg); + return -1; + } + + return 0; +} + +int msg_run_parse(const struct msg *msg, struct run **run) +{ + int ret = check_msg_length(msg, 3); + if (ret < 0) + return ret; + + const char **argv = msg_get_strings(msg); + /* We don't know the ID yet. */ + return run_create(run, 0, argv[1], argv[2]); +} + +int msg_new_worker_create(struct msg **msg) +{ + static const char *argv[] = {CMD_NEW_WORKER, NULL}; + return msg_from_argv(msg, argv); +} + +int msg_start_create(struct msg **msg, const struct run *run) +{ + char id[16]; + snprintf(id, sizeof(id), "%d", run_get_id(run)); + + const char *argv[] = {CMD_START, id, run_get_url(run), run_get_rev(run), NULL}; + + return msg_from_argv(msg, argv); +} + +int msg_start_parse(const struct msg *msg, struct run **run) +{ + int ret = 0; + + ret = check_msg_length(msg, 4); + if (ret < 0) + return ret; + + const char **argv = msg_get_strings(msg); + + int id = 0; + + ret = string_to_int(argv[1], &id); + if (ret < 0) + return ret; + + return run_create(run, id, argv[2], argv[3]); +} + +int msg_finished_create(struct msg **msg, int run_id, const struct proc_output *output) +{ + char id[16]; + char ec[16]; + + snprintf(id, sizeof(id), "%d", run_id); + snprintf(ec, sizeof(ec), "%d", output->ec); + + const char *argv[] = {CMD_FINISHED, id, ec, NULL}; + + return msg_from_argv(msg, argv); +} + +int msg_finished_parse(const struct msg *msg, int *run_id, struct proc_output *output) +{ + int ret = 0; + + ret = check_msg_length(msg, 3); + if (ret < 0) + return ret; + + const char **argv = msg_get_strings(msg); + + proc_output_init(output); + + ret = string_to_int(argv[1], run_id); + if (ret < 0) + return ret; + ret = string_to_int(argv[2], &output->ec); + if (ret < 0) + return ret; + + return 0; +} |