#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"
}
}
+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;
return 1;
}
url = arg;
- mode = 1;
+ mode = 0;
break;
case 't':
arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
}
/* 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 */
/* test: morep_valid.exe -h | grep usage */
-/* vim: set ts=4 sw=4 et: */
+/* vim: set ts=4 sw=4 si et: */