aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan McCrohan <jmccrohan@gmail.com>2011-10-12 21:50:48 +0100
committerJonathan McCrohan <jmccrohan@gmail.com>2011-10-12 21:50:48 +0100
commit6cfbf2dee130cc36a72d57adea0e9c04bb31f620 (patch)
tree638bcaf4c63e3d3be17e0f5e7d74639394d15702
downloadverteco-6cfbf2dee130cc36a72d57adea0e9c04bb31f620.tar.gz
Initial commit
Diffstat (limited to '')
-rw-r--r--libconfig/example.cfg46
-rw-r--r--libconfig/example1.c117
-rw-r--r--libconfig/jmccrohan-example.c93
-rw-r--r--libconfig/jmccrohan-example.cfg47
-rwxr-xr-xlibconfig/myprogrambin0 -> 9968 bytes
-rwxr-xr-xtests/.libs/bandwidth-clientbin0 -> 17863 bytes
-rwxr-xr-xtests/.libs/bandwidth-server-many-upbin0 -> 15765 bytes
-rwxr-xr-xtests/.libs/bandwidth-server-onebin0 -> 14927 bytes
-rwxr-xr-xtests/.libs/lt-random-test-clientbin0 -> 17944 bytes
-rwxr-xr-xtests/.libs/lt-unit-test-clientbin0 -> 30776 bytes
-rwxr-xr-xtests/.libs/lt-unit-test-serverbin0 -> 20113 bytes
-rwxr-xr-xtests/.libs/lt-versionbin0 -> 10471 bytes
-rwxr-xr-xtests/.libs/random-test-clientbin0 -> 17896 bytes
-rwxr-xr-xtests/.libs/random-test-serverbin0 -> 12678 bytes
-rwxr-xr-xtests/.libs/unit-test-clientbin0 -> 29848 bytes
-rwxr-xr-xtests/.libs/unit-test-serverbin0 -> 20049 bytes
-rwxr-xr-xtests/.libs/versionbin0 -> 10423 bytes
-rw-r--r--tests/Makefile585
-rw-r--r--tests/Makefile.am41
-rw-r--r--tests/Makefile.in585
-rw-r--r--tests/README38
-rwxr-xr-xtests/bandwidth-client225
-rw-r--r--tests/bandwidth-client.c220
-rw-r--r--tests/bandwidth-client.obin0 -> 22288 bytes
-rwxr-xr-xtests/bandwidth-server-many-up225
-rw-r--r--tests/bandwidth-server-many-up.c143
-rw-r--r--tests/bandwidth-server-many-up.obin0 -> 15216 bytes
-rwxr-xr-xtests/bandwidth-server-one225
-rw-r--r--tests/bandwidth-server-one.c93
-rw-r--r--tests/bandwidth-server-one.obin0 -> 14432 bytes
-rwxr-xr-xtests/random-test-clientbin0 -> 12956 bytes
-rw-r--r--tests/random-test-client.c253
-rw-r--r--tests/random-test-client.obin0 -> 20776 bytes
-rwxr-xr-xtests/random-test-serverbin0 -> 9638 bytes
-rw-r--r--tests/random-test-server.c66
-rw-r--r--tests/random-test-server.obin0 -> 10152 bytes
-rwxr-xr-xtests/unit-test-client225
-rw-r--r--tests/unit-test-client.c690
-rw-r--r--tests/unit-test-client.obin0 -> 43688 bytes
-rwxr-xr-xtests/unit-test-server225
-rw-r--r--tests/unit-test-server.c155
-rw-r--r--tests/unit-test-server.obin0 -> 23360 bytes
-rw-r--r--tests/unit-test.h62
-rwxr-xr-xtests/version225
-rw-r--r--tests/version.c36
-rw-r--r--tests/version.obin0 -> 7440 bytes
-rwxr-xr-xvertecobin0 -> 9589 bytes
-rw-r--r--verteco.c63
48 files changed, 4683 insertions, 0 deletions
diff --git a/libconfig/example.cfg b/libconfig/example.cfg
new file mode 100644
index 0000000..03b73e6
--- /dev/null
+++ b/libconfig/example.cfg
@@ -0,0 +1,46 @@
+// An example configuration file that stores information about a store.
+
+// Basic store information:
+name = "Books, Movies & More";
+
+// Store inventory:
+inventory =
+ {
+ books = ( { title = "Treasure Island";
+ author = "Robert Louis Stevenson";
+ price = 29.99;
+ qty = 5; },
+ { title = "Snow Crash";
+ author = "Neal Stephenson";
+ price = 9.99;
+ qty = 8; }
+ );
+
+ movies = ( { title = "Brazil";
+ media = "DVD";
+ price = 19.99;
+ qty = 11; },
+ { title = "The City of Lost Children";
+ media = "DVD";
+ price = 18.99;
+ qty = 5; },
+ { title = "Memento";
+ media = "Blu-Ray";
+ price = 24.99;
+ qty = 20;
+ },
+ { title = "Howard the Duck"; }
+ );
+};
+
+// Store hours:
+hours =
+{
+ mon = { open = 9; close = 18; };
+ tue = { open = 9; close = 18; };
+ wed = { open = 9; close = 18; };
+ thu = { open = 9; close = 18; };
+ fri = { open = 9; close = 20; };
+ sat = { open = 9; close = 20; };
+ sun = { open = 11; close = 16; };
+};
diff --git a/libconfig/example1.c b/libconfig/example1.c
new file mode 100644
index 0000000..56661f3
--- /dev/null
+++ b/libconfig/example1.c
@@ -0,0 +1,117 @@
+/* ----------------------------------------------------------------------------
+ libconfig - A library for processing structured configuration files
+ Copyright (C) 2005-2010 Mark A Lindner
+
+ This file is part of libconfig.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 2.1 of
+ the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, see
+ <http://www.gnu.org/licenses/>.
+ ----------------------------------------------------------------------------
+*/
+
+// gcc `pkg-config --cflags libconfig` example1.c -o myprogram `pkg-config --libs libconfig`
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <libconfig.h>
+
+/* This example reads the configuration file 'example.cfg' and displays
+ * some of its contents.
+ */
+
+int main(int argc, char **argv)
+{
+ config_t cfg;
+ config_setting_t *setting;
+ const char *str;
+
+ config_init(&cfg);
+
+ /* Read the file. If there is an error, report it and exit. */
+ if(! config_read_file(&cfg, "example.cfg"))
+ {
+ fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
+ config_error_line(&cfg), config_error_text(&cfg));
+ config_destroy(&cfg);
+ return(EXIT_FAILURE);
+ }
+
+ /* Get the store name. */
+ if(config_lookup_string(&cfg, "name", &str))
+ printf("Store name: %s\n\n", str);
+ else
+ fprintf(stderr, "No 'name' setting in configuration file.\n");
+
+ /* Output a list of all books in the inventory. */
+ setting = config_lookup(&cfg, "inventory.books");
+ if(setting != NULL)
+ {
+ int count = config_setting_length(setting);
+ int i;
+
+ printf("%-30s %-30s %-6s %s\n", "TITLE", "AUTHOR", "PRICE", "QTY");
+
+ for(i = 0; i < count; ++i)
+ {
+ config_setting_t *book = config_setting_get_elem(setting, i);
+
+ /* Only output the record if all of the expected fields are present. */
+ const char *title, *author;
+ double price;
+ int qty;
+
+ if(!(config_setting_lookup_string(book, "title", &title)
+ && config_setting_lookup_string(book, "author", &author)
+ && config_setting_lookup_float(book, "price", &price)
+ && config_setting_lookup_int(book, "qty", &qty)))
+ continue;
+
+ printf("%-30s %-30s $%6.2f %3d\n", title, author, price, qty);
+ }
+ putchar('\n');
+ }
+
+ /* Output a list of all movies in the inventory. */
+ setting = config_lookup(&cfg, "inventory.movies");
+ if(setting != NULL)
+ {
+ unsigned int count = config_setting_length(setting);
+ unsigned int i;
+
+ printf("%-30s %-10s %-6s %s\n", "TITLE", "MEDIA", "PRICE", "QTY");
+ for(i = 0; i < count; ++i)
+ {
+ config_setting_t *movie = config_setting_get_elem(setting, i);
+
+ /* Only output the record if all of the expected fields are present. */
+ const char *title, *media;
+ double price;
+ int qty;
+
+ if(!(config_setting_lookup_string(movie, "title", &title)
+ && config_setting_lookup_string(movie, "media", &media)
+ && config_setting_lookup_float(movie, "price", &price)
+ && config_setting_lookup_int(movie, "qty", &qty)))
+ continue;
+
+ printf("%-30s %-10s $%6.2f %3d\n", title, media, price, qty);
+ }
+ putchar('\n');
+ }
+
+ config_destroy(&cfg);
+ return(EXIT_SUCCESS);
+}
+
+/* eof */
diff --git a/libconfig/jmccrohan-example.c b/libconfig/jmccrohan-example.c
new file mode 100644
index 0000000..1dbb6da
--- /dev/null
+++ b/libconfig/jmccrohan-example.c
@@ -0,0 +1,93 @@
+// gcc `pkg-config --cflags libconfig` example1.c -o myprogram `pkg-config --libs libconfig`
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <libconfig.h>
+
+#define CONFIG_FILE jmccrohan-example.cfg
+
+int main(int argc, char **argv)
+{
+ config_t cfg;
+ config_setting_t *setting;
+ const char *str;
+
+ config_init(&cfg);
+
+ /* Read the file. If there is an error, report it and exit. */
+ if(! config_read_file(&cfg, "CONFIG_FILE"))
+ {
+ fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
+ config_error_line(&cfg), config_error_text(&cfg));
+ config_destroy(&cfg);
+ return(EXIT_FAILURE);
+ }
+
+ /* Get the store name. */
+ if(config_lookup_string(&cfg, "version", &str))
+ printf("Store name: %s\n\n", str);
+ else
+ fprintf(stderr, "No 'version' setting in configuration file.\n");
+
+ /* Output a list of all books in the inventory. */
+ setting = config_lookup(&cfg, "inventory.books");
+ if(setting != NULL)
+ {
+ int count = config_setting_length(setting);
+ int i;
+
+ printf("%-30s %-30s %-6s %s\n", "TITLE", "AUTHOR", "PRICE", "QTY");
+
+ for(i = 0; i < count; ++i)
+ {
+ config_setting_t *book = config_setting_get_elem(setting, i);
+
+ /* Only output the record if all of the expected fields are present. */
+ const char *title, *author;
+ double price;
+ int qty;
+
+ if(!(config_setting_lookup_string(book, "title", &title)
+ && config_setting_lookup_string(book, "author", &author)
+ && config_setting_lookup_float(book, "price", &price)
+ && config_setting_lookup_int(book, "qty", &qty)))
+ continue;
+
+ printf("%-30s %-30s $%6.2f %3d\n", title, author, price, qty);
+ }
+ putchar('\n');
+ }
+
+ /* Output a list of all movies in the inventory. */
+ setting = config_lookup(&cfg, "inventory.movies");
+ if(setting != NULL)
+ {
+ unsigned int count = config_setting_length(setting);
+ unsigned int i;
+
+ printf("%-30s %-10s %-6s %s\n", "TITLE", "MEDIA", "PRICE", "QTY");
+ for(i = 0; i < count; ++i)
+ {
+ config_setting_t *movie = config_setting_get_elem(setting, i);
+
+ /* Only output the record if all of the expected fields are present. */
+ const char *title, *media;
+ double price;
+ int qty;
+
+ if(!(config_setting_lookup_string(movie, "title", &title)
+ && config_setting_lookup_string(movie, "media", &media)
+ && config_setting_lookup_float(movie, "price", &price)
+ && config_setting_lookup_int(movie, "qty", &qty)))
+ continue;
+
+ printf("%-30s %-10s $%6.2f %3d\n", title, media, price, qty);
+ }
+ putchar('\n');
+ }
+
+ config_destroy(&cfg);
+ return(EXIT_SUCCESS);
+}
+
+/* eof */
diff --git a/libconfig/jmccrohan-example.cfg b/libconfig/jmccrohan-example.cfg
new file mode 100644
index 0000000..b217dfb
--- /dev/null
+++ b/libconfig/jmccrohan-example.cfg
@@ -0,0 +1,47 @@
+// An example configuration file that stores information about a store.
+
+// Basic store information:
+version = "0.99beta";
+
+// Store inventory:
+modbusdevices =
+{
+ monday = (
+ { time = "05:00";
+ author = "Robert Louis Stevenson";
+ price = 29.99;
+ qty = 5; },
+ { title = "Snow Crash";
+ author = "Neal Stephenson";
+ price = 9.99;
+ qty = 8; }
+ );
+
+ movies = ( { title = "Brazil";
+ media = "DVD";
+ price = 19.99;
+ qty = 11; },
+ { title = "The City of Lost Children";
+ media = "DVD";
+ price = 18.99;
+ qty = 5; },
+ { title = "Memento";
+ media = "Blu-Ray";
+ price = 24.99;
+ qty = 20;
+ },
+ { title = "Howard the Duck"; }
+ );
+};
+
+// Store hours:
+hours =
+{
+ mon = { open = 9; close = 18; };
+ tue = { open = 9; close = 18; };
+ wed = { open = 9; close = 18; };
+ thu = { open = 9; close = 18; };
+ fri = { open = 9; close = 20; };
+ sat = { open = 9; close = 20; };
+ sun = { open = 11; close = 16; };
+};
diff --git a/libconfig/myprogram b/libconfig/myprogram
new file mode 100755
index 0000000..8e28bdd
--- /dev/null
+++ b/libconfig/myprogram
Binary files differ
diff --git a/tests/.libs/bandwidth-client b/tests/.libs/bandwidth-client
new file mode 100755
index 0000000..4d82059
--- /dev/null
+++ b/tests/.libs/bandwidth-client
Binary files differ
diff --git a/tests/.libs/bandwidth-server-many-up b/tests/.libs/bandwidth-server-many-up
new file mode 100755
index 0000000..9f3e0b5
--- /dev/null
+++ b/tests/.libs/bandwidth-server-many-up
Binary files differ
diff --git a/tests/.libs/bandwidth-server-one b/tests/.libs/bandwidth-server-one
new file mode 100755
index 0000000..f14a514
--- /dev/null
+++ b/tests/.libs/bandwidth-server-one
Binary files differ
diff --git a/tests/.libs/lt-random-test-client b/tests/.libs/lt-random-test-client
new file mode 100755
index 0000000..168d3c4
--- /dev/null
+++ b/tests/.libs/lt-random-test-client
Binary files differ
diff --git a/tests/.libs/lt-unit-test-client b/tests/.libs/lt-unit-test-client
new file mode 100755
index 0000000..72c8ca1
--- /dev/null
+++ b/tests/.libs/lt-unit-test-client
Binary files differ
diff --git a/tests/.libs/lt-unit-test-server b/tests/.libs/lt-unit-test-server
new file mode 100755
index 0000000..4a6d570
--- /dev/null
+++ b/tests/.libs/lt-unit-test-server
Binary files differ
diff --git a/tests/.libs/lt-version b/tests/.libs/lt-version
new file mode 100755
index 0000000..7b81ff1
--- /dev/null
+++ b/tests/.libs/lt-version
Binary files differ
diff --git a/tests/.libs/random-test-client b/tests/.libs/random-test-client
new file mode 100755
index 0000000..17d9c36
--- /dev/null
+++ b/tests/.libs/random-test-client
Binary files differ
diff --git a/tests/.libs/random-test-server b/tests/.libs/random-test-server
new file mode 100755
index 0000000..d0d9010
--- /dev/null
+++ b/tests/.libs/random-test-server
Binary files differ
diff --git a/tests/.libs/unit-test-client b/tests/.libs/unit-test-client
new file mode 100755
index 0000000..4920d69
--- /dev/null
+++ b/tests/.libs/unit-test-client
Binary files differ
diff --git a/tests/.libs/unit-test-server b/tests/.libs/unit-test-server
new file mode 100755
index 0000000..6a426ab
--- /dev/null
+++ b/tests/.libs/unit-test-server
Binary files differ
diff --git a/tests/.libs/version b/tests/.libs/version
new file mode 100755
index 0000000..c88ec66
--- /dev/null
+++ b/tests/.libs/version
Binary files differ
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 0000000..88d829e
--- /dev/null
+++ b/tests/Makefile
@@ -0,0 +1,585 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# tests/Makefile. Generated from Makefile.in by configure.
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+
+
+pkgdatadir = $(datadir)/libmodbus
+pkgincludedir = $(includedir)/libmodbus
+pkglibdir = $(libdir)/libmodbus
+pkglibexecdir = $(libexecdir)/libmodbus
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = x86_64-pc-linux-gnu
+host_triplet = x86_64-pc-linux-gnu
+noinst_PROGRAMS = bandwidth-server-one$(EXEEXT) \
+ bandwidth-server-many-up$(EXEEXT) bandwidth-client$(EXEEXT) \
+ random-test-server$(EXEEXT) random-test-client$(EXEEXT) \
+ unit-test-server$(EXEEXT) unit-test-client$(EXEEXT) \
+ version$(EXEEXT)
+subdir = tests
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+am_bandwidth_client_OBJECTS = bandwidth-client.$(OBJEXT)
+bandwidth_client_OBJECTS = $(am_bandwidth_client_OBJECTS)
+bandwidth_client_DEPENDENCIES = $(common_ldflags)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+am_bandwidth_server_many_up_OBJECTS = \
+ bandwidth-server-many-up.$(OBJEXT)
+bandwidth_server_many_up_OBJECTS = \
+ $(am_bandwidth_server_many_up_OBJECTS)
+bandwidth_server_many_up_DEPENDENCIES = $(common_ldflags)
+am_bandwidth_server_one_OBJECTS = bandwidth-server-one.$(OBJEXT)
+bandwidth_server_one_OBJECTS = $(am_bandwidth_server_one_OBJECTS)
+bandwidth_server_one_DEPENDENCIES = $(common_ldflags)
+am_random_test_client_OBJECTS = random-test-client.$(OBJEXT)
+random_test_client_OBJECTS = $(am_random_test_client_OBJECTS)
+random_test_client_DEPENDENCIES = $(common_ldflags)
+am_random_test_server_OBJECTS = random-test-server.$(OBJEXT)
+random_test_server_OBJECTS = $(am_random_test_server_OBJECTS)
+random_test_server_DEPENDENCIES = $(common_ldflags)
+am_unit_test_client_OBJECTS = unit-test-client.$(OBJEXT)
+unit_test_client_OBJECTS = $(am_unit_test_client_OBJECTS)
+unit_test_client_DEPENDENCIES = $(common_ldflags)
+am_unit_test_server_OBJECTS = unit-test-server.$(OBJEXT)
+unit_test_server_OBJECTS = $(am_unit_test_server_OBJECTS)
+unit_test_server_DEPENDENCIES = $(common_ldflags)
+am_version_OBJECTS = version.$(OBJEXT)
+version_OBJECTS = $(am_version_OBJECTS)
+version_DEPENDENCIES = $(common_ldflags)
+DEFAULT_INCLUDES = -I. -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(bandwidth_client_SOURCES) \
+ $(bandwidth_server_many_up_SOURCES) \
+ $(bandwidth_server_one_SOURCES) $(random_test_client_SOURCES) \
+ $(random_test_server_SOURCES) $(unit_test_client_SOURCES) \
+ $(unit_test_server_SOURCES) $(version_SOURCES)
+DIST_SOURCES = $(bandwidth_client_SOURCES) \
+ $(bandwidth_server_many_up_SOURCES) \
+ $(bandwidth_server_one_SOURCES) $(random_test_client_SOURCES) \
+ $(random_test_server_SOURCES) $(unit_test_client_SOURCES) \
+ $(unit_test_server_SOURCES) $(version_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = ${SHELL} /home/jmccrohan/bin/libmodbus/missing --run aclocal-1.11
+AMTAR = ${SHELL} /home/jmccrohan/bin/libmodbus/missing --run tar
+AM_DEFAULT_VERBOSITY = 1
+AR = ar
+AS = as
+AUTOCONF = ${SHELL} /home/jmccrohan/bin/libmodbus/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/jmccrohan/bin/libmodbus/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/jmccrohan/bin/libmodbus/missing --run automake-1.11
+AWK = gawk
+CC = gcc
+CCDEPMODE = depmode=none
+CFLAGS = -g -O2 -g -O2 -Wall -Werror
+CPP = gcc -E
+CPPFLAGS =
+CXX = g++
+CXXCPP = g++ -E
+CXXDEPMODE = depmode=none
+CXXFLAGS = -g -O2 -g -O2 -Wall
+CYGPATH_W = echo
+DEFS = -DHAVE_CONFIG_H
+DEPDIR = .deps
+DLLTOOL = false
+DSYMUTIL =
+DUMPBIN =
+ECHO_C =
+ECHO_N = -n
+ECHO_T =
+EGREP = /bin/grep -E
+EXEEXT =
+FGREP = /bin/grep -F
+GREP = /bin/grep
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = ${INSTALL} -m 644
+INSTALL_PROGRAM = ${INSTALL}
+INSTALL_SCRIPT = ${INSTALL}
+INSTALL_STRIP_PROGRAM = $(install_sh) -c -s
+LD = /usr/bin/ld -m elf_x86_64
+LDFLAGS =
+LIBMODBUS_LT_VERSION_INFO = 5:0:0
+LIBMODBUS_VERSION = 3.0.1
+LIBMODBUS_VERSION_MAJOR = 3
+LIBMODBUS_VERSION_MICRO = 1
+LIBMODBUS_VERSION_MINOR = 0
+LIBOBJS =
+LIBS =
+LIBTOOL = $(SHELL) $(top_builddir)/libtool
+LIPO =
+LN_S = ln -s
+LTLIBOBJS =
+MAKEINFO = ${SHELL} /home/jmccrohan/bin/libmodbus/missing --run makeinfo
+MANIFEST_TOOL = :
+MKDIR_P = /bin/mkdir -p
+NM = /usr/bin/nm -B
+NMEDIT =
+OBJDUMP = objdump
+OBJEXT = o
+OTOOL =
+OTOOL64 =
+PACKAGE = libmodbus
+PACKAGE_BUGREPORT = https://github.com/stephane/libmodbus/issues
+PACKAGE_NAME = libmodbus
+PACKAGE_STRING = libmodbus 3.0.1
+PACKAGE_TARNAME = libmodbus
+PACKAGE_URL =
+PACKAGE_VERSION = 3.0.1
+PATH_SEPARATOR = :
+RANLIB = ranlib
+SED = /bin/sed
+SET_MAKE =
+SHELL = /bin/bash
+STRIP = strip
+VERSION = 3.0.1
+abs_builddir = /home/jmccrohan/bin/libmodbus/tests
+abs_srcdir = /home/jmccrohan/bin/libmodbus/tests
+abs_top_builddir = /home/jmccrohan/bin/libmodbus
+abs_top_srcdir = /home/jmccrohan/bin/libmodbus
+ac_ct_AR = ar
+ac_ct_CC = gcc
+ac_ct_CXX = g++
+ac_ct_DUMPBIN =
+ac_libmodbus_have_asciidoc = yes
+ac_libmodbus_have_xmlto = yes
+am__include = include
+am__leading_dot = .
+am__quote =
+am__tar = ${AMTAR} chof - "$$tardir"
+am__untar = ${AMTAR} xf -
+bindir = ${exec_prefix}/bin
+build = x86_64-pc-linux-gnu
+build_alias = x86_64-linux-gnu
+build_cpu = x86_64
+build_os = linux-gnu
+build_vendor = pc
+builddir = .
+datadir = ${datarootdir}
+datarootdir = ${prefix}/share
+docdir = ${datarootdir}/doc/${PACKAGE_TARNAME}
+dvidir = ${docdir}
+exec_prefix = ${prefix}
+host = x86_64-pc-linux-gnu
+host_alias =
+host_cpu = x86_64
+host_os = linux-gnu
+host_vendor = pc
+htmldir = ${docdir}
+includedir = ${prefix}/include
+infodir = ${prefix}/share/info
+install_sh = ${SHELL} /home/jmccrohan/bin/libmodbus/install-sh
+libdir = ${exec_prefix}/lib
+libexecdir = ${prefix}/lib/libmodbus
+localedir = ${datarootdir}/locale
+localstatedir = /var
+mandir = ${prefix}/share/man
+mkdir_p = /bin/mkdir -p
+oldincludedir = /usr/include
+pdfdir = ${docdir}
+prefix = /usr
+program_transform_name = s,x,x,
+psdir = ${docdir}
+sbindir = ${exec_prefix}/sbin
+sharedstatedir = ${prefix}/com
+srcdir = .
+sysconfdir = /etc
+target_alias =
+top_build_prefix = ../
+top_builddir = ..
+top_srcdir = ..
+EXTRA_DIST = README
+common_ldflags = \
+ $(top_builddir)/src/libmodbus.la
+
+bandwidth_server_one_SOURCES = bandwidth-server-one.c
+bandwidth_server_one_LDADD = $(common_ldflags)
+bandwidth_server_many_up_SOURCES = bandwidth-server-many-up.c
+bandwidth_server_many_up_LDADD = $(common_ldflags)
+bandwidth_client_SOURCES = bandwidth-client.c
+bandwidth_client_LDADD = $(common_ldflags)
+random_test_server_SOURCES = random-test-server.c
+random_test_server_LDADD = $(common_ldflags)
+random_test_client_SOURCES = random-test-client.c
+random_test_client_LDADD = $(common_ldflags)
+unit_test_server_SOURCES = unit-test-server.c unit-test.h
+unit_test_server_LDADD = $(common_ldflags)
+unit_test_client_SOURCES = unit-test-client.c unit-test.h
+unit_test_client_LDADD = $(common_ldflags)
+version_SOURCES = version.c
+version_LDADD = $(common_ldflags)
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
+CLEANFILES = *~
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+bandwidth-client$(EXEEXT): $(bandwidth_client_OBJECTS) $(bandwidth_client_DEPENDENCIES)
+ @rm -f bandwidth-client$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(bandwidth_client_OBJECTS) $(bandwidth_client_LDADD) $(LIBS)
+bandwidth-server-many-up$(EXEEXT): $(bandwidth_server_many_up_OBJECTS) $(bandwidth_server_many_up_DEPENDENCIES)
+ @rm -f bandwidth-server-many-up$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(bandwidth_server_many_up_OBJECTS) $(bandwidth_server_many_up_LDADD) $(LIBS)
+bandwidth-server-one$(EXEEXT): $(bandwidth_server_one_OBJECTS) $(bandwidth_server_one_DEPENDENCIES)
+ @rm -f bandwidth-server-one$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(bandwidth_server_one_OBJECTS) $(bandwidth_server_one_LDADD) $(LIBS)
+random-test-client$(EXEEXT): $(random_test_client_OBJECTS) $(random_test_client_DEPENDENCIES)
+ @rm -f random-test-client$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(random_test_client_OBJECTS) $(random_test_client_LDADD) $(LIBS)
+random-test-server$(EXEEXT): $(random_test_server_OBJECTS) $(random_test_server_DEPENDENCIES)
+ @rm -f random-test-server$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(random_test_server_OBJECTS) $(random_test_server_LDADD) $(LIBS)
+unit-test-client$(EXEEXT): $(unit_test_client_OBJECTS) $(unit_test_client_DEPENDENCIES)
+ @rm -f unit-test-client$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(unit_test_client_OBJECTS) $(unit_test_client_LDADD) $(LIBS)
+unit-test-server$(EXEEXT): $(unit_test_server_OBJECTS) $(unit_test_server_DEPENDENCIES)
+ @rm -f unit-test-server$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(unit_test_server_OBJECTS) $(unit_test_server_LDADD) $(LIBS)
+version$(EXEEXT): $(version_OBJECTS) $(version_DEPENDENCIES)
+ @rm -f version$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(version_OBJECTS) $(version_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+#include ./$(DEPDIR)/bandwidth-client.Po
+#include ./$(DEPDIR)/bandwidth-server-many-up.Po
+#include ./$(DEPDIR)/bandwidth-server-one.Po
+#include ./$(DEPDIR)/random-test-client.Po
+#include ./$(DEPDIR)/random-test-server.Po
+#include ./$(DEPDIR)/unit-test-client.Po
+#include ./$(DEPDIR)/unit-test-server.Po
+#include ./$(DEPDIR)/version.Po
+
+.c.o:
+# $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+# $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ $(AM_V_CC) \
+# source='$<' object='$@' libtool=no
+# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp)
+ $(COMPILE) -c $<
+
+.c.obj:
+# $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+# $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+ $(AM_V_CC) \
+# source='$<' object='$@' libtool=no
+# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp)
+ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+# $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+# $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+ $(AM_V_CC) \
+# source='$<' object='$@' libtool=yes
+# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp)
+ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ set x; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstPROGRAMS ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..2633873
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,41 @@
+EXTRA_DIST = README
+
+noinst_PROGRAMS = \
+ bandwidth-server-one \
+ bandwidth-server-many-up \
+ bandwidth-client \
+ random-test-server \
+ random-test-client \
+ unit-test-server \
+ unit-test-client \
+ version
+
+common_ldflags = \
+ $(top_builddir)/src/libmodbus.la
+
+bandwidth_server_one_SOURCES = bandwidth-server-one.c
+bandwidth_server_one_LDADD = $(common_ldflags)
+
+bandwidth_server_many_up_SOURCES = bandwidth-server-many-up.c
+bandwidth_server_many_up_LDADD = $(common_ldflags)
+
+bandwidth_client_SOURCES = bandwidth-client.c
+bandwidth_client_LDADD = $(common_ldflags)
+
+random_test_server_SOURCES = random-test-server.c
+random_test_server_LDADD = $(common_ldflags)
+
+random_test_client_SOURCES = random-test-client.c
+random_test_client_LDADD = $(common_ldflags)
+
+unit_test_server_SOURCES = unit-test-server.c unit-test.h
+unit_test_server_LDADD = $(common_ldflags)
+
+unit_test_client_SOURCES = unit-test-client.c unit-test.h
+unit_test_client_LDADD = $(common_ldflags)
+
+version_SOURCES = version.c
+version_LDADD = $(common_ldflags)
+
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
+CLEANFILES = *~
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..b06860f
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,585 @@
+# Makefile.in generated by automake 1.11.1 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
+# Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+noinst_PROGRAMS = bandwidth-server-one$(EXEEXT) \
+ bandwidth-server-many-up$(EXEEXT) bandwidth-client$(EXEEXT) \
+ random-test-server$(EXEEXT) random-test-client$(EXEEXT) \
+ unit-test-server$(EXEEXT) unit-test-client$(EXEEXT) \
+ version$(EXEEXT)
+subdir = tests
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
+ $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+am_bandwidth_client_OBJECTS = bandwidth-client.$(OBJEXT)
+bandwidth_client_OBJECTS = $(am_bandwidth_client_OBJECTS)
+bandwidth_client_DEPENDENCIES = $(common_ldflags)
+AM_V_lt = $(am__v_lt_$(V))
+am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
+am__v_lt_0 = --silent
+am_bandwidth_server_many_up_OBJECTS = \
+ bandwidth-server-many-up.$(OBJEXT)
+bandwidth_server_many_up_OBJECTS = \
+ $(am_bandwidth_server_many_up_OBJECTS)
+bandwidth_server_many_up_DEPENDENCIES = $(common_ldflags)
+am_bandwidth_server_one_OBJECTS = bandwidth-server-one.$(OBJEXT)
+bandwidth_server_one_OBJECTS = $(am_bandwidth_server_one_OBJECTS)
+bandwidth_server_one_DEPENDENCIES = $(common_ldflags)
+am_random_test_client_OBJECTS = random-test-client.$(OBJEXT)
+random_test_client_OBJECTS = $(am_random_test_client_OBJECTS)
+random_test_client_DEPENDENCIES = $(common_ldflags)
+am_random_test_server_OBJECTS = random-test-server.$(OBJEXT)
+random_test_server_OBJECTS = $(am_random_test_server_OBJECTS)
+random_test_server_DEPENDENCIES = $(common_ldflags)
+am_unit_test_client_OBJECTS = unit-test-client.$(OBJEXT)
+unit_test_client_OBJECTS = $(am_unit_test_client_OBJECTS)
+unit_test_client_DEPENDENCIES = $(common_ldflags)
+am_unit_test_server_OBJECTS = unit-test-server.$(OBJEXT)
+unit_test_server_OBJECTS = $(am_unit_test_server_OBJECTS)
+unit_test_server_DEPENDENCIES = $(common_ldflags)
+am_version_OBJECTS = version.$(OBJEXT)
+version_OBJECTS = $(am_version_OBJECTS)
+version_DEPENDENCIES = $(common_ldflags)
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_$(V))
+am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY))
+am__v_CC_0 = @echo " CC " $@;
+AM_V_at = $(am__v_at_$(V))
+am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY))
+am__v_at_0 = @
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_$(V))
+am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY))
+am__v_CCLD_0 = @echo " CCLD " $@;
+AM_V_GEN = $(am__v_GEN_$(V))
+am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY))
+am__v_GEN_0 = @echo " GEN " $@;
+SOURCES = $(bandwidth_client_SOURCES) \
+ $(bandwidth_server_many_up_SOURCES) \
+ $(bandwidth_server_one_SOURCES) $(random_test_client_SOURCES) \
+ $(random_test_server_SOURCES) $(unit_test_client_SOURCES) \
+ $(unit_test_server_SOURCES) $(version_SOURCES)
+DIST_SOURCES = $(bandwidth_client_SOURCES) \
+ $(bandwidth_server_many_up_SOURCES) \
+ $(bandwidth_server_one_SOURCES) $(random_test_client_SOURCES) \
+ $(random_test_server_SOURCES) $(unit_test_client_SOURCES) \
+ $(unit_test_server_SOURCES) $(version_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBMODBUS_LT_VERSION_INFO = @LIBMODBUS_LT_VERSION_INFO@
+LIBMODBUS_VERSION = @LIBMODBUS_VERSION@
+LIBMODBUS_VERSION_MAJOR = @LIBMODBUS_VERSION_MAJOR@
+LIBMODBUS_VERSION_MICRO = @LIBMODBUS_VERSION_MICRO@
+LIBMODBUS_VERSION_MINOR = @LIBMODBUS_VERSION_MINOR@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_libmodbus_have_asciidoc = @ac_libmodbus_have_asciidoc@
+ac_libmodbus_have_xmlto = @ac_libmodbus_have_xmlto@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+EXTRA_DIST = README
+common_ldflags = \
+ $(top_builddir)/src/libmodbus.la
+
+bandwidth_server_one_SOURCES = bandwidth-server-one.c
+bandwidth_server_one_LDADD = $(common_ldflags)
+bandwidth_server_many_up_SOURCES = bandwidth-server-many-up.c
+bandwidth_server_many_up_LDADD = $(common_ldflags)
+bandwidth_client_SOURCES = bandwidth-client.c
+bandwidth_client_LDADD = $(common_ldflags)
+random_test_server_SOURCES = random-test-server.c
+random_test_server_LDADD = $(common_ldflags)
+random_test_client_SOURCES = random-test-client.c
+random_test_client_LDADD = $(common_ldflags)
+unit_test_server_SOURCES = unit-test-server.c unit-test.h
+unit_test_server_LDADD = $(common_ldflags)
+unit_test_client_SOURCES = unit-test-client.c unit-test.h
+unit_test_client_LDADD = $(common_ldflags)
+version_SOURCES = version.c
+version_LDADD = $(common_ldflags)
+INCLUDES = -I$(top_srcdir) -I$(top_srcdir)/src
+CLEANFILES = *~
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign tests/Makefile
+.PRECIOUS: Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+ @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
+bandwidth-client$(EXEEXT): $(bandwidth_client_OBJECTS) $(bandwidth_client_DEPENDENCIES)
+ @rm -f bandwidth-client$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(bandwidth_client_OBJECTS) $(bandwidth_client_LDADD) $(LIBS)
+bandwidth-server-many-up$(EXEEXT): $(bandwidth_server_many_up_OBJECTS) $(bandwidth_server_many_up_DEPENDENCIES)
+ @rm -f bandwidth-server-many-up$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(bandwidth_server_many_up_OBJECTS) $(bandwidth_server_many_up_LDADD) $(LIBS)
+bandwidth-server-one$(EXEEXT): $(bandwidth_server_one_OBJECTS) $(bandwidth_server_one_DEPENDENCIES)
+ @rm -f bandwidth-server-one$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(bandwidth_server_one_OBJECTS) $(bandwidth_server_one_LDADD) $(LIBS)
+random-test-client$(EXEEXT): $(random_test_client_OBJECTS) $(random_test_client_DEPENDENCIES)
+ @rm -f random-test-client$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(random_test_client_OBJECTS) $(random_test_client_LDADD) $(LIBS)
+random-test-server$(EXEEXT): $(random_test_server_OBJECTS) $(random_test_server_DEPENDENCIES)
+ @rm -f random-test-server$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(random_test_server_OBJECTS) $(random_test_server_LDADD) $(LIBS)
+unit-test-client$(EXEEXT): $(unit_test_client_OBJECTS) $(unit_test_client_DEPENDENCIES)
+ @rm -f unit-test-client$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(unit_test_client_OBJECTS) $(unit_test_client_LDADD) $(LIBS)
+unit-test-server$(EXEEXT): $(unit_test_server_OBJECTS) $(unit_test_server_DEPENDENCIES)
+ @rm -f unit-test-server$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(unit_test_server_OBJECTS) $(unit_test_server_LDADD) $(LIBS)
+version$(EXEEXT): $(version_OBJECTS) $(version_DEPENDENCIES)
+ @rm -f version$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(version_OBJECTS) $(version_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bandwidth-client.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bandwidth-server-many-up.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bandwidth-server-one.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random-test-client.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/random-test-server.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit-test-client.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unit-test-server.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
+@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ set x; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in files) print i; }; }'`; \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstPROGRAMS ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+ pdf pdf-am ps ps-am tags uninstall uninstall-am
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/tests/README b/tests/README
new file mode 100644
index 0000000..f530c8a
--- /dev/null
+++ b/tests/README
@@ -0,0 +1,38 @@
+Compilation
+-----------
+
+After installation, you can use pkg-config to compile these tests.
+For example, to compile random-test-server run:
+
+gcc random-test-server.c -o random-test-server `pkg-config --libs --cflags libmodbus`
+
+random-test-server
+-----------------
+It's necessary to launch this server before run random-test-client. By
+default, it receives and responses to Modbus query on the localhost
+and port 1502.
+
+random-test-client
+------------------
+This programm sends many different queries to a large range of
+addresses and values to test the communication between the client and
+the server.
+
+unit-test-server
+unit-test-client
+----------------
+By default, this program sends some queries with the values defined in
+unit-test.h and checks the responses. These programs are useful to
+test the protocol implementation.
+
+bandwidth-server-one
+bandwidth-server-many-up
+bandwidth-client
+-----------------------
+It returns some very useful informations about the performance of
+transfert rate between the server and the client.
+
+- bandwidth-server-one: it can handles only one connection with a client.
+- bandwidth-server-many-up: it opens a connection each time a new client asks
+ for, but the number of connection is limited. The same server process handles
+ all the connections.
diff --git a/tests/bandwidth-client b/tests/bandwidth-client
new file mode 100755
index 0000000..b013803
--- /dev/null
+++ b/tests/bandwidth-client
@@ -0,0 +1,225 @@
+#! /bin/bash
+
+# bandwidth-client - temporary wrapper script for .libs/bandwidth-client
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-3
+#
+# The bandwidth-client program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command="(cd /home/jmccrohan/bin/libmodbus/tests; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11; export PATH; gcc -g -O2 -g -O2 -Wall -Werror -o \$progdir/\$file bandwidth-client.o ../src/.libs/libmodbus.so -Wl,-rpath -Wl,/home/jmccrohan/bin/libmodbus/src/.libs)"
+
+# This environment variable determines our operation mode.
+if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
+ # install mode needs the following variables:
+ generated_by_libtool_version='2.4'
+ notinst_deplibs=' ../src/libmodbus.la'
+else
+ # When we are sourced in execute mode, $file and $ECHO are already set.
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ file="$0"
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+ ECHO="printf %s\\n"
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string --lt-
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's ../libtool value, followed by no.
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=$0
+ shift
+ for lt_opt
+ do
+ case "$lt_opt" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
+ test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
+ lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
+ cat "$lt_dump_D/$lt_dump_F"
+ exit 0
+ ;;
+ --lt-*)
+ $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n "$lt_option_debug"; then
+ echo "bandwidth-client:bandwidth-client:${LINENO}: libtool wrapper (GNU libtool) 2.4 Debian-2.4-3" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ $ECHO "bandwidth-client:bandwidth-client:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
+ lt_dump_args_N=`expr $lt_dump_args_N + 1`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+
+ if test -n "$lt_option_debug"; then
+ $ECHO "bandwidth-client:bandwidth-client:${LINENO}: newargv[0]: $progdir/$program" 1>&2
+ func_lt_dump_args ${1+"$@"} 1>&2
+ fi
+ exec "$progdir/$program" ${1+"$@"}
+
+ $ECHO "$0: cannot exec $program $*" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from $@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ for lt_wr_arg
+ do
+ case $lt_wr_arg in
+ --lt-*) ;;
+ *) set x "$@" "$lt_wr_arg"; shift;;
+ esac
+ shift
+ done
+ func_exec_program_core ${1+"$@"}
+}
+
+ # Parse options
+ func_parse_lt_options "$0" ${1+"$@"}
+
+ # Find the directory that this script lives in.
+ thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+ test "x$thisdir" = "x$file" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
+ while test -n "$file"; do
+ destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+
+ # If there was a directory component, then change thisdir.
+ if test "x$destdir" != "x$file"; then
+ case "$destdir" in
+ [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
+ *) thisdir="$thisdir/$destdir" ;;
+ esac
+ fi
+
+ file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
+ file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
+ done
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
+ if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
+ # special case for '.'
+ if test "$thisdir" = "."; then
+ thisdir=`pwd`
+ fi
+ # remove .libs from thisdir
+ case "$thisdir" in
+ *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
+ .libs ) thisdir=. ;;
+ esac
+ fi
+
+ # Try to get the absolute directory name.
+ absdir=`cd "$thisdir" && pwd`
+ test -n "$absdir" && thisdir="$absdir"
+
+ program=lt-'bandwidth-client'
+ progdir="$thisdir/.libs"
+
+ if test ! -f "$progdir/$program" ||
+ { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
+ test "X$file" != "X$progdir/$program"; }; then
+
+ file="$$-$program"
+
+ if test ! -d "$progdir"; then
+ mkdir "$progdir"
+ else
+ rm -f "$progdir/$file"
+ fi
+
+ # relink executable if necessary
+ if test -n "$relink_command"; then
+ if relink_command_output=`eval $relink_command 2>&1`; then :
+ else
+ printf %s\n "$relink_command_output" >&2
+ rm -f "$progdir/$file"
+ exit 1
+ fi
+ fi
+
+ mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
+ { rm -f "$progdir/$program";
+ mv -f "$progdir/$file" "$progdir/$program"; }
+ rm -f "$progdir/$file"
+ fi
+
+ if test -f "$progdir/$program"; then
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ # Run the actual program with our arguments.
+ func_exec_program ${1+"$@"}
+ fi
+ else
+ # The program doesn't exist.
+ $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
+ $ECHO "This script is just a wrapper for $program." 1>&2
+ $ECHO "See the libtool documentation for more information." 1>&2
+ exit 1
+ fi
+fi
diff --git a/tests/bandwidth-client.c b/tests/bandwidth-client.c
new file mode 100644
index 0000000..e9109e1
--- /dev/null
+++ b/tests/bandwidth-client.c
@@ -0,0 +1,220 @@
+/*
+ * Copyright © 2008-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/time.h>
+#include <errno.h>
+
+#include <modbus.h>
+
+#define G_MSEC_PER_SEC 1000
+
+uint32_t gettime_ms(void)
+{
+ struct timeval tv;
+ gettimeofday (&tv, NULL);
+
+ return (uint32_t) tv.tv_sec * 1000 + tv.tv_usec / 1000;
+}
+
+enum {
+ TCP,
+ RTU
+};
+
+/* Tests based on PI-MBUS-300 documentation */
+int main(int argc, char *argv[])
+{
+ uint8_t *tab_bit;
+ uint16_t *tab_reg;
+ modbus_t *ctx;
+ int i;
+ int nb_points;
+ double elapsed;
+ uint32_t start;
+ uint32_t end;
+ uint32_t bytes;
+ uint32_t rate;
+ int rc;
+ int n_loop;
+ int use_backend;
+
+ if (argc > 1) {
+ if (strcmp(argv[1], "tcp") == 0) {
+ use_backend = TCP;
+ n_loop = 100000;
+ } else if (strcmp(argv[1], "rtu") == 0) {
+ use_backend = RTU;
+ n_loop = 100;
+ } else {
+ printf("Usage:\n %s [tcp|rtu] - Modbus client to measure data bandwith\n\n", argv[0]);
+ exit(1);
+ }
+ } else {
+ /* By default */
+ use_backend = TCP;
+ n_loop = 100000;
+ }
+
+ if (use_backend == TCP) {
+ ctx = modbus_new_tcp("127.0.0.1", 1502);
+ } else {
+ ctx = modbus_new_rtu("/dev/ttyUSB1", 115200, 'N', 8, 1);
+ modbus_set_slave(ctx, 1);
+ }
+ if (modbus_connect(ctx) == -1) {
+ fprintf(stderr, "Connexion failed: %s\n",
+ modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+ }
+
+ /* Allocate and initialize the memory to store the status */
+ tab_bit = (uint8_t *) malloc(MODBUS_MAX_READ_BITS * sizeof(uint8_t));
+ memset(tab_bit, 0, MODBUS_MAX_READ_BITS * sizeof(uint8_t));
+
+ /* Allocate and initialize the memory to store the registers */
+ tab_reg = (uint16_t *) malloc(MODBUS_MAX_READ_REGISTERS * sizeof(uint16_t));
+ memset(tab_reg, 0, MODBUS_MAX_READ_REGISTERS * sizeof(uint16_t));
+
+ printf("READ BITS\n\n");
+
+ nb_points = MODBUS_MAX_READ_BITS;
+ start = gettime_ms();
+ for (i=0; i<n_loop; i++) {
+ rc = modbus_read_bits(ctx, 0, nb_points, tab_bit);
+ if (rc == -1) {
+ fprintf(stderr, "%s\n", modbus_strerror(errno));
+ return -1;
+ }
+ }
+ end = gettime_ms();
+ elapsed = end - start;
+
+ rate = (n_loop * nb_points) * G_MSEC_PER_SEC / (end - start);
+ printf("Transfert rate in points/seconds:\n");
+ printf("* %d points/s\n", rate);
+ printf("\n");
+
+ bytes = n_loop * (nb_points / 8) + ((nb_points % 8) ? 1 : 0);
+ rate = bytes / 1024 * G_MSEC_PER_SEC / (end - start);
+ printf("Values:\n");
+ printf("* %d x %d values\n", n_loop, nb_points);
+ printf("* %.3f ms for %d bytes\n", elapsed, bytes);
+ printf("* %d KiB/s\n", rate);
+ printf("\n");
+
+ /* TCP: Query and reponse header and values */
+ bytes = 12 + 9 + (nb_points / 8) + ((nb_points % 8) ? 1 : 0);
+ printf("Values and TCP Modbus overhead:\n");
+ printf("* %d x %d bytes\n", n_loop, bytes);
+ bytes = n_loop * bytes;
+ rate = bytes / 1024 * G_MSEC_PER_SEC / (end - start);
+ printf("* %.3f ms for %d bytes\n", elapsed, bytes);
+ printf("* %d KiB/s\n", rate);
+ printf("\n\n");
+
+ printf("READ REGISTERS\n\n");
+
+ nb_points = MODBUS_MAX_READ_REGISTERS;
+ start = gettime_ms();
+ for (i=0; i<n_loop; i++) {
+ rc = modbus_read_registers(ctx, 0, nb_points, tab_reg);
+ if (rc == -1) {
+ fprintf(stderr, "%s\n", modbus_strerror(errno));
+ return -1;
+ }
+ }
+ end = gettime_ms();
+ elapsed = end - start;
+
+ rate = (n_loop * nb_points) * G_MSEC_PER_SEC / (end - start);
+ printf("Transfert rate in points/seconds:\n");
+ printf("* %d registers/s\n", rate);
+ printf("\n");
+
+ bytes = n_loop * nb_points * sizeof(uint16_t);
+ rate = bytes / 1024 * G_MSEC_PER_SEC / (end - start);
+ printf("Values:\n");
+ printf("* %d x %d values\n", n_loop, nb_points);
+ printf("* %.3f ms for %d bytes\n", elapsed, bytes);
+ printf("* %d KiB/s\n", rate);
+ printf("\n");
+
+ /* TCP:Query and reponse header and values */
+ bytes = 12 + 9 + (nb_points * sizeof(uint16_t));
+ printf("Values and TCP Modbus overhead:\n");
+ printf("* %d x %d bytes\n", n_loop, bytes);
+ bytes = n_loop * bytes;
+ rate = bytes / 1024 * G_MSEC_PER_SEC / (end - start);
+ printf("* %.3f ms for %d bytes\n", elapsed, bytes);
+ printf("* %d KiB/s\n", rate);
+ printf("\n\n");
+
+ printf("READ AND WRITE REGISTERS\n\n");
+
+ nb_points = MODBUS_MAX_RW_WRITE_REGISTERS;
+ start = gettime_ms();
+ for (i=0; i<n_loop; i++) {
+ rc = modbus_write_and_read_registers(ctx,
+ 0, nb_points, tab_reg,
+ 0, nb_points, tab_reg);
+ if (rc == -1) {
+ fprintf(stderr, "%s\n", modbus_strerror(errno));
+ return -1;
+ }
+ }
+ end = gettime_ms();
+ elapsed = end - start;
+
+ rate = (n_loop * nb_points) * G_MSEC_PER_SEC / (end - start);
+ printf("Transfert rate in points/seconds:\n");
+ printf("* %d registers/s\n", rate);
+ printf("\n");
+
+ bytes = n_loop * nb_points * sizeof(uint16_t);
+ rate = bytes / 1024 * G_MSEC_PER_SEC / (end - start);
+ printf("Values:\n");
+ printf("* %d x %d values\n", n_loop, nb_points);
+ printf("* %.3f ms for %d bytes\n", elapsed, bytes);
+ printf("* %d KiB/s\n", rate);
+ printf("\n");
+
+ /* TCP:Query and reponse header and values */
+ bytes = 12 + 9 + (nb_points * sizeof(uint16_t));
+ printf("Values and TCP Modbus overhead:\n");
+ printf("* %d x %d bytes\n", n_loop, bytes);
+ bytes = n_loop * bytes;
+ rate = bytes / 1024 * G_MSEC_PER_SEC / (end - start);
+ printf("* %.3f ms for %d bytes\n", elapsed, bytes);
+ printf("* %d KiB/s\n", rate);
+ printf("\n");
+
+ /* Free the memory */
+ free(tab_bit);
+ free(tab_reg);
+
+ /* Close the connection */
+ modbus_close(ctx);
+ modbus_free(ctx);
+
+ return 0;
+}
diff --git a/tests/bandwidth-client.o b/tests/bandwidth-client.o
new file mode 100644
index 0000000..9ff6b23
--- /dev/null
+++ b/tests/bandwidth-client.o
Binary files differ
diff --git a/tests/bandwidth-server-many-up b/tests/bandwidth-server-many-up
new file mode 100755
index 0000000..85a88ea
--- /dev/null
+++ b/tests/bandwidth-server-many-up
@@ -0,0 +1,225 @@
+#! /bin/bash
+
+# bandwidth-server-many-up - temporary wrapper script for .libs/bandwidth-server-many-up
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-3
+#
+# The bandwidth-server-many-up program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command="(cd /home/jmccrohan/bin/libmodbus/tests; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11; export PATH; gcc -g -O2 -g -O2 -Wall -Werror -o \$progdir/\$file bandwidth-server-many-up.o ../src/.libs/libmodbus.so -Wl,-rpath -Wl,/home/jmccrohan/bin/libmodbus/src/.libs)"
+
+# This environment variable determines our operation mode.
+if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
+ # install mode needs the following variables:
+ generated_by_libtool_version='2.4'
+ notinst_deplibs=' ../src/libmodbus.la'
+else
+ # When we are sourced in execute mode, $file and $ECHO are already set.
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ file="$0"
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+ ECHO="printf %s\\n"
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string --lt-
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's ../libtool value, followed by no.
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=$0
+ shift
+ for lt_opt
+ do
+ case "$lt_opt" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
+ test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
+ lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
+ cat "$lt_dump_D/$lt_dump_F"
+ exit 0
+ ;;
+ --lt-*)
+ $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n "$lt_option_debug"; then
+ echo "bandwidth-server-many-up:bandwidth-server-many-up:${LINENO}: libtool wrapper (GNU libtool) 2.4 Debian-2.4-3" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ $ECHO "bandwidth-server-many-up:bandwidth-server-many-up:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
+ lt_dump_args_N=`expr $lt_dump_args_N + 1`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+
+ if test -n "$lt_option_debug"; then
+ $ECHO "bandwidth-server-many-up:bandwidth-server-many-up:${LINENO}: newargv[0]: $progdir/$program" 1>&2
+ func_lt_dump_args ${1+"$@"} 1>&2
+ fi
+ exec "$progdir/$program" ${1+"$@"}
+
+ $ECHO "$0: cannot exec $program $*" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from $@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ for lt_wr_arg
+ do
+ case $lt_wr_arg in
+ --lt-*) ;;
+ *) set x "$@" "$lt_wr_arg"; shift;;
+ esac
+ shift
+ done
+ func_exec_program_core ${1+"$@"}
+}
+
+ # Parse options
+ func_parse_lt_options "$0" ${1+"$@"}
+
+ # Find the directory that this script lives in.
+ thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+ test "x$thisdir" = "x$file" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
+ while test -n "$file"; do
+ destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+
+ # If there was a directory component, then change thisdir.
+ if test "x$destdir" != "x$file"; then
+ case "$destdir" in
+ [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
+ *) thisdir="$thisdir/$destdir" ;;
+ esac
+ fi
+
+ file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
+ file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
+ done
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
+ if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
+ # special case for '.'
+ if test "$thisdir" = "."; then
+ thisdir=`pwd`
+ fi
+ # remove .libs from thisdir
+ case "$thisdir" in
+ *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
+ .libs ) thisdir=. ;;
+ esac
+ fi
+
+ # Try to get the absolute directory name.
+ absdir=`cd "$thisdir" && pwd`
+ test -n "$absdir" && thisdir="$absdir"
+
+ program=lt-'bandwidth-server-many-up'
+ progdir="$thisdir/.libs"
+
+ if test ! -f "$progdir/$program" ||
+ { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
+ test "X$file" != "X$progdir/$program"; }; then
+
+ file="$$-$program"
+
+ if test ! -d "$progdir"; then
+ mkdir "$progdir"
+ else
+ rm -f "$progdir/$file"
+ fi
+
+ # relink executable if necessary
+ if test -n "$relink_command"; then
+ if relink_command_output=`eval $relink_command 2>&1`; then :
+ else
+ printf %s\n "$relink_command_output" >&2
+ rm -f "$progdir/$file"
+ exit 1
+ fi
+ fi
+
+ mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
+ { rm -f "$progdir/$program";
+ mv -f "$progdir/$file" "$progdir/$program"; }
+ rm -f "$progdir/$file"
+ fi
+
+ if test -f "$progdir/$program"; then
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ # Run the actual program with our arguments.
+ func_exec_program ${1+"$@"}
+ fi
+ else
+ # The program doesn't exist.
+ $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
+ $ECHO "This script is just a wrapper for $program." 1>&2
+ $ECHO "See the libtool documentation for more information." 1>&2
+ exit 1
+ fi
+fi
diff --git a/tests/bandwidth-server-many-up.c b/tests/bandwidth-server-many-up.c
new file mode 100644
index 0000000..02968c1
--- /dev/null
+++ b/tests/bandwidth-server-many-up.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright © 2009-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <signal.h>
+
+#include <modbus.h>
+
+#if defined(_WIN32)
+#include <ws2tcpip.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#endif
+
+#define NB_CONNECTION 5
+
+modbus_t *ctx = NULL;
+int server_socket;
+modbus_mapping_t *mb_mapping;
+
+static void close_sigint(int dummy)
+{
+ close(server_socket);
+ modbus_free(ctx);
+ modbus_mapping_free(mb_mapping);
+
+ exit(dummy);
+}
+
+int main(void)
+{
+ int master_socket;
+ int rc;
+ fd_set refset;
+ fd_set rdset;
+
+ /* Maximum file descriptor number */
+ int fdmax;
+
+ ctx = modbus_new_tcp("127.0.0.1", 1502);
+
+ mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,
+ MODBUS_MAX_READ_REGISTERS, 0);
+ if (mb_mapping == NULL) {
+ fprintf(stderr, "Failed to allocate the mapping: %s\n",
+ modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+ }
+
+ server_socket = modbus_tcp_listen(ctx, NB_CONNECTION);
+
+ signal(SIGINT, close_sigint);
+
+ /* Clear the reference set of socket */
+ FD_ZERO(&refset);
+ /* Add the server socket */
+ FD_SET(server_socket, &refset);
+
+ /* Keep track of the max file descriptor */
+ fdmax = server_socket;
+
+ for (;;) {
+ rdset = refset;
+ if (select(fdmax+1, &rdset, NULL, NULL, NULL) == -1) {
+ perror("Server select() failure.");
+ close_sigint(1);
+ }
+
+ /* Run through the existing connections looking for data to be
+ * read */
+ for (master_socket = 0; master_socket <= fdmax; master_socket++) {
+
+ if (FD_ISSET(master_socket, &rdset)) {
+ if (master_socket == server_socket) {
+ /* A client is asking a new connection */
+ socklen_t addrlen;
+ struct sockaddr_in clientaddr;
+ int newfd;
+
+ /* Handle new connections */
+ addrlen = sizeof(clientaddr);
+ memset(&clientaddr, 0, sizeof(clientaddr));
+ newfd = accept(server_socket, (struct sockaddr *)&clientaddr, &addrlen);
+ if (newfd == -1) {
+ perror("Server accept() error");
+ } else {
+ FD_SET(newfd, &refset);
+
+ if (newfd > fdmax) {
+ /* Keep track of the maximum */
+ fdmax = newfd;
+ }
+ printf("New connection from %s:%d on socket %d\n",
+ inet_ntoa(clientaddr.sin_addr), clientaddr.sin_port, newfd);
+ }
+ } else {
+ /* An already connected master has sent a new query */
+ uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
+
+ modbus_set_socket(ctx, master_socket);
+ rc = modbus_receive(ctx, query);
+ if (rc != -1) {
+ modbus_reply(ctx, query, rc, mb_mapping);
+ } else {
+ /* Connection closed by the client, end of server */
+ printf("Connection closed on socket %d\n", master_socket);
+ close(master_socket);
+
+ /* Remove from reference set */
+ FD_CLR(master_socket, &refset);
+
+ if (master_socket == fdmax) {
+ fdmax--;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/tests/bandwidth-server-many-up.o b/tests/bandwidth-server-many-up.o
new file mode 100644
index 0000000..0b6254d
--- /dev/null
+++ b/tests/bandwidth-server-many-up.o
Binary files differ
diff --git a/tests/bandwidth-server-one b/tests/bandwidth-server-one
new file mode 100755
index 0000000..4aa0039
--- /dev/null
+++ b/tests/bandwidth-server-one
@@ -0,0 +1,225 @@
+#! /bin/bash
+
+# bandwidth-server-one - temporary wrapper script for .libs/bandwidth-server-one
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-3
+#
+# The bandwidth-server-one program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command="(cd /home/jmccrohan/bin/libmodbus/tests; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11; export PATH; gcc -g -O2 -g -O2 -Wall -Werror -o \$progdir/\$file bandwidth-server-one.o ../src/.libs/libmodbus.so -Wl,-rpath -Wl,/home/jmccrohan/bin/libmodbus/src/.libs)"
+
+# This environment variable determines our operation mode.
+if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
+ # install mode needs the following variables:
+ generated_by_libtool_version='2.4'
+ notinst_deplibs=' ../src/libmodbus.la'
+else
+ # When we are sourced in execute mode, $file and $ECHO are already set.
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ file="$0"
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+ ECHO="printf %s\\n"
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string --lt-
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's ../libtool value, followed by no.
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=$0
+ shift
+ for lt_opt
+ do
+ case "$lt_opt" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
+ test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
+ lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
+ cat "$lt_dump_D/$lt_dump_F"
+ exit 0
+ ;;
+ --lt-*)
+ $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n "$lt_option_debug"; then
+ echo "bandwidth-server-one:bandwidth-server-one:${LINENO}: libtool wrapper (GNU libtool) 2.4 Debian-2.4-3" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ $ECHO "bandwidth-server-one:bandwidth-server-one:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
+ lt_dump_args_N=`expr $lt_dump_args_N + 1`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+
+ if test -n "$lt_option_debug"; then
+ $ECHO "bandwidth-server-one:bandwidth-server-one:${LINENO}: newargv[0]: $progdir/$program" 1>&2
+ func_lt_dump_args ${1+"$@"} 1>&2
+ fi
+ exec "$progdir/$program" ${1+"$@"}
+
+ $ECHO "$0: cannot exec $program $*" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from $@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ for lt_wr_arg
+ do
+ case $lt_wr_arg in
+ --lt-*) ;;
+ *) set x "$@" "$lt_wr_arg"; shift;;
+ esac
+ shift
+ done
+ func_exec_program_core ${1+"$@"}
+}
+
+ # Parse options
+ func_parse_lt_options "$0" ${1+"$@"}
+
+ # Find the directory that this script lives in.
+ thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+ test "x$thisdir" = "x$file" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
+ while test -n "$file"; do
+ destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+
+ # If there was a directory component, then change thisdir.
+ if test "x$destdir" != "x$file"; then
+ case "$destdir" in
+ [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
+ *) thisdir="$thisdir/$destdir" ;;
+ esac
+ fi
+
+ file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
+ file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
+ done
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
+ if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
+ # special case for '.'
+ if test "$thisdir" = "."; then
+ thisdir=`pwd`
+ fi
+ # remove .libs from thisdir
+ case "$thisdir" in
+ *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
+ .libs ) thisdir=. ;;
+ esac
+ fi
+
+ # Try to get the absolute directory name.
+ absdir=`cd "$thisdir" && pwd`
+ test -n "$absdir" && thisdir="$absdir"
+
+ program=lt-'bandwidth-server-one'
+ progdir="$thisdir/.libs"
+
+ if test ! -f "$progdir/$program" ||
+ { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
+ test "X$file" != "X$progdir/$program"; }; then
+
+ file="$$-$program"
+
+ if test ! -d "$progdir"; then
+ mkdir "$progdir"
+ else
+ rm -f "$progdir/$file"
+ fi
+
+ # relink executable if necessary
+ if test -n "$relink_command"; then
+ if relink_command_output=`eval $relink_command 2>&1`; then :
+ else
+ printf %s\n "$relink_command_output" >&2
+ rm -f "$progdir/$file"
+ exit 1
+ fi
+ fi
+
+ mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
+ { rm -f "$progdir/$program";
+ mv -f "$progdir/$file" "$progdir/$program"; }
+ rm -f "$progdir/$file"
+ fi
+
+ if test -f "$progdir/$program"; then
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ # Run the actual program with our arguments.
+ func_exec_program ${1+"$@"}
+ fi
+ else
+ # The program doesn't exist.
+ $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
+ $ECHO "This script is just a wrapper for $program." 1>&2
+ $ECHO "See the libtool documentation for more information." 1>&2
+ exit 1
+ fi
+fi
diff --git a/tests/bandwidth-server-one.c b/tests/bandwidth-server-one.c
new file mode 100644
index 0000000..e15fb69
--- /dev/null
+++ b/tests/bandwidth-server-one.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2008-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <modbus.h>
+
+enum {
+ TCP,
+ RTU
+};
+
+int main(int argc, char *argv[])
+{
+ int socket;
+ modbus_t *ctx;
+ modbus_mapping_t *mb_mapping;
+ int rc;
+ int use_backend;
+
+ /* TCP */
+ if (argc > 1) {
+ if (strcmp(argv[1], "tcp") == 0) {
+ use_backend = TCP;
+ } else if (strcmp(argv[1], "rtu") == 0) {
+ use_backend = RTU;
+ } else {
+ printf("Usage:\n %s [tcp|rtu] - Modbus client to measure data bandwith\n\n", argv[0]);
+ exit(1);
+ }
+ } else {
+ /* By default */
+ use_backend = TCP;
+ }
+
+ if (use_backend == TCP) {
+ ctx = modbus_new_tcp("127.0.0.1", 1502);
+ socket = modbus_tcp_listen(ctx, 1);
+ modbus_tcp_accept(ctx, &socket);
+
+ } else {
+ ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
+ modbus_set_slave(ctx, 1);
+ modbus_connect(ctx);
+ }
+
+ mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,
+ MODBUS_MAX_READ_REGISTERS, 0);
+ if (mb_mapping == NULL) {
+ fprintf(stderr, "Failed to allocate the mapping: %s\n",
+ modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+ }
+
+ for(;;) {
+ uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
+
+ rc = modbus_receive(ctx, query);
+ if (rc >= 0) {
+ modbus_reply(ctx, query, rc, mb_mapping);
+ } else {
+ /* Connection closed by the client or server */
+ break;
+ }
+ }
+
+ printf("Quit the loop: %s\n", modbus_strerror(errno));
+
+ modbus_mapping_free(mb_mapping);
+ close(socket);
+ modbus_free(ctx);
+
+ return 0;
+}
diff --git a/tests/bandwidth-server-one.o b/tests/bandwidth-server-one.o
new file mode 100644
index 0000000..016e927
--- /dev/null
+++ b/tests/bandwidth-server-one.o
Binary files differ
diff --git a/tests/random-test-client b/tests/random-test-client
new file mode 100755
index 0000000..d6291ee
--- /dev/null
+++ b/tests/random-test-client
Binary files differ
diff --git a/tests/random-test-client.c b/tests/random-test-client.c
new file mode 100644
index 0000000..593867c
--- /dev/null
+++ b/tests/random-test-client.c
@@ -0,0 +1,253 @@
+/*
+ * Copyright © 2001-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <modbus.h>
+
+/* The goal of this program is to check all major functions of
+ libmodbus:
+ - write_coil
+ - read_bits
+ - write_coils
+ - write_register
+ - read_registers
+ - write_registers
+ - read_registers
+
+ All these functions are called with random values on a address
+ range defined by the following defines.
+*/
+#define LOOP 1
+#define SERVER_ID 17
+#define ADDRESS_START 0
+#define ADDRESS_END 99
+
+/* At each loop, the program works in the range ADDRESS_START to
+ * ADDRESS_END then ADDRESS_START + 1 to ADDRESS_END and so on.
+ */
+int main(void)
+{
+ modbus_t *ctx;
+ int rc;
+ int nb_fail;
+ int nb_loop;
+ int addr;
+ int nb;
+ uint8_t *tab_rq_bits;
+ uint8_t *tab_rp_bits;
+ uint16_t *tab_rq_registers;
+ uint16_t *tab_rw_rq_registers;
+ uint16_t *tab_rp_registers;
+
+ /* RTU */
+/*
+ ctx = modbus_new_rtu("/dev/ttyUSB0", 19200, 'N', 8, 1);
+ modbus_set_slave(ctx, SERVER_ID);
+*/
+
+ /* TCP */
+ ctx = modbus_new_tcp("127.0.0.1", 1502);
+ modbus_set_debug(ctx, TRUE);
+
+ if (modbus_connect(ctx) == -1) {
+ fprintf(stderr, "Connection failed: %s\n",
+ modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+ }
+
+ /* Allocate and initialize the different memory spaces */
+ nb = ADDRESS_END - ADDRESS_START;
+
+ tab_rq_bits = (uint8_t *) malloc(nb * sizeof(uint8_t));
+ memset(tab_rq_bits, 0, nb * sizeof(uint8_t));
+
+ tab_rp_bits = (uint8_t *) malloc(nb * sizeof(uint8_t));
+ memset(tab_rp_bits, 0, nb * sizeof(uint8_t));
+
+ tab_rq_registers = (uint16_t *) malloc(nb * sizeof(uint16_t));
+ memset(tab_rq_registers, 0, nb * sizeof(uint16_t));
+
+ tab_rp_registers = (uint16_t *) malloc(nb * sizeof(uint16_t));
+ memset(tab_rp_registers, 0, nb * sizeof(uint16_t));
+
+ tab_rw_rq_registers = (uint16_t *) malloc(nb * sizeof(uint16_t));
+ memset(tab_rw_rq_registers, 0, nb * sizeof(uint16_t));
+
+ nb_loop = nb_fail = 0;
+ while (nb_loop++ < LOOP) {
+ for (addr = ADDRESS_START; addr <= ADDRESS_END; addr++) {
+ int i;
+
+ /* Random numbers (short) */
+ for (i=0; i<nb; i++) {
+ tab_rq_registers[i] = (uint16_t) (65535.0*rand() / (RAND_MAX + 1.0));
+ tab_rw_rq_registers[i] = ~tab_rq_registers[i];
+ tab_rq_bits[i] = tab_rq_registers[i] % 2;
+ }
+ nb = ADDRESS_END - addr;
+
+ /* WRITE BIT */
+ rc = modbus_write_bit(ctx, addr, tab_rq_bits[0]);
+ if (rc != 1) {
+ printf("ERROR modbus_write_bit (%d)\n", rc);
+ printf("Address = %d, value = %d\n", addr, tab_rq_bits[0]);
+ nb_fail++;
+ } else {
+ rc = modbus_read_bits(ctx, addr, 1, tab_rp_bits);
+ if (rc != 1 || tab_rq_bits[0] != tab_rp_bits[0]) {
+ printf("ERROR modbus_read_bits single (%d)\n", rc);
+ printf("address = %d\n", addr);
+ nb_fail++;
+ }
+ }
+
+ /* MULTIPLE BITS */
+ rc = modbus_write_bits(ctx, addr, nb, tab_rq_bits);
+ if (rc != nb) {
+ printf("ERROR modbus_write_bits (%d)\n", rc);
+ printf("Address = %d, nb = %d\n", addr, nb);
+ nb_fail++;
+ } else {
+ rc = modbus_read_bits(ctx, addr, nb, tab_rp_bits);
+ if (rc != nb) {
+ printf("ERROR modbus_read_bits\n");
+ printf("Address = %d, nb = %d\n", addr, nb);
+ nb_fail++;
+ } else {
+ for (i=0; i<nb; i++) {
+ if (tab_rp_bits[i] != tab_rq_bits[i]) {
+ printf("ERROR modbus_read_bits\n");
+ printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
+ addr, tab_rq_bits[i], tab_rq_bits[i],
+ tab_rp_bits[i], tab_rp_bits[i]);
+ nb_fail++;
+ }
+ }
+ }
+ }
+
+ /* SINGLE REGISTER */
+ rc = modbus_write_register(ctx, addr, tab_rq_registers[0]);
+ if (rc != 1) {
+ printf("ERROR modbus_write_register (%d)\n", rc);
+ printf("Address = %d, value = %d (0x%X)\n",
+ addr, tab_rq_registers[0], tab_rq_registers[0]);
+ nb_fail++;
+ } else {
+ rc = modbus_read_registers(ctx, addr, 1, tab_rp_registers);
+ if (rc != 1) {
+ printf("ERROR modbus_read_registers single (%d)\n", rc);
+ printf("Address = %d\n", addr);
+ nb_fail++;
+ } else {
+ if (tab_rq_registers[0] != tab_rp_registers[0]) {
+ printf("ERROR modbus_read_registers single\n");
+ printf("Address = %d, value = %d (0x%X) != %d (0x%X)\n",
+ addr, tab_rq_registers[0], tab_rq_registers[0],
+ tab_rp_registers[0], tab_rp_registers[0]);
+ nb_fail++;
+ }
+ }
+ }
+
+ /* MULTIPLE REGISTERS */
+ rc = modbus_write_registers(ctx, addr, nb, tab_rq_registers);
+ if (rc != nb) {
+ printf("ERROR modbus_write_registers (%d)\n", rc);
+ printf("Address = %d, nb = %d\n", addr, nb);
+ nb_fail++;
+ } else {
+ rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);
+ if (rc != nb) {
+ printf("ERROR modbus_read_registers (%d)\n", rc);
+ printf("Address = %d, nb = %d\n", addr, nb);
+ nb_fail++;
+ } else {
+ for (i=0; i<nb; i++) {
+ if (tab_rq_registers[i] != tab_rp_registers[i]) {
+ printf("ERROR modbus_read_registers\n");
+ printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
+ addr, tab_rq_registers[i], tab_rq_registers[i],
+ tab_rp_registers[i], tab_rp_registers[i]);
+ nb_fail++;
+ }
+ }
+ }
+ }
+ /* R/W MULTIPLE REGISTERS */
+ rc = modbus_write_and_read_registers(ctx,
+ addr, nb, tab_rw_rq_registers,
+ addr, nb, tab_rp_registers);
+ if (rc != nb) {
+ printf("ERROR modbus_read_and_write_registers (%d)\n", rc);
+ printf("Address = %d, nb = %d\n", addr, nb);
+ nb_fail++;
+ } else {
+ for (i=0; i<nb; i++) {
+ if (tab_rp_registers[i] != tab_rw_rq_registers[i]) {
+ printf("ERROR modbus_read_and_write_registers READ\n");
+ printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
+ addr, tab_rp_registers[i], tab_rw_rq_registers[i],
+ tab_rp_registers[i], tab_rw_rq_registers[i]);
+ nb_fail++;
+ }
+ }
+
+ rc = modbus_read_registers(ctx, addr, nb, tab_rp_registers);
+ if (rc != nb) {
+ printf("ERROR modbus_read_registers (%d)\n", rc);
+ printf("Address = %d, nb = %d\n", addr, nb);
+ nb_fail++;
+ } else {
+ for (i=0; i<nb; i++) {
+ if (tab_rw_rq_registers[i] != tab_rp_registers[i]) {
+ printf("ERROR modbus_read_and_write_registers WRITE\n");
+ printf("Address = %d, value %d (0x%X) != %d (0x%X)\n",
+ addr, tab_rw_rq_registers[i], tab_rw_rq_registers[i],
+ tab_rp_registers[i], tab_rp_registers[i]);
+ nb_fail++;
+ }
+ }
+ }
+ }
+ }
+
+ printf("Test: ");
+ if (nb_fail)
+ printf("%d FAILS\n", nb_fail);
+ else
+ printf("SUCCESS\n");
+ }
+
+ /* Free the memory */
+ free(tab_rq_bits);
+ free(tab_rp_bits);
+ free(tab_rq_registers);
+ free(tab_rp_registers);
+
+ /* Close the connection */
+ modbus_close(ctx);
+ modbus_free(ctx);
+
+ return 0;
+}
diff --git a/tests/random-test-client.o b/tests/random-test-client.o
new file mode 100644
index 0000000..b9ddf6f
--- /dev/null
+++ b/tests/random-test-client.o
Binary files differ
diff --git a/tests/random-test-server b/tests/random-test-server
new file mode 100755
index 0000000..5beca61
--- /dev/null
+++ b/tests/random-test-server
Binary files differ
diff --git a/tests/random-test-server.c b/tests/random-test-server.c
new file mode 100644
index 0000000..9569fe4
--- /dev/null
+++ b/tests/random-test-server.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2008-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <modbus.h>
+
+int main(void)
+{
+ int socket;
+ modbus_t *ctx;
+ modbus_mapping_t *mb_mapping;
+
+ ctx = modbus_new_tcp("127.0.0.1", 1502);
+ /* modbus_set_debug(ctx, TRUE); */
+
+ mb_mapping = modbus_mapping_new(500, 500, 500, 500);
+ if (mb_mapping == NULL) {
+ fprintf(stderr, "Failed to allocate the mapping: %s\n",
+ modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+ }
+
+ socket = modbus_tcp_listen(ctx, 1);
+ modbus_tcp_accept(ctx, &socket);
+
+ for (;;) {
+ uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
+ int rc;
+
+ rc = modbus_receive(ctx, query);
+ if (rc != -1) {
+ /* rc is the query size */
+ modbus_reply(ctx, query, rc, mb_mapping);
+ } else {
+ /* Connection closed by the client or error */
+ break;
+ }
+ }
+
+ printf("Quit the loop: %s\n", modbus_strerror(errno));
+
+ modbus_mapping_free(mb_mapping);
+ modbus_close(ctx);
+ modbus_free(ctx);
+
+ return 0;
+}
diff --git a/tests/random-test-server.o b/tests/random-test-server.o
new file mode 100644
index 0000000..7ea92e9
--- /dev/null
+++ b/tests/random-test-server.o
Binary files differ
diff --git a/tests/unit-test-client b/tests/unit-test-client
new file mode 100755
index 0000000..4e2b561
--- /dev/null
+++ b/tests/unit-test-client
@@ -0,0 +1,225 @@
+#! /bin/bash
+
+# unit-test-client - temporary wrapper script for .libs/unit-test-client
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-3
+#
+# The unit-test-client program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command="(cd /home/jmccrohan/bin/libmodbus/tests; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11; export PATH; gcc -g -O2 -g -O2 -Wall -Werror -o \$progdir/\$file unit-test-client.o ../src/.libs/libmodbus.so -Wl,-rpath -Wl,/home/jmccrohan/bin/libmodbus/src/.libs)"
+
+# This environment variable determines our operation mode.
+if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
+ # install mode needs the following variables:
+ generated_by_libtool_version='2.4'
+ notinst_deplibs=' ../src/libmodbus.la'
+else
+ # When we are sourced in execute mode, $file and $ECHO are already set.
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ file="$0"
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+ ECHO="printf %s\\n"
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string --lt-
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's ../libtool value, followed by no.
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=$0
+ shift
+ for lt_opt
+ do
+ case "$lt_opt" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
+ test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
+ lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
+ cat "$lt_dump_D/$lt_dump_F"
+ exit 0
+ ;;
+ --lt-*)
+ $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n "$lt_option_debug"; then
+ echo "unit-test-client:unit-test-client:${LINENO}: libtool wrapper (GNU libtool) 2.4 Debian-2.4-3" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ $ECHO "unit-test-client:unit-test-client:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
+ lt_dump_args_N=`expr $lt_dump_args_N + 1`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+
+ if test -n "$lt_option_debug"; then
+ $ECHO "unit-test-client:unit-test-client:${LINENO}: newargv[0]: $progdir/$program" 1>&2
+ func_lt_dump_args ${1+"$@"} 1>&2
+ fi
+ exec "$progdir/$program" ${1+"$@"}
+
+ $ECHO "$0: cannot exec $program $*" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from $@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ for lt_wr_arg
+ do
+ case $lt_wr_arg in
+ --lt-*) ;;
+ *) set x "$@" "$lt_wr_arg"; shift;;
+ esac
+ shift
+ done
+ func_exec_program_core ${1+"$@"}
+}
+
+ # Parse options
+ func_parse_lt_options "$0" ${1+"$@"}
+
+ # Find the directory that this script lives in.
+ thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+ test "x$thisdir" = "x$file" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
+ while test -n "$file"; do
+ destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+
+ # If there was a directory component, then change thisdir.
+ if test "x$destdir" != "x$file"; then
+ case "$destdir" in
+ [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
+ *) thisdir="$thisdir/$destdir" ;;
+ esac
+ fi
+
+ file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
+ file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
+ done
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
+ if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
+ # special case for '.'
+ if test "$thisdir" = "."; then
+ thisdir=`pwd`
+ fi
+ # remove .libs from thisdir
+ case "$thisdir" in
+ *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
+ .libs ) thisdir=. ;;
+ esac
+ fi
+
+ # Try to get the absolute directory name.
+ absdir=`cd "$thisdir" && pwd`
+ test -n "$absdir" && thisdir="$absdir"
+
+ program=lt-'unit-test-client'
+ progdir="$thisdir/.libs"
+
+ if test ! -f "$progdir/$program" ||
+ { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
+ test "X$file" != "X$progdir/$program"; }; then
+
+ file="$$-$program"
+
+ if test ! -d "$progdir"; then
+ mkdir "$progdir"
+ else
+ rm -f "$progdir/$file"
+ fi
+
+ # relink executable if necessary
+ if test -n "$relink_command"; then
+ if relink_command_output=`eval $relink_command 2>&1`; then :
+ else
+ printf %s\n "$relink_command_output" >&2
+ rm -f "$progdir/$file"
+ exit 1
+ fi
+ fi
+
+ mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
+ { rm -f "$progdir/$program";
+ mv -f "$progdir/$file" "$progdir/$program"; }
+ rm -f "$progdir/$file"
+ fi
+
+ if test -f "$progdir/$program"; then
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ # Run the actual program with our arguments.
+ func_exec_program ${1+"$@"}
+ fi
+ else
+ # The program doesn't exist.
+ $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
+ $ECHO "This script is just a wrapper for $program." 1>&2
+ $ECHO "See the libtool documentation for more information." 1>&2
+ exit 1
+ fi
+fi
diff --git a/tests/unit-test-client.c b/tests/unit-test-client.c
new file mode 100644
index 0000000..533e6a7
--- /dev/null
+++ b/tests/unit-test-client.c
@@ -0,0 +1,690 @@
+/*
+ * Copyright © 2008-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <modbus.h>
+
+#include "unit-test.h"
+
+enum {
+ TCP,
+ TCP_PI,
+ RTU
+};
+
+int main(int argc, char *argv[])
+{
+ uint8_t *tab_rp_bits;
+ uint16_t *tab_rp_registers;
+ uint16_t *tab_rp_registers_bad;
+ modbus_t *ctx;
+ int i;
+ uint8_t value;
+ int nb_points;
+ int rc;
+ float real;
+ struct timeval old_response_timeout;
+ struct timeval response_timeout;
+ int use_backend;
+
+ if (argc > 1) {
+ if (strcmp(argv[1], "tcp") == 0) {
+ use_backend = TCP;
+ } else if (strcmp(argv[1], "tcppi") == 0) {
+ use_backend = TCP_PI;
+ } else if (strcmp(argv[1], "rtu") == 0) {
+ use_backend = RTU;
+ } else {
+ printf("Usage:\n %s [tcp|tcppi|rtu] - Modbus client for unit testing\n\n", argv[0]);
+ exit(1);
+ }
+ } else {
+ /* By default */
+ use_backend = TCP;
+ }
+
+ if (use_backend == TCP) {
+ ctx = modbus_new_tcp("127.0.0.1", 1502);
+ } else if (use_backend == TCP_PI) {
+ ctx = modbus_new_tcp_pi("::1", "1502");
+ } else {
+ ctx = modbus_new_rtu("/dev/ttyUSB1", 115200, 'N', 8, 1);
+ }
+ if (ctx == NULL) {
+ fprintf(stderr, "Unable to allocate libmodbus context\n");
+ return -1;
+ }
+ modbus_set_debug(ctx, TRUE);
+ modbus_set_error_recovery(ctx,
+ MODBUS_ERROR_RECOVERY_LINK |
+ MODBUS_ERROR_RECOVERY_PROTOCOL);
+
+ if (use_backend == RTU) {
+ modbus_set_slave(ctx, SERVER_ID);
+ }
+
+ if (modbus_connect(ctx) == -1) {
+ fprintf(stderr, "Connection failed: %s\n",
+ modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+ }
+
+ /* Allocate and initialize the memory to store the bits */
+ nb_points = (UT_BITS_NB > UT_INPUT_BITS_NB) ? UT_BITS_NB : UT_INPUT_BITS_NB;
+ tab_rp_bits = (uint8_t *) malloc(nb_points * sizeof(uint8_t));
+ memset(tab_rp_bits, 0, nb_points * sizeof(uint8_t));
+
+ /* Allocate and initialize the memory to store the registers */
+ nb_points = (UT_REGISTERS_NB > UT_INPUT_REGISTERS_NB) ?
+ UT_REGISTERS_NB : UT_INPUT_REGISTERS_NB;
+ tab_rp_registers = (uint16_t *) malloc(nb_points * sizeof(uint16_t));
+ memset(tab_rp_registers, 0, nb_points * sizeof(uint16_t));
+
+ printf("** UNIT TESTING **\n");
+
+ printf("\nTEST WRITE/READ:\n");
+
+ /** COIL BITS **/
+
+ /* Single */
+ rc = modbus_write_bit(ctx, UT_BITS_ADDRESS, ON);
+ printf("1/2 modbus_write_bit: ");
+ if (rc == 1) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_bits(ctx, UT_BITS_ADDRESS, 1, tab_rp_bits);
+ printf("2/2 modbus_read_bits: ");
+ if (rc != 1) {
+ printf("FAILED (nb points %d)\n", rc);
+ goto close;
+ }
+
+ if (tab_rp_bits[0] != ON) {
+ printf("FAILED (%0X = != %0X)\n", tab_rp_bits[0], ON);
+ goto close;
+ }
+ printf("OK\n");
+ /* End single */
+
+ /* Multiple bits */
+ {
+ uint8_t tab_value[UT_BITS_NB];
+
+ modbus_set_bits_from_bytes(tab_value, 0, UT_BITS_NB, UT_BITS_TAB);
+ rc = modbus_write_bits(ctx, UT_BITS_ADDRESS,
+ UT_BITS_NB, tab_value);
+ printf("1/2 modbus_write_bits: ");
+ if (rc == UT_BITS_NB) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+ }
+
+ rc = modbus_read_bits(ctx, UT_BITS_ADDRESS, UT_BITS_NB, tab_rp_bits);
+ printf("2/2 modbus_read_bits: ");
+ if (rc != UT_BITS_NB) {
+ printf("FAILED (nb points %d)\n", rc);
+ goto close;
+ }
+
+ i = 0;
+ nb_points = UT_BITS_NB;
+ while (nb_points > 0) {
+ int nb_bits = (nb_points > 8) ? 8 : nb_points;
+
+ value = modbus_get_byte_from_bits(tab_rp_bits, i*8, nb_bits);
+ if (value != UT_BITS_TAB[i]) {
+ printf("FAILED (%0X != %0X)\n", value, UT_BITS_TAB[i]);
+ goto close;
+ }
+
+ nb_points -= nb_bits;
+ i++;
+ }
+ printf("OK\n");
+ /* End of multiple bits */
+
+ /** DISCRETE INPUTS **/
+ rc = modbus_read_input_bits(ctx, UT_INPUT_BITS_ADDRESS,
+ UT_INPUT_BITS_NB, tab_rp_bits);
+ printf("1/1 modbus_read_input_bits: ");
+
+ if (rc != UT_INPUT_BITS_NB) {
+ printf("FAILED (nb points %d)\n", rc);
+ goto close;
+ }
+
+ i = 0;
+ nb_points = UT_INPUT_BITS_NB;
+ while (nb_points > 0) {
+ int nb_bits = (nb_points > 8) ? 8 : nb_points;
+
+ value = modbus_get_byte_from_bits(tab_rp_bits, i*8, nb_bits);
+ if (value != UT_INPUT_BITS_TAB[i]) {
+ printf("FAILED (%0X != %0X)\n", value, UT_INPUT_BITS_TAB[i]);
+ goto close;
+ }
+
+ nb_points -= nb_bits;
+ i++;
+ }
+ printf("OK\n");
+
+ /** HOLDING REGISTERS **/
+
+ /* Single register */
+ rc = modbus_write_register(ctx, UT_REGISTERS_ADDRESS, 0x1234);
+ printf("1/2 modbus_write_register: ");
+ if (rc == 1) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ 1, tab_rp_registers);
+ printf("2/2 modbus_read_registers: ");
+ if (rc != 1) {
+ printf("FAILED (nb points %d)\n", rc);
+ goto close;
+ }
+
+ if (tab_rp_registers[0] != 0x1234) {
+ printf("FAILED (%0X != %0X)\n",
+ tab_rp_registers[0], 0x1234);
+ goto close;
+ }
+ printf("OK\n");
+ /* End of single register */
+
+ /* Many registers */
+ rc = modbus_write_registers(ctx, UT_REGISTERS_ADDRESS,
+ UT_REGISTERS_NB, UT_REGISTERS_TAB);
+ printf("1/5 modbus_write_registers: ");
+ if (rc == UT_REGISTERS_NB) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ UT_REGISTERS_NB, tab_rp_registers);
+ printf("2/5 modbus_read_registers: ");
+ if (rc != UT_REGISTERS_NB) {
+ printf("FAILED (nb points %d)\n", rc);
+ goto close;
+ }
+
+ for (i=0; i < UT_REGISTERS_NB; i++) {
+ if (tab_rp_registers[i] != UT_REGISTERS_TAB[i]) {
+ printf("FAILED (%0X != %0X)\n",
+ tab_rp_registers[i],
+ UT_REGISTERS_TAB[i]);
+ goto close;
+ }
+ }
+ printf("OK\n");
+
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ 0, tab_rp_registers);
+ printf("3/5 modbus_read_registers (0): ");
+ if (rc != 0) {
+ printf("FAILED (nb points %d)\n", rc);
+ goto close;
+ }
+ printf("OK\n");
+
+ nb_points = (UT_REGISTERS_NB >
+ UT_INPUT_REGISTERS_NB) ?
+ UT_REGISTERS_NB : UT_INPUT_REGISTERS_NB;
+ memset(tab_rp_registers, 0, nb_points * sizeof(uint16_t));
+
+ /* Write registers to zero from tab_rp_registers and store read registers
+ into tab_rp_registers. So the read registers must set to 0, except the
+ first one because there is an offset of 1 register on write. */
+ rc = modbus_write_and_read_registers(ctx,
+ UT_REGISTERS_ADDRESS + 1, UT_REGISTERS_NB - 1,
+ tab_rp_registers,
+ UT_REGISTERS_ADDRESS,
+ UT_REGISTERS_NB,
+ tab_rp_registers);
+ printf("4/5 modbus_write_and_read_registers: ");
+ if (rc != UT_REGISTERS_NB) {
+ printf("FAILED (nb points %d != %d)\n", rc, UT_REGISTERS_NB);
+ goto close;
+ }
+
+ if (tab_rp_registers[0] != UT_REGISTERS_TAB[0]) {
+ printf("FAILED (%0X != %0X)\n",
+ tab_rp_registers[0], UT_REGISTERS_TAB[0]);
+ }
+
+ for (i=1; i < UT_REGISTERS_NB; i++) {
+ if (tab_rp_registers[i] != 0) {
+ printf("FAILED (%0X != %0X)\n",
+ tab_rp_registers[i], 0);
+ goto close;
+ }
+ }
+ printf("OK\n");
+
+ /* End of many registers */
+
+
+ /** INPUT REGISTERS **/
+ rc = modbus_read_input_registers(ctx, UT_INPUT_REGISTERS_ADDRESS,
+ UT_INPUT_REGISTERS_NB,
+ tab_rp_registers);
+ printf("1/1 modbus_read_input_registers: ");
+ if (rc != UT_INPUT_REGISTERS_NB) {
+ printf("FAILED (nb points %d)\n", rc);
+ goto close;
+ }
+
+ for (i=0; i < UT_INPUT_REGISTERS_NB; i++) {
+ if (tab_rp_registers[i] != UT_INPUT_REGISTERS_TAB[i]) {
+ printf("FAILED (%0X != %0X)\n",
+ tab_rp_registers[i], UT_INPUT_REGISTERS_TAB[i]);
+ goto close;
+ }
+ }
+ printf("OK\n");
+
+ printf("\nTEST FLOATS\n");
+ /** FLOAT **/
+ printf("1/2 Set float: ");
+ modbus_set_float(UT_REAL, tab_rp_registers);
+ if (tab_rp_registers[1] == (UT_IREAL >> 16) &&
+ tab_rp_registers[0] == (UT_IREAL & 0xFFFF)) {
+ printf("OK\n");
+ } else {
+ printf("FAILED (%x != %x)\n",
+ *((uint32_t *)tab_rp_registers), UT_IREAL);
+ goto close;
+ }
+
+ printf("2/2 Get float: ");
+ real = modbus_get_float(tab_rp_registers);
+ if (real == UT_REAL) {
+ printf("OK\n");
+ } else {
+ printf("FAILED (%f != %f)\n", real, UT_REAL);
+ goto close;
+ }
+
+ printf("\nAt this point, error messages doesn't mean the test has failed\n");
+
+ /** ILLEGAL DATA ADDRESS **/
+ printf("\nTEST ILLEGAL DATA ADDRESS:\n");
+
+ /* The mapping begins at 0 and ends at address + nb_points so
+ * the addresses are not valid. */
+
+ rc = modbus_read_bits(ctx, UT_BITS_ADDRESS,
+ UT_BITS_NB + 1, tab_rp_bits);
+ printf("* modbus_read_bits: ");
+ if (rc == -1 && errno == EMBXILADD) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_input_bits(ctx, UT_INPUT_BITS_ADDRESS,
+ UT_INPUT_BITS_NB + 1, tab_rp_bits);
+ printf("* modbus_read_input_bits: ");
+ if (rc == -1 && errno == EMBXILADD)
+ printf("OK\n");
+ else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ UT_REGISTERS_NB + 1, tab_rp_registers);
+ printf("* modbus_read_registers: ");
+ if (rc == -1 && errno == EMBXILADD)
+ printf("OK\n");
+ else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_input_registers(ctx, UT_INPUT_REGISTERS_ADDRESS,
+ UT_INPUT_REGISTERS_NB + 1,
+ tab_rp_registers);
+ printf("* modbus_read_input_registers: ");
+ if (rc == -1 && errno == EMBXILADD)
+ printf("OK\n");
+ else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_write_bit(ctx, UT_BITS_ADDRESS + UT_BITS_NB, ON);
+ printf("* modbus_write_bit: ");
+ if (rc == -1 && errno == EMBXILADD) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_write_bits(ctx, UT_BITS_ADDRESS + UT_BITS_NB,
+ UT_BITS_NB, tab_rp_bits);
+ printf("* modbus_write_coils: ");
+ if (rc == -1 && errno == EMBXILADD) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_write_registers(ctx, UT_REGISTERS_ADDRESS + UT_REGISTERS_NB,
+ UT_REGISTERS_NB, tab_rp_registers);
+ printf("* modbus_write_registers: ");
+ if (rc == -1 && errno == EMBXILADD) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+
+ /** TOO MANY DATA **/
+ printf("\nTEST TOO MANY DATA ERROR:\n");
+
+ rc = modbus_read_bits(ctx, UT_BITS_ADDRESS,
+ MODBUS_MAX_READ_BITS + 1, tab_rp_bits);
+ printf("* modbus_read_bits: ");
+ if (rc == -1 && errno == EMBMDATA) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_input_bits(ctx, UT_INPUT_BITS_ADDRESS,
+ MODBUS_MAX_READ_BITS + 1, tab_rp_bits);
+ printf("* modbus_read_input_bits: ");
+ if (rc == -1 && errno == EMBMDATA) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ MODBUS_MAX_READ_REGISTERS + 1,
+ tab_rp_registers);
+ printf("* modbus_read_registers: ");
+ if (rc == -1 && errno == EMBMDATA) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_read_input_registers(ctx, UT_INPUT_REGISTERS_ADDRESS,
+ MODBUS_MAX_READ_REGISTERS + 1,
+ tab_rp_registers);
+ printf("* modbus_read_input_registers: ");
+ if (rc == -1 && errno == EMBMDATA) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ rc = modbus_write_bits(ctx, UT_BITS_ADDRESS,
+ MODBUS_MAX_WRITE_BITS + 1, tab_rp_bits);
+ printf("* modbus_write_bits: ");
+ if (rc == -1 && errno == EMBMDATA) {
+ printf("OK\n");
+ } else {
+ goto close;
+ printf("FAILED\n");
+ }
+
+ rc = modbus_write_registers(ctx, UT_REGISTERS_ADDRESS,
+ MODBUS_MAX_WRITE_REGISTERS + 1,
+ tab_rp_registers);
+ printf("* modbus_write_registers: ");
+ if (rc == -1 && errno == EMBMDATA) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ /** SLAVE REPLY **/
+ printf("\nTEST SLAVE REPLY:\n");
+ modbus_set_slave(ctx, INVALID_SERVER_ID);
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ UT_REGISTERS_NB, tab_rp_registers);
+ if (use_backend == RTU) {
+ const int RAW_REQ_LENGTH = 6;
+ uint8_t raw_req[] = { INVALID_SERVER_ID, 0x03, 0x00, 0x01, 0xFF, 0xFF };
+ uint8_t rsp[MODBUS_TCP_MAX_ADU_LENGTH];
+
+ /* No response in RTU mode */
+ printf("1/4-A No response from slave %d: ", INVALID_SERVER_ID);
+
+ if (rc == -1 && errno == ETIMEDOUT) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ /* Send an invalid query with a wrong slave ID */
+ modbus_send_raw_request(ctx, raw_req,
+ RAW_REQ_LENGTH * sizeof(uint8_t));
+ rc = modbus_receive_confirmation(ctx, rsp);
+
+ printf("1/4-B No response from slave %d with invalid request: ",
+ INVALID_SERVER_ID);
+
+ if (rc == -1 && errno == ETIMEDOUT) {
+ printf("OK\n");
+ } else {
+ printf("FAILED (%d)\n", rc);
+ goto close;
+ }
+
+ } else {
+ /* Response in TCP mode */
+ printf("1/4 Response from slave %d: ", 18);
+
+ if (rc == UT_REGISTERS_NB) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+ }
+
+ rc = modbus_set_slave(ctx, MODBUS_BROADCAST_ADDRESS);
+ if (rc == -1) {
+ printf("Invalid broacast address\n");
+ goto close;
+ }
+
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ UT_REGISTERS_NB, tab_rp_registers);
+ printf("2/4 Reply after a broadcast query: ");
+ if (rc == UT_REGISTERS_NB) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ /* Restore slave */
+ if (use_backend == RTU) {
+ modbus_set_slave(ctx, SERVER_ID);
+ } else {
+ modbus_set_slave(ctx, MODBUS_TCP_SLAVE);
+ }
+
+ printf("3/4 Report slave ID: \n");
+ /* tab_rp_bits is used to store bytes */
+ rc = modbus_report_slave_id(ctx, tab_rp_bits);
+ if (rc == -1) {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ /* Slave ID is an arbitraty number for libmodbus */
+ if (rc > 0) {
+ printf("OK Slave ID is %d\n", tab_rp_bits[0]);
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ /* Run status indicator */
+ if (rc > 1 && tab_rp_bits[1] == 0xFF) {
+ printf("OK Run Status Indicator is %s\n", tab_rp_bits[1] ? "ON" : "OFF");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ /* Print additional data as string */
+ if (rc > 2) {
+ printf("Additional data: ");
+ for (i=2; i < rc; i++) {
+ printf("%c", tab_rp_bits[i]);
+ }
+ printf("\n");
+ }
+
+ /* Save original timeout */
+ modbus_get_response_timeout(ctx, &old_response_timeout);
+
+ /* Define a new and too short timeout */
+ response_timeout.tv_sec = 0;
+ response_timeout.tv_usec = 0;
+ modbus_set_response_timeout(ctx, &response_timeout);
+
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ UT_REGISTERS_NB, tab_rp_registers);
+ printf("4/4 Too short timeout: ");
+ if (rc == -1 && errno == ETIMEDOUT) {
+ printf("OK\n");
+ } else {
+ printf("FAILED (can fail on slow systems or Windows)\n");
+ }
+
+ /* Restore original timeout */
+ modbus_set_response_timeout(ctx, &old_response_timeout);
+
+ /* A wait and flush operation is done by the error recovery code of
+ * libmodbus */
+
+ /** BAD RESPONSE **/
+ printf("\nTEST BAD RESPONSE ERROR:\n");
+
+ /* Allocate only the required space */
+ tab_rp_registers_bad = (uint16_t *) malloc(
+ UT_REGISTERS_NB_SPECIAL * sizeof(uint16_t));
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS,
+ UT_REGISTERS_NB_SPECIAL, tab_rp_registers_bad);
+ printf("* modbus_read_registers: ");
+ if (rc == -1 && errno == EMBBADDATA) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ free(tab_rp_registers_bad);
+
+ /** MANUAL EXCEPTION **/
+ printf("\nTEST MANUAL EXCEPTION:\n");
+
+ rc = modbus_read_registers(ctx, UT_REGISTERS_ADDRESS_SPECIAL,
+ UT_REGISTERS_NB, tab_rp_registers);
+ printf("* modbus_read_registers at special address: ");
+ if (rc == -1 && errno == EMBXSBUSY) {
+ printf("OK\n");
+ } else {
+ printf("FAILED\n");
+ goto close;
+ }
+
+ /** RAW REQUEST */
+ printf("\nTEST RAW REQUEST:\n");
+ {
+ const int RAW_REQ_LENGTH = 6;
+ uint8_t raw_req[] = { (use_backend == RTU) ? SERVER_ID : 0xFF,
+ 0x03, 0x00, 0x01, 0x0, 0x05 };
+ int req_length;
+ uint8_t rsp[MODBUS_TCP_MAX_ADU_LENGTH];
+
+ req_length = modbus_send_raw_request(ctx, raw_req,
+ RAW_REQ_LENGTH * sizeof(uint8_t));
+
+ printf("* modbus_send_raw_request: ");
+ if ((use_backend == RTU && req_length == (RAW_REQ_LENGTH + 2)) ||
+ ((use_backend == TCP || use_backend == TCP_PI) &&
+ req_length == (RAW_REQ_LENGTH + 6))) {
+ printf("OK\n");
+ } else {
+ printf("FAILED (%d)\n", req_length);
+ goto close;
+ }
+
+ printf("* modbus_receive_confirmation: ");
+ rc = modbus_receive_confirmation(ctx, rsp);
+ if ((use_backend == RTU && rc == 15) ||
+ ((use_backend == TCP || use_backend == TCP_PI) &&
+ rc == 19)) {
+ printf("OK\n");
+ } else {
+ printf("FAILED (%d)\n", rc);
+ goto close;
+ }
+ }
+
+ printf("\nALL TESTS PASS WITH SUCCESS.\n");
+
+close:
+ /* Free the memory */
+ free(tab_rp_bits);
+ free(tab_rp_registers);
+
+ /* Close the connection */
+ modbus_close(ctx);
+ modbus_free(ctx);
+
+ return 0;
+}
diff --git a/tests/unit-test-client.o b/tests/unit-test-client.o
new file mode 100644
index 0000000..8358604
--- /dev/null
+++ b/tests/unit-test-client.o
Binary files differ
diff --git a/tests/unit-test-server b/tests/unit-test-server
new file mode 100755
index 0000000..a8d1c0e
--- /dev/null
+++ b/tests/unit-test-server
@@ -0,0 +1,225 @@
+#! /bin/bash
+
+# unit-test-server - temporary wrapper script for .libs/unit-test-server
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-3
+#
+# The unit-test-server program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command="(cd /home/jmccrohan/bin/libmodbus/tests; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11; export PATH; gcc -g -O2 -g -O2 -Wall -Werror -o \$progdir/\$file unit-test-server.o ../src/.libs/libmodbus.so -Wl,-rpath -Wl,/home/jmccrohan/bin/libmodbus/src/.libs)"
+
+# This environment variable determines our operation mode.
+if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
+ # install mode needs the following variables:
+ generated_by_libtool_version='2.4'
+ notinst_deplibs=' ../src/libmodbus.la'
+else
+ # When we are sourced in execute mode, $file and $ECHO are already set.
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ file="$0"
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+ ECHO="printf %s\\n"
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string --lt-
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's ../libtool value, followed by no.
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=$0
+ shift
+ for lt_opt
+ do
+ case "$lt_opt" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
+ test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
+ lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
+ cat "$lt_dump_D/$lt_dump_F"
+ exit 0
+ ;;
+ --lt-*)
+ $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n "$lt_option_debug"; then
+ echo "unit-test-server:unit-test-server:${LINENO}: libtool wrapper (GNU libtool) 2.4 Debian-2.4-3" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ $ECHO "unit-test-server:unit-test-server:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
+ lt_dump_args_N=`expr $lt_dump_args_N + 1`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+
+ if test -n "$lt_option_debug"; then
+ $ECHO "unit-test-server:unit-test-server:${LINENO}: newargv[0]: $progdir/$program" 1>&2
+ func_lt_dump_args ${1+"$@"} 1>&2
+ fi
+ exec "$progdir/$program" ${1+"$@"}
+
+ $ECHO "$0: cannot exec $program $*" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from $@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ for lt_wr_arg
+ do
+ case $lt_wr_arg in
+ --lt-*) ;;
+ *) set x "$@" "$lt_wr_arg"; shift;;
+ esac
+ shift
+ done
+ func_exec_program_core ${1+"$@"}
+}
+
+ # Parse options
+ func_parse_lt_options "$0" ${1+"$@"}
+
+ # Find the directory that this script lives in.
+ thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+ test "x$thisdir" = "x$file" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
+ while test -n "$file"; do
+ destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+
+ # If there was a directory component, then change thisdir.
+ if test "x$destdir" != "x$file"; then
+ case "$destdir" in
+ [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
+ *) thisdir="$thisdir/$destdir" ;;
+ esac
+ fi
+
+ file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
+ file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
+ done
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
+ if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
+ # special case for '.'
+ if test "$thisdir" = "."; then
+ thisdir=`pwd`
+ fi
+ # remove .libs from thisdir
+ case "$thisdir" in
+ *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
+ .libs ) thisdir=. ;;
+ esac
+ fi
+
+ # Try to get the absolute directory name.
+ absdir=`cd "$thisdir" && pwd`
+ test -n "$absdir" && thisdir="$absdir"
+
+ program=lt-'unit-test-server'
+ progdir="$thisdir/.libs"
+
+ if test ! -f "$progdir/$program" ||
+ { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
+ test "X$file" != "X$progdir/$program"; }; then
+
+ file="$$-$program"
+
+ if test ! -d "$progdir"; then
+ mkdir "$progdir"
+ else
+ rm -f "$progdir/$file"
+ fi
+
+ # relink executable if necessary
+ if test -n "$relink_command"; then
+ if relink_command_output=`eval $relink_command 2>&1`; then :
+ else
+ printf %s\n "$relink_command_output" >&2
+ rm -f "$progdir/$file"
+ exit 1
+ fi
+ fi
+
+ mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
+ { rm -f "$progdir/$program";
+ mv -f "$progdir/$file" "$progdir/$program"; }
+ rm -f "$progdir/$file"
+ fi
+
+ if test -f "$progdir/$program"; then
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ # Run the actual program with our arguments.
+ func_exec_program ${1+"$@"}
+ fi
+ else
+ # The program doesn't exist.
+ $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
+ $ECHO "This script is just a wrapper for $program." 1>&2
+ $ECHO "See the libtool documentation for more information." 1>&2
+ exit 1
+ fi
+fi
diff --git a/tests/unit-test-server.c b/tests/unit-test-server.c
new file mode 100644
index 0000000..9a986c5
--- /dev/null
+++ b/tests/unit-test-server.c
@@ -0,0 +1,155 @@
+/*
+ * Copyright © 2008-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <modbus.h>
+
+#include "unit-test.h"
+
+enum {
+ TCP,
+ TCP_PI,
+ RTU
+};
+
+int main(int argc, char*argv[])
+{
+ int socket;
+ modbus_t *ctx;
+ modbus_mapping_t *mb_mapping;
+ int rc;
+ int i;
+ int use_backend;
+ uint8_t *query;
+ int header_length;
+
+ if (argc > 1) {
+ if (strcmp(argv[1], "tcp") == 0) {
+ use_backend = TCP;
+ } else if (strcmp(argv[1], "tcppi") == 0) {
+ use_backend = TCP_PI;
+ } else if (strcmp(argv[1], "rtu") == 0) {
+ use_backend = RTU;
+ } else {
+ printf("Usage:\n %s [tcp|tcppi|rtu] - Modbus server for unit testing\n\n", argv[0]);
+ return -1;
+ }
+ } else {
+ /* By default */
+ use_backend = TCP;
+ }
+
+ if (use_backend == TCP) {
+ ctx = modbus_new_tcp("127.0.0.1", 1502);
+ query = malloc(MODBUS_TCP_MAX_ADU_LENGTH);
+ } else if (use_backend == TCP_PI) {
+ ctx = modbus_new_tcp_pi("::0", "1502");
+ query = malloc(MODBUS_TCP_MAX_ADU_LENGTH);
+ } else {
+ ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
+ modbus_set_slave(ctx, SERVER_ID);
+ query = malloc(MODBUS_RTU_MAX_ADU_LENGTH);
+ }
+ header_length = modbus_get_header_length(ctx);
+
+ modbus_set_debug(ctx, TRUE);
+
+ mb_mapping = modbus_mapping_new(
+ UT_BITS_ADDRESS + UT_BITS_NB,
+ UT_INPUT_BITS_ADDRESS + UT_INPUT_BITS_NB,
+ UT_REGISTERS_ADDRESS + UT_REGISTERS_NB,
+ UT_INPUT_REGISTERS_ADDRESS + UT_INPUT_REGISTERS_NB);
+ if (mb_mapping == NULL) {
+ fprintf(stderr, "Failed to allocate the mapping: %s\n",
+ modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+ }
+
+ /* Examples from PI_MODBUS_300.pdf.
+ Only the read-only input values are assigned. */
+
+ /** INPUT STATUS **/
+ modbus_set_bits_from_bytes(mb_mapping->tab_input_bits,
+ UT_INPUT_BITS_ADDRESS, UT_INPUT_BITS_NB,
+ UT_INPUT_BITS_TAB);
+
+ /** INPUT REGISTERS **/
+ for (i=0; i < UT_INPUT_REGISTERS_NB; i++) {
+ mb_mapping->tab_input_registers[UT_INPUT_REGISTERS_ADDRESS+i] =
+ UT_INPUT_REGISTERS_TAB[i];;
+ }
+
+ if (use_backend == TCP) {
+ socket = modbus_tcp_listen(ctx, 1);
+ modbus_tcp_accept(ctx, &socket);
+ } else if (use_backend == TCP_PI) {
+ socket = modbus_tcp_pi_listen(ctx, 1);
+ modbus_tcp_pi_accept(ctx, &socket);
+ } else {
+ rc = modbus_connect(ctx);
+ if (rc == -1) {
+ fprintf(stderr, "Unable to connect %s\n", modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+ }
+ }
+
+ for (;;) {
+ rc = modbus_receive(ctx, query);
+ if (rc == -1) {
+ /* Connection closed by the client or error */
+ break;
+ }
+
+ /* Read holding registers */
+ if (query[header_length] == 0x03) {
+ if (MODBUS_GET_INT16_FROM_INT8(query, header_length + 3)
+ == UT_REGISTERS_NB_SPECIAL) {
+ printf("Set an incorrect number of values\n");
+ MODBUS_SET_INT16_TO_INT8(query, header_length + 3,
+ UT_REGISTERS_NB_SPECIAL - 1);
+ } else if (MODBUS_GET_INT16_FROM_INT8(query, header_length + 1)
+ == UT_REGISTERS_ADDRESS_SPECIAL) {
+ printf("Reply to this special register address by an exception\n");
+ modbus_reply_exception(ctx, query,
+ MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY);
+ continue;
+ }
+ }
+
+ rc = modbus_reply(ctx, query, rc, mb_mapping);
+ if (rc == -1) {
+ break;
+ }
+ }
+
+ printf("Quit the loop: %s\n", modbus_strerror(errno));
+
+ if (use_backend == TCP) {
+ close(socket);
+ }
+ modbus_mapping_free(mb_mapping);
+ free(query);
+ modbus_free(ctx);
+
+ return 0;
+}
diff --git a/tests/unit-test-server.o b/tests/unit-test-server.o
new file mode 100644
index 0000000..7d3a2de
--- /dev/null
+++ b/tests/unit-test-server.o
Binary files differ
diff --git a/tests/unit-test.h b/tests/unit-test.h
new file mode 100644
index 0000000..78575c1
--- /dev/null
+++ b/tests/unit-test.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2008-2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _UNIT_TEST_H_
+#define _UNIT_TEST_H_
+
+#include <config.h>
+
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# ifndef _MSC_VER
+# include <stdint.h>
+# else
+# include "stdint.h"
+# endif
+#endif
+
+#define SERVER_ID 17
+#define INVALID_SERVER_ID 18
+
+const uint16_t UT_BITS_ADDRESS = 0x13;
+const uint16_t UT_BITS_NB = 0x25;
+const uint8_t UT_BITS_TAB[] = { 0xCD, 0x6B, 0xB2, 0x0E, 0x1B };
+
+const uint16_t UT_INPUT_BITS_ADDRESS = 0xC4;
+const uint16_t UT_INPUT_BITS_NB = 0x16;
+const uint8_t UT_INPUT_BITS_TAB[] = { 0xAC, 0xDB, 0x35 };
+
+const uint16_t UT_REGISTERS_ADDRESS = 0x6B;
+/* Raise a manual exception when this adress is used for the first byte */
+const uint16_t UT_REGISTERS_ADDRESS_SPECIAL = 0x6C;
+const uint16_t UT_REGISTERS_NB = 0x3;
+const uint16_t UT_REGISTERS_TAB[] = { 0x022B, 0x0001, 0x0064 };
+/* If the following value is used, a bad response is sent.
+ It's better to test with a lower value than
+ UT_REGISTERS_NB_POINTS to try to raise a segfault. */
+const uint16_t UT_REGISTERS_NB_SPECIAL = 0x2;
+
+const uint16_t UT_INPUT_REGISTERS_ADDRESS = 0x08;
+const uint16_t UT_INPUT_REGISTERS_NB = 0x1;
+const uint16_t UT_INPUT_REGISTERS_TAB[] = { 0x000A };
+
+const float UT_REAL = 916.540649;
+const uint32_t UT_IREAL = 0x4465229a;
+
+#endif /* _UNIT_TEST_H_ */
diff --git a/tests/version b/tests/version
new file mode 100755
index 0000000..7fa8075
--- /dev/null
+++ b/tests/version
@@ -0,0 +1,225 @@
+#! /bin/bash
+
+# version - temporary wrapper script for .libs/version
+# Generated by libtool (GNU libtool) 2.4 Debian-2.4-3
+#
+# The version program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else
+ case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command="(cd /home/jmccrohan/bin/libmodbus/tests; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11; export PATH; gcc -g -O2 -g -O2 -Wall -Werror -o \$progdir/\$file version.o ../src/.libs/libmodbus.so -Wl,-rpath -Wl,/home/jmccrohan/bin/libmodbus/src/.libs)"
+
+# This environment variable determines our operation mode.
+if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then
+ # install mode needs the following variables:
+ generated_by_libtool_version='2.4'
+ notinst_deplibs=' ../src/libmodbus.la'
+else
+ # When we are sourced in execute mode, $file and $ECHO are already set.
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ file="$0"
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+ eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+ ECHO="printf %s\\n"
+ fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string --lt-
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's ../libtool value, followed by no.
+lt_option_debug=
+func_parse_lt_options ()
+{
+ lt_script_arg0=$0
+ shift
+ for lt_opt
+ do
+ case "$lt_opt" in
+ --lt-debug) lt_option_debug=1 ;;
+ --lt-dump-script)
+ lt_dump_D=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%/[^/]*$%%'`
+ test "X$lt_dump_D" = "X$lt_script_arg0" && lt_dump_D=.
+ lt_dump_F=`$ECHO "X$lt_script_arg0" | /bin/sed -e 's/^X//' -e 's%^.*/%%'`
+ cat "$lt_dump_D/$lt_dump_F"
+ exit 0
+ ;;
+ --lt-*)
+ $ECHO "Unrecognized --lt- option: '$lt_opt'" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+
+ # Print the debug banner immediately:
+ if test -n "$lt_option_debug"; then
+ echo "version:version:${LINENO}: libtool wrapper (GNU libtool) 2.4 Debian-2.4-3" 1>&2
+ fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+ lt_dump_args_N=1;
+ for lt_arg
+ do
+ $ECHO "version:version:${LINENO}: newargv[$lt_dump_args_N]: $lt_arg"
+ lt_dump_args_N=`expr $lt_dump_args_N + 1`
+ done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+
+ if test -n "$lt_option_debug"; then
+ $ECHO "version:version:${LINENO}: newargv[0]: $progdir/$program" 1>&2
+ func_lt_dump_args ${1+"$@"} 1>&2
+ fi
+ exec "$progdir/$program" ${1+"$@"}
+
+ $ECHO "$0: cannot exec $program $*" 1>&2
+ exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from $@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+ for lt_wr_arg
+ do
+ case $lt_wr_arg in
+ --lt-*) ;;
+ *) set x "$@" "$lt_wr_arg"; shift;;
+ esac
+ shift
+ done
+ func_exec_program_core ${1+"$@"}
+}
+
+ # Parse options
+ func_parse_lt_options "$0" ${1+"$@"}
+
+ # Find the directory that this script lives in.
+ thisdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+ test "x$thisdir" = "x$file" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'`
+ while test -n "$file"; do
+ destdir=`$ECHO "$file" | /bin/sed 's%/[^/]*$%%'`
+
+ # If there was a directory component, then change thisdir.
+ if test "x$destdir" != "x$file"; then
+ case "$destdir" in
+ [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;;
+ *) thisdir="$thisdir/$destdir" ;;
+ esac
+ fi
+
+ file=`$ECHO "$file" | /bin/sed 's%^.*/%%'`
+ file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'`
+ done
+
+ # Usually 'no', except on cygwin/mingw when embedded into
+ # the cwrapper.
+ WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=no
+ if test "$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR" = "yes"; then
+ # special case for '.'
+ if test "$thisdir" = "."; then
+ thisdir=`pwd`
+ fi
+ # remove .libs from thisdir
+ case "$thisdir" in
+ *[\\/].libs ) thisdir=`$ECHO "$thisdir" | /bin/sed 's%[\\/][^\\/]*$%%'` ;;
+ .libs ) thisdir=. ;;
+ esac
+ fi
+
+ # Try to get the absolute directory name.
+ absdir=`cd "$thisdir" && pwd`
+ test -n "$absdir" && thisdir="$absdir"
+
+ program=lt-'version'
+ progdir="$thisdir/.libs"
+
+ if test ! -f "$progdir/$program" ||
+ { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \
+ test "X$file" != "X$progdir/$program"; }; then
+
+ file="$$-$program"
+
+ if test ! -d "$progdir"; then
+ mkdir "$progdir"
+ else
+ rm -f "$progdir/$file"
+ fi
+
+ # relink executable if necessary
+ if test -n "$relink_command"; then
+ if relink_command_output=`eval $relink_command 2>&1`; then :
+ else
+ printf %s\n "$relink_command_output" >&2
+ rm -f "$progdir/$file"
+ exit 1
+ fi
+ fi
+
+ mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null ||
+ { rm -f "$progdir/$program";
+ mv -f "$progdir/$file" "$progdir/$program"; }
+ rm -f "$progdir/$file"
+ fi
+
+ if test -f "$progdir/$program"; then
+ if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then
+ # Run the actual program with our arguments.
+ func_exec_program ${1+"$@"}
+ fi
+ else
+ # The program doesn't exist.
+ $ECHO "$0: error: \`$progdir/$program' does not exist" 1>&2
+ $ECHO "This script is just a wrapper for $program." 1>&2
+ $ECHO "See the libtool documentation for more information." 1>&2
+ exit 1
+ fi
+fi
diff --git a/tests/version.c b/tests/version.c
new file mode 100644
index 0000000..e0fc569
--- /dev/null
+++ b/tests/version.c
@@ -0,0 +1,36 @@
+/*
+ * Copyright © 2010 Stéphane Raimbault <stephane.raimbault@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <modbus.h>
+
+int main(void)
+{
+ printf("Compiled with libmodbus version %s\n", LIBMODBUS_VERSION_STRING);
+ printf("Linked with libmodbus version %d.%d.%d\n",
+ libmodbus_version_major, libmodbus_version_minor, libmodbus_version_micro);
+
+ if (LIBMODBUS_VERSION_CHECK(2, 1, 0)) {
+ printf("The functions to read/write float values are available (2.1.0).\n");
+ }
+
+ if (LIBMODBUS_VERSION_CHECK(2, 1, 1)) {
+ printf("Oh gosh, brand new API (2.1.1)!\n");
+ }
+
+ return 0;
+}
diff --git a/tests/version.o b/tests/version.o
new file mode 100644
index 0000000..fa29586
--- /dev/null
+++ b/tests/version.o
Binary files differ
diff --git a/verteco b/verteco
new file mode 100755
index 0000000..4223811
--- /dev/null
+++ b/verteco
Binary files differ
diff --git a/verteco.c b/verteco.c
new file mode 100644
index 0000000..a039952
--- /dev/null
+++ b/verteco.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <modbus.h>
+
+#define SLAVE_ID 1
+#define START_ADDRESS 0
+#define NUMBER_REGISTERS 14
+
+#define DEBUG_MODE 0
+
+int main(int argc, char *argv[])
+{
+
+if ( argc != 2 ){
+ return -1;
+}
+
+
+modbus_t *ctx;
+uint16_t tab_reg[64];
+int rc;
+int i;
+
+ctx = modbus_new_rtu(argv[1], 19200, 'E', 8, 1);
+modbus_set_slave(ctx, SLAVE_ID);
+
+modbus_set_debug(ctx, DEBUG_MODE);
+
+if (ctx == NULL) {
+ fprintf(stderr, "Unable to create the libmodbus context\n");
+ return -1;
+}
+
+
+
+if (modbus_connect(ctx) == -1) {
+ fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
+ modbus_free(ctx);
+ return -1;
+}
+
+rc = modbus_read_input_registers(ctx, START_ADDRESS, NUMBER_REGISTERS, tab_reg);
+
+
+if (rc == -1) {
+ fprintf(stderr, "ERROR: %s\n", modbus_strerror(errno));
+ return -1;
+}
+
+
+for (i=0; i < rc; i=i+2) {
+ printf("reg[%d]=%d\n", i, tab_reg[i]+tab_reg[i+1]);
+}
+
+
+modbus_close(ctx);
+modbus_free(ctx);
+
+ return 0;
+}