From: Mazet Laurent Date: Thu, 27 Mar 2025 19:29:53 +0000 (+0100) Subject: rename test program X-Git-Tag: v1.0~87 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=124d75550bf89dc2b38a3430ba13bb99aaf666fb;p=morep.git rename test program --- diff --git a/makefile b/makefile index d9f3225..2431ad2 100644 --- 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 index 45e913d..0000000 --- a/morep_server.c +++ /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 - - Description : Raw Ethernet packet server for MOREP library - - History : - - initial version -*/ - -/* depend: */ -/* cflags: */ -/* linker: morep.o */ -/* winlnk: morep.o */ - -#include -#include -#include -#include -#include - -#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] \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 index 0000000..7688c90 --- /dev/null +++ b/morep_test.c @@ -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 + + Description : Raw Ethernet packet test program for MOREP library + + History : + - initial version +*/ + +/* depend: */ +/* cflags: */ +/* linker: morep.o */ +/* winlnk: morep.o */ + +#include +#include +#include +#include +#include + +#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] \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: */