poke-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]