parser coded
authorMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Mar 2025 21:39:26 +0000 (22:39 +0100)
committerMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Mar 2025 21:39:26 +0000 (22:39 +0100)
morep_valid.c

index 92e3746e9eb2d7f486fedabc49d03c2cc9441017..409e9cb26411e30ee2396810b9412ad0d6797ca3 100644 (file)
 
 #include <errno.h>
 #include <signal.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "morep.h"
 #include "verbose.h"
@@ -47,6 +49,96 @@ void sig_handler (int sig)
     }
 }
 
+char *readstream (FILE *sd, int *length)
+{
+    VERBOSE (morep, TRACE, PRINTF ("readstream\n"));
+
+    char *buffer = NULL;
+    size_t size = 0;
+    int blocklen = 0;
+    int _length = 0;
+    do {
+        size += BUFMAX + (size == 0);
+        buffer = (char *) realloc (buffer, size);
+        memset (buffer + size - BUFMAX - 1, 0, BUFMAX + 1);
+        blocklen = fread (buffer + size - BUFMAX - 1, 1, BUFMAX, sd);
+        _length += blocklen;
+        VERBOSE (morep, DEBUG, PRINTF ("buffer: 0x%p 0x%p %d %d %d\n", buffer, buffer + size - BUFMAX - 1, (int)size, _length, blocklen));
+    } while (blocklen > 0);
+
+    /* check size */
+    VERBOSE (morep, DEBUG, PRINTF ("read length: %d\n", _length));
+    if (_length == 0) {
+        free (buffer);
+        buffer = NULL;
+    }
+    if (length) {
+        *length = _length;
+    }
+
+    return buffer;
+}
+
+int parse_line (char *line, uint8_t *msgtype, uint8_t **payload)
+{
+    char *delim = " =\t";
+    char *str = strdup (line);
+    char *save_ptr;
+    char *pt = str;
+    int rc = -1;
+    *msgtype = -1;
+    while (1) {
+        char *var = strtok_r (pt, delim, &save_ptr);
+        pt = NULL;
+        if (!var) break;
+        char *val = strtok_r (NULL, delim, &save_ptr);
+        if (!var) break;
+
+        if (0) {
+        } else if (strcmp ("MSGTYPE", var) == 0) {
+            *msgtype = strtol (val, NULL, 0);
+            if (rc < 0 ) {
+                rc = 0;
+            }
+        } else if (strcmp ("PAYLOAD", var) == 0) {
+            if ((*val == '"') && (val[strlen (val) - 1] == '"')) {
+                val++;
+                rc = strlen (val) - 1;
+                uint8_t *buf = *payload = (uint8_t *) calloc (rc, 1);
+                do {
+                    *buf++ = *val++;
+                } while (*val != '\0');
+                buf[-1] = '\0';
+            } else if (*val == '@') {
+                FILE *fid = fopen (++val, "r");
+                if (fid == NULL) {
+                    VERBOSE (morep, ERROR, PRINTF ("can't open file '%s'\n", val));
+                    break;
+                }
+                *payload = (uint8_t *) readstream (fid, &rc);
+                fclose (fid);
+            } else if (strlen (val) % 2 == 0) {
+                rc = strlen (val) % 2;
+                uint8_t *buf = *payload = (uint8_t *) calloc (rc / 2, 1);
+                while (*val != '\0') {
+                    char digit[3] = {0};
+                    digit[0] = *val++;
+                    digit[1] = *val++;
+                    *buf++ = strtol (digit, NULL, 16);
+                }
+            } else {
+                VERBOSE (morep, WARNING, PRINTF ("can't parse payload in '%s'\n", line));
+                break;
+            }
+        } else {
+            VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line));
+            break;
+        }
+    }
+
+    return rc;
+}
+
 typedef struct {
     int morep;
     int mode;
@@ -88,7 +180,7 @@ int main (int argc, char **argv)
                 return 1;
             }
             url = arg;
-            mode = 1;
+            mode = 0;
             break;
         case 't':
             arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
@@ -181,8 +273,71 @@ int main (int argc, char **argv)
         }
 
         /* analyse line */
+        mode = -1;
+        if (*pt == 'R') {
+            mode = 0;
+        } else if (*pt == 'T') {
+            mode = 1;
+        } else if (strcmp (pt, "SLEEP") == 0) {
+            int duration = atoi (pt + 5);
+            usleep (duration * 1000);
+            continue;
+        }
+        if (mode == -1) {
+            VERBOSE (morep, WARNING, PRINTF ("unrecognize line '%s'\n", line));
+            continue;
+        }
+
+        /* find ethertype */
+        pt++;
+        comm_t *comm = NULL;
+        for (i = 0; i < nbcomms; i++) {
+            comm_t *c = comm_list + i;
+            if ((strncmp (pt, c->etype, strlen (c->etype)) == 0) && (c->mode == mode)) {
+                comm = c;
+                break;
+            }
+        }
+        if (comm == NULL) {
+            VERBOSE (morep, WARNING, PRINTF ("no morep found '%s'\n", line));
+            continue;
+        }
 
+        /* get values */
+        uint8_t msgtype = 0;
+        uint8_t *payload = NULL;
+        int len = parse_line (pt, &msgtype, &payload);
+        if (len < 0) {
+            VERBOSE (morep, WARNING, PRINTF ("can't parse line '%s'\n", line));
+            continue;
+        }
 
+        /* transmit */
+        if (mode == 1) {
+            int seqnum = MOREP_Send (comm->morep, msgtype, payload, len);
+            VERBOSE (morep, INFO, PRINTF ("S%s seqnum %d\n", comm->etype, seqnum));
+        } else { /* receive */
+            uint8_t rxmsgtype = 0;
+            uint8_t *rxpayload = NULL;
+            int rxlen = 0;
+            int seqnum = MOREP_Receive (comm->morep, &rxmsgtype, rxpayload, &rxlen);
+            if (rxmsgtype != msgtype) {
+                VERBOSE (morep, WARNING, PRINTF ("R%04x seqnum %d: expected msgtype %04x\n", rxmsgtype, seqnum, msgtype));
+            } else {
+                int ok = (len == rxlen);
+                i = -1;
+                for (i = 0; ok && (i < len); i++) {
+                    ok = (rxpayload[i] == payload[i]);
+                }
+                if (!ok) {
+                    VERBOSE (morep, WARNING, PRINTF ("R%04x seqnum %d: payload diff at %d/%d\n", rxmsgtype, seqnum, i, rxlen));
+                } else {
+                    VERBOSE (morep, INFO, PRINTF ("R%04x seqnum %d\n", rxmsgtype, seqnum));
+                }
+            }
+            free (rxpayload);
+        }
+        free (payload);
     }
 
     /* cleaning */
@@ -198,4 +353,4 @@ int main (int argc, char **argv)
 
 /* test: morep_valid.exe -h | grep usage */
 
-/* vim: set ts=4 sw=4 et: */
+/* vim: set ts=4 sw=4 si et: */