rename test program
authorMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Mar 2025 19:29:53 +0000 (20:29 +0100)
committerMazet Laurent <laurent.mazet@thalesgroup.com>
Thu, 27 Mar 2025 19:29:53 +0000 (20:29 +0100)
makefile
morep_server.c [deleted file]
morep_test.c [new file with mode: 0644]

index d9f32256416cb086a5a1672c04228fc162eac396..2431ad23fd16282980ac3cd7cd805c522719a193 100644 (file)
--- a/makefile
+++ b/makefile
@@ -38,8 +38,7 @@ endif
 # Targets
 
 ALLEXE  =
-ALLEXE += morep_server
-#ALLEXE += morep_test
+ALLEXE += morep_test
 
 SHELL = bash
 
diff --git a/morep_server.c b/morep_server.c
deleted file mode 100644 (file)
index 45e913d..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
-  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: */
diff --git a/morep_test.c b/morep_test.c
new file mode 100644 (file)
index 0000000..7688c90
--- /dev/null
@@ -0,0 +1,328 @@
+/*
+  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: */