[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 2/2] MI: Add error reporting functionality for invalid msgs
From: |
Mohammad-Reza Nabipoor |
Subject: |
[PATCH 2/2] MI: Add error reporting functionality for invalid msgs |
Date: |
Fri, 6 Aug 2021 14:54:02 +0430 |
2021-08-06 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
* poke/pk-mi-msg.c (pk_mi_make_resp): Prevents `errmsg` to be `NULL`.
(pk_mi_set_arg): Fix the assertion.
* poke/pk-mi-msg.def (INVREQ): Add new arg (`errmsg`).
* poke/pk-mi.c (pk_mi_invalid_msg): New function to report error
of invalid messages to the client.
(pk_mi_process_frame_msg): Use `pk_mi_invalid_msg`.
(pk_mi_dispatch_msg): Add error reporting functionality for invalid
messages.
---
ChangeLog | 11 +++++
poke/pk-mi-msg.c | 6 ++-
poke/pk-mi-msg.def | 6 ++-
poke/pk-mi.c | 118 ++++++++++++++++++++++++++-------------------
4 files changed, 88 insertions(+), 53 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 06547311..23a99bd8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2021-08-06 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
+
+ * poke/pk-mi-msg.c (pk_mi_make_resp): Prevents `errmsg` to be `NULL`.
+ (pk_mi_set_arg): Fix the assertion.
+ * poke/pk-mi-msg.def (INVREQ): Add new arg (`errmsg`).
+ * poke/pk-mi.c (pk_mi_invalid_msg): New function to report error
+ of invalid messages to the client.
+ (pk_mi_process_frame_msg): Use `pk_mi_invalid_msg`.
+ (pk_mi_dispatch_msg): Add error reporting functionality for invalid
+ messages.
+
2021-08-06 Mohammad-Reza Nabipoor <mnabipoor@gnu.org>
* poke/pk-mi-json.h (pk_mi_json_to_msg): Add new arg (`errmsg`).
diff --git a/poke/pk-mi-msg.c b/poke/pk-mi-msg.c
index 4c565854..c8ee2ab6 100644
--- a/poke/pk-mi-msg.c
+++ b/poke/pk-mi-msg.c
@@ -208,6 +208,9 @@ pk_mi_make_resp (enum pk_mi_resp_type type,
{
pk_mi_msg msg = pk_mi_make_msg (PK_MI_MSG_RESPONSE);
+ if (errmsg == NULL)
+ errmsg = "";
+
PK_MI_MSG_RESP_TYPE (msg) = type;
PK_MI_MSG_RESP_REQ_NUMBER (msg) = req_seqnum;
PK_MI_MSG_RESP_SUCCESS_P (msg) = success_p;
@@ -309,8 +312,7 @@ pk_mi_set_arg (pk_mi_msg msg, const char *argname, pk_val
value)
assert (0);
/* Check that VALUE is of the right kind for this argument. */
- assert (pk_type_code (type) == PK_ANY
- || pk_type_code (type) == kind);
+ assert (kind == PK_ANY || pk_type_code (type) == kind);
/* Ok, set the value for this argument. */
PK_MI_MSG_ARGS (msg)[argindex] = value;
diff --git a/poke/pk-mi-msg.def b/poke/pk-mi-msg.def
index a3bff1c6..42e5ab7b 100644
--- a/poke/pk-mi-msg.def
+++ b/poke/pk-mi-msg.def
@@ -108,9 +108,13 @@ PK_DEF_RESP (PRINTV, PK_DEF_ARGS (PK_DEF_ARG (string,
PK_STRING)))
reqnum (uint)
Sequence number of the invalid request.
+ errmsg (string)
+ Invalidity reason.
*/
-PK_DEF_EVENT (INVREQ, PK_DEF_ARGS (PK_DEF_ARG (reqnum, PK_UINT)))
+PK_DEF_EVENT (INVREQ,
+ PK_DEF_ARGS (PK_DEF_ARG (reqnum, PK_UINT),
+ PK_DEF_ARG (errmsg, PK_STRING)))
/* Cleanup. */
diff --git a/poke/pk-mi.c b/poke/pk-mi.c
index 95ad34a9..c0d4c5e3 100644
--- a/poke/pk-mi.c
+++ b/poke/pk-mi.c
@@ -53,6 +53,7 @@
#define MAXMSG 2048
static void pk_mi_dispatch_msg (pk_mi_msg msg);
+static void pk_mi_invalid_msg (pk_mi_msg msg, const char* errmsg);
static void
pk_mi_process_frame_msg (int size, char *frame_msg)
@@ -63,7 +64,7 @@ pk_mi_process_frame_msg (int size, char *frame_msg)
if (msg)
pk_mi_dispatch_msg (msg);
else
- ; /* XXX: raise an event to communicate this to the client. */
+ pk_mi_invalid_msg (msg, errmsg);
free (errmsg);
}
@@ -269,62 +270,79 @@ pk_mi_send (pk_mi_msg msg)
/* Message dispatcher. */
+static void
+pk_mi_invalid_msg(pk_mi_msg msg, const char* errmsg)
+{
+ pk_mi_seqnum seq = msg ? pk_mi_msg_number (msg) : -1;
+ pk_mi_msg invreq_msg = pk_mi_make_event (PK_MI_EVENT_INVREQ);
+
+ if (errmsg == NULL)
+ errmsg = "";
+
+ pk_mi_set_arg (invreq_msg, "reqnum", pk_make_uint (seq, 64));
+ pk_mi_set_arg (invreq_msg, "errmsg", pk_make_string (errmsg));
+ pk_mi_send (invreq_msg);
+ pk_mi_msg_free (invreq_msg);
+}
+
static void
pk_mi_dispatch_msg (pk_mi_msg msg)
{
- if (pk_mi_msg_kind (msg) == PK_MI_MSG_REQUEST)
+ const char* errmsg = "";
+
+ if (pk_mi_msg_kind (msg) != PK_MI_MSG_REQUEST) {
+ errmsg = "expects request message";
+ goto error;
+ }
+
+ switch (pk_mi_msg_req_type (msg))
{
- switch (pk_mi_msg_req_type (msg))
- {
- case PK_MI_REQ_EXIT:
- {
- pk_mi_msg resp
- = pk_mi_make_resp (PK_MI_RESP_EXIT,
- pk_mi_msg_number (msg),
- 1 /* success_p */,
- NULL /* errmsg */);
- pk_mi_send (resp);
- pk_mi_msg_free (resp);
- pk_mi_exit_p = 1;
- break;
- }
- case PK_MI_REQ_PRINTV:
- {
- int ok;
- pk_mi_msg resp;
- pk_val arg, val;
-
- arg = pk_mi_get_arg (msg, "value");
-
- ok = pk_defvar (poke_compiler, "__pkl_mi_value", arg);
- assert (ok == PK_OK);
-
- ok = pk_compile_expression (poke_compiler,
- "format (\"%v\", __pkl_mi_value)",
- NULL, &val);
- assert (ok == PK_OK);
-
- resp = pk_mi_make_resp (PK_MI_RESP_PRINTV, pk_mi_msg_number (msg),
- 1 /* success_p */, NULL /* errmsg */);
- pk_mi_set_arg (resp, "string", val);
- pk_mi_send (resp);
- pk_mi_msg_free (resp);
- break;
- }
- default:
- assert (0);
- }
+ case PK_MI_REQ_EXIT:
+ {
+ pk_mi_msg resp
+ = pk_mi_make_resp (PK_MI_RESP_EXIT,
+ pk_mi_msg_number (msg),
+ 1 /* success_p */,
+ NULL /* errmsg */);
+ pk_mi_send (resp);
+ pk_mi_msg_free (resp);
+ pk_mi_exit_p = 1;
+ break;
+ }
+ case PK_MI_REQ_PRINTV:
+ {
+ int ok;
+ pk_mi_msg resp;
+ pk_val arg, val;
+
+ arg = pk_mi_get_arg (msg, "value");
+
+ ok = pk_defvar (poke_compiler, "__pkl_mi_value", arg);
+ assert (ok == PK_OK);
+
+ ok = pk_compile_expression (poke_compiler,
+ "format (\"%v\", __pkl_mi_value)",
+ NULL, &val);
+ assert (ok == PK_OK);
+
+ resp = pk_mi_make_resp (PK_MI_RESP_PRINTV, pk_mi_msg_number (msg),
+ 1 /* success_p */, NULL /* errmsg */);
+ pk_mi_set_arg (resp, "string", val);
+ pk_mi_send (resp);
+ pk_mi_msg_free (resp);
+ break;
+ }
+ default:
+ errmsg = "invalid request type";
+ goto error;
}
- else
- {
- pk_mi_msg invreq_msg = pk_mi_make_event (PK_MI_EVENT_INVREQ);
- pk_mi_set_arg (invreq_msg, "reqnum",
- pk_make_uint (pk_mi_msg_number (msg), 64));
- pk_mi_send (invreq_msg);
- pk_mi_msg_free (invreq_msg);
- }
+ goto done;
+
+error:
+ pk_mi_invalid_msg (msg, errmsg);
+done:
pk_mi_msg_free (msg);
}
--
2.32.0