+++ /dev/null
-/*
- File name : morep_server.c
- Projet : MERLIN
- Date of creation : 2025/03/18
- Version : 1.0
- Copyright : Thales SIX
- Author : Laurent Mazet <laurent.mazet@thalesgroup.com>
-
- Description : Raw Ethernet packet server for MOREP library
-
- History :
- - initial version
-*/
-
-/* depend: */
-/* cflags: */
-/* linker: morep.o */
-/* winlnk: morep.o */
-
-#include <errno.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "morep.h"
-#include "verbose.h"
-
-char *progname = NULL;
-
-int stop = 0;
-
-DECLARE_VERBOSE_LEVEL (morep, INFO);
-
-char *words[] = {"Quo", "cognito", "Constantius", "ultra", "mortalem", "modum", "exarsit", "ac", "nequo", "casu", "idem", "Gallus", "de", "futuris", "incertus", "agitare", "quaedam", "conducentia", "saluti", "suae", "per", "itinera", "conaretur,", "remoti", "sunt", "omnes", "de", "industria", "milites", "agentes", "in", "civitatibus", "perviis.", NULL};
-
-#define BUFMAX 4096
-
-void sig_handler (int sig)
-{
- switch (sig) {
- case SIGINT:
- //stop = 1;
- exit (0);
- break;
- case SIGTERM:
- exit (0);
- break;
- }
-}
-
-int server (char *url)
-{
- VERBOSE (morep, TRACE, PRINTF ("server\n"));
-
- int morep = MOREP_Connect (url);
- if (morep < 0) {
- VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
- return -1;
- }
-
- VERBOSE (morep, INFO, PRINTF ("server started at '%s' (%d)\n", url, morep));
-
- signal(SIGINT, sig_handler);
- signal(SIGTERM, sig_handler);
-
- int i = 0;
- while (!stop) {
-
- uint8_t rxmsgtype = 0;
- int rxmsglen = 0;
- uint8_t rxbuffer[1496 * 16] = {0};
- int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
- VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
- VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
-
- uint8_t txmsgtype = 0x01;
- int txmsglen = strlen (words[i]);
- int txseqnum = MOREP_Send (morep, txmsgtype, (uint8_t *)words[i], txmsglen);
- VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
- VERBOSE (morep, TRACE, PRINTF ("tx msg: '%s'\n", words[i]));
- if (words[++i] == NULL) {
- i = 0;
- }
- }
-
- MOREP_Close (morep);
-
- return 0;
-}
-
-int clientline (char *url, uint8_t txmsgtype, char *filename)
-{
- VERBOSE (morep, TRACE, PRINTF ("client\n"));
-
- /* open connection */
- int morep = MOREP_Connect (url);
- if (morep < 0) {
- VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
- return -1;
- }
-
- /* read file */
- FILE *fid = stdin;
- if (filename != NULL) {
- fid = fopen (filename, "r");
- if (fid == NULL) {
- VERBOSE (morep, ERROR, PRINTF ("can't open file '%s' for reading\n", filename));
- return -1;
- }
- }
-
- while (!feof (fid)) {
- int txmsglen = 1496;
- uint8_t txbuffer[1496] = {0};
- int i = 0;
- do {
- fread (txbuffer + i, 1, 1, fid);
- if ((txbuffer[i] == '\n') || (txbuffer[i] == '\r')) {
- txbuffer[i] = 0;
- }
- } while ((txbuffer[i] != 0) && (++i < txmsglen));
- if ((i == 0) && feof (fid)) {
- continue;
- }
- txmsglen = i;
- if ((txmsglen == 0) && (errno != 0)) {
- VERBOSE (morep, ERROR, PRINTF ("can't read data from file '%s'\n", filename));
- return -1;
- }
-
- int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
- VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
- VERBOSE (morep, TRACE, PRINTF ("tx msg: '%s'\n", txbuffer));
-
- uint8_t rxmsgtype = 0;
- int rxmsglen = 0;
- uint8_t rxbuffer[1496] = {0};
- int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
- VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
- VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
- }
-
- if (fid != stdin) {
- fclose (fid);
- }
- MOREP_Close (morep);
-
- return 0;
-}
-
-
-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 clientfile (char *url, uint8_t txmsgtype, char *filename)
-{
- VERBOSE (morep, TRACE, PRINTF ("client\n"));
-
- /* open connection */
- int morep = MOREP_Connect (url);
- if (morep < 0) {
- VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
- return -1;
- }
-
- /* read file */
- FILE *fid = stdin;
- if (filename != NULL) {
- fid = fopen (filename, "r");
- if (fid == NULL) {
- VERBOSE (morep, ERROR, PRINTF ("can't open file '%s' for reading\n", filename));
- return -1;
- }
- }
- int len = 0;
- uint8_t *buffer = (uint8_t *) readstream (fid, &len);
- if (fid != stdin) {
- fclose (fid);
- }
-
- uint8_t *txbuffer = buffer;
- while (len > 0) {
- int txmsglen = 1496 * 16 - 1;
- if (len < txmsglen) {
- txmsglen = len;
- }
- int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
- VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
- VERBOSE (morep, TRACE, PRINTF ("tx msg: '"); fwrite ((char *)txbuffer, 1, txmsglen, stdout); printf ("'\n"));
- len -= txmsglen;
- txbuffer -= txmsglen;
-
- uint8_t rxmsgtype = 0;
- int rxmsglen = 0;
- uint8_t rxbuffer[1496 * 16] = {0};
- int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
- VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
- VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
- }
-
- free (buffer);
- MOREP_Close (morep);
-
- return 0;
-}
-
-int main (int argc, char **argv)
-{
- char *filename = NULL;
- int msgtype = -1;
- char *url = NULL;
- int linebyline = 1;
-
- /* get basename */
- char *pt = progname = argv[0];
- while (*pt) {
- if ((*pt == '/') || (*pt == '\\')) {
- progname = pt + 1;
- }
- pt++;
- }
-
- /* process argument */
- while (argc-- > 1) {
- char *arg = *(++argv);
- if (arg[0] != '-') {
- url = arg;
- continue;
- }
- char c = arg[1];
- switch (c) {
- case 'b':
- linebyline = 0;
- break;
- case 'f':
- arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
- if (arg == NULL) {
- VERBOSE (morep, ERROR, PRINTF ("%s: message file not specified\n", progname));
- return 1;
- }
- filename = arg;
- break;
- case 'l':
- linebyline = 1;
- break;
- case 's':
- arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
- if (arg == NULL) {
- VERBOSE (morep, ERROR, PRINTF ("%s: message type not specified\n", progname));
- return 1;
- }
- msgtype = atoi (arg);
- break;
- case 'v':
- arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
- if (arg == NULL) {
- VERBOSE (morep, ERROR, PRINTF ("%s: verbose level not specified\n", progname));
- return 1;
- }
- CHANGE_VERBOSE_LEVEL (morep, atoi (arg));
- break;
- case 'h':
- default:
- printf ("usage: %s [-b|-l] [-h] [-f file] [-s msgtype] [-v int] <url>\n", progname);
- return (c != 'h');
- }
- }
-
- int rc = 1;
- if (url == NULL) {
- VERBOSE (morep, ERROR, PRINTF ("missing url\n"));
- } else if (msgtype != -1) {
- if (linebyline) {
- rc = clientline (url, msgtype, filename);
- } else {
- rc = clientfile (url, msgtype, filename);
- }
- } else {
- rc = server (url);
- }
-
- return rc;
-}
-
-/* test: morep_server.exe -h | grep usage */
-/* test: morep_server.exe 2>&1 | grep "missing url" */
-/* test: morep_server.exe lo:/du:mm:yi:nt:er:fa/0808 2>&1 | grep "can't parse interface" */
-/* test: morep_server.exe lo://du:mm:yi:nt:er:fa/0808 2>&1 | grep "can't parse mac" */
-/* test: morep_server.exe lo://00:00:00:00:00:00/foo 2>&1 | grep "can't parse ethertype" */
-/* test: morep_server.exe foo://00:00:00:00:00:00/0808 2>&1 | grep "No such device" */
-/* test: morep_server.exe lo://00:00:00:00:00:00/0808 -l -f foobar -s 42 2>&1 | grep "can't open file" */
-/* test: morep_server.exe lo://00:00:00:00:00:00/0808 -b -f foobar -s 42 2>&1 | grep "can't open file" */
-/* test: morep_server.exe lo://00:00:00:00:00:00/0808 -l -f makefile -s 42 -v 3 */
-/* test: morep_server.exe lo://00:00:00:00:00:00/0808 -l -f makefile -s 42 -v 4 | grep "rx msg: '$(tail -1 makefile)" */
-/* test: morep_server.exe lo://00:00:00:00:00:00/0808 -l -f makefile -s 42 -v 4 | grep -v "WARNING" */
-/* test: morep_server.exe lo://00:00:00:00:00:f9/0808 -b -f morep.c -s 42 -v 3 */
-/* test: morep_server.exe lo://00:00:00:00:00:00/0808 -b -f morep.c -s 42 -v 3 | grep "rx $(cat morep.c | wc -c) bytes" */
-/* test: morep_server.exe lo://00:00:00:00:00:00/0808 -b -f morep.c -s 42 -v 3 | grep -v "WARNING" */
-
-/* vim: set ts=4 sw=4 et: */
--- /dev/null
+/*
+ File name : morep_test.c
+ Projet : MERLIN
+ Date of creation : 2025/03/18
+ Version : 1.0
+ Copyright : Thales SIX
+ Author : Laurent Mazet <laurent.mazet@thalesgroup.com>
+
+ Description : Raw Ethernet packet test program for MOREP library
+
+ History :
+ - initial version
+*/
+
+/* depend: */
+/* cflags: */
+/* linker: morep.o */
+/* winlnk: morep.o */
+
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "morep.h"
+#include "verbose.h"
+
+char *progname = NULL;
+
+int stop = 0;
+
+DECLARE_VERBOSE_LEVEL (morep, INFO);
+
+char *words[] = {"Quo", "cognito", "Constantius", "ultra", "mortalem", "modum", "exarsit", "ac", "nequo", "casu", "idem", "Gallus", "de", "futuris", "incertus", "agitare", "quaedam", "conducentia", "saluti", "suae", "per", "itinera", "conaretur,", "remoti", "sunt", "omnes", "de", "industria", "milites", "agentes", "in", "civitatibus", "perviis.", NULL};
+
+#define BUFMAX 4096
+
+void sig_handler (int sig)
+{
+ switch (sig) {
+ case SIGINT:
+ //stop = 1;
+ exit (0);
+ break;
+ case SIGTERM:
+ exit (0);
+ break;
+ }
+}
+
+int server (char *url)
+{
+ VERBOSE (morep, TRACE, PRINTF ("server\n"));
+
+ int morep = MOREP_Connect (url);
+ if (morep < 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
+ return -1;
+ }
+
+ VERBOSE (morep, INFO, PRINTF ("server started at '%s' (%d)\n", url, morep));
+
+ signal(SIGINT, sig_handler);
+ signal(SIGTERM, sig_handler);
+
+ int i = 0;
+ while (!stop) {
+
+ uint8_t rxmsgtype = 0;
+ int rxmsglen = 0;
+ uint8_t rxbuffer[1496 * 16] = {0};
+ int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+ VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
+ VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
+
+ uint8_t txmsgtype = 0x01;
+ int txmsglen = strlen (words[i]);
+ int txseqnum = MOREP_Send (morep, txmsgtype, (uint8_t *)words[i], txmsglen);
+ VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+ VERBOSE (morep, TRACE, PRINTF ("tx msg: '%s'\n", words[i]));
+ if (words[++i] == NULL) {
+ i = 0;
+ }
+ }
+
+ MOREP_Close (morep);
+
+ return 0;
+}
+
+int clientline (char *url, uint8_t txmsgtype, char *filename)
+{
+ VERBOSE (morep, TRACE, PRINTF ("client\n"));
+
+ /* open connection */
+ int morep = MOREP_Connect (url);
+ if (morep < 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
+ return -1;
+ }
+
+ /* read file */
+ FILE *fid = stdin;
+ if (filename != NULL) {
+ fid = fopen (filename, "r");
+ if (fid == NULL) {
+ VERBOSE (morep, ERROR, PRINTF ("can't open file '%s' for reading\n", filename));
+ return -1;
+ }
+ }
+
+ while (!feof (fid)) {
+ int txmsglen = 1496;
+ uint8_t txbuffer[1496] = {0};
+ int i = 0;
+ do {
+ fread (txbuffer + i, 1, 1, fid);
+ if ((txbuffer[i] == '\n') || (txbuffer[i] == '\r')) {
+ txbuffer[i] = 0;
+ }
+ } while ((txbuffer[i] != 0) && (++i < txmsglen));
+ if ((i == 0) && feof (fid)) {
+ continue;
+ }
+ txmsglen = i;
+ if ((txmsglen == 0) && (errno != 0)) {
+ VERBOSE (morep, ERROR, PRINTF ("can't read data from file '%s'\n", filename));
+ return -1;
+ }
+
+ int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
+ VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+ VERBOSE (morep, TRACE, PRINTF ("tx msg: '%s'\n", txbuffer));
+
+ uint8_t rxmsgtype = 0;
+ int rxmsglen = 0;
+ uint8_t rxbuffer[1496] = {0};
+ int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+ VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
+ VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
+ }
+
+ if (fid != stdin) {
+ fclose (fid);
+ }
+ MOREP_Close (morep);
+
+ return 0;
+}
+
+
+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 clientfile (char *url, uint8_t txmsgtype, char *filename)
+{
+ VERBOSE (morep, TRACE, PRINTF ("client\n"));
+
+ /* open connection */
+ int morep = MOREP_Connect (url);
+ if (morep < 0) {
+ VERBOSE (morep, ERROR, PRINTF ("can't connect on url '%s'\n", url));
+ return -1;
+ }
+
+ /* read file */
+ FILE *fid = stdin;
+ if (filename != NULL) {
+ fid = fopen (filename, "r");
+ if (fid == NULL) {
+ VERBOSE (morep, ERROR, PRINTF ("can't open file '%s' for reading\n", filename));
+ return -1;
+ }
+ }
+ int len = 0;
+ uint8_t *buffer = (uint8_t *) readstream (fid, &len);
+ if (fid != stdin) {
+ fclose (fid);
+ }
+
+ uint8_t *txbuffer = buffer;
+ while (len > 0) {
+ int txmsglen = 1496 * 16 - 1;
+ if (len < txmsglen) {
+ txmsglen = len;
+ }
+ int txseqnum = MOREP_Send (morep, txmsgtype, txbuffer, txmsglen);
+ VERBOSE (morep, INFO, PRINTF ("tx %d bytes (msgid %d) [%d]\n", txmsglen, txmsgtype, txseqnum));
+ VERBOSE (morep, TRACE, PRINTF ("tx msg: '"); fwrite ((char *)txbuffer, 1, txmsglen, stdout); printf ("'\n"));
+ len -= txmsglen;
+ txbuffer -= txmsglen;
+
+ uint8_t rxmsgtype = 0;
+ int rxmsglen = 0;
+ uint8_t rxbuffer[1496 * 16] = {0};
+ int rxseqnum = MOREP_Receive (morep, &rxmsgtype, rxbuffer, &rxmsglen);
+ VERBOSE (morep, INFO, PRINTF ("rx %d bytes (msgid %d) [%d]\n", rxmsglen, rxmsgtype, rxseqnum));
+ VERBOSE (morep, TRACE, PRINTF ("rx msg: '"); fwrite ((char *)rxbuffer, 1, rxmsglen, stdout); printf ("'\n"));
+ }
+
+ free (buffer);
+ MOREP_Close (morep);
+
+ return 0;
+}
+
+int main (int argc, char **argv)
+{
+ char *filename = NULL;
+ int msgtype = -1;
+ char *url = NULL;
+ int linebyline = 1;
+
+ /* get basename */
+ char *pt = progname = argv[0];
+ while (*pt) {
+ if ((*pt == '/') || (*pt == '\\')) {
+ progname = pt + 1;
+ }
+ pt++;
+ }
+
+ /* process argument */
+ while (argc-- > 1) {
+ char *arg = *(++argv);
+ if (arg[0] != '-') {
+ url = arg;
+ continue;
+ }
+ char c = arg[1];
+ switch (c) {
+ case 'b':
+ linebyline = 0;
+ break;
+ case 'f':
+ arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+ if (arg == NULL) {
+ VERBOSE (morep, ERROR, PRINTF ("%s: message file not specified\n", progname));
+ return 1;
+ }
+ filename = arg;
+ break;
+ case 'l':
+ linebyline = 1;
+ break;
+ case 's':
+ arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+ if (arg == NULL) {
+ VERBOSE (morep, ERROR, PRINTF ("%s: message type not specified\n", progname));
+ return 1;
+ }
+ msgtype = atoi (arg);
+ break;
+ case 'v':
+ arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
+ if (arg == NULL) {
+ VERBOSE (morep, ERROR, PRINTF ("%s: verbose level not specified\n", progname));
+ return 1;
+ }
+ CHANGE_VERBOSE_LEVEL (morep, atoi (arg));
+ break;
+ case 'h':
+ default:
+ printf ("usage: %s [-b|-l] [-h] [-f file] [-s msgtype] [-v int] <url>\n", progname);
+ return (c != 'h');
+ }
+ }
+
+ int rc = 1;
+ if (url == NULL) {
+ VERBOSE (morep, ERROR, PRINTF ("missing url\n"));
+ } else if (msgtype != -1) {
+ if (linebyline) {
+ rc = clientline (url, msgtype, filename);
+ } else {
+ rc = clientfile (url, msgtype, filename);
+ }
+ } else {
+ rc = server (url);
+ }
+
+ return rc;
+}
+
+/* test: morep_test.exe -h | grep usage */
+/* test: morep_test.exe 2>&1 | grep "missing url" */
+/* test: morep_test.exe lo:/du:mm:yi:nt:er:fa/0808 2>&1 | grep "can't parse interface" */
+/* test: morep_test.exe lo://du:mm:yi:nt:er:fa/0808 2>&1 | grep "can't parse mac" */
+/* test: morep_test.exe lo://00:00:00:00:00:00/foo 2>&1 | grep "can't parse ethertype" */
+/* test: morep_test.exe foo://00:00:00:00:00:00/0808 2>&1 | grep "No such device" */
+/* test: morep_test.exe lo://00:00:00:00:00:00/0808 -l -f foobar -s 42 2>&1 | grep "can't open file" */
+/* test: morep_test.exe lo://00:00:00:00:00:00/0808 -b -f foobar -s 42 2>&1 | grep "can't open file" */
+/* test: morep_test.exe lo://00:00:00:00:00:00/0808 -l -f makefile -s 42 -v 3 */
+/* test: morep_test.exe lo://00:00:00:00:00:00/0808 -l -f makefile -s 42 -v 4 | grep "rx msg: '$(tail -1 makefile)" */
+/* test: morep_test.exe lo://00:00:00:00:00:00/0808 -l -f makefile -s 42 -v 4 | grep -v "WARNING" */
+/* test: morep_test.exe lo://00:00:00:00:00:f9/0808 -b -f morep.c -s 42 -v 3 */
+/* test: morep_test.exe lo://00:00:00:00:00:00/0808 -b -f morep.c -s 42 -v 3 | grep "rx $(cat morep.c | wc -c) bytes" */
+/* test: morep_test.exe lo://00:00:00:00:00:00/0808 -b -f morep.c -s 42 -v 3 | grep -v "WARNING" */
+
+/* vim: set ts=4 sw=4 et: */