From 1c42eca6cdae99804b7020d89ae220308e4daff5 Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Sun, 28 Aug 2022 20:24:41 +0200 Subject: make proper "error" messages Previously, the client had no way to distinguish errors from succesful calls. --- src/msg.c | 16 ++++++++-------- src/msg.h | 4 ++-- src/server.c | 11 ++++++++--- src/worker.c | 14 ++++++++++---- 4 files changed, 28 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/msg.c b/src/msg.c index 5a7e165..d1f3b5e 100644 --- a/src/msg.c +++ b/src/msg.c @@ -5,26 +5,26 @@ #include #include -void msg_success(struct msg *msg) +int msg_success(struct msg *msg) { - msg->argc = 0; - msg->argv = NULL; + char *argv[] = {"success", NULL}; + return msg_from_argv(msg, argv); } -void msg_error(struct msg *msg) +int msg_error(struct msg *msg) { - msg->argc = -1; - msg->argv = NULL; + char *argv[] = {"error", NULL}; + return msg_from_argv(msg, argv); } int msg_is_success(const struct msg *msg) { - return msg->argc == 0; + return msg->argc == 1 && !strcmp(msg->argv[0], "success"); } int msg_is_error(const struct msg *msg) { - return msg->argc < 0; + return msg->argc == 1 && !strcmp(msg->argv[0], "error"); } static int msg_copy_argv(struct msg *msg, char **argv) diff --git a/src/msg.h b/src/msg.h index e60f2ce..f6b85e6 100644 --- a/src/msg.h +++ b/src/msg.h @@ -6,8 +6,8 @@ struct msg { char **argv; }; -void msg_success(struct msg *); -void msg_error(struct msg *); +int msg_success(struct msg *); +int msg_error(struct msg *); int msg_is_success(const struct msg *); int msg_is_error(const struct msg *); diff --git a/src/server.c b/src/server.c index a84016e..c2941c5 100644 --- a/src/server.c +++ b/src/server.c @@ -227,11 +227,16 @@ static int msg_ci_run_handler(struct server *server, int client_fd, const struct ret = msg_ci_run_queue(server, msg->argv[1], msg->argv[2]); if (ret < 0) - msg_error(&response); + ret = msg_error(&response); else - msg_success(&response); + ret = msg_success(&response); - return msg_send(client_fd, &response); + if (ret < 0) + return ret; + + ret = msg_send(client_fd, &response); + msg_free(&response); + return ret; } static int msg_ci_run_parser(const struct msg *msg) diff --git a/src/worker.c b/src/worker.c index fbf609b..baba9b0 100644 --- a/src/worker.c +++ b/src/worker.c @@ -88,13 +88,19 @@ static int msg_ci_run_handler(struct worker *worker, const struct msg *request) int ret = 0; ret = msg_ci_run_do(request->argv[1], request->argv[2], &result); + proc_output_free(&result); + if (ret < 0) - msg_error(&response); + ret = msg_error(&response); else - msg_success(&response); - proc_output_free(&result); + ret = msg_success(&response); - return msg_send(worker->fd, &response); + if (ret < 0) + return ret; + + ret = msg_send(worker->fd, &response); + msg_free(&response); + return ret; } static int msg_ci_run_parser(const struct msg *msg) -- cgit v1.2.3