summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1999-07-08 06:44:55 +0200
committerRalf Baechle <ralf@linux-mips.org>1999-07-08 06:44:55 +0200
commit5f5d1604492ae15967f9d86f41fbeeedcae0ae2b (patch)
treebcecfd65dc578eabfaee10b1e039c467ac89d8b5
parent1b4023134b5ff6342301c8135b11df46546d2828 (diff)
Import ax25-tools 0.0.3 from tarballax25-tools-0.0.3
-rw-r--r--AUTHORS2
-rw-r--r--ChangeLog17
-rw-r--r--INSTALL17
-rw-r--r--Makefile.am13
-rw-r--r--Makefile.in14
-rw-r--r--README2
-rw-r--r--acconfig.h14
-rw-r--r--ax25/Makefile.am20
-rw-r--r--ax25/Makefile.in20
-rw-r--r--ax25/ax25d.c2
-rw-r--r--ax25/axctl.c2
-rw-r--r--ax25/axports.562
-rw-r--r--ax25/axspawn.c2
-rw-r--r--ax25/mheardd.c12
-rw-r--r--config.h.in22
-rwxr-xr-xconfigure361
-rw-r--r--configure.in44
-rw-r--r--dmascc/Makefile.am14
-rw-r--r--dmascc/Makefile.in359
-rw-r--r--dmascc/README.dmascc69
-rw-r--r--dmascc/dmascc_cfg.1101
-rw-r--r--dmascc/dmascc_cfg.c191
-rw-r--r--hdlcutil/Makefile.am13
-rw-r--r--hdlcutil/Makefile.in26
-rw-r--r--hdlcutil/setcrystal.c2
-rw-r--r--hdlcutil/smdiag.878
-rw-r--r--hdlcutil/smdiag.c434
-rw-r--r--kiss/Makefile.am11
-rw-r--r--kiss/Makefile.in28
-rw-r--r--kiss/kissattach.822
-rw-r--r--kiss/kissattach.c86
-rw-r--r--kiss/kissnetd.c2
-rw-r--r--kiss/kissparms.c2
-rw-r--r--kiss/mkiss.812
-rw-r--r--kiss/mkiss.c256
-rw-r--r--kiss/spattach.81
-rw-r--r--netrom/Makefile.am17
-rw-r--r--netrom/Makefile.in24
-rw-r--r--netrom/netromd.c4
-rw-r--r--netrom/netromr.c136
-rw-r--r--netrom/nodesave.812
-rw-r--r--netrom/nodesave.c103
-rw-r--r--netrom/nrattach.c1
-rw-r--r--netrom/nrparms.c4
-rw-r--r--netrom/nrports7
-rw-r--r--netrom/nrports.556
-rw-r--r--pathnames.h22
-rw-r--r--rose/Makefile.am20
-rw-r--r--rose/Makefile.in80
-rw-r--r--rose/rsports7
-rw-r--r--rose/rsports.552
-rw-r--r--tcpip/Makefile.am18
-rw-r--r--tcpip/Makefile.in66
-rw-r--r--tcpip/ttylinkd.INSTALL36
-rw-r--r--tcpip/ttylinkd.README34
-rw-r--r--user_call/Makefile.am27
-rw-r--r--user_call/Makefile.in93
-rw-r--r--user_call/README.user_call (renamed from user_call/README)0
-rw-r--r--user_call/ax25_call.859
-rw-r--r--user_call/ax25_call.c90
-rw-r--r--user_call/netrom_call.829
-rw-r--r--user_call/netrom_call.c97
-rw-r--r--user_call/rose_call.827
-rw-r--r--user_call/rose_call.c96
-rw-r--r--user_call/tcp_call.81
-rw-r--r--user_call/tcp_call.c139
-rw-r--r--user_call/user_io.c215
-rw-r--r--user_call/user_io.h12
-rw-r--r--yamdrv/Makefile.am16
-rw-r--r--yamdrv/Makefile.in323
-rw-r--r--yamdrv/README.yamdrv92
-rw-r--r--yamdrv/mcs2h.c106
-rw-r--r--yamdrv/yam.h82
-rwxr-xr-xyamdrv/yam08-2.0.36-patch.diff2180
-rw-r--r--yamdrv/yam08-2.2.1-patch.diff2172
-rw-r--r--yamdrv/yamcfg.c351
76 files changed, 7681 insertions, 1558 deletions
diff --git a/AUTHORS b/AUTHORS
index e71e95a..111c63f 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -18,6 +18,8 @@ sethdlc Thomas Sailer HB9JNX <sailer@ife.ee.ethz.ch>
smdiag Thomas Sailer HB9JNX <sailer@ife.ee.ethz.ch>
smmixer Thomas Sailer HB9JNX <sailer@ife.ee.ethz.ch>
ttylinkd Craig Small VK2XLZ <csmall@small.dropbear.id.au>
+dmascc_cfg Klaus Kudielka
+yamcfg Jean-Paul Roubelat F6FBB <jpr@f6fbb.org>
All others Jonathon Naylor G4KLX <g4klx@g4klx.demon.co.uk>
diff --git a/ChangeLog b/ChangeLog
index c154a78..1167915 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,19 @@
-1999-04-21 Craig Small <csmall@small.dropbear.id.au>
+ax25-tools (0.0.3)
+
+ * Fixed configure.in so it doesn't check for libax25io
+ * Added dmascc configuration program
+ * Added spattach
+ * Added yamcfg
+ * Removed nrports, axports and rsports, they are in the library
+ * Had another crack at getting config locations portable
+
+ -- Craig Small <csmall@small.dropbear.id.au> 30 June 1999
+
+ax25-tools (0.0.2)
+
+ * First public release
+
+ -- Craig Small <csmall@small.dropbear.id.au> 21 April 1999
* Initial version from Terry Dawson's code, split from the old
ax25-utils package. Uses new ntoa aton calls.
diff --git a/INSTALL b/INSTALL
index 2d3d5e9..cd2bcbe 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,6 +6,7 @@ To make this library you will need the following:
A Modern kernel
libtool
ax25-lib 0.0.3 or better
+ zlib
To build it you type:
./configure
@@ -14,6 +15,20 @@ To build it you type:
By default, it will install the files in /usr/local. To change this
so that binaries go in /usr and the conf files go in /etc
-type 'make install prefix=/usr'
+ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
+ make
+ make install
+
+To install example configuration files type
+ make installconf
+
+
+While the configure script attempts to detect broken header files, it may
+be that some slip through. You can try to use the other header files by
+editing config.h and changing the relevant lines to:
+
+#undef HAVE_NETAX25_AX25_H
+#undef HAVE_NETROM_NETROM_H
+#undef HAVE_NETROSE_ROSE_H
- Craig Small <csmall@small.dropbear.id.au>
diff --git a/Makefile.am b/Makefile.am
index d0f7bd0..c8797c7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,14 +1,13 @@
installconf:
- @echo "**** WARNING - This will overwrite any existing files ****"
- @echo "**** WARNING - This will overwrite any existing files ****"
- @echo "**** WARNING - This will overwrite any existing files ****"
- @echo
- @echo Hit the return key to proceed, or ^C to exit.
- @read
@for app in $(SUBDIRS); do $(MAKE) -C $$app installconf; done
-SUBDIRS = ax25 hdlcutil kiss netrom rose tcpip user_call
+SUBDIRS = ax25 hdlcutil kiss netrom rose tcpip user_call yamdrv dmascc
EXTRA_DIST = pathnames.h
+INCLUDES = -DAX25_SYSCONFDIR=\""$(sysconfdir)/ax25/"\" \
+ -DAX25_LOCALSTATEDIR=\""$(localstatedir)/ax25/"\"
+
+AX25_SYSCONFDIR=@sysconfdir@/ax25/
+AX25_LOCALSTATEDIR=@localstatedir@/ax25/
diff --git a/Makefile.in b/Makefile.in
index 4a82957..f4a35c1 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -68,9 +68,15 @@ UTIL_LIB = @UTIL_LIB@
VERSION = @VERSION@
Z_LIB = @Z_LIB@
-SUBDIRS = ax25 hdlcutil kiss netrom rose tcpip user_call
+SUBDIRS = ax25 hdlcutil kiss netrom rose tcpip user_call yamdrv dmascc
EXTRA_DIST = pathnames.h
+
+INCLUDES = -DAX25_SYSCONFDIR=\""$(sysconfdir)/ax25/"\" -DAX25_LOCALSTATEDIR=\""$(localstatedir)/ax25/"\"
+
+
+AX25_SYSCONFDIR = @sysconfdir@/ax25/
+AX25_LOCALSTATEDIR = @localstatedir@/ax25/
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = config.h
@@ -351,12 +357,6 @@ maintainer-clean-generic clean mostlyclean distclean maintainer-clean
installconf:
- @echo "**** WARNING - This will overwrite any existing files ****"
- @echo "**** WARNING - This will overwrite any existing files ****"
- @echo "**** WARNING - This will overwrite any existing files ****"
- @echo
- @echo Hit the return key to proceed, or ^C to exit.
- @read
@for app in $(SUBDIRS); do $(MAKE) -C $$app installconf; done
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/README b/README
index b59dea9..3a5dd0f 100644
--- a/README
+++ b/README
@@ -8,7 +8,7 @@ More specifically, it is recommended that you use a glibc newer than
2 May 1999, I believe Debian libc6 package 2.1.1-5 will do.
These tools were built on a Debian system, potato release, the libraries
-are libc6 2.1.1-10 and ncurses 4.2-3.2. Kernel is 2.2.5
+are libc6 2.1.1-10, libax25 0.0.5 and ncurses 4.2-3.2. Kernel is 2.2.10
- Craig Small <csmall@small.dropbear.id.au>
diff --git a/acconfig.h b/acconfig.h
index 4498431..65a2cfc 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -1,10 +1,8 @@
+/* Define if you have a proper netax25/ax25.h header file. */
+#undef HAVE_NETAX25_AX25_H
-#undef HAVE_AX25_FWD_STRUCT
-
-#undef HAVE_AX25_IAMDIGI
-#undef HAVE_AX25_PIDINCL
-
-/* #undef PACKAGE */
-/* #undef VERSION */
-
+/* Define if you have a proper netrom/netrom.h header file. */
+#undef HAVE_NETROM_NETROM_H
+/* Define if you have a proper netrose/rose.h header file. */
+#undef HAVE_NETROSE_ROSE_H
diff --git a/ax25/Makefile.am b/ax25/Makefile.am
index 6bfe46a..bb78855 100644
--- a/ax25/Makefile.am
+++ b/ax25/Makefile.am
@@ -3,15 +3,15 @@ etcfiles = ax25.profile ax25d.conf axspawn.conf rxecho.conf
varfiles = mheard.dat
installconf:
- $(mkinstalldirs) $(DESTDIR)$(etcdir)
+ $(mkinstalldirs) $(DESTDIR)$(AX25_SYSCONFDIR)
@list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p; \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p; \
done
- $(mkinstalldirs) $(DESTDIR)$(vardir)
+ $(mkinstalldirs) $(DESTDIR)$(AX25_LOCALSTATEDIR)/mheard
@list='$(varfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(vardir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(vardir)/$$p; \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_LOCALSTATEDIR)/mheard/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_LOCALSTATEDIR)/mheard/$$p; \
done
@@ -22,7 +22,13 @@ bin_PROGRAMS = mheard
LDADD = $(AX25_LIB)
axspawn_LDADD = $(AX25_LIB) $(UTIL_LIB)
-man_MANS = ax25.4 ax25d.conf.5 axports.5 axspawn.conf.5 rxecho.conf.5 \
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" \
+ -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
+AX25_SYSCONFDIR=$(sysconfdir)/ax25/
+AX25_LOCALSTATEDIR=$(localstatedir)/ax25/
+
+man_MANS = ax25.4 ax25d.conf.5 axspawn.conf.5 rxecho.conf.5 \
ax25d.8 axctl.8 axparms.8 axspawn.8 beacon.8 bpqparms.8 \
mheard.1 mheardd.8 rxecho.8
diff --git a/ax25/Makefile.in b/ax25/Makefile.in
index 2331d82..5117b0a 100644
--- a/ax25/Makefile.in
+++ b/ax25/Makefile.in
@@ -78,7 +78,13 @@ bin_PROGRAMS = mheard
LDADD = $(AX25_LIB)
axspawn_LDADD = $(AX25_LIB) $(UTIL_LIB)
-man_MANS = ax25.4 ax25d.conf.5 axports.5 axspawn.conf.5 rxecho.conf.5 ax25d.8 axctl.8 axparms.8 axspawn.8 beacon.8 bpqparms.8 mheard.1 mheardd.8 rxecho.8
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
+
+AX25_SYSCONFDIR = $(sysconfdir)/ax25/
+AX25_LOCALSTATEDIR = $(localstatedir)/ax25/
+
+man_MANS = ax25.4 ax25d.conf.5 axspawn.conf.5 rxecho.conf.5 ax25d.8 axctl.8 axparms.8 axspawn.8 beacon.8 bpqparms.8 mheard.1 mheardd.8 rxecho.8
EXTRA_DIST = $(man_MANS) $(etcfiles) $(varfiles)
@@ -553,15 +559,15 @@ maintainer-clean-generic clean mostlyclean distclean maintainer-clean
installconf:
- $(mkinstalldirs) $(DESTDIR)$(etcdir)
+ $(mkinstalldirs) $(DESTDIR)$(AX25_SYSCONFDIR)
@list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p; \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p; \
done
- $(mkinstalldirs) $(DESTDIR)$(vardir)
+ $(mkinstalldirs) $(DESTDIR)$(AX25_LOCALSTATEDIR)/mheard
@list='$(varfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(vardir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(vardir)/$$p; \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_LOCALSTATEDIR)/mheard/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_LOCALSTATEDIR)/mheard/$$p; \
done
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/ax25/ax25d.c b/ax25/ax25d.c
index 86d3895..9be7d34 100644
--- a/ax25/ax25d.c
+++ b/ax25/ax25d.c
@@ -679,7 +679,7 @@ static int ReadConfig(void)
int af_type = 0; /* Keep GCC happy */
int line = 0;
int hunt = TRUE, error = FALSE;
- int iamdigi = FALSE, yes;
+ int iamdigi = FALSE;
int parameters = 0;
memset(&axl_defaults, 0, sizeof(axl_defaults));
diff --git a/ax25/axctl.c b/ax25/axctl.c
index 3d7c780..3b453c3 100644
--- a/ax25/axctl.c
+++ b/ax25/axctl.c
@@ -89,6 +89,8 @@ int main(int argc, char **argv)
else if (strcmp(argv[4], "-paclen") == 0)
ax25_ctl.cmd = AX25_PACLEN;
}
+
+ ax25_ctl.digi_count = 0;
if (ioctl(s, SIOCAX25CTLCON, &ax25_ctl) != 0) {
perror("axctl: SIOAX25CTLCON");
diff --git a/ax25/axports.5 b/ax25/axports.5
deleted file mode 100644
index fc61a47..0000000
--- a/ax25/axports.5
+++ /dev/null
@@ -1,62 +0,0 @@
-.TH AXPORTS 5 "15 October 1996" Linux "Linux Programmer's Manual"
-.SH NAME
-axports \- AX.25 port configuration file.
-.SH DESCRIPTION
-.LP
-.B Axports
-is an ASCII file that contains information about each of the physical AX.25
-ports that are to be used. When dealing with an AX.25 utility such as
-.B call,
-it takes an optional argument that is the port name. This port name is a
-reference to the line within
-.B axports,
-which has that name as its first argument. The information on each line
-contains enough information to bind the command to a particular physical AX.25
-interface, this binding is done by matching the callsign on the line in
-.B axports
-with the callsign of the port set by
-.B kissattach.
-.LP
-The lines within
-.B axports
-must either be a comment line, which starts with a # in the first column, or
-a port description in the following format, each field being delimited by
-white space:
-.sp
-.RS
-name callsign speed paclen window description
-.RE
-.sp
-The field descriptions are:
-.sp
-.RS
-.TP 14
-.B name
-is the unique identifier of the port. This is the name given as the port
-argument of many of the AX.25 support programs.
-.TP 14
-.B callsign
-the callsign of the physical interface to bind to.
-.TP 14
-.B speed
-this is the speed of interface, a value of zero means that no speed will be
-set by kissattach(8).
-.TP 14
-.B paclen
-is the default maximum packet size for this interface.
-.TP 14
-.B window
-the default window size for this interface.
-.TP 14
-.B description
-a free format description of this interface, this field extends to the end
-of the line. This field may contain spaces.
-.RE
-.SH FILES
-.LP
-/etc/ax25/axports
-.SH "SEE ALSO"
-.BR call (1),
-.BR ax25 (4),
-.BR axparms (8),
-.BR kissattach (8).
diff --git a/ax25/axspawn.c b/ax25/axspawn.c
index 35724a4..ab5ab92 100644
--- a/ax25/axspawn.c
+++ b/ax25/axspawn.c
@@ -113,7 +113,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
-#include <strings.h>
+#include <string.h>
#include <ctype.h>
#include <termios.h>
#include <unistd.h>
diff --git a/ax25/mheardd.c b/ax25/mheardd.c
index a2b3b21..2d98fad 100644
--- a/ax25/mheardd.c
+++ b/ax25/mheardd.c
@@ -8,8 +8,6 @@
#include <errno.h>
#include <fcntl.h>
-#include <config.h>
-
#include <sys/types.h>
#include <sys/ioctl.h>
#include <sys/param.h>
@@ -19,22 +17,16 @@
#include <net/ethernet.h>
#include <netinet/in.h>
-#ifdef HAVE_NETAX25_AX25_H
#include <netax25/ax25.h>
-#else
-#include <netax25/kernel_ax25.h>
-#endif
-#ifdef HAVE_NETROSE_ROSE_H
#include <netrose/rose.h>
-#else
-#include <netax25/kernel_rose.h>
-#endif
#include <netax25/axlib.h>
#include <netax25/axconfig.h>
#include <netax25/daemon.h>
#include <netax25/mheard.h>
+#include <config.h>
+
#include "../pathnames.h"
#define KISS_MASK 0x0F
diff --git a/config.h.in b/config.h.in
index 3b84bf1..ef89ff5 100644
--- a/config.h.in
+++ b/config.h.in
@@ -39,10 +39,14 @@
/* Define if the X Window System is missing or not being used. */
#undef X_DISPLAY_MISSING
-#undef HAVE_AX25_FWD_STRUCT
+/* Define if you have a proper netax25/ax25.h header file. */
+#undef HAVE_NETAX25_AX25_H
-#undef HAVE_AX25_IAMDIGI
-#undef HAVE_AX25_PIDINCL
+/* Define if you have a proper netrom/netrom.h header file. */
+#undef HAVE_NETROM_NETROM_H
+
+/* Define if you have a proper netrose/rose.h header file. */
+#undef HAVE_NETROSE_ROSE_H
/* Define if you have the gethostname function. */
#undef HAVE_GETHOSTNAME
@@ -86,15 +90,6 @@
/* Define if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
-/* Define if you have the <netax25/ax25.h> header file. */
-#undef HAVE_NETAX25_AX25_H
-
-/* Define if you have the <netrom/netrom.h> header file. */
-#undef HAVE_NETROM_NETROM_H
-
-/* Define if you have the <netrose/rose.h> header file. */
-#undef HAVE_NETROSE_ROSE_H
-
/* Define if you have the <paths.h> header file. */
#undef HAVE_PATHS_H
@@ -116,6 +111,9 @@
/* Define if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
+/* Define if you have the <zlib.h> header file. */
+#undef HAVE_ZLIB_H
+
/* Name of package */
#undef PACKAGE
diff --git a/configure b/configure
index e29bd90..cdfc5a7 100755
--- a/configure
+++ b/configure
@@ -526,7 +526,7 @@ fi
-VERSION=0.0.2
+VERSION=0.0.3
PACKAGE=ax25-tools
ac_aux_dir=
for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
@@ -1192,52 +1192,11 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
AX25_LIB="-lax25"
else
echo "$ac_t""no" 1>&6
-AX25_LIB=
-fi
-
-echo $ac_n "checking for axio_init in -lax25io""... $ac_c" 1>&6
-echo "configure:1200: checking for axio_init in -lax25io" >&5
-ac_lib_var=`echo ax25io'_'axio_init | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- ac_save_LIBS="$LIBS"
-LIBS="-lax25io lz $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 1208 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error. */
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char axio_init();
-
-int main() {
-axio_init()
-; return 0; }
-EOF
-if { (eval echo configure:1219: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=yes"
-else
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- AX25IO_LIB="-lax25io"
-else
- echo "$ac_t""no" 1>&6
-AX25IO_LIB=
+{ echo "configure: error: Could not find the libax25 libraries; aborting" 1>&2; exit 1; }
fi
echo $ac_n "checking for initscr in -lncurses""... $ac_c" 1>&6
-echo "configure:1241: checking for initscr in -lncurses" >&5
+echo "configure:1200: checking for initscr in -lncurses" >&5
ac_lib_var=`echo ncurses'_'initscr | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1245,7 +1204,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lncurses $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1249 "configure"
+#line 1208 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1256,7 +1215,7 @@ int main() {
initscr()
; return 0; }
EOF
-if { (eval echo configure:1260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1219: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1278,7 +1237,7 @@ NCURSES_LIB=
fi
echo $ac_n "checking for openpty in -lutil""... $ac_c" 1>&6
-echo "configure:1282: checking for openpty in -lutil" >&5
+echo "configure:1241: checking for openpty in -lutil" >&5
ac_lib_var=`echo util'_'openpty | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1286,7 +1245,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lutil $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1290 "configure"
+#line 1249 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1297,7 +1256,7 @@ int main() {
openpty()
; return 0; }
EOF
-if { (eval echo configure:1301: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1320,7 +1279,7 @@ fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:1324: checking how to run the C preprocessor" >&5
+echo "configure:1283: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
@@ -1335,13 +1294,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp.
cat > conftest.$ac_ext <<EOF
-#line 1339 "configure"
+#line 1298 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1345: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1304: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1352,13 +1311,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF
-#line 1356 "configure"
+#line 1315 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1362: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1321: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1369,13 +1328,13 @@ else
rm -rf conftest*
CPP="${CC-cc} -nologo -E"
cat > conftest.$ac_ext <<EOF
-#line 1373 "configure"
+#line 1332 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1379: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1338: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
:
@@ -1404,7 +1363,7 @@ echo "$ac_t""$CPP" 1>&6
# Uses ac_ vars as temps to allow command line to override cache and checks.
# --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:1408: checking for X" >&5
+echo "configure:1367: checking for X" >&5
# Check whether --with-x or --without-x was given.
if test "${with_x+set}" = set; then
@@ -1466,12 +1425,12 @@ if test "$ac_x_includes" = NO; then
# First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF
-#line 1470 "configure"
+#line 1429 "configure"
#include "confdefs.h"
#include <$x_direct_test_include>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1475: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1434: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -1540,14 +1499,14 @@ if test "$ac_x_libraries" = NO; then
ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1544 "configure"
+#line 1503 "configure"
#include "confdefs.h"
int main() {
${x_direct_test_function}()
; return 0; }
EOF
-if { (eval echo configure:1551: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1510: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
@@ -1653,17 +1612,17 @@ else
case "`(uname -sr) 2>/dev/null`" in
"SunOS 5"*)
echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:1657: checking whether -R must be followed by a space" >&5
+echo "configure:1616: checking whether -R must be followed by a space" >&5
ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
cat > conftest.$ac_ext <<EOF
-#line 1660 "configure"
+#line 1619 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:1667: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_R_nospace=yes
else
@@ -1679,14 +1638,14 @@ rm -f conftest*
else
LIBS="$ac_xsave_LIBS -R $x_libraries"
cat > conftest.$ac_ext <<EOF
-#line 1683 "configure"
+#line 1642 "configure"
#include "confdefs.h"
int main() {
; return 0; }
EOF
-if { (eval echo configure:1690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1649: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
ac_R_space=yes
else
@@ -1718,7 +1677,7 @@ rm -f conftest*
# libraries were built with DECnet support. And karl@cs.umb.edu says
# the Alpha needs dnet_stub (dnet does not exist).
echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:1722: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:1681: checking for dnet_ntoa in -ldnet" >&5
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1726,7 +1685,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldnet $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1730 "configure"
+#line 1689 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1737,7 +1696,7 @@ int main() {
dnet_ntoa()
; return 0; }
EOF
-if { (eval echo configure:1741: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1700: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1759,7 +1718,7 @@ fi
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:1763: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:1722: checking for dnet_ntoa in -ldnet_stub" >&5
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1767,7 +1726,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-ldnet_stub $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1771 "configure"
+#line 1730 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1778,7 +1737,7 @@ int main() {
dnet_ntoa()
; return 0; }
EOF
-if { (eval echo configure:1782: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1741: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1807,12 +1766,12 @@ fi
# The nsl library prevents programs from opening the X display
# on Irix 5.2, according to dickey@clark.net.
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:1811: checking for gethostbyname" >&5
+echo "configure:1770: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1816 "configure"
+#line 1775 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostbyname(); below. */
@@ -1835,7 +1794,7 @@ gethostbyname();
; return 0; }
EOF
-if { (eval echo configure:1839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1798: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes"
else
@@ -1856,7 +1815,7 @@ fi
if test $ac_cv_func_gethostbyname = no; then
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:1860: checking for gethostbyname in -lnsl" >&5
+echo "configure:1819: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1864,7 +1823,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1868 "configure"
+#line 1827 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1875,7 +1834,7 @@ int main() {
gethostbyname()
; return 0; }
EOF
-if { (eval echo configure:1879: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1905,12 +1864,12 @@ fi
# -lsocket must be given before -lnsl if both are needed.
# We assume that if connect needs -lnsl, so does gethostbyname.
echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:1909: checking for connect" >&5
+echo "configure:1868: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 1914 "configure"
+#line 1873 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */
@@ -1933,7 +1892,7 @@ connect();
; return 0; }
EOF
-if { (eval echo configure:1937: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_connect=yes"
else
@@ -1954,7 +1913,7 @@ fi
if test $ac_cv_func_connect = no; then
echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
-echo "configure:1958: checking for connect in -lsocket" >&5
+echo "configure:1917: checking for connect in -lsocket" >&5
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -1962,7 +1921,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 1966 "configure"
+#line 1925 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -1973,7 +1932,7 @@ int main() {
connect()
; return 0; }
EOF
-if { (eval echo configure:1977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1936: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -1997,12 +1956,12 @@ fi
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:2001: checking for remove" >&5
+echo "configure:1960: checking for remove" >&5
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2006 "configure"
+#line 1965 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char remove(); below. */
@@ -2025,7 +1984,7 @@ remove();
; return 0; }
EOF
-if { (eval echo configure:2029: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1988: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_remove=yes"
else
@@ -2046,7 +2005,7 @@ fi
if test $ac_cv_func_remove = no; then
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:2050: checking for remove in -lposix" >&5
+echo "configure:2009: checking for remove in -lposix" >&5
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2054,7 +2013,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lposix $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2058 "configure"
+#line 2017 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -2065,7 +2024,7 @@ int main() {
remove()
; return 0; }
EOF
-if { (eval echo configure:2069: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -2089,12 +2048,12 @@ fi
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:2093: checking for shmat" >&5
+echo "configure:2052: checking for shmat" >&5
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2098 "configure"
+#line 2057 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shmat(); below. */
@@ -2117,7 +2076,7 @@ shmat();
; return 0; }
EOF
-if { (eval echo configure:2121: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2080: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_shmat=yes"
else
@@ -2138,7 +2097,7 @@ fi
if test $ac_cv_func_shmat = no; then
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:2142: checking for shmat in -lipc" >&5
+echo "configure:2101: checking for shmat in -lipc" >&5
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2146,7 +2105,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lipc $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2150 "configure"
+#line 2109 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -2157,7 +2116,7 @@ int main() {
shmat()
; return 0; }
EOF
-if { (eval echo configure:2161: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2120: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -2190,7 +2149,7 @@ fi
# libraries we check for below, so use a different variable.
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
-echo "configure:2194: checking for IceConnectionNumber in -lICE" >&5
+echo "configure:2153: checking for IceConnectionNumber in -lICE" >&5
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -2198,7 +2157,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lICE $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2202 "configure"
+#line 2161 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -2209,7 +2168,7 @@ int main() {
IceConnectionNumber()
; return 0; }
EOF
-if { (eval echo configure:2213: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -2239,7 +2198,7 @@ fi
# Uses ac_ vars as temps to allow command line to override cache and checks.
# --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:2243: checking for X" >&5
+echo "configure:2202: checking for X" >&5
# Check whether --with-x or --without-x was given.
if test "${with_x+set}" = set; then
@@ -2301,12 +2260,12 @@ if test "$ac_x_includes" = NO; then
# First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF
-#line 2305 "configure"
+#line 2264 "configure"
#include "confdefs.h"
#include <$x_direct_test_include>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2310: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2269: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2375,14 +2334,14 @@ if test "$ac_x_libraries" = NO; then
ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 2379 "configure"
+#line 2338 "configure"
#include "confdefs.h"
int main() {
${x_direct_test_function}()
; return 0; }
EOF
-if { (eval echo configure:2386: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2345: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
@@ -2469,12 +2428,12 @@ else
fi
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:2473: checking for ANSI C header files" >&5
+echo "configure:2432: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2478 "configure"
+#line 2437 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@@ -2482,7 +2441,7 @@ else
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2486: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2445: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2499,7 +2458,7 @@ rm -f conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 2503 "configure"
+#line 2462 "configure"
#include "confdefs.h"
#include <string.h>
EOF
@@ -2517,7 +2476,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
-#line 2521 "configure"
+#line 2480 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
@@ -2538,7 +2497,7 @@ if test "$cross_compiling" = yes; then
:
else
cat > conftest.$ac_ext <<EOF
-#line 2542 "configure"
+#line 2501 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -2549,7 +2508,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }
EOF
-if { (eval echo configure:2553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
:
else
@@ -2573,12 +2532,12 @@ EOF
fi
echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:2577: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:2536: checking for sys/wait.h that is POSIX.1 compatible" >&5
if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2582 "configure"
+#line 2541 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/wait.h>
@@ -2594,7 +2553,7 @@ wait (&s);
s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
; return 0; }
EOF
-if { (eval echo configure:2598: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2557: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_sys_wait_h=yes
else
@@ -2614,61 +2573,21 @@ EOF
fi
-for ac_hdr in fcntl.h limits.h paths.h strings.h sys/file.h sys/ioctl.h sys/time.h syslog.h unistd.h
+for ac_hdr in fcntl.h limits.h paths.h strings.h sys/file.h sys/ioctl.h sys/time.h syslog.h unistd.h zlib.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2622: checking for $ac_hdr" >&5
+echo "configure:2581: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2627 "configure"
+#line 2586 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2632: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
-ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
-if test -z "$ac_err"; then
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=yes"
-else
- echo "$ac_err" >&5
- echo "configure: failed program was:" >&5
- cat conftest.$ac_ext >&5
- rm -rf conftest*
- eval "ac_cv_header_$ac_safe=no"
-fi
-rm -f conftest*
-fi
-if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
- echo "$ac_t""yes" 1>&6
- ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
- cat >> confdefs.h <<EOF
-#define $ac_tr_hdr 1
-EOF
-
-else
- echo "$ac_t""no" 1>&6
-fi
-done
-
-for ac_hdr in netax25/ax25.h netrom/netrom.h netrose/rose.h
-do
-ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
-echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:2662: checking for $ac_hdr" >&5
-if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
- echo $ac_n "(cached) $ac_c" 1>&6
-else
- cat > conftest.$ac_ext <<EOF
-#line 2667 "configure"
-#include "confdefs.h"
-#include <$ac_hdr>
-EOF
-ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2672: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2591: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
rm -rf conftest*
@@ -2695,8 +2614,10 @@ fi
done
+echo $ac_n "checking for working netax25/ax25.h header file""... $ac_c" 1>&6
+echo "configure:2619: checking for working netax25/ax25.h header file" >&5
cat > conftest.$ac_ext <<EOF
-#line 2700 "configure"
+#line 2621 "configure"
#include "confdefs.h"
#include <netax25/ax25.h>
EOF
@@ -2704,52 +2625,70 @@ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
egrep "ax25_fwd_struct" >/dev/null 2>&1; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
-#define HAVE_AX25_FWD_STRUCT 1
+#define HAVE_NETAX25_AX25_H 1
EOF
fi
rm -f conftest*
+if $HAVE_NETAX25_AX25_H ; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+echo $ac_n "checking for working netrom/netrom.h header file""... $ac_c" 1>&6
+echo "configure:2641: checking for working netrom/netrom.h header file" >&5
cat > conftest.$ac_ext <<EOF
-#line 2715 "configure"
+#line 2643 "configure"
#include "confdefs.h"
-#include <netax25/ax25.h>
+#include <netrom/netrom.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "AX25_IAMDIGI" >/dev/null 2>&1; then
+ egrep "unsigned int ndigis" >/dev/null 2>&1; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
-#define HAVE_AX25_IAMDIGI 1
+#define HAVE_NETROM_NETROM_H 1
EOF
fi
rm -f conftest*
+if $HAVE_NETROM_NETROM_H ; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+echo $ac_n "checking for working netrose/rose.h header file""... $ac_c" 1>&6
+echo "configure:2663: checking for working netrose/rose.h header file" >&5
cat > conftest.$ac_ext <<EOF
-#line 2730 "configure"
+#line 2665 "configure"
#include "confdefs.h"
-#include <netax25/ax25.h>
+#include <netrose/rose.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "AX25_PIDINCL" >/dev/null 2>&1; then
+ egrep "rose_facilities_struct" >/dev/null 2>&1; then
rm -rf conftest*
cat >> confdefs.h <<\EOF
-#define HAVE_AX25_PIDINCL 1
+#define HAVE_NETROSE_ROSE_H 1
EOF
fi
rm -f conftest*
-
+if $HAVE_NETROSE_ROSE_H ; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:2748: checking for working const" >&5
+echo "configure:2687: checking for working const" >&5
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2753 "configure"
+#line 2692 "configure"
#include "confdefs.h"
int main() {
@@ -2798,7 +2737,7 @@ ccp = (char const *const *) p;
; return 0; }
EOF
-if { (eval echo configure:2802: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2741: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_const=yes
else
@@ -2819,12 +2758,12 @@ EOF
fi
echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:2823: checking for uid_t in sys/types.h" >&5
+echo "configure:2762: checking for uid_t in sys/types.h" >&5
if eval "test \"`echo '$''{'ac_cv_type_uid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2828 "configure"
+#line 2767 "configure"
#include "confdefs.h"
#include <sys/types.h>
EOF
@@ -2853,12 +2792,12 @@ EOF
fi
echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:2857: checking for pid_t" >&5
+echo "configure:2796: checking for pid_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2862 "configure"
+#line 2801 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@@ -2886,12 +2825,12 @@ EOF
fi
echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:2890: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:2829: checking whether time.h and sys/time.h may both be included" >&5
if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2895 "configure"
+#line 2834 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
@@ -2900,7 +2839,7 @@ int main() {
struct tm *tp;
; return 0; }
EOF
-if { (eval echo configure:2904: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2843: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_header_time=yes
else
@@ -2921,12 +2860,12 @@ EOF
fi
echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:2925: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "configure:2864: checking whether struct tm is in sys/time.h or time.h" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 2930 "configure"
+#line 2869 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <time.h>
@@ -2934,7 +2873,7 @@ int main() {
struct tm *tp; tp->tm_sec;
; return 0; }
EOF
-if { (eval echo configure:2938: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2877: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_struct_tm=time.h
else
@@ -2957,13 +2896,13 @@ fi
if test $ac_cv_prog_gcc = yes; then
echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
-echo "configure:2961: checking whether ${CC-cc} needs -traditional" >&5
+echo "configure:2900: checking whether ${CC-cc} needs -traditional" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_pattern="Autoconf.*'x'"
cat > conftest.$ac_ext <<EOF
-#line 2967 "configure"
+#line 2906 "configure"
#include "confdefs.h"
#include <sgtty.h>
Autoconf TIOCGETP
@@ -2981,7 +2920,7 @@ rm -f conftest*
if test $ac_cv_prog_gcc_traditional = no; then
cat > conftest.$ac_ext <<EOF
-#line 2985 "configure"
+#line 2924 "configure"
#include "confdefs.h"
#include <termio.h>
Autoconf TCGETA
@@ -3003,7 +2942,7 @@ echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
fi
echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6
-echo "configure:3007: checking for 8-bit clean memcmp" >&5
+echo "configure:2946: checking for 8-bit clean memcmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3011,7 +2950,7 @@ else
ac_cv_func_memcmp_clean=no
else
cat > conftest.$ac_ext <<EOF
-#line 3015 "configure"
+#line 2954 "configure"
#include "confdefs.h"
main()
@@ -3021,7 +2960,7 @@ main()
}
EOF
-if { (eval echo configure:3025: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2964: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_memcmp_clean=yes
else
@@ -3039,7 +2978,7 @@ echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6
test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}"
echo $ac_n "checking whether setpgrp takes no argument""... $ac_c" 1>&6
-echo "configure:3043: checking whether setpgrp takes no argument" >&5
+echo "configure:2982: checking whether setpgrp takes no argument" >&5
if eval "test \"`echo '$''{'ac_cv_func_setpgrp_void'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3047,7 +2986,7 @@ else
{ echo "configure: error: cannot check setpgrp if cross compiling" 1>&2; exit 1; }
else
cat > conftest.$ac_ext <<EOF
-#line 3051 "configure"
+#line 2990 "configure"
#include "confdefs.h"
#ifdef HAVE_UNISTD_H
@@ -3067,7 +3006,7 @@ main()
}
EOF
-if { (eval echo configure:3071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_setpgrp_void=no
else
@@ -3091,12 +3030,12 @@ EOF
fi
echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:3095: checking return type of signal handlers" >&5
+echo "configure:3034: checking return type of signal handlers" >&5
if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3100 "configure"
+#line 3039 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <signal.h>
@@ -3113,7 +3052,7 @@ int main() {
int i;
; return 0; }
EOF
-if { (eval echo configure:3117: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3056: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_type_signal=void
else
@@ -3132,12 +3071,12 @@ EOF
echo $ac_n "checking for strftime""... $ac_c" 1>&6
-echo "configure:3136: checking for strftime" >&5
+echo "configure:3075: checking for strftime" >&5
if eval "test \"`echo '$''{'ac_cv_func_strftime'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3141 "configure"
+#line 3080 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char strftime(); below. */
@@ -3160,7 +3099,7 @@ strftime();
; return 0; }
EOF
-if { (eval echo configure:3164: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3103: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_strftime=yes"
else
@@ -3182,7 +3121,7 @@ else
echo "$ac_t""no" 1>&6
# strftime is in -lintl on SCO UNIX.
echo $ac_n "checking for strftime in -lintl""... $ac_c" 1>&6
-echo "configure:3186: checking for strftime in -lintl" >&5
+echo "configure:3125: checking for strftime in -lintl" >&5
ac_lib_var=`echo intl'_'strftime | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@@ -3190,7 +3129,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-lintl $LIBS"
cat > conftest.$ac_ext <<EOF
-#line 3194 "configure"
+#line 3133 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@@ -3201,7 +3140,7 @@ int main() {
strftime()
; return 0; }
EOF
-if { (eval echo configure:3205: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3144: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@@ -3228,7 +3167,7 @@ fi
fi
echo $ac_n "checking for wait3 that fills in rusage""... $ac_c" 1>&6
-echo "configure:3232: checking for wait3 that fills in rusage" >&5
+echo "configure:3171: checking for wait3 that fills in rusage" >&5
if eval "test \"`echo '$''{'ac_cv_func_wait3_rusage'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -3236,7 +3175,7 @@ else
ac_cv_func_wait3_rusage=no
else
cat > conftest.$ac_ext <<EOF
-#line 3240 "configure"
+#line 3179 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/time.h>
@@ -3267,7 +3206,7 @@ main() {
}
}
EOF
-if { (eval echo configure:3271: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3210: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
ac_cv_func_wait3_rusage=yes
else
@@ -3292,12 +3231,12 @@ fi
for ac_func in gethostname gettimeofday mkdir select socket strdup strerror strspn strstr strtol strtoul uname
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3296: checking for $ac_func" >&5
+echo "configure:3235: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
-#line 3301 "configure"
+#line 3240 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@@ -3320,7 +3259,7 @@ $ac_func();
; return 0; }
EOF
-if { (eval echo configure:3324: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3263: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@@ -3345,6 +3284,12 @@ fi
done
+if test "x$GCC" = "xyes"; then
+ if test -z "`echo "$CFLAGS" | grep "\-Wall" 2> /dev/null`" ; then
+ CFLAGS="$CFLAGS -Wall"
+ fi
+fi
+
trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
@@ -3446,7 +3391,7 @@ done
ac_given_srcdir=$srcdir
ac_given_INSTALL="$INSTALL"
-trap 'rm -fr `echo "netrom/Makefile tcpip/Makefile ax25/Makefile Makefile rose/Makefile user_call/Makefile kiss/Makefile hdlcutil/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+trap 'rm -fr `echo "netrom/Makefile tcpip/Makefile ax25/Makefile Makefile rose/Makefile user_call/Makefile kiss/Makefile hdlcutil/Makefile yamdrv/Makefile dmascc/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
EOF
cat >> $CONFIG_STATUS <<EOF
@@ -3543,7 +3488,7 @@ EOF
cat >> $CONFIG_STATUS <<EOF
-CONFIG_FILES=\${CONFIG_FILES-"netrom/Makefile tcpip/Makefile ax25/Makefile Makefile rose/Makefile user_call/Makefile kiss/Makefile hdlcutil/Makefile"}
+CONFIG_FILES=\${CONFIG_FILES-"netrom/Makefile tcpip/Makefile ax25/Makefile Makefile rose/Makefile user_call/Makefile kiss/Makefile hdlcutil/Makefile yamdrv/Makefile dmascc/Makefile"}
EOF
cat >> $CONFIG_STATUS <<\EOF
for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
diff --git a/configure.in b/configure.in
index 4e5dd00..72b0245 100644
--- a/configure.in
+++ b/configure.in
@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(ax25/ax25d.c)
dnl For automake
-VERSION=0.0.2
+VERSION=0.0.3
PACKAGE=ax25-tools
AM_INIT_AUTOMAKE($PACKAGE,$VERSION)
@@ -22,8 +22,7 @@ AC_SUBST(AX25IO_LIB)
AC_SUBST(NCURSES_LIB)
AC_SUBST(UTIL_LIB)
AC_CHECK_LIB(z, zlibVersion,Z_LIB="-lz",Z_LIB=)
-AC_CHECK_LIB(ax25, ax25_config_load_ports, AX25_LIB="-lax25", AX25_LIB=)
-AC_CHECK_LIB(ax25io, axio_init, AX25IO_LIB="-lax25io", AX25IO_LIB=,lz)
+AC_CHECK_LIB(ax25, ax25_config_load_ports, AX25_LIB="-lax25", AC_MSG_ERROR(Could not find the libax25 libraries; aborting))
AC_CHECK_LIB(ncurses, initscr,NCURSES_LIB="-lncurses",NCURSES_LIB=)
AC_CHECK_LIB(util, openpty, UTIL_LIB="-lutil",UTIL_LIB=)
@@ -33,14 +32,30 @@ dnl Checks for header files.
AC_PATH_X
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
-AC_CHECK_HEADERS(fcntl.h limits.h paths.h strings.h sys/file.h sys/ioctl.h sys/time.h syslog.h unistd.h)
-AC_CHECK_HEADERS(netax25/ax25.h netrom/netrom.h netrose/rose.h)
-
-dnl Check for ceratin functions in header files
-AC_HEADER_EGREP(ax25_fwd_struct, netax25/ax25.h, AC_DEFINE(HAVE_AX25_FWD_STRUCT))
-AC_HEADER_EGREP(AX25_IAMDIGI, netax25/ax25.h, AC_DEFINE(HAVE_AX25_IAMDIGI))
-AC_HEADER_EGREP(AX25_PIDINCL, netax25/ax25.h, AC_DEFINE(HAVE_AX25_PIDINCL))
+AC_CHECK_HEADERS(fcntl.h limits.h paths.h strings.h sys/file.h sys/ioctl.h sys/time.h syslog.h unistd.h zlib.h)
+dnl Checks for working glibc 2.1 headers
+AC_MSG_CHECKING(for working netax25/ax25.h header file)
+AC_HEADER_EGREP(ax25_fwd_struct, netax25/ax25.h,AC_DEFINE(HAVE_NETAX25_AX25_H))
+if $HAVE_NETAX25_AX25_H ; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_MSG_CHECKING(for working netrom/netrom.h header file)
+AC_HEADER_EGREP(unsigned int ndigis, netrom/netrom.h,AC_DEFINE(HAVE_NETROM_NETROM_H))
+if $HAVE_NETROM_NETROM_H ; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_MSG_CHECKING(for working netrose/rose.h header file)
+AC_HEADER_EGREP(rose_facilities_struct, netrose/rose.h,AC_DEFINE(HAVE_NETROSE_ROSE_H))
+if $HAVE_NETROSE_ROSE_H ; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
dnl Checks for typedefs, structures, and compiler characteristics.
@@ -59,4 +74,11 @@ AC_FUNC_STRFTIME
AC_FUNC_WAIT3
AC_CHECK_FUNCS(gethostname gettimeofday mkdir select socket strdup strerror strspn strstr strtol strtoul uname)
-AC_OUTPUT(netrom/Makefile tcpip/Makefile ax25/Makefile Makefile rose/Makefile user_call/Makefile kiss/Makefile hdlcutil/Makefile)
+dnl Only use -Wall if we have gcc
+if test "x$GCC" = "xyes"; then
+ if test -z "`echo "$CFLAGS" | grep "\-Wall" 2> /dev/null`" ; then
+ CFLAGS="$CFLAGS -Wall"
+ fi
+fi
+
+AC_OUTPUT(netrom/Makefile tcpip/Makefile ax25/Makefile Makefile rose/Makefile user_call/Makefile kiss/Makefile hdlcutil/Makefile yamdrv/Makefile dmascc/Makefile)
diff --git a/dmascc/Makefile.am b/dmascc/Makefile.am
new file mode 100644
index 0000000..1af785f
--- /dev/null
+++ b/dmascc/Makefile.am
@@ -0,0 +1,14 @@
+
+sbin_PROGRAMS = dmascc_cfg
+
+dmascc_cfg_SOURCE = dmascc_cfg.c
+
+man_MANS = dmascc_cfg.1
+
+EXTRA_DIST = $(man_MANS) $(doc_DATA)
+
+docdir=$(prefix)/doc/ax25-tools
+doc_DATA = README.dmascc
+
+installconf:
+
diff --git a/dmascc/Makefile.in b/dmascc/Makefile.in
new file mode 100644
index 0000000..e27dab5
--- /dev/null
+++ b/dmascc/Makefile.in
@@ -0,0 +1,359 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+AX25IO_LIB = @AX25IO_LIB@
+AX25_LIB = @AX25_LIB@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+NCURSES_LIB = @NCURSES_LIB@
+PACKAGE = @PACKAGE@
+UTIL_LIB = @UTIL_LIB@
+VERSION = @VERSION@
+Z_LIB = @Z_LIB@
+
+sbin_PROGRAMS = dmascc_cfg
+
+dmascc_cfg_SOURCE = dmascc_cfg.c
+
+man_MANS = dmascc_cfg.1
+
+EXTRA_DIST = $(man_MANS) $(doc_DATA)
+
+docdir = $(prefix)/doc/ax25-tools
+doc_DATA = README.dmascc
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+PROGRAMS = $(sbin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+dmascc_cfg_SOURCES = dmascc_cfg.c
+dmascc_cfg_OBJECTS = dmascc_cfg.o
+dmascc_cfg_LDADD = $(LDADD)
+dmascc_cfg_DEPENDENCIES =
+dmascc_cfg_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+man1dir = $(mandir)/man1
+MANS = $(man_MANS)
+
+NROFF = nroff
+DATA = $(doc_DATA)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = dmascc_cfg.c
+OBJECTS = dmascc_cfg.o
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps dmascc/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-sbinPROGRAMS:
+
+clean-sbinPROGRAMS:
+ -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+
+distclean-sbinPROGRAMS:
+
+maintainer-clean-sbinPROGRAMS:
+
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(sbindir)
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-sbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+.c.o:
+ $(COMPILE) -c $<
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+dmascc_cfg: $(dmascc_cfg_OBJECTS) $(dmascc_cfg_DEPENDENCIES)
+ @rm -f dmascc_cfg
+ $(LINK) $(dmascc_cfg_LDFLAGS) $(dmascc_cfg_OBJECTS) $(dmascc_cfg_LDADD) $(LIBS)
+
+install-man1:
+ $(mkinstalldirs) $(DESTDIR)$(man1dir)
+ @list='$(man1_MANS)'; \
+ l2='$(man_MANS)'; for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \
+ done
+
+uninstall-man1:
+ @list='$(man1_MANS)'; \
+ l2='$(man_MANS)'; for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \
+ rm -f $(DESTDIR)$(man1dir)/$$inst; \
+ done
+install-man: $(MANS)
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-man1
+uninstall-man:
+ @$(NORMAL_UNINSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-man1
+
+install-docDATA: $(doc_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(docdir)
+ @list='$(doc_DATA)'; for p in $$list; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p; \
+ fi; fi; \
+ done
+
+uninstall-docDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(doc_DATA)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(docdir)/$$p; \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = dmascc
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-sbinPROGRAMS
+install-exec: install-exec-am
+
+install-data-am: install-man install-docDATA
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-sbinPROGRAMS uninstall-man uninstall-docDATA
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(MANS) $(DATA)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man1 \
+ $(DESTDIR)$(docdir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-sbinPROGRAMS mostlyclean-compile \
+ mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-sbinPROGRAMS clean-compile clean-tags clean-generic \
+ mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-sbinPROGRAMS distclean-compile distclean-tags \
+ distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-sbinPROGRAMS \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-sbinPROGRAMS distclean-sbinPROGRAMS \
+clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \
+install-sbinPROGRAMS mostlyclean-compile distclean-compile \
+clean-compile maintainer-clean-compile install-man1 uninstall-man1 \
+install-man uninstall-man uninstall-docDATA install-docDATA tags \
+mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
+distdir info-am info dvi-am dvi check check-am installcheck-am \
+installcheck install-exec-am install-exec install-data-am install-data \
+install-am install uninstall-am uninstall all-redirect all-am all \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+installconf:
+
+# 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/dmascc/README.dmascc b/dmascc/README.dmascc
new file mode 100644
index 0000000..fcd7746
--- /dev/null
+++ b/dmascc/README.dmascc
@@ -0,0 +1,69 @@
+The dmascc_cfg utility
+======================
+
+Use this utility to configure the dmascc driver.
+
+Usage:
+------
+
+dmascc_cfg <interface> [ options ... ]
+
+Options:
+--------
+
+--show Show all configurable parameters for this port.
+ May be specified at any time by any user.
+
+All other options change parameters and thus may only be specified
+ - by root
+ - when the interface is down
+
+--speed <f> Set frequency of baud rate generator. A value of 0 disables
+ the baud rate generator and the digital PLL. Use the
+ --show option to check whether the frequency you selected
+ could be approximated with sufficient accuracy.
+
+--nrzi 0 | 1 0 selects NRZ mode, 1 selects NRZI mode.
+
+--clocks <i> Set clock mode. You may OR together three choices (other
+ values are not supported and may cause strange results):
+
+ TX clock pin: 0x00 input
+ 0x05 output TX clock *
+ 0x06 output baud rate generator *
+ 0x07 output digital PLL *
+
+ TX clock source: 0x00 RX clock pin
+ 0x08 TX clock pin #
+ 0x10 baud rate generator
+ 0x18 digital PLL +
+
+ RX clock source: 0x00 RX clock pin
+ 0x20 TX clock pin
+ 0x40 baud rate generator
+ 0x60 digital PLL +
+
+ * Not allowed on PI2 Port A if J3 is installed.
+ # TX clock pin must be configured as input
+ + Speed must be equal to 32 times the baud rate.
+
+--txdelay <f> Set transmit delay in ms (0 < f < 2500).
+
+--txtime <f> Set maximum time in s the transmitter may be active
+ (0 < f).
+
+--sqdelay <f> Set squelch delay in ms (0 < f < 2500).
+
+--slottime <f> Set slot time in ms (0 < f < 2500).
+
+--waittime <f> Set the minimum time in ms between transmitter off and
+ transmitter on (0 < f < 2500).
+
+--persist <i> Set persistence parameter (0 <= i <= 255).
+
+--dma <i> Set DMA channel (0, 1, or 3). 0 disables DMA.
+
+<f> ... floating-point argument, <i> ... integer argument.
+Parameters are not checked for validity. The driver or the kernel may crash
+if you specify invalid values.
+
diff --git a/dmascc/dmascc_cfg.1 b/dmascc/dmascc_cfg.1
new file mode 100644
index 0000000..f5884ea
--- /dev/null
+++ b/dmascc/dmascc_cfg.1
@@ -0,0 +1,101 @@
+.TH DMASCC_CFG 1 "30 June 1999" Linux "Linux Programmer's Manual"
+.SH NAME
+dmascc_cfg \- Configure dmascc devices
+.SH SYNOPSIS
+.B dmascc <interface> [<options>]
+.SH DESCRIPTION
+.LP
+.B dmascc_cfg
+is used to configure dmascc devices such as PI2 and PackeTwin cards. The
+\fB\-\-show\fR option can be used by any user, all other options must be
+used by root.
+.SH OPTIONS
+.TP 10
+.BI "\-\-speed "\fIfrequency\fR
+Set frequency of baud rate generator to \fIfrequency\fR. A value of 0
+disables the baud rate generator and the digital PLL. Use the \fB\-\-show\fR
+option to check whether the frequency you selected could be approximated
+with sufficient accuracy.
+.TP 10
+.BI "\-\-nrzi "\fR[\fI0\fR|\fI1\fR]
+\fI0\fR selects NRZ mode, \fI1\fR selects NRZI mode.
+.TP 10
+.BI "\-\-clocks "\fIinteger\fR
+Set the clock mode. You may \fBOR\fR together three choices (other values
+are not supported and may cause strange results).
+.PP
+TX clock pin:
+.IP
+.ta 1.5i
+0x00 input
+.br
+0x05 output TX clock *
+.br
+0x06 output baud rate generator *
+.br
+0x07 output digital PLL *
+.PP
+TX clock source:
+.IP
+.ta 1.5i
+0x00 RX clock pin
+.br
+0x08 TX clock pin #
+.br
+0x10 baud rate generator
+.br
+0x18 digital PLL +
+.br
+.PP
+RX clock source:
+.IP
+.ta 1.5i
+0x00 RX clock pin
+.br
+0x20 TX clock pin
+.br
+0x40 baud rate generator
+.br
+0x60 digital PLL +
+.br
+.PP
+* Not allowed on PI2 Port A if J3 is installed.
+.PP
+# TX clock pin must be configured as input.
+.PP
++ Speed must be equal to 32 times the baud rate.
+.TP 10
+.BI "\-\-txdelay "\fImilliseconds\fR
+Set transmit delay to \fImilliseconds\fR. Maximum is 2500 ms.
+.TP 10
+.BI "\-\-txtime "\fIseconds\fR
+Set maximum time the transmitter may be active to \fIseconds\fR.
+.TP 10
+.BI "\-\-sqdelay "\fImilliseconds\fR
+Set the squelch delay to \fImilliseconds\fR. Maximum delay is 2500 ms.
+.TP 10
+.BI "\-\-slottime "\fImilliseconds\fR
+Set the slot time to \fImilliseconds\fR. Maximum slottime is 2500 ms.
+.TP 10
+.BI "\-\-waittime "\fImilliseconds\fR
+Set the minimum time between the transmitter turning off to when it turns
+on to \fImilliseconds\fR. Maximum wait time is 2500 ms.
+.TP 10
+.BI "\-\-persist "\fIf\fR
+Set the persistance parameter to \fIf\fR. Must be between 0 and 255
+(inclusive).
+.TP 10
+.BI "\-\-dma "\fIchannel\fR
+Set the DMA channel to \fIchannel\fR. Can be 1 or 3. Setting to 0 disables
+DMA.
+.LP
+.SH BUGS
+.B dmascc_cfg
+does not check the parameters for validity. The driver or kernel may crash
+if you specify invalid values.
+.SH AUTHORS
+.nf
+Klaus Kudielka
+.br
+This manual page written by Craig Small <csmall@small.dropbear.id.au>
+.fi
diff --git a/dmascc/dmascc_cfg.c b/dmascc/dmascc_cfg.c
new file mode 100644
index 0000000..abf7673
--- /dev/null
+++ b/dmascc/dmascc_cfg.c
@@ -0,0 +1,191 @@
+/*
+ * $Id: dmascc_cfg.c,v 0.7 1997/12/02 11:31:21 oe1kib Exp $
+ *
+ * Configuration utility for dmascc driver
+ * Copyright (C) 1997 Klaus Kudielka
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <linux/if.h>
+#include <linux/dmascc.h>
+#include <asm/param.h>
+
+void usage(char *name)
+{
+ fprintf(stderr,
+ "usage: %s <interface> [ options ... ]\n\n"
+ "options: --show show configuration\n"
+ " --speed <f> set baud rate\n"
+ " --nrzi 0 | 1 set NRZ or NRZI encoding\n"
+ " --clocks <i> set clock mode\n"
+ " --txdelay <f> set transmit delay in ms\n"
+ " --txtime <f> set maximum transmit time in s\n"
+ " --sqdelay <f> set squelch delay in ms\n"
+ " --slottime <f> set slot time in ms\n"
+ " --waittime <f> set wait time after transmit in ms\n"
+ " --persist <i> set persistence parameter\n"
+ " --dma <i> set DMA channel\n", name);
+}
+
+int main(int argc, char *argv[])
+{
+ int sk, show = 0, set = 0, error = 0;
+ struct ifreq ifr;
+ struct scc_param param;
+ char **option, *end;
+
+ if (argc < 2) {
+ usage(argv[0]);
+ return 1;
+ }
+
+ if ((sk = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+ perror("socket");
+ return 2;
+ }
+
+ strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
+ ifr.ifr_data = (caddr_t) &param;
+ if (ioctl(sk, SIOCGSCCPARAM, &ifr) < 0) {
+ perror("ioctl");
+ close(sk);
+ return 3;
+ }
+
+ option = argv + 2;
+ while (!error && *option != NULL) {
+ if (!strcmp(*option, "--show")) {
+ show = 1;
+ option++;
+ } else if (!strcmp(*option, "--speed")) {
+ option++;
+ if (*option != NULL) {
+ double speed;
+ set = 1;
+ speed = strtod(*option++, &end);
+ if (*end) error = 1; else {
+ if (speed <= 0.0) param.brg_tc = -1;
+ else param.brg_tc = param.pclk_hz / (speed * 2) - 2;
+ if (param.brg_tc > 0xffff) param.brg_tc = -1;
+ }
+ } else error = 1;
+ } else if (!strcmp(*option, "--nrzi")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.nrzi = strtol(*option++, &end, 0);
+ if (*end) error = 1;
+ } else error = 1;
+ } else if (!strcmp(*option, "--clocks")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.clocks = strtol(*option++, &end, 0);
+ if (*end) error = 1;
+ } else error = 1;
+ } else if (!strcmp(*option, "--txdelay")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.txdelay = TMR_0_HZ * strtod(*option++, &end) / 1000.0;
+ if (*end) error = 1;
+ } else error = 1;
+ } else if (!strcmp(*option, "--txtime")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.txtime = HZ * strtod(*option++, &end);
+ if (*end) error = 1;
+ } else error = 1;
+ } else if (!strcmp(*option, "--sqdelay")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.sqdelay = TMR_0_HZ * strtod(*option++, &end) / 1000.0;
+ if (*end) error = 1;
+ } else error = 1;
+ } else if (!strcmp(*option, "--slottime")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.slottime = TMR_0_HZ * strtod(*option++, &end) / 1000.0;
+ if (*end) error = 1;
+ } else error = 1;
+ } else if (!strcmp(*option, "--waittime")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.waittime = TMR_0_HZ * strtod(*option++, &end) / 1000.0;
+ if (*end) error = 1;
+ } else error = 1;
+ } else if (!strcmp(*option, "--persist")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.persist = strtol(*option++, &end, 0);
+ if (*end) error = 1;
+ } else error = 1;
+ } else if (!strcmp(*option, "--dma")) {
+ option++;
+ if (*option != NULL) {
+ set = 1;
+ param.dma = strtol(*option++, &end, 0);
+ if (*end) error = 1;
+ } else error = 1;
+ } else error = 1;
+ }
+
+ if (error) {
+ usage(argv[0]);
+ close(sk);
+ return 1;
+ }
+
+ if (set) {
+ if (ioctl(sk, SIOCSSCCPARAM, &ifr) < 0) {
+ perror("ioctl");
+ close(sk);
+ return 4;
+ }
+ }
+
+ if (show) {
+ double speed;
+ if (param.brg_tc < 0) speed = 0.0;
+ else speed = ((double) param.pclk_hz) / ( 2 * (param.brg_tc + 2));
+ printf("speed = %.2f\nnrzi = %d\nclocks = 0x%02X\n"
+ "txdelay = %.2f ms\ntxtime = %.2f s\nsqdelay = %.2f ms\n"
+ "slottime = %.2f ms\nwaittime = %.2f ms\npersist = %d\n"
+ "dma = %d\n",
+ speed, param.nrzi, param.clocks,
+ param.txdelay * 1000.0 / TMR_0_HZ,
+ (double) param.txtime / HZ,
+ param.sqdelay * 1000.0 / TMR_0_HZ,
+ param.slottime * 1000.0 / TMR_0_HZ,
+ param.waittime * 1000.0 / TMR_0_HZ,
+ param.persist, param.dma);
+ }
+
+ close(sk);
+ return 0;
+}
diff --git a/hdlcutil/Makefile.am b/hdlcutil/Makefile.am
index effca5e..3584a38 100644
--- a/hdlcutil/Makefile.am
+++ b/hdlcutil/Makefile.am
@@ -1,9 +1,9 @@
installconf:
-sbin_PROGRAMS = setcrystal sethdlc smmixer smdiag
+sbin_PROGRAMS = setcrystal sethdlc smmixer
-man_MANS = sethdlc.8 smdiag.8 smmixer.8 baycom.9 hdlcdrv.9 soundmodem.9
+man_MANS = sethdlc.8 smmixer.8 baycom.9 hdlcdrv.9 soundmodem.9
EXTRA_DIST = $(man_MANS)
@@ -22,12 +22,3 @@ smmixer_SOURCES = \
hdrvcomm.h \
usersmdiag.h
-smdiag_SOURCES = \
- smdiag.c \
- hdrvcomm.c \
- hdrvcomm.h \
- usersmdiag.h
-
-smdiag_LDADD = \
- $(X_LIBS) \
- -lX11
diff --git a/hdlcutil/Makefile.in b/hdlcutil/Makefile.in
index a0d16f9..1583b42 100644
--- a/hdlcutil/Makefile.in
+++ b/hdlcutil/Makefile.in
@@ -68,9 +68,9 @@ UTIL_LIB = @UTIL_LIB@
VERSION = @VERSION@
Z_LIB = @Z_LIB@
-sbin_PROGRAMS = setcrystal sethdlc smmixer smdiag
+sbin_PROGRAMS = setcrystal sethdlc smmixer
-man_MANS = sethdlc.8 smdiag.8 smmixer.8 baycom.9 hdlcdrv.9 soundmodem.9
+man_MANS = sethdlc.8 smmixer.8 baycom.9 hdlcdrv.9 soundmodem.9
EXTRA_DIST = $(man_MANS)
@@ -82,12 +82,6 @@ sethdlc_SOURCES = sethdlc.c hdrvcomm.c hdrvcomm.h usersmdiag.h
smmixer_SOURCES = smmixer.c hdrvcomm.c hdrvcomm.h usersmdiag.h
-
-smdiag_SOURCES = smdiag.c hdrvcomm.c hdrvcomm.h usersmdiag.h
-
-
-smdiag_LDADD = $(X_LIBS) -lX11
-
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../config.h
CONFIG_CLEAN_FILES =
@@ -114,9 +108,6 @@ smmixer_OBJECTS = smmixer.o hdrvcomm.o
smmixer_LDADD = $(LDADD)
smmixer_DEPENDENCIES =
smmixer_LDFLAGS =
-smdiag_OBJECTS = smdiag.o hdrvcomm.o
-smdiag_DEPENDENCIES =
-smdiag_LDFLAGS =
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
@@ -133,8 +124,8 @@ DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
GZIP_ENV = --best
-SOURCES = $(setcrystal_SOURCES) $(sethdlc_SOURCES) $(smmixer_SOURCES) $(smdiag_SOURCES)
-OBJECTS = $(setcrystal_OBJECTS) $(sethdlc_OBJECTS) $(smmixer_OBJECTS) $(smdiag_OBJECTS)
+SOURCES = $(setcrystal_SOURCES) $(sethdlc_SOURCES) $(smmixer_SOURCES)
+OBJECTS = $(setcrystal_OBJECTS) $(sethdlc_OBJECTS) $(smmixer_OBJECTS)
all: all-redirect
.SUFFIXES:
@@ -203,10 +194,6 @@ smmixer: $(smmixer_OBJECTS) $(smmixer_DEPENDENCIES)
@rm -f smmixer
$(LINK) $(smmixer_LDFLAGS) $(smmixer_OBJECTS) $(smmixer_LDADD) $(LIBS)
-smdiag: $(smdiag_OBJECTS) $(smdiag_DEPENDENCIES)
- @rm -f smdiag
- $(LINK) $(smdiag_LDFLAGS) $(smdiag_OBJECTS) $(smdiag_LDADD) $(LIBS)
-
install-man8:
$(mkinstalldirs) $(DESTDIR)$(man8dir)
@list='$(man8_MANS)'; \
@@ -323,11 +310,6 @@ distdir: $(DISTFILES)
|| cp -p $$d/$$file $(distdir)/$$file || :; \
fi; \
done
-hdrvcomm.o: hdrvcomm.c hdrvcomm.h usersmdiag.h
-setcrystal.o: setcrystal.c
-sethdlc.o: sethdlc.c hdrvcomm.h
-smdiag.o: smdiag.c hdrvcomm.h
-smmixer.o: smmixer.c hdrvcomm.h
info-am:
info: info-am
diff --git a/hdlcutil/setcrystal.c b/hdlcutil/setcrystal.c
index f5181f3..48ee750 100644
--- a/hdlcutil/setcrystal.c
+++ b/hdlcutil/setcrystal.c
@@ -30,7 +30,7 @@
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
-#include <asm/io.h>
+#include <sys/io.h>
/* --------------------------------------------------------------------- */
diff --git a/hdlcutil/smdiag.8 b/hdlcutil/smdiag.8
deleted file mode 100644
index 276a1b7..0000000
--- a/hdlcutil/smdiag.8
+++ /dev/null
@@ -1,78 +0,0 @@
-.\" Copyright 1996 Thomas Sailer (sailer@ife.ee.ethz.ch)
-.\" May be distributed under the GNU General Public License
-.\" "
-.TH SMDIAG 8 "1 October 1996" "Smdiag 0.1" "Linux Programmer's Manual"
-.SH NAME
-smdiag \- Linux soundcard packet radio modem driver diagnostics utility
-.SH SYNOPSIS
-.B smdiag
-.B "[\-i device]"
-.B "[\-d display]"
-.B "[ \-ce ]"
-
-.SH DESCRIPTION
-.B smdiag
-may help to adjust the audio levels of the soundcard modem driver, as well
-as to control the quality of the radio link. It may either display an
-oscilloscope like view of the input signal, or display an eye diagram.
-The display may be gated with DCD, i.e. only updated if the modem detects
-a data carrier.
-
-.SH OPTIONS
-.B smdiag
-accepts the following options:
-
-.TP
-.B \-i
-The
-.I device
-argument specifies the soundcard modem device which should be configured or
-interrogated. It will usually have the following form:
-.I sm[0-3].
-.TP
-.B \-d
-sets the address of the X server to display the window.
-.TP
-.B \-h
-display an overview of the available command line parameters and exit.
-.TP
-.B \-c
-toggle the carrier gating of the display.
-.TP
-.B \-e
-display an eye diagram (overlay of the synchronized demodulator output)
-instead of an oscilloscope view of the input signal.
-
-.SH KEYS
-.TP
-.B C
-clears the window
-.TP
-.B D
-toggles the DCD gating.
-.TP
-.B E
-displays an eye diagram
-.TP
-.B I
-displays the input signal
-.TP
-.B Q
-quits
-.I smdiag
-
-.SH BUGS
-.B smdiag
-Reacts sluggishly to keypresses. The window size is fixed. For speed reasons,
-two square root operations per sample are not implemented in the AFSK 1200
-baud modes. The eye diagram for the AFSK 1200 baud mode is therefore
-distorted.
-
-.SH "SEE ALSO"
-.BR smmixer " (8), " sethdlc " (8),"
-linux/drivers/net/soundmodem.c
-
-.SH AUTHOR
-smdiag was written by Thomas Sailer (sailer@ife.ee.ethz.ch).
-
-
diff --git a/hdlcutil/smdiag.c b/hdlcutil/smdiag.c
deleted file mode 100644
index d8a20f8..0000000
--- a/hdlcutil/smdiag.c
+++ /dev/null
@@ -1,434 +0,0 @@
-/*****************************************************************************/
-
-/*
- * smdiag.c -- kernel soundcard radio modem driver diagnostics utility.
- *
- * Copyright (C) 1996 Thomas Sailer (sailer@ife.ee.ethz.ch)
- *
- * 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 2 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, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * Please note that the GPL allows you to use the driver, NOT the radio.
- * In order to use the radio, you need a license from the communications
- * authority of your country.
- *
- *
- * History:
- * 0.1 26.06.96 Started
- * 0.2 11.05.97 introduced hdrvcomm.h
- */
-
-/*****************************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <sys/time.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <string.h>
-#include <limits.h>
-#include <net/if.h>
-#include <X11/X.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include "hdrvcomm.h"
-
-#include <linux/soundmodem.h>
-
-/* ---------------------------------------------------------------------- */
-
-static char *progname;
-static Display *display = NULL;
-static Window window;
-static Pixmap pixmap;
-static unsigned long col_zeroline;
-static unsigned long col_background;
-static unsigned long col_trace;
-static GC gr_context;
-static int xmul;
-
-/* ---------------------------------------------------------------------- */
-
-static int x_error_handler(Display *disp, XErrorEvent *evt)
-{
- char err_buf[256], mesg[256], number[256];
- char *mtype = "XlibMessage";
-
- XGetErrorText(disp, evt->error_code, err_buf, sizeof(err_buf));
- fprintf(stderr, "X Error: %s\n", err_buf);
- XGetErrorDatabaseText(disp, mtype, "MajorCode", "Request Major code %d",
- mesg, sizeof(mesg));
- fprintf(stderr, mesg, evt->request_code);
- sprintf(number, "%d", evt->request_code);
- XGetErrorDatabaseText(disp, "XRequest", number, "", err_buf,
- sizeof(err_buf));
- fprintf(stderr, " (%s)\n", err_buf);
- abort();
-}
-
-/* ---------------------------------------------------------------------- */
-
-#define WIDTH 512
-#define HEIGHT (constell ? 512 : 256)
-
-static int openwindow(char *disp, int constell, int samplesperbit)
-{
- XSetWindowAttributes attr;
- XGCValues gr_values;
- XColor color, dummy;
- XSizeHints sizehints;
-
- if (!(display = XOpenDisplay(NULL)))
- return -1;
- XSetErrorHandler(x_error_handler);
- XAllocNamedColor(display, DefaultColormap(display, 0), "red",
- &color, &dummy);
- col_zeroline = color.pixel;
- col_background = WhitePixel(display, 0);
- col_trace = BlackPixel(display, 0);
- attr.background_pixel = col_background;
- if (!(window = XCreateWindow(display, XRootWindow(display, 0),
- 200, 200, WIDTH, HEIGHT, 5,
- DefaultDepth(display, 0),
- InputOutput, DefaultVisual(display, 0),
- CWBackPixel, &attr))) {
- fprintf(stderr, "smdiag: unable to open X window\n");
- exit(1);
- }
- if (!(pixmap = XCreatePixmap(display, window, WIDTH, HEIGHT,
- DefaultDepth(display, 0)))) {
- fprintf(stderr, "smdiag: unable to open offscreen pixmap\n");
- exit(1);
- }
- xmul = WIDTH / (2*(samplesperbit > 0 ? samplesperbit : 1));
- XSelectInput(display, window, KeyPressMask | StructureNotifyMask
- | ExposureMask) ;
- XAllocNamedColor(display, DefaultColormap(display, 0), "red",
- &color, &dummy);
- gr_values.foreground = col_trace;
- gr_values.line_width = 1;
- gr_values.line_style = LineSolid;
- gr_context = XCreateGC(display, window, GCForeground | GCLineWidth |
- GCLineStyle, &gr_values);
- XStoreName(display, window, "diagnostics");
- /*
- * Do not allow the window to be resized
- */
- memset(&sizehints, 0, sizeof(sizehints));
- sizehints.min_width = sizehints.max_width = WIDTH;
- sizehints.min_height = sizehints.max_height = HEIGHT;
- sizehints.flags = PMinSize | PMaxSize;
- XSetWMNormalHints(display, window, &sizehints);
- XMapWindow(display, window);
- XSynchronize(display, 1);
- return 0;
-}
-
-#undef WIDTH
-#undef HEIGHT
-
-/* ---------------------------------------------------------------------- */
-
-static void closewindow(void)
-{
- if (!display)
- return;
- XDestroyWindow(display, window);
- XCloseDisplay(display);
- display = NULL;
-}
-
-/* ---------------------------------------------------------------------- */
-
-#define XCOORD(x) ((x) * xm)
-#define YCOORD(y) ((SHRT_MAX - (int)(y)) * winattrs.height / USHRT_MAX)
-
-static void drawdata(short *data, int len, int replace, int xm)
-{
- int cnt;
- GC gc;
- XGCValues gcv;
- XWindowAttributes winattrs;
-
- if (!display || !pixmap)
- return;
- XGetWindowAttributes(display, window, &winattrs);
- gcv.line_width = 1;
- gcv.line_style = LineSolid;
- gc = XCreateGC(display, pixmap, GCLineWidth | GCLineStyle, &gcv);
- XSetState(display, gc, col_background, col_background, GXcopy,
- AllPlanes);
- if (replace)
- XFillRectangle(display, pixmap, gc, 0, 0,
- winattrs.width, winattrs.height);
- else
- XCopyArea(display, window, pixmap, gr_context, 0, 0,
- winattrs.width, winattrs.height, 0, 0);
- XSetForeground(display, gc, col_trace);
- for (cnt = 0; cnt < len-1; cnt++)
- XDrawLine(display, pixmap, gc, XCOORD(cnt), YCOORD(data[cnt]),
- XCOORD(cnt+1), YCOORD(data[cnt+1]));
- XSetForeground(display, gc, col_zeroline);
- XDrawLine(display, pixmap, gc, 0, YCOORD(0), winattrs.width,
- YCOORD(0));
- XCopyArea(display, pixmap, window, gr_context, 0, 0, winattrs.width,
- winattrs.height, 0, 0);
- XFreeGC(display, gc);
- XSync(display, 0);
-}
-
-#undef XCOORD
-#undef YCOORD
-
-/* ---------------------------------------------------------------------- */
-
-#define XCOORD(x) ((SHRT_MAX - (int)(x)) * winattrs.width / USHRT_MAX)
-#define YCOORD(y) ((SHRT_MAX - (int)(y)) * winattrs.height / USHRT_MAX)
-
-static void drawconstell(short *data, int len)
-{
- int cnt;
- GC gc;
- XGCValues gcv;
- XWindowAttributes winattrs;
-
- if (!display || !pixmap)
- return;
- XGetWindowAttributes(display, window, &winattrs);
- gcv.line_width = 1;
- gcv.line_style = LineSolid;
- gc = XCreateGC(display, pixmap, GCLineWidth | GCLineStyle, &gcv);
- XSetState(display, gc, col_background, col_background, GXcopy,
- AllPlanes);
- XCopyArea(display, window, pixmap, gr_context, 0, 0,
- winattrs.width, winattrs.height, 0, 0);
- XSetForeground(display, gc, col_trace);
- for (cnt = 0; cnt < len-1; cnt += 2)
- XDrawPoint(display, pixmap, gc,
- XCOORD(data[cnt]), YCOORD(data[cnt+1]));
- XSetForeground(display, gc, col_zeroline);
- XDrawLine(display, pixmap, gc, 0, YCOORD(0), winattrs.width, YCOORD(0));
- XDrawLine(display, pixmap, gc, XCOORD(0), 0, XCOORD(0), winattrs.height);
- XCopyArea(display, pixmap, window, gr_context, 0, 0, winattrs.width,
- winattrs.height, 0, 0);
- XFreeGC(display, gc);
- XSync(display, 0);
-}
-
-#undef XCOORD
-#undef YCOORD
-
-/* ---------------------------------------------------------------------- */
-
-static void clearwindow(void)
-{
- XWindowAttributes winattrs;
- GC gc;
- XGCValues gcv;
-
- if (!display || !pixmap)
- return;
- XGetWindowAttributes(display, window, &winattrs);
- gcv.line_width = 1;
- gcv.line_style = LineSolid;
- gc = XCreateGC(display, pixmap, GCLineWidth | GCLineStyle, &gcv);
- XSetState(display, gc, col_background, col_background, GXcopy,
- AllPlanes);
- XFillRectangle(display, pixmap, gc, 0, 0,
- winattrs.width, winattrs.height);
- XSetForeground(display, gc, col_zeroline);
- XClearArea(display, window, 0, 0, 0, 0, False);
- XCopyArea(display, pixmap, window, gr_context, 0, 0, winattrs.width,
- winattrs.height, 0, 0);
- XFreeGC(display, gc);
-}
-
-/* ---------------------------------------------------------------------- */
-
-static Bool predicate(Display *display, XEvent *event, char *arg)
-{
- return True;
-}
-
-/* ---------------------------------------------------------------------- */
-
-static char *getkey(void)
-{
- XWindowAttributes winattrs;
- XEvent evt;
- static char kbuf[32];
- int i;
-
- if (!display)
- return NULL;
- XSync(display, 0);
- while (XCheckIfEvent(display, &evt, predicate, NULL)) {
- switch (evt.type) {
- case KeyPress:
- i = XLookupString((XKeyEvent *)&evt, kbuf, sizeof(kbuf)-1,
- NULL, NULL);
- if (!i)
- return NULL;
- kbuf[i] = 0;
- return kbuf;
- case DestroyNotify:
- XCloseDisplay(display);
- display = NULL;
- return NULL;
- case Expose:
- XGetWindowAttributes(display, window, &winattrs);
- XCopyArea(display, pixmap, window, gr_context, 0, 0,
- winattrs.width, winattrs.height, 0, 0);
- break;
- default:
- break;
- }
- }
- return NULL;
-}
-
-/* ---------------------------------------------------------------------- */
-
-static void printmode(unsigned int mode, unsigned int trigger)
-{
- printf("Source: %s%s\n", (mode == SM_DIAGMODE_DEMOD) ?
- "demodulator (eye diagram)" : "input (oscilloscope)",
- (trigger & SM_DIAGFLAG_DCDGATE) ? " gated with DCD" : "");
-}
-
-/* ---------------------------------------------------------------------- */
-
-static const char *usage_str =
-"[-d display] [-i smif] [-c] [-e]\n"
-" -d: display host\n"
-" -i: specify the name of the baycom kernel driver interface\n"
-" -c: toggle carrier trigger\n"
-" -e: eye diagram mode\n\n"
-" -p: constellation plot\n\n";
-
-int main(int argc, char *argv[])
-{
- char *disp = NULL;
- unsigned int mode = HDRVC_DIAGMODE_INPUT;
- unsigned int trigger = 0;
- unsigned int ifflags;
- short data[256];
- char *cp;
- int ret;
- unsigned int samplesperbit;
-
- progname = *argv;
- printf("%s: Version 0.2; (C) 1996-1997 by Thomas Sailer HB9JNX/AE4WA\n", *argv);
- hdrvc_args(&argc, argv, "sm0");
- while ((ret = getopt(argc, argv, "d:ecp")) != -1) {
- switch (ret) {
- case 'd':
- disp = optarg;
- break;
- case 'e':
- mode = HDRVC_DIAGMODE_DEMOD;
- trigger = HDRVC_DIAGFLAG_DCDGATE;
- break;
- case 'c':
- trigger ^= HDRVC_DIAGFLAG_DCDGATE;
- break;
- case 'p':
- mode = HDRVC_DIAGMODE_CONSTELLATION;
- break;
- default:
- printf("usage: %s %s", *argv, usage_str);
- exit(-1);
- }
- }
- hdrvc_init();
-#ifdef HDRVC_KERNEL
- ifflags = hdrvc_get_ifflags();
- if (!(ifflags & IFF_UP)) {
- fprintf(stderr, "interface %s down\n", hdrvc_ifname());
- exit(1);
- }
- if (!(ifflags & IFF_RUNNING)) {
- fprintf(stderr, "interface %s not running\n", hdrvc_ifname());
- exit(1);
- }
-#endif /* HDRVC_KERNEL */
- printmode(mode, trigger);
- for (;;) {
- if ((ret = hdrvc_diag2(mode, trigger, data, sizeof(data) / sizeof(short),
- &samplesperbit)) < 0) {
- perror("hdrvc_diag2");
- exit(1);
- }
- if (ret > 0) {
- if (!display) {
- openwindow(disp, mode == HDRVC_DIAGMODE_CONSTELLATION,
- samplesperbit);
- clearwindow();
- }
- if (mode == SM_DIAGMODE_CONSTELLATION)
- drawconstell(data, ret);
- else
- drawdata(data, ret, mode == HDRVC_DIAGMODE_INPUT,
- mode == HDRVC_DIAGMODE_INPUT ? 5:xmul);
- } else
- usleep(100000L);
- if (display) {
- if ((cp = getkey())) {
- for (; *cp; cp++) {
- printf("char pressed: '%c'\n", *cp);
- switch (*cp) {
- case 'c':
- case 'C':
- clearwindow();
- printmode(mode, trigger);
- break;
- case 'q':
- case 'Q':
- closewindow();
- break;
- case 'i':
- case 'I':
- if (mode == HDRVC_DIAGMODE_CONSTELLATION)
- break;
- mode = HDRVC_DIAGMODE_INPUT;
- clearwindow();
- printmode(mode, trigger);
- break;
- case 'e':
- case 'E':
- if (mode == HDRVC_DIAGMODE_CONSTELLATION)
- break;
- mode = HDRVC_DIAGMODE_DEMOD;
- clearwindow();
- printmode(mode, trigger);
- break;
- case 'd':
- case 'D':
- trigger ^= HDRVC_DIAGFLAG_DCDGATE;
- clearwindow();
- printmode(mode, trigger);
- break;
- }
- }
- }
- if (!display)
- exit(0);
- }
- }
-}
-
-/* ---------------------------------------------------------------------- */
diff --git a/kiss/Makefile.am b/kiss/Makefile.am
index 82db252..c37accc 100644
--- a/kiss/Makefile.am
+++ b/kiss/Makefile.am
@@ -5,7 +5,16 @@ sbin_PROGRAMS = kissattach kissnetd kissparms mkiss net2kiss
LDADD= $(AX25_LIB)
-man_MANS = kissattach.8 kissnetd.8 kissparms.8 mkiss.8 net2kiss.8
+man_MANS = kissattach.8 spattach.8 kissnetd.8 kissparms.8 mkiss.8 net2kiss.8
EXTRA_DIST = $(man_MANS)
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" \
+ -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
+AX25_SYSCONFDIR=${sysconfdir}/ax25/
+AX25_LOCALSTATEDIR=${localstatedir}/ax25/
+
+install-exec-local:
+ (cd $(DESTDIR)$(sbindir) ; ln -s kissattach spattach)
+
diff --git a/kiss/Makefile.in b/kiss/Makefile.in
index ba5b17c..fdada1d 100644
--- a/kiss/Makefile.in
+++ b/kiss/Makefile.in
@@ -72,9 +72,15 @@ sbin_PROGRAMS = kissattach kissnetd kissparms mkiss net2kiss
LDADD = $(AX25_LIB)
-man_MANS = kissattach.8 kissnetd.8 kissparms.8 mkiss.8 net2kiss.8
+man_MANS = kissattach.8 spattach.8 kissnetd.8 kissparms.8 mkiss.8 net2kiss.8
EXTRA_DIST = $(man_MANS)
+
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
+
+AX25_SYSCONFDIR = ${sysconfdir}/ax25/
+AX25_LOCALSTATEDIR = ${localstatedir}/ax25/
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../config.h
CONFIG_CLEAN_FILES =
@@ -290,11 +296,6 @@ distdir: $(DISTFILES)
|| cp -p $$d/$$file $(distdir)/$$file || :; \
fi; \
done
-kissattach.o: kissattach.c ../config.h ../pathnames.h
-kissnetd.o: kissnetd.c
-kissparms.o: kissparms.c ../config.h
-mkiss.o: mkiss.c ../config.h
-net2kiss.o: net2kiss.c
info-am:
info: info-am
@@ -304,7 +305,7 @@ check-am: all-am
check: check-am
installcheck-am:
installcheck: installcheck-am
-install-exec-am: install-sbinPROGRAMS
+install-exec-am: install-sbinPROGRAMS install-exec-local
install-exec: install-exec-am
install-data-am: install-man
@@ -361,15 +362,18 @@ install-sbinPROGRAMS mostlyclean-compile distclean-compile \
clean-compile maintainer-clean-compile install-man8 uninstall-man8 \
install-man uninstall-man tags mostlyclean-tags distclean-tags \
clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
-check-am installcheck-am installcheck install-exec-am install-exec \
-install-data-am install-data install-am install uninstall-am uninstall \
-all-redirect all-am all installdirs mostlyclean-generic \
-distclean-generic clean-generic maintainer-clean-generic clean \
-mostlyclean distclean maintainer-clean
+check-am installcheck-am installcheck install-exec-local \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
installconf:
+install-exec-local:
+ (cd $(DESTDIR)$(sbindir) ; ln -s kissattach spattach)
+
# 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/kiss/kissattach.8 b/kiss/kissattach.8
index eabc2a1..1ba0ea7 100644
--- a/kiss/kissattach.8
+++ b/kiss/kissattach.8
@@ -1,13 +1,15 @@
-.TH KISSATTACH 8 "13 October 1996" Linux "Linux System Managers Manual"
+.TH KISSATTACH 8 "4 July 1999" Linux "Linux System Managers Manual"
.SH NAME
-kissattach \- Attach a KISS interface
+kissattach, spattach \- Attach a KISS or 6PACK interface
.SH SYNOPSIS
-.B kissattach [-i inetaddr] [-l] [-m mtu] [-v] tty port
+.B kissattach [-6] [-i inetaddr] [-l] [-m mtu] [-v] tty port
+.sp
+.B spattach [-i inetaddr] [-l] [-m mtu] [-v] tty port
.SH DESCRIPTION
.LP
-Attach a KISS interface to what is normally a tty line connected to a TNC in
-KISS mode. This program will turn itself into a background process. To down
-an interface send its kissattach process a SIGKILL.
+Attach a KISS or a 6PACK interface to what is normally a tty line connected
+to a TNC in KISS or 6PACK mode. This program will turn itself into a
+background process. To down an interface send its attach process a SIGTERM.
.LP
.B Kissattach
takes many of the parameters for the port from the axports(5) file. If the
@@ -16,12 +18,16 @@ serial port speed, a zero value means that no speed is set. The paclen
parameter is used for the device mtu unless overridden by a value on the
command line.
.LP
-The tty argument will typically be that of a serial port with a KISS TNC
-attached, although it could be a psuedo tty or a KISS port emulator such as
+The tty argument will typically be that of a serial port with a KISS or 6PACK
+TNC attached, although it could be a pseudo tty or a KISS port emulator such as
an SCC card. The port arguments is the name of a port as given in the
axports(5) file.
.SH OPTIONS
.TP 16
+.BI "\-6"
+Use the 6PACK line discipline instead of KISS. This is the default if
+the program is called as spattach.
+.TP 16
.BI "\-i inetaddr"
Set the internet address of the interface. This address may either be a
dotted decimal address or a host name.
diff --git a/kiss/kissattach.c b/kiss/kissattach.c
index 0c80fe4..7b26560 100644
--- a/kiss/kissattach.c
+++ b/kiss/kissattach.c
@@ -1,4 +1,3 @@
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -9,6 +8,7 @@
#include <ctype.h>
#include <netdb.h>
#include <syslog.h>
+#include <errno.h>
#include <config.h>
@@ -35,10 +35,21 @@
#include "../pathnames.h"
+#ifndef N_6PACK
+#define N_6PACK 7 /* This is valid for all architectures in 2.2.x */
+#endif
+
static char *callsign;
static int speed = 0;
static int mtu = 0;
static int logging = FALSE;
+static char *progname;
+
+static char *basename(char *s)
+{
+ char *p = strrchr(s, '/');
+ return p ? p + 1 : s;
+}
static void terminate(int sig)
{
@@ -57,7 +68,7 @@ static int readconfig(char *port)
int n = 0;
if ((fp = fopen(CONF_AXPORTS_FILE, "r")) == NULL) {
- fprintf(stderr, "kissattach: cannot open axports file\n");
+ fprintf(stderr, "%s: cannot open axports file\n", progname);
return FALSE;
}
@@ -71,7 +82,7 @@ static int readconfig(char *port)
continue;
if ((s = strtok(buffer, " \t\r\n")) == NULL) {
- fprintf(stderr, "kissattach: unable to parse line %d of the axports file\n", n);
+ fprintf(stderr, "%s: unable to parse line %d of the axports file\n", progname, n);
return FALSE;
}
@@ -79,27 +90,27 @@ static int readconfig(char *port)
continue;
if ((s = strtok(NULL, " \t\r\n")) == NULL) {
- fprintf(stderr, "kissattach: unable to parse line %d of the axports file\n", n);
+ fprintf(stderr, "%s: unable to parse line %d of the axports file\n", progname, n);
return FALSE;
}
callsign = strdup(s);
if ((s = strtok(NULL, " \t\r\n")) == NULL) {
- fprintf(stderr, "kissattach: unable to parse line %d of the axports file\n", n);
+ fprintf(stderr, "%s: unable to parse line %d of the axports file\n", progname, n);
return FALSE;
}
speed = atoi(s);
if ((s = strtok(NULL, " \t\r\n")) == NULL) {
- fprintf(stderr, "kissattach: unable to parse line %d of the axports file\n", n);
+ fprintf(stderr, "%s: unable to parse line %d of the axports file\n", progname, n);
return FALSE;
}
if (mtu == 0) {
if ((mtu = atoi(s)) <= 0) {
- fprintf(stderr, "kissattach: invalid paclen setting\n");
+ fprintf(stderr, "%s: invalid paclen setting\n", progname);
return FALSE;
}
}
@@ -111,7 +122,7 @@ static int readconfig(char *port)
fclose(fp);
- fprintf(stderr, "kissattach: cannot find port %s in axports\n", port);
+ fprintf(stderr, "%s: cannot find port %s in axports\n", progname, port);
return FALSE;
}
@@ -126,7 +137,8 @@ static int setifcall(int fd, char *name)
if (ioctl(fd, SIOCSIFHWADDR, call) != 0) {
close(fd);
- perror("kissattach: SIOCSIFHWADDR");
+ fprintf(stderr, "%s: ", progname);
+ perror("SIOCSIFHWADDR");
return FALSE;
}
@@ -140,7 +152,8 @@ static int startiface(char *dev, struct hostent *hp)
int fd;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- perror("kissattach: socket");
+ fprintf(stderr, "%s: ", progname);
+ perror("socket");
return FALSE;
}
@@ -158,7 +171,8 @@ static int startiface(char *dev, struct hostent *hp)
ifr.ifr_addr.sa_data[6] = 0;
if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) {
- perror("kissattach: SIOCSIFADDR");
+ fprintf(stderr, "%s: ", progname);
+ perror("SIOCSIFADDR");
return FALSE;
}
}
@@ -166,12 +180,14 @@ static int startiface(char *dev, struct hostent *hp)
ifr.ifr_mtu = mtu;
if (ioctl(fd, SIOCSIFMTU, &ifr) < 0) {
- perror("kissattach: SIOCSIFMTU");
+ fprintf(stderr, "%s: ", progname);
+ perror("SIOCSIFMTU");
return FALSE;
}
if (ioctl(fd, SIOCGIFFLAGS, &ifr) < 0) {
- perror("kissattach: SIOCGIFFLAGS");
+ fprintf(stderr, "%s: ", progname);
+ perror("SIOCGIFFLAGS");
return FALSE;
}
@@ -180,7 +196,8 @@ static int startiface(char *dev, struct hostent *hp)
ifr.ifr_flags |= IFF_RUNNING;
if (ioctl(fd, SIOCSIFFLAGS, &ifr) < 0) {
- perror("kissattach: SIOCSIFFLAGS");
+ fprintf(stderr, "%s: ", progname);
+ perror("SIOCSIFFLAGS");
return FALSE;
}
@@ -198,11 +215,19 @@ int main(int argc, char *argv[])
int v = 4;
struct hostent *hp = NULL;
- while ((fd = getopt(argc, argv, "i:lm:v")) != -1) {
+ progname = basename(argv[0]);
+
+ if (!strcmp(progname, "spattach"))
+ disc = N_6PACK;
+
+ while ((fd = getopt(argc, argv, "6i:lm:v")) != -1) {
switch (fd) {
+ case '6':
+ disc = N_6PACK;
+ break;
case 'i':
if ((hp = gethostbyname(optarg)) == NULL) {
- fprintf(stderr, "kissattach: invalid internet name/address - %s\n", optarg);
+ fprintf(stderr, "%s: invalid internet name/address - %s\n", progname, optarg);
return 1;
}
break;
@@ -211,27 +236,27 @@ int main(int argc, char *argv[])
break;
case 'm':
if ((mtu = atoi(optarg)) <= 0) {
- fprintf(stderr, "kissattach: invalid mtu size - %s\n", optarg);
+ fprintf(stderr, "%s: invalid mtu size - %s\n", progname, optarg);
return 1;
}
break;
case 'v':
- printf("kissattach: %s\n", VERSION);
+ printf("%s: %s\n", progname, VERSION);
return 0;
case ':':
case '?':
- fprintf(stderr, "usage: kissattach [-i inetaddr] [-l] [-m mtu] [-v] ttyinterface port\n");
+ fprintf(stderr, "usage: %s [-i inetaddr] [-l] [-m mtu] [-v] ttyinterface port\n", progname);
return 1;
}
}
if ((argc - optind) != 2) {
- fprintf(stderr, "usage: kissattach [-i inetaddr] [-l] [-m mtu] [-v] ttyinterface port\n");
+ fprintf(stderr, "usage: %s [-i inetaddr] [-l] [-m mtu] [-v] ttyinterface port\n", progname);
return 1;
}
if (tty_is_locked(argv[optind])) {
- fprintf(stderr, "kissattach: device %s already in use\n", argv[optind]);
+ fprintf(stderr, "%s: device %s already in use\n", progname, argv[optind]);
return 1;
}
@@ -239,7 +264,8 @@ int main(int argc, char *argv[])
return 1;
if ((fd = open(argv[optind], O_RDONLY | O_NONBLOCK)) == -1) {
- perror("kissattach: open");
+ fprintf(stderr, "%s: ", progname);
+ perror("open");
return 1;
}
@@ -247,12 +273,17 @@ int main(int argc, char *argv[])
return 1;
if (ioctl(fd, TIOCSETD, &disc) == -1) {
- perror("kissattach: TIOCSETD");
+ fprintf(stderr, "%s: Error setting line discipline: ", progname);
+ perror("TIOCSETD");
+ fprintf(stderr, "Are you sure you have enabled %s support in the kernel\n",
+ disc == N_AX25 ? "MKISS" : "6PACK");
+ fprintf(stderr, "or, if you made it a module, that the module is loaded?\n");
return 1;
}
if (ioctl(fd, SIOCGIFNAME, dev) == -1) {
- perror("kissattach: SIOCGIFNAME");
+ fprintf(stderr, "%s: ", progname);
+ perror("SIOCGIFNAME");
return 1;
}
@@ -261,7 +292,8 @@ int main(int argc, char *argv[])
/* Now set the encapsulation */
if (ioctl(fd, SIOCSIFENCAP, &v) == -1) {
- perror("kissattach: SIOCSIFENCAP");
+ fprintf(stderr, "%s: ", progname);
+ perror("SIOCSIFENCAP");
return 1;
}
@@ -271,7 +303,7 @@ int main(int argc, char *argv[])
printf("AX.25 port %s bound to device %s\n", argv[optind + 1], dev);
if (logging) {
- openlog("kissattach", LOG_PID, LOG_DAEMON);
+ openlog(progname, LOG_PID, LOG_DAEMON);
syslog(LOG_INFO, "AX.25 port %s bound to device %s\n", argv[optind + 1], dev);
}
@@ -282,7 +314,7 @@ int main(int argc, char *argv[])
* Become a daemon if we can.
*/
if (!daemon_start(FALSE)) {
- fprintf(stderr, "kissattach: cannot become a daemon\n");
+ fprintf(stderr, "%s: cannot become a daemon\n", progname);
return 1;
}
diff --git a/kiss/kissnetd.c b/kiss/kissnetd.c
index ff38779..99e31dd 100644
--- a/kiss/kissnetd.c
+++ b/kiss/kissnetd.c
@@ -16,7 +16,7 @@
#include <unistd.h>
#include <assert.h>
#include <fcntl.h>
-#include <strings.h>
+#include <string.h>
#include <errno.h>
#include <syslog.h>
#include <time.h>
diff --git a/kiss/kissparms.c b/kiss/kissparms.c
index d761f55..ea0f0bd 100644
--- a/kiss/kissparms.c
+++ b/kiss/kissparms.c
@@ -21,6 +21,8 @@
#include <netax25/kernel_rose.h>
#endif
+#include <netax25/axconfig.h>
+
#define PARAM_TXDELAY 1
#define PARAM_PERSIST 2
#define PARAM_SLOTTIME 3
diff --git a/kiss/mkiss.8 b/kiss/mkiss.8
index 4c6c973..f629403 100644
--- a/kiss/mkiss.8
+++ b/kiss/mkiss.8
@@ -1,8 +1,8 @@
-.TH MKISS 8 "05 January 1997" Linux "Linux System Managers Manual"
+.TH MKISS 8 "4 July 1999" Linux "Linux System Managers Manual"
.SH NAME
mkiss \- Attach a multi KISS interface
.SH SYNOPSIS
-.B mkiss [-c] [-h] [-l] [-s speed] [-p] [-v] ttyinterface pty...
+.B mkiss [-c] [-f] [-h] [-l] [-s speed] [-p pollrate] [-v] ttyinterface pty...
.SH DESCRIPTION
.LP
.B Mkiss
@@ -37,6 +37,11 @@ This enables a one-byte checksum on each incoming and outgoing KISS frame on
the serial port. This checksum is used by G8BPQ KISS roms to maintain the
integrity of KISS frames.
.TP 10
+.BI \-f
+This enables a 16-bit checksum on each incoming and outgoing KISS frame on
+the serial port. This checksum is used by Flexnet Node and BayCom Mailbox
+to maintain the integrity of KISS frames.
+.TP 10
.BI \-h
Enables hardware handshaking on the serial line to the TNC. The KISS
specification states that no hardware flow control shall be used so the
@@ -48,9 +53,10 @@ Enables system logging, the default is off.
.BI "\-s speed"
Set the speed of the serial port.
.TP 10
-.BI "\-p"
+.BI "\-p pollrate"
Enables polling. Polled mode is used by G8BPQ KISS roms to prevent
contention on systems where multiple TNCs share the same serial line.
+Pollrate is interval between polls (in 100ms units).
.TP 10
.BI \-v
Display the version.
diff --git a/kiss/mkiss.c b/kiss/mkiss.c
index 8621ce4..bfdb46d 100644
--- a/kiss/mkiss.c
+++ b/kiss/mkiss.c
@@ -30,6 +30,11 @@
* system logging.
*
* 1.06 23/11/96 Tomi Manninen - Added simple support for polled kiss.
+ *
+ * 1.07 12/24/97 Deti Fliegl - Added Flexnet/BayCom CRC mode with commandline
+ * parameter -f
+ *
+ * 1.08 xx/xx/99 Tom Mazouch - Adjustable poll interval
*/
#include <stdio.h>
@@ -50,6 +55,9 @@
#include <config.h>
+#define FLEX_CRC 2
+#define G8BPQ_CRC 1
+
#define SIZE 4096
#define FEND 0300 /* Frame End (0xC0) */
@@ -57,6 +65,7 @@
#define TFEND 0334 /* Transposed Frame End (0xDC) */
#define TFESC 0335 /* Transposed Frame Escape (0xDD) */
+#define ACKREQ 0x0C
#define POLL 0x0E
/*
@@ -69,21 +78,26 @@ static int crc_errors = 0;
static int invalid_ports = 0;
static int return_polls = 0;
-static char *usage_string = "usage: mkiss [-p] [-c] [-h] [-l] [-s speed] [-v] ttyinterface pty ...\n";
+static char *usage_string = "usage: mkiss [-p interval] [-c] [-f] [-h] [-l] [-s speed] [-v] ttyinterface pty ...\n";
static int dump_report = FALSE;
static int logging = FALSE;
static int crcflag = FALSE;
static int hwflag = FALSE;
-static int pollflag = FALSE;
+static int pollspeed = 0;
+
+/* CRC-stuff */
+typedef unsigned short int u16;
+#define CRCTYP 0x20
+static u16 crctab[256];
struct iface
{
char *name; /* Interface name (/dev/???) */
int fd; /* File descriptor */
int escaped; /* FESC received? */
- unsigned char crc; /* Incoming frame crc */
+ u16 crc; /* Incoming frame crc */
unsigned char obuf[SIZE]; /* TX buffer */
unsigned char *optr; /* Next byte to transmit */
unsigned int errors; /* KISS protocol error count */
@@ -94,6 +108,28 @@ struct iface
unsigned long txbytes; /* TX bytes count */
};
+static void init_crc(void)
+{
+ short int i, j;
+ u16 accum, data;
+
+ for (i = 0; i < 256; i++) { /* fill table with CRC of values... */
+ accum = 0xffff;
+ data = i;
+ for (j = 0; j < 8; ++j) {
+ if ((data^accum) & 0x0001)
+ /* if msb of data^accum is TRUE */
+ /* then shift and subtract poly */
+ accum = (accum >> 1) ^ 0x8408;
+ else
+ /* otherwise: transparent shift */
+ accum >>= 1;
+ data >>= 1; /* move up next bit for XOR */
+ }
+ crctab[i] = accum;
+ }
+}
+
static int poll(int fd, int ports)
{
char buffer[3];
@@ -111,60 +147,88 @@ static int poll(int fd, int ports)
return 0;
}
+static int put_ubyte(unsigned char* s, u16* crc, unsigned char c, int usecrc)
+{
+ int len = 1;
+
+ if (c == FEND) {
+ *s++ = FESC;
+ *s++ = TFEND;
+ len++;
+ } else {
+ *s++ = c;
+ if (c == FESC) {
+ *s++ = TFESC;
+ len++;
+ }
+ }
+
+ switch (usecrc) {
+ case G8BPQ_CRC:
+ *crc ^= c; /* Adjust checksum */
+ break;
+ case FLEX_CRC:
+ *crc = (*crc<<8)^crctab[(*crc>>8)^((u16)((c)&255))];
+ break;
+ }
+
+ return len;
+}
+
static int kiss_tx(int fd, int port, unsigned char *s, int len, int usecrc)
{
unsigned char *ptr = obuf;
- unsigned char c;
- unsigned char crc = 0;
- int first = TRUE;
+ unsigned char c, cmd;
+ u16 crc = 0;
+ int i;
+
+ cmd = s[0] & 0x0F;
/* Non-data frames don't get a checksum byte */
- if ((s[0] & 0x0F) != 0)
+ if (usecrc == G8BPQ_CRC && cmd != 0 && cmd != ACKREQ)
usecrc = FALSE;
- /* Allow for checksum byte */
- if (usecrc)
- len++;
-
/*
* Send an initial FEND character to flush out any
* data that may have accumulated in the receiver
* due to line noise.
*/
-
*ptr++ = FEND;
+ if (usecrc == FLEX_CRC) {
+ crc = 0xffff;
+ ptr += put_ubyte(ptr, &crc, CRCTYP, usecrc);
+ c = *s++;
+ } else {
+ c = *s++;
+ c = (c & 0x0F) | (port << 4);
+ ptr += put_ubyte(ptr, &crc, c, usecrc);
+ }
+
/*
* For each byte in the packet, send the appropriate
* character sequence, according to the SLIP protocol.
*/
+ for(i = 0; i < len - 1; i++)
+ ptr += put_ubyte(ptr, &crc, s[i], usecrc);
- while (len-- > 0) {
- c = *s++;
- if (first) { /* Control byte */
- c = (c & 0x0F) | (port << 4);
- first = FALSE;
- }
- if (usecrc) {
- if (len == 0) /* Now past user data... */
- c = crc; /* ...time to encode cksum */
- else
- crc ^= c; /* Adjust checksum */
- }
- switch (c) {
- case FEND:
- *ptr++ = FESC;
- *ptr++ = TFEND;
- break;
- case FESC:
- *ptr++ = FESC;
- *ptr++ = TFESC;
- break;
- default:
- *ptr++ = c;
- break;
+ /*
+ * Now the checksum...
+ */
+ switch (usecrc) {
+ case G8BPQ_CRC:
+ c = crc & 0xFF;
+ ptr += put_ubyte(ptr, &crc, c, usecrc);
+ break;
+ case FLEX_CRC:
+ {
+ u16 u = crc;
+ ptr += put_ubyte(ptr, &crc, u / 256, usecrc);
+ ptr += put_ubyte(ptr, &crc, u & 255, usecrc);
}
+ break;
}
+
*ptr++ = FEND;
return write(fd, obuf, ptr - obuf);
}
@@ -176,37 +240,62 @@ static int kiss_rx(struct iface *ifp, unsigned char c, int usecrc)
switch (c) {
case FEND:
len = ifp->optr - ifp->obuf;
+
if (len != 0 && ifp->escaped) { /* protocol error... */
len = 0; /* ...drop frame */
ifp->errors++;
}
- if (len != 0 && (ifp->obuf[0] & 0x0F) != 0) {
- /*
- * Non-data frames don't have checksum.
- */
- usecrc = 0;
- if ((ifp->obuf[0] & 0x0F) == POLL) {
- len = 0; /* drop returned polls */
- return_polls++;
- } else
- ifp->nondata++;
- }
- if (len != 0 && usecrc) {
- if (ifp->crc != 0) { /* checksum failed... */
- len = 0; /* ...drop frame */
- crc_errors++;
- } else
- len--; /* delete checksum byte */
+
+ if (len != 0) {
+ switch (usecrc) {
+ case G8BPQ_CRC:
+ if ((ifp->obuf[0] & 0x0F) != 0) {
+ /*
+ * Non-data frames don't have checksum.
+ */
+ usecrc = 0;
+ if ((ifp->obuf[0] & 0x0F) == POLL) {
+ /* drop returned polls */
+ len = 0;
+ return_polls++;
+ } else
+ ifp->nondata++;
+ } else {
+ if ((ifp->crc & 0xFF) != 0) {
+ /* checksum failed... */
+ /* ...drop frame */
+ len = 0;
+ crc_errors++;
+ } else
+ /* delete checksum byte */
+ len--;
+ }
+ break;
+ case FLEX_CRC:
+ if (len > 14 && ifp->crc == 0x7070) {
+ len -= 2;
+ *ifp->obuf = 0;
+ } else {
+ len = 0;
+ crc_errors++;
+ }
+ break;
+ }
}
+
if (len != 0) {
ifp->rxpackets++;
ifp->rxbytes += len;
}
+
/*
* Clean up.
*/
ifp->optr = ifp->obuf;
- ifp->crc = 0;
+ if (usecrc == FLEX_CRC)
+ ifp->crc = 0xffff;
+ else
+ ifp->crc = 0;
ifp->escaped = FALSE;
return len;
case FESC:
@@ -231,9 +320,20 @@ static int kiss_rx(struct iface *ifp, unsigned char c, int usecrc)
}
break;
}
+
*ifp->optr++ = c;
- if (usecrc)
+
+ switch (usecrc) {
+ case G8BPQ_CRC:
ifp->crc ^= c;
+ break;
+ case FLEX_CRC:
+ ifp->crc = (ifp->crc << 8) ^ crctab[(ifp->crc >> 8) ^ c];
+ break;
+ default:
+ break;
+ }
+
return 0;
}
@@ -264,9 +364,14 @@ static void report(struct iface *tty, struct iface **pty, int numptys)
syslog(LOG_INFO, "Hardware handshaking %sabled.",
hwflag ? "en" : "dis");
syslog(LOG_INFO, "G8BPQ checksumming %sabled.",
- crcflag ? "en" : "dis");
+ crcflag == G8BPQ_CRC ? "en" : "dis");
+ syslog(LOG_INFO, "FLEX checksumming %sabled.",
+ crcflag == FLEX_CRC ? "en" : "dis");
+
syslog(LOG_INFO, "polling %sabled.",
- pollflag ? "en" : "dis");
+ pollspeed ? "en" : "dis");
+ if (pollspeed)
+ syslog(LOG_INFO, "Poll interval %d00ms", pollspeed);
syslog(LOG_INFO, "ttyinterface is %s (fd=%d)", tty->name, tty->fd);
for (i = 0; i < numptys; i++)
syslog(LOG_INFO, "pty%d is %s (fd=%d)", i, pty[i]->name,
@@ -297,14 +402,17 @@ int main(int argc, char *argv[])
unsigned char *icp;
int topfd;
fd_set readfd;
- struct timeval timeout;
+ struct timeval timeout, pollinterval;
int retval, numptys, i, size, len;
int speed = -1;
- while ((size = getopt(argc, argv, "chlps:v")) != -1) {
+ while ((size = getopt(argc, argv, "cfhlp:s:v")) != -1) {
switch (size) {
case 'c':
- crcflag = TRUE;
+ crcflag = G8BPQ_CRC;
+ break;
+ case 'f':
+ crcflag = FLEX_CRC;
break;
case 'h':
hwflag = TRUE;
@@ -313,7 +421,9 @@ int main(int argc, char *argv[])
logging = TRUE;
break;
case 'p':
- pollflag = TRUE;
+ pollspeed = atoi(optarg);
+ pollinterval.tv_sec = pollspeed / 10;
+ pollinterval.tv_usec = (pollspeed % 10) * 100000L;
break;
case 's':
speed = atoi(optarg);
@@ -368,9 +478,13 @@ int main(int argc, char *argv[])
tty->name = argv[optind];
tty_raw(tty->fd, hwflag);
- if (speed != -1) tty_speed(tty->fd, speed);
+ if (speed != -1 && !tty_speed(tty->fd, speed)) {
+ close(tty->fd);
+ return 1;
+ }
tty->optr = tty->obuf;
topfd = tty->fd;
+
/*
* Make it block again...
*/
@@ -414,7 +528,7 @@ int main(int argc, char *argv[])
openlog("mkiss", LOG_PID, LOG_DAEMON);
syslog(LOG_INFO, "starting");
}
-
+ init_crc();
/*
* Loop until an error occurs on a read.
*/
@@ -424,13 +538,11 @@ int main(int argc, char *argv[])
for (i = 0; i < numptys; i++)
FD_SET(pty[i]->fd, &readfd);
- if (pollflag) {
- timeout.tv_sec = 1;
- timeout.tv_usec = 0;
- }
+ if (pollspeed)
+ timeout = pollinterval;
errno = 0;
- retval = select(topfd + 1, &readfd, NULL, NULL, pollflag ? &timeout : NULL);
+ retval = select(topfd + 1, &readfd, NULL, NULL, pollspeed ? &timeout : NULL);
if (retval == -1) {
if (dump_report) {
@@ -445,9 +557,9 @@ int main(int argc, char *argv[])
}
/*
- * Timer expired.
+ * Timer expired - let's poll...
*/
- if (retval == 0 && pollflag) {
+ if (retval == 0 && pollspeed) {
poll(tty->fd, numptys);
continue;
}
@@ -469,7 +581,7 @@ int main(int argc, char *argv[])
pty[i]->txbytes += len;
} else
invalid_ports++;
- if (pollflag)
+ if (pollspeed)
poll(tty->fd, numptys);
}
}
@@ -496,7 +608,7 @@ int main(int argc, char *argv[])
}
}
- end:
+end:
if (logging)
closelog();
diff --git a/kiss/spattach.8 b/kiss/spattach.8
new file mode 100644
index 0000000..2a2db22
--- /dev/null
+++ b/kiss/spattach.8
@@ -0,0 +1 @@
+.so man8/kissattach.8
diff --git a/netrom/Makefile.am b/netrom/Makefile.am
index c5845b8..0678996 100644
--- a/netrom/Makefile.am
+++ b/netrom/Makefile.am
@@ -1,12 +1,11 @@
-etcfiles = nrbroadcast nrports
-etcdir = $(sysconfdir)/ax25
+etcfiles = nrbroadcast
installconf:
- $(mkinstalldirs) $(DESTDIR)$(etcdir)
+ $(mkinstalldirs) $(DESTDIR)$(AX25_SYSCONFDIR)
@list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p; \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p; \
done
@@ -14,7 +13,7 @@ sbin_PROGRAMS = netromd nodesave nrattach nrparms nrsdrv
LDADD = $(AX25_LIB)
-man_MANS = netrom.4 nrports.5 nrbroadcast.5 netromd.8 nodesave.8 \
+man_MANS = netrom.4 nrbroadcast.5 netromd.8 nodesave.8 \
nrattach.8 nrparms.8 nrsdrv.8
EXTRA_DIST = $(man_MANS) $(etcfiles)
@@ -26,3 +25,9 @@ netromd_SOURCES = \
netromt.c
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" \
+ -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
+AX25_SYSCONFDIR=${sysconfdir}/ax25/
+AX25_LOCALSTATEDIR=${localstatedir}/ax25/
+
diff --git a/netrom/Makefile.in b/netrom/Makefile.in
index 810c407..e909d4e 100644
--- a/netrom/Makefile.in
+++ b/netrom/Makefile.in
@@ -68,20 +68,25 @@ UTIL_LIB = @UTIL_LIB@
VERSION = @VERSION@
Z_LIB = @Z_LIB@
-etcfiles = nrbroadcast nrports
-etcdir = $(sysconfdir)/ax25
+etcfiles = nrbroadcast
sbin_PROGRAMS = netromd nodesave nrattach nrparms nrsdrv
LDADD = $(AX25_LIB)
-man_MANS = netrom.4 nrports.5 nrbroadcast.5 netromd.8 nodesave.8 nrattach.8 nrparms.8 nrsdrv.8
+man_MANS = netrom.4 nrbroadcast.5 netromd.8 nodesave.8 nrattach.8 nrparms.8 nrsdrv.8
EXTRA_DIST = $(man_MANS) $(etcfiles)
netromd_SOURCES = netromd.c netromd.h netromr.c netromt.c
+
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
+
+AX25_SYSCONFDIR = ${sysconfdir}/ax25/
+AX25_LOCALSTATEDIR = ${localstatedir}/ax25/
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../config.h
CONFIG_CLEAN_FILES =
@@ -364,13 +369,6 @@ distdir: $(DISTFILES)
|| cp -p $$d/$$file $(distdir)/$$file || :; \
fi; \
done
-netromd.o: netromd.c ../config.h ../pathnames.h netromd.h
-netromr.o: netromr.c ../config.h ../pathnames.h netromd.h
-netromt.o: netromt.c ../config.h ../pathnames.h netromd.h
-nodesave.o: nodesave.c ../config.h
-nrattach.o: nrattach.c ../config.h ../pathnames.h
-nrparms.o: nrparms.c ../config.h
-nrsdrv.o: nrsdrv.c ../config.h ../pathnames.h
info-am:
info: info-am
@@ -447,10 +445,10 @@ mostlyclean distclean maintainer-clean
installconf:
- $(mkinstalldirs) $(DESTDIR)$(etcdir)
+ $(mkinstalldirs) $(DESTDIR)$(AX25_SYSCONFDIR)
@list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p; \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p; \
done
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/netrom/netromd.c b/netrom/netromd.c
index 5fab52d..15fc0e4 100644
--- a/netrom/netromd.c
+++ b/netrom/netromd.c
@@ -44,8 +44,8 @@ struct port_struct port_list[20];
int port_count = FALSE;
int compliant = FALSE;
-int debug = FALSE;
int logging = FALSE;
+int debug = 0;
ax25_address my_call;
ax25_address node_call;
@@ -147,7 +147,7 @@ int main(int argc, char **argv)
compliant = TRUE;
break;
case 'd':
- debug = TRUE;
+ debug++;
break;
case 'i':
timelast = 0;
diff --git a/netrom/netromr.c b/netrom/netromr.c
index 90e775a..3ba7c33 100644
--- a/netrom/netromr.c
+++ b/netrom/netromr.c
@@ -1,7 +1,8 @@
#include <stdio.h>
#include <stdlib.h>
-#include <string.h>
#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
#include <syslog.h>
#include <config.h>
@@ -37,6 +38,28 @@
extern int compliant;
+static int validcallsign(ax25_address *a)
+{
+ char c;
+ int n, end = 0;
+
+ for (n = 0; n < 6; n++) {
+ c = (a->ax25_call[n] >> 1) & 0x7F;
+
+ if (!end && (isupper(c) || isdigit(c)))
+ continue;
+
+ if (c == ' ') {
+ end = 1;
+ continue;
+ }
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static int validmnemonic(char *mnemonic)
{
if (compliant) {
@@ -50,6 +73,73 @@ static int validmnemonic(char *mnemonic)
return FALSE;
}
+static int add_node(int s, unsigned char *buffer, struct nr_route_struct *nr_node, int quality, int index)
+{
+ ax25_address best_neighbour;
+ int best_quality;
+ char *p;
+
+ memcpy(&nr_node->callsign, buffer + 0, CALLSIGN_LEN);
+ memcpy(nr_node->mnemonic, buffer + 7, MNEMONIC_LEN);
+ memcpy(&best_neighbour, buffer + 13, CALLSIGN_LEN);
+
+ best_quality = buffer[20];
+
+ nr_node->mnemonic[MNEMONIC_LEN] = '\0';
+ if ((p = strchr(nr_node->mnemonic, ' ')) != NULL)
+ *p = '\0';
+
+ if (!validcallsign(&nr_node->callsign)) {
+ if (debug && logging)
+ syslog(LOG_DEBUG, "netromr: add_node: invalid node callsign - %s", ax25_ntoa(&nr_node->callsign));
+ return -1;
+ }
+
+ if (!validmnemonic(nr_node->mnemonic)) {
+ if (debug && logging)
+ syslog(LOG_DEBUG, "netromr: add_node: invalid mnemonic - %s", nr_node->mnemonic);
+ return -1;
+ }
+
+ if (!validcallsign(&best_neighbour)) {
+ if (debug && logging)
+ syslog(LOG_DEBUG, "netromr: add_node: invalid best neighbour callsign - %s", &best_neighbour);
+ return -1;
+ }
+
+ if (ax25_cmp(&my_call, &best_neighbour) == 0) {
+ if (debug && logging)
+ syslog(LOG_DEBUG, "netromr: add_node: route to me");
+ return FALSE;
+ }
+
+ if (best_quality < port_list[index].worst_qual) {
+ if (debug && logging)
+ syslog(LOG_DEBUG, "netromr: add_node: quality less than worst_qual");
+ return FALSE;
+ }
+
+ nr_node->quality = ((quality * best_quality) + 128) / 256;
+
+ /* log this only when logging verbosely */
+ if (debug > 1 && logging) {
+ syslog(LOG_DEBUG, "Node update: %s:%s",
+ ax25_ntoa(&nr_node->callsign), nr_node->mnemonic);
+ syslog(LOG_DEBUG, "Neighbour: %s device: %s",
+ ax25_ntoa(&nr_node->neighbour), nr_node->device);
+ syslog(LOG_DEBUG, "Quality: %d obs: %d ndigis: %d",
+ nr_node->quality, nr_node->obs_count, nr_node->ndigis);
+ }
+
+ if (ioctl(s, SIOCADDRT, nr_node) == -1) {
+ if (logging)
+ syslog(LOG_ERR, "netromr: SIOCADDRT: %m");
+ return -1;
+ }
+
+ return TRUE;
+}
+
void receive_nodes(unsigned char *buffer, int length, ax25_address *neighbour, int index)
{
struct nr_route_struct nr_node;
@@ -59,8 +149,14 @@ void receive_nodes(unsigned char *buffer, int length, ax25_address *neighbour, i
int quality, obs_count, qual, lock;
char *addr, *callsign, *device;
+ if (!validcallsign(neighbour)) {
+ if (debug && logging)
+ syslog(LOG_DEBUG, "rejecting frame, invalid neighbour callsign - %s\n", ax25_ntoa(neighbour));
+ return;
+ }
+
nr_node.type = NETROM_NODE;
- /*nr_node.ndigis = 0;*/
+ nr_node.ndigis = 0;
sprintf(neigh_buffer, "%s/obsolescence_count_initialiser", PROC_NR_SYSCTL_DIR);
@@ -140,35 +236,13 @@ void receive_nodes(unsigned char *buffer, int length, ax25_address *neighbour, i
length -= MNEMONIC_LEN;
while (length >= ROUTE_LEN) {
- /*
- * Ensure that a) the route is not via me, and
- * b) it is better than my minimum acceptable quality
- */
- if (ax25_cmp(&my_call, (ax25_address *)(buffer + 13)) != 0 &&
- buffer[20] > port_list[index].worst_qual) {
- memcpy(&nr_node.callsign, buffer + 0, CALLSIGN_LEN);
- memcpy(nr_node.mnemonic, buffer + 7, MNEMONIC_LEN);
- nr_node.mnemonic[MNEMONIC_LEN] = '\0';
-
- if ((p = strchr(nr_node.mnemonic, ' ')) != NULL)
- *p = '\0';
-
- if (!validmnemonic(nr_node.mnemonic)) {
- if (debug && logging)
- syslog(LOG_DEBUG, "rejecting route, invalid mnemonic - %s\n", nr_node.mnemonic);
- } else {
- nr_node.neighbour = *neighbour;
- strcpy(nr_node.device, port_list[index].device);
- nr_node.quality = ((quality * buffer[20]) + 128) / 256;
- nr_node.obs_count = obs_count;
-
- if (ioctl(s, SIOCADDRT, &nr_node) == -1) {
- if (logging)
- syslog(LOG_ERR, "netromr: SIOCADDRT: %m");
- close(s);
- return;
- }
- }
+ nr_node.neighbour = *neighbour;
+ strcpy(nr_node.device, port_list[index].device);
+ nr_node.obs_count = obs_count;
+
+ if (add_node(s, buffer, &nr_node, quality, index) == -1) {
+ close(s);
+ return;
}
buffer += ROUTE_LEN;
diff --git a/netrom/nodesave.8 b/netrom/nodesave.8
index 626778b..a1339ac 100644
--- a/netrom/nodesave.8
+++ b/netrom/nodesave.8
@@ -1,8 +1,8 @@
-.TH NODESAVE 8 "21 May 1996" Linux "Linux System Managers Manual"
+.TH NODESAVE 8 "4 July 1999" Linux "Linux System Managers Manual"
.SH NAME
nodesave \- Saves NET/ROM routing information
.SH SYNOPSIS
-.B nodesave [filename]
+.B nodesave [-p path] [-v] [filename]
.SH DESCRIPTION
.LP
.B Nodesave
@@ -16,6 +16,14 @@ Typically
.B nodesave
would be used when taking a system off-air so that the NET/ROM routing may
be quickly restored when the system is brought back on-line.
+.SH OPTIONS
+.TP 10
+.BI "\-p path"
+Set the path to the nrparms binary. This only affects the output of the
+program. Default is /usr/sbin.
+.TP 10
+.BI "\-v"
+Display the version.
.SH FILES
.nf
/proc/net/nr_neigh
diff --git a/netrom/nodesave.c b/netrom/nodesave.c
index a677422..7737fff 100644
--- a/netrom/nodesave.c
+++ b/netrom/nodesave.c
@@ -1,6 +1,8 @@
#include <stdlib.h>
#include <stdio.h>
+#include <unistd.h>
#include <errno.h>
+#include <string.h>
#include <config.h>
@@ -15,23 +17,55 @@
#endif
#include <netax25/axconfig.h>
+#include <netax25/nrconfig.h>
#include <netax25/procutils.h>
+static char *Nrparms = "/usr/sbin/nrparms";
+static char *Usage = "Usage: nodesave [-p <path>] [-v] [<file>]\n";
+
int main(int argc, char **argv)
{
FILE *fp = stdout;
struct proc_nr_nodes *nodes, *nop;
struct proc_nr_neigh *neighs, *nep;
+ char buf[256];
+ int s;
if (ax25_config_load_ports() == 0) {
fprintf(stderr, "nodesave: no AX.25 port data configured\n");
return 1;
}
- if (argc > 1) {
- if ((fp = fopen(argv[1], "w")) == NULL) {
- fprintf(stderr, "nodesave: cannot open file %s\n", argv[1]);
+ if (nr_config_load_ports() == 0) {
+ fprintf(stderr, "nodesave: no NET/ROM port data configured\n");
+ return 1;
+ }
+
+ while ((s = getopt(argc, argv, "p:v")) != -1) {
+ switch (s) {
+ case 'p':
+ sprintf(buf, "%s/nrparms", optarg);
+ Nrparms = strdup(buf);
+ break;
+ case 'v':
+ printf("nodesave: %s\n", VERSION);
+ return 0;
+ case ':':
+ case '?':
+ fputs(Usage, stderr);
+ return 1;
+ }
+ }
+
+ if ((argc - optind) > 1) {
+ fputs(Usage, stderr);
+ return 1;
+ }
+
+ if ((argc - optind) == 1) {
+ if ((fp = fopen(argv[optind], "w")) == NULL) {
+ fprintf(stderr, "nodesave: cannot open file %s\n", argv[optind]);
return 1;
}
}
@@ -53,8 +87,10 @@ int main(int argc, char **argv)
for (nep = neighs; nep != NULL; nep = nep->next) {
if (nep->lock) {
- fprintf(fp, "nrparms -routes \"%s\" %s + %d\n",
- ax25_config_get_name(nep->dev),
+ fprintf(fp, "%s -routes ", Nrparms);
+ sprintf(buf, "\"%s\"", ax25_config_get_name(nep->dev));
+ fprintf(fp, "%-8s %-9s + %d\n",
+ buf,
nep->call,
nep->qual);
}
@@ -63,33 +99,51 @@ int main(int argc, char **argv)
fprintf(fp, "#\n# Nodes:\n#\n");
for (nop = nodes; nop != NULL; nop = nop->next) {
- if ((nep = find_neigh(nop->addr1, neighs)) != NULL) {
- fprintf(fp, "nrparms -nodes %s + \"%s\" %d %d \"%s\" %s\n",
- nop->call,
- nop->alias,
+ /*
+ * nop->n == 0 indicates a local node with no routes.
+ */
+ if (nop->n > 0 && (nep = find_neigh(nop->addr1, neighs)) != NULL) {
+ fprintf(fp, "%s -nodes %-9s + ",
+ Nrparms,
+ nop->call);
+ sprintf(buf, "\"%s\"", nop->alias);
+ fprintf(fp, "%-8s %-3d %d ",
+ buf,
nop->qual1,
- nop->obs1,
- ax25_config_get_name(nep->dev),
+ nop->obs1);
+ sprintf(buf, "\"%s\"", ax25_config_get_name(nep->dev));
+ fprintf(fp, "%-8s %s\n",
+ buf,
nep->call);
}
if (nop->n > 1 && (nep = find_neigh(nop->addr2, neighs)) != NULL) {
- fprintf(fp, "nrparms -nodes %s + \"%s\" %d %d \"%s\" %s\n",
- nop->call,
- nop->alias,
+ fprintf(fp, "%s -nodes %-9s + ",
+ Nrparms,
+ nop->call);
+ sprintf(buf, "\"%s\"", nop->alias);
+ fprintf(fp, "%-8s %-3d %d ",
+ buf,
nop->qual2,
- nop->obs2,
- ax25_config_get_name(nep->dev),
+ nop->obs2);
+ sprintf(buf, "\"%s\"", ax25_config_get_name(nep->dev));
+ fprintf(fp, "%-8s %s\n",
+ buf,
nep->call);
}
if (nop->n > 2 && (nep = find_neigh(nop->addr3, neighs)) != NULL) {
- fprintf(fp, "nrparms -nodes %s + \"%s\" %d %d \"%s\" %s\n",
- nop->call,
- nop->alias,
+ fprintf(fp, "%s -nodes %-9s + ",
+ Nrparms,
+ nop->call);
+ sprintf(buf, "\"%s\"", nop->alias);
+ fprintf(fp, "%-8s %-3d %d ",
+ buf,
nop->qual3,
- nop->obs3,
- ax25_config_get_name(nep->dev),
+ nop->obs3);
+ sprintf(buf, "\"%s\"", ax25_config_get_name(nep->dev));
+ fprintf(fp, "%-8s %s\n",
+ buf,
nep->call);
}
}
@@ -99,8 +153,11 @@ int main(int argc, char **argv)
fclose(fp);
- if (argc > 1) {
- chmod(argv[1], S_IEXEC);
+ if ((argc - optind) == 1) {
+ if (chmod(argv[optind], 0755) == -1) {
+ perror("nodesave: chmod");
+ return 1;
+ }
}
return 0;
diff --git a/netrom/nrattach.c b/netrom/nrattach.c
index ecbbd56..c3a9e63 100644
--- a/netrom/nrattach.c
+++ b/netrom/nrattach.c
@@ -33,6 +33,7 @@
#include <netax25/kernel_rose.h>
#endif
+#include <netax25/axlib.h>
#include <netax25/nrconfig.h>
#include "../pathnames.h"
diff --git a/netrom/nrparms.c b/netrom/nrparms.c
index bc5803b..48895b9 100644
--- a/netrom/nrparms.c
+++ b/netrom/nrparms.c
@@ -37,7 +37,6 @@ void nodes(int s, char *nodecall, char *op, char *ident, int quality, int count,
{
struct nr_route_struct nr_node;
char *p, *q, *dev;
- int i;
if (ax25_config_load_ports() == 0) {
fprintf(stderr, "nrparms: nodes: no AX.25 ports configured\n");
@@ -144,7 +143,7 @@ void routes(int s, char *port, char *nodecall, char *rest[])
}
nr_neigh.type = NETROM_NEIGH;
- /*nr_neigh.ndigis = 0;
+ nr_neigh.ndigis = 0;
for (i = 0; i < AX25_MAX_DIGIS && rest[i][0] != '-' && rest[i][0] != '+'; i++) {
if (ax25_aton_entry(rest[i], nr_neigh.digipeaters[i].ax25_call) != 0) {
@@ -154,7 +153,6 @@ void routes(int s, char *port, char *nodecall, char *rest[])
}
nr_neigh.ndigis++;
}
- */
op = rest[i + 0];
quality = atoi(rest[i + 1]);
diff --git a/netrom/nrports b/netrom/nrports
deleted file mode 100644
index 4faa359..0000000
--- a/netrom/nrports
+++ /dev/null
@@ -1,7 +0,0 @@
-# /etc/ax25/nrports
-#
-# The format of this file is:
-#
-# name callsign alias paclen description
-#
-netrom OH2BNS-10 #LNODE 235 Switch Port
diff --git a/netrom/nrports.5 b/netrom/nrports.5
deleted file mode 100644
index 3449113..0000000
--- a/netrom/nrports.5
+++ /dev/null
@@ -1,56 +0,0 @@
-.TH NRPORTS 5 "2 August 1996" Linux "Linux Programmer's Manual"
-.SH NAME
-nrports \- NET/ROM port configuration file.
-.SH DESCRIPTION
-.LP
-.B Nrports
-is an ASCII file that contains information about each of the NET/ROM
-ports that are to be used. When dealing with an NET/ROM utility such as
-.B call,
-it takes an optional argument that is the port name. This port name is a
-reference to the line within
-.B nrports,
-which has the same name. The information on each line contains
-enough information to bind the command to a particular NET/ROM
-interface, this binding is done by matching the callsign on the line in
-.B nrports
-with the callsign of the port set by
-.B ifconfig.
-.LP
-The
-.B nrports
-file may contain comments that begin with a # in the first column, or a port
-description in the following format, each field being delimited by white space:
-.sp
-.RS
-name callsign alias paclen description
-.RE
-.sp
-The field descriptions are:
-.sp
-.RS
-.TP 14
-.B name
-this is the unique NET/ROM port identifier.
-.TP 14
-.B callsign
-the callsign of the NET/ROM interface to bind to.
-.TP 14
-.B alias
-this is the alias of the NET/ROM port.
-.TP 14
-.B paclen
-is the default packet size for this interface.
-.TP 14
-.B description
-a free format description of this interface, this field extends to the end
-of the line. It may contain spaces.
-.RE
-.SH FILES
-.LP
-/etc/ax25/nrports
-.SH "SEE ALSO"
-.BR call (1),
-.BR netrom (4),
-.BR ifconfig (8),
-.BR nrparms (8).
diff --git a/pathnames.h b/pathnames.h
index 62b8227..f5e871c 100644
--- a/pathnames.h
+++ b/pathnames.h
@@ -1,16 +1,16 @@
-#define CONF_AX25D_FILE "/etc/ax25/ax25d.conf"
-#define CONF_AXPORTS_FILE "/etc/ax25/axports"
-#define CONF_AXSPAWN_FILE "/etc/ax25/axspawn.conf"
-#define CONF_AXSPAWN_PROF_FILE "/etc/ax25/ax25.profile"
-#define CONF_NETROMD_FILE "/etc/ax25/nrbroadcast"
-#define CONF_NRPORTS_FILE "/etc/ax25/nrports"
-#define CONF_RIP98D_FILE "/etc/ax25/rip98d.conf"
-#define CONF_RSPORTS_FILE "/etc/ax25/rsports"
-#define CONF_RXECHO_FILE "/etc/ax25/rxecho.conf"
-#define CONF_TTYLINKD_FILE "/etc/ax25/ttylinkd.conf"
+#define CONF_AX25D_FILE AX25_SYSCONFDIR"ax25d.conf"
+#define CONF_AXPORTS_FILE AX25_SYSCONFDIR"axports"
+#define CONF_AXSPAWN_FILE AX25_SYSCONFDIR"axspawn.conf"
+#define CONF_AXSPAWN_PROF_FILE AX25_SYSCONFDIR"ax25.profile"
+#define CONF_NETROMD_FILE AX25_SYSCONFDIR"nrbroadcast"
+#define CONF_NRPORTS_FILE AX25_SYSCONFDIR"nrports"
+#define CONF_RIP98D_FILE AX25_SYSCONFDIR"rip98d.conf"
+#define CONF_RSPORTS_FILE AX25_SYSCONFDIR"rsports"
+#define CONF_RXECHO_FILE AX25_SYSCONFDIR"rxecho.conf"
+#define CONF_TTYLINKD_FILE AX25_SYSCONFDIR"ttylinkd.conf"
-#define DATA_MHEARD_FILE "/var/ax25/mheard/mheard.dat"
+#define DATA_MHEARD_FILE AX25_LOCALSTATEDIR"mheard/mheard.dat"
#define LOCK_AXSPAWN_FILE "/var/lock/axspawn"
#define LOCK_SERIAL_DIR "/var/lock"
diff --git a/rose/Makefile.am b/rose/Makefile.am
index c806d95..5596113 100644
--- a/rose/Makefile.am
+++ b/rose/Makefile.am
@@ -1,14 +1,4 @@
-etcfiles = rsports
-etcdir = $(sysconfdir)/ax25
-
-installconf:
- $(mkinstalldirs) $(DESTDIR)$(etcdir)
- @list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p; \
- done
-
sbin_PROGRAMS = rsattach rsdwnlnk rsmemsiz rsparms rsuplnk
LDADD = $(AX25_LIB)
@@ -18,6 +8,12 @@ rsmemsiz_LDADD =
sbin_SCRIPTS = rsusers.sh
-man_MANS = rose.4 rsports.5 rsattach.8 rsparms.8 rsdwnlnk.8 rsuplnk.8
+man_MANS = rose.4 rsattach.8 rsparms.8 rsdwnlnk.8 rsuplnk.8
+
+EXTRA_DIST = $(man_MANS) $(sbin_SCRIPTS)
+
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" \
+ -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
-EXTRA_DIST = $(man_MANS) $(etcfiles) $(sbin_SCRIPTS)
+AX25_SYSCONFDIR=${sysconfdir}/ax25/
+AX25_LOCALSTATEDIR=${localstatedir}/ax25/
diff --git a/rose/Makefile.in b/rose/Makefile.in
index 8849f25..bd3874b 100644
--- a/rose/Makefile.in
+++ b/rose/Makefile.in
@@ -68,9 +68,6 @@ UTIL_LIB = @UTIL_LIB@
VERSION = @VERSION@
Z_LIB = @Z_LIB@
-etcfiles = rsports
-etcdir = $(sysconfdir)/ax25
-
sbin_PROGRAMS = rsattach rsdwnlnk rsmemsiz rsparms rsuplnk
LDADD = $(AX25_LIB)
@@ -79,9 +76,15 @@ rsmemsiz_LDADD =
sbin_SCRIPTS = rsusers.sh
-man_MANS = rose.4 rsports.5 rsattach.8 rsparms.8 rsdwnlnk.8 rsuplnk.8
+man_MANS = rose.4 rsattach.8 rsparms.8 rsdwnlnk.8 rsuplnk.8
+
+EXTRA_DIST = $(man_MANS) $(sbin_SCRIPTS)
+
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
-EXTRA_DIST = $(man_MANS) $(etcfiles) $(sbin_SCRIPTS)
+AX25_SYSCONFDIR = ${sysconfdir}/ax25/
+AX25_LOCALSTATEDIR = ${localstatedir}/ax25/
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../config.h
CONFIG_CLEAN_FILES =
@@ -127,7 +130,6 @@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CF
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
man4dir = $(mandir)/man4
-man5dir = $(mandir)/man5
man8dir = $(mandir)/man8
MANS = $(man_MANS)
@@ -269,39 +271,6 @@ uninstall-man4:
rm -f $(DESTDIR)$(man4dir)/$$inst; \
done
-install-man5:
- $(mkinstalldirs) $(DESTDIR)$(man5dir)
- @list='$(man5_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.5*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
- else file=$$i; fi; \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst"; \
- $(INSTALL_DATA) $$file $(DESTDIR)$(man5dir)/$$inst; \
- done
-
-uninstall-man5:
- @list='$(man5_MANS)'; \
- l2='$(man_MANS)'; for i in $$l2; do \
- case "$$i" in \
- *.5*) list="$$list $$i" ;; \
- esac; \
- done; \
- for i in $$list; do \
- ext=`echo $$i | sed -e 's/^.*\\.//'`; \
- inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
- inst=`echo $$inst | sed '$(transform)'`.$$ext; \
- echo " rm -f $(DESTDIR)$(man5dir)/$$inst"; \
- rm -f $(DESTDIR)$(man5dir)/$$inst; \
- done
-
install-man8:
$(mkinstalldirs) $(DESTDIR)$(man8dir)
@list='$(man8_MANS)'; \
@@ -336,10 +305,10 @@ uninstall-man8:
done
install-man: $(MANS)
@$(NORMAL_INSTALL)
- $(MAKE) $(AM_MAKEFLAGS) install-man4 install-man5 install-man8
+ $(MAKE) $(AM_MAKEFLAGS) install-man4 install-man8
uninstall-man:
@$(NORMAL_UNINSTALL)
- $(MAKE) $(AM_MAKEFLAGS) uninstall-man4 uninstall-man5 uninstall-man8
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-man4 uninstall-man8
tags: TAGS
@@ -385,11 +354,6 @@ distdir: $(DISTFILES)
|| cp -p $$d/$$file $(distdir)/$$file || :; \
fi; \
done
-rsattach.o: rsattach.c ../config.h ../pathnames.h
-rsdwnlnk.o: rsdwnlnk.c ../config.h
-rsmemsiz.o: rsmemsiz.c
-rsparms.o: rsparms.c ../config.h ../pathnames.h
-rsuplnk.o: rsuplnk.c ../config.h
info-am:
info: info-am
@@ -416,8 +380,7 @@ install-strip:
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
installdirs:
$(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(sbindir) \
- $(DESTDIR)$(mandir)/man4 $(DESTDIR)$(mandir)/man5 \
- $(DESTDIR)$(mandir)/man8
+ $(DESTDIR)$(mandir)/man4 $(DESTDIR)$(mandir)/man8
mostlyclean-generic:
@@ -456,23 +419,16 @@ maintainer-clean: maintainer-clean-am
clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \
install-sbinPROGRAMS mostlyclean-compile distclean-compile \
clean-compile maintainer-clean-compile uninstall-sbinSCRIPTS \
-install-sbinSCRIPTS install-man4 uninstall-man4 install-man5 \
-uninstall-man5 install-man8 uninstall-man8 install-man uninstall-man \
-tags mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
-distdir info-am info dvi-am dvi check check-am installcheck-am \
-installcheck install-exec-am install-exec install-data-am install-data \
-install-am install uninstall-am uninstall all-redirect all-am all \
-installdirs mostlyclean-generic distclean-generic clean-generic \
+install-sbinSCRIPTS install-man4 uninstall-man4 install-man8 \
+uninstall-man8 install-man uninstall-man tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
maintainer-clean-generic clean mostlyclean distclean maintainer-clean
-installconf:
- $(mkinstalldirs) $(DESTDIR)$(etcdir)
- @list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p; \
- done
-
# 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/rose/rsports b/rose/rsports
deleted file mode 100644
index 8be51a0..0000000
--- a/rose/rsports
+++ /dev/null
@@ -1,7 +0,0 @@
-# /etc/ax25/rsports
-#
-# The format of this file is:
-#
-# name address description
-#
-rose 2080192203 Rose port
diff --git a/rose/rsports.5 b/rose/rsports.5
deleted file mode 100644
index 44ce54e..0000000
--- a/rose/rsports.5
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH RSPORTS 5 "27 August 1996" Linux "Linux Programmer's Manual"
-.SH NAME
-rsports \- Rose port configuration file.
-.SH DESCRIPTION
-.LP
-.B Rsports
-is an ASCII file that contains information about each of the Rose
-ports that are to be used. When dealing with a Rose utility such as
-.B call,
-it takes an optional argument that is the port name. This port name is a
-reference to the line within
-.B rsports,
-which has the same name. The information on each line contains
-enough information to bind the command to a particular Rose
-interface, this binding is done by matching the address on the line in
-.B rsports
-with the address of the port set by
-.B ifconfig
-or
-.B rsattach.
-.LP
-The
-.B rsports
-file may contain comments that begin with a # in the first column, or a port
-description in the following format, each field being delimited by white space:
-.sp
-.RS
-name address description
-.RE
-.sp
-The field descriptions are:
-.sp
-.RS
-.TP 14
-.B name
-this is the unique Rose port identifier.
-.TP 14
-.B address
-the address of the Rose interface to bind to.
-.TP 14
-.B description
-a free format description of this interface, this field extends to the end
-of the line. It may contain spaces.
-.RE
-.SH FILES
-.LP
-/etc/ax25/rsports
-.SH "SEE ALSO"
-.BR call (1),
-.BR rose (4),
-.BR ifconfig (8),
-.BR rsparms (8).
diff --git a/tcpip/Makefile.am b/tcpip/Makefile.am
index 4fbc7e9..88e07fd 100644
--- a/tcpip/Makefile.am
+++ b/tcpip/Makefile.am
@@ -1,19 +1,21 @@
etcfiles = rip98.conf ttylinkd.conf
-etcdir = $(sysconfdir)/ax25
installconf:
- $(mkinstalldirs) $(DESTDIR)$(etcdir)
+ $(mkinstalldirs) $(DESTDIR)$(AX25_SYSCONFDIR)
@list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p; \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p; \
done
sbin_PROGRAMS = rip98d ttylinkd
man_MANS = rip98.conf.5 rip98d.8 ttylinkd.conf.5 ttylinkd.8
-EXTRA_DIST = $(man_MANS) $(etcfiles)
+docdir=${prefix}/doc/ax25-tools
+doc_DATA= ttylinkd.README ttylinkd.INSTALL
+
+EXTRA_DIST = $(man_MANS) $(etcfiles) $(doc_DATA)
rip98d_SOURCES = \
rip98d.c \
@@ -23,3 +25,9 @@ rip98d_SOURCES = \
rip98d_LDADD = $(AX25_LIB)
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" \
+ -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
+AX25_SYSCONFDIR=${sysconfdir}/ax25/
+AX25_LOCALSTATEDIR=${localstatedir}/ax25/
+
diff --git a/tcpip/Makefile.in b/tcpip/Makefile.in
index 84ce5b2..95bf91a 100644
--- a/tcpip/Makefile.in
+++ b/tcpip/Makefile.in
@@ -69,18 +69,26 @@ VERSION = @VERSION@
Z_LIB = @Z_LIB@
etcfiles = rip98.conf ttylinkd.conf
-etcdir = $(sysconfdir)/ax25
sbin_PROGRAMS = rip98d ttylinkd
man_MANS = rip98.conf.5 rip98d.8 ttylinkd.conf.5 ttylinkd.8
-EXTRA_DIST = $(man_MANS) $(etcfiles)
+docdir = ${prefix}/doc/ax25-tools
+doc_DATA = ttylinkd.README ttylinkd.INSTALL
+
+EXTRA_DIST = $(man_MANS) $(etcfiles) $(doc_DATA)
rip98d_SOURCES = rip98d.c rip98r.c rip98t.c rip98d.h
rip98d_LDADD = $(AX25_LIB)
+
+INCLUDES = -DAX25_SYSCONFDIR=\""$(AX25_SYSCONFDIR)"\" -DAX25_LOCALSTATEDIR=\""$(AX25_LOCALSTATEDIR)"\"
+
+
+AX25_SYSCONFDIR = ${sysconfdir}/ax25/
+AX25_LOCALSTATEDIR = ${localstatedir}/ax25/
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../config.h
CONFIG_CLEAN_FILES =
@@ -112,6 +120,8 @@ man8dir = $(mandir)/man8
MANS = $(man_MANS)
NROFF = nroff
+DATA = $(doc_DATA)
+
DIST_COMMON = Makefile.am Makefile.in
@@ -257,6 +267,25 @@ uninstall-man:
@$(NORMAL_UNINSTALL)
$(MAKE) $(AM_MAKEFLAGS) uninstall-man5 uninstall-man8
+install-docDATA: $(doc_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(docdir)
+ @list='$(doc_DATA)'; for p in $$list; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p; \
+ fi; fi; \
+ done
+
+uninstall-docDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(doc_DATA)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(docdir)/$$p; \
+ done
+
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP)
@@ -301,10 +330,6 @@ distdir: $(DISTFILES)
|| cp -p $$d/$$file $(distdir)/$$file || :; \
fi; \
done
-rip98d.o: rip98d.c ../config.h ../pathnames.h rip98d.h
-rip98r.o: rip98r.c rip98d.h
-rip98t.o: rip98t.c rip98d.h
-ttylinkd.o: ttylinkd.c ../config.h ../pathnames.h
info-am:
info: info-am
@@ -317,21 +342,21 @@ installcheck: installcheck-am
install-exec-am: install-sbinPROGRAMS
install-exec: install-exec-am
-install-data-am: install-man
+install-data-am: install-man install-docDATA
install-data: install-data-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
install: install-am
-uninstall-am: uninstall-sbinPROGRAMS uninstall-man
+uninstall-am: uninstall-sbinPROGRAMS uninstall-man uninstall-docDATA
uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) $(MANS)
+all-am: Makefile $(PROGRAMS) $(MANS) $(DATA)
all-redirect: all-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
installdirs:
$(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man5 \
- $(DESTDIR)$(mandir)/man8
+ $(DESTDIR)$(mandir)/man8 $(DESTDIR)$(docdir)
mostlyclean-generic:
@@ -370,20 +395,21 @@ maintainer-clean: maintainer-clean-am
clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \
install-sbinPROGRAMS mostlyclean-compile distclean-compile \
clean-compile maintainer-clean-compile install-man5 uninstall-man5 \
-install-man8 uninstall-man8 install-man uninstall-man tags \
-mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
-distdir info-am info dvi-am dvi check check-am installcheck-am \
-installcheck install-exec-am install-exec install-data-am install-data \
-install-am install uninstall-am uninstall all-redirect all-am all \
-installdirs mostlyclean-generic distclean-generic clean-generic \
-maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+install-man8 uninstall-man8 install-man uninstall-man uninstall-docDATA \
+install-docDATA tags mostlyclean-tags distclean-tags clean-tags \
+maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
installconf:
- $(mkinstalldirs) $(DESTDIR)$(etcdir)
+ $(mkinstalldirs) $(DESTDIR)$(AX25_SYSCONFDIR)
@list='$(etcfiles)'; for p in $$list; do \
- echo " $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p"; \
- $(INSTALL_DATA) $$p $(DESTDIR)$(etcdir)/$$p; \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(AX25_SYSCONFDIR)/$$p; \
done
# Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/tcpip/ttylinkd.INSTALL b/tcpip/ttylinkd.INSTALL
new file mode 100644
index 0000000..70de9b3
--- /dev/null
+++ b/tcpip/ttylinkd.INSTALL
@@ -0,0 +1,36 @@
+To install ttylinkd;
+
+To create binary:
+ make
+
+To install binary and man pages:
+ make install
+
+Then edit the file /etc/ax25/ttylinkd.conf to change the sysops login to
+whoever you want.
+
+That should hopefully be it, although you may want to do/check the
+following;
+
+ * Ensure that there is a line in /etc/services that says
+ 'link 87/tcp ttylink'.
+ * Add the following line to /etc/inetd.conf,
+ 'ttylink stream tcp nowait root /usr/sbin/ttylinkd ttylinkd'
+ * Get inetd to re-read config file by sending a HUP signal to it.
+ To do this find the process number of inetd with ps and then type
+ 'kill -SIGHUP <number>'
+
+If you want connections from AX25, Net/ROM or ROSE ports, you will have to
+edit your ax25d.conf file too, for example mine has;
+[VK2XLZ-1 VIA VHF]
+NOCALL * * * * * * L
+default * * * * * * - root /usr/bin/node node
+[VK2XLZ-6 VIA VHF]
+NOCALL * * * * * * L
+default * * * * * * - root /usr/sbin/ttylinkd ttylinkd
+
+etc, pretty simple stuff.
+
+For programs like node etc to connect to sysop, specify the callers callsign
+as a parameter, eg ttylinkd <callsign>. This will send a message to the
+sysop's screen that <callsign> wants to talk to them.
diff --git a/tcpip/ttylinkd.README b/tcpip/ttylinkd.README
new file mode 100644
index 0000000..40d8003
--- /dev/null
+++ b/tcpip/ttylinkd.README
@@ -0,0 +1,34 @@
+README file for ttylinkd: The ttylink daemon, dated 5 Mar 1997
+
+This program allows you to recieve ttylink requests from NOS or other
+stations. It uses the normal Un*x talk protocol for the sysop end and inetd
+for the user's end.
+
+As of 0.02, we now accept connections for Net/ROM and AX.25.
+As of 0.03, we now accept connections from ROSE (not tested!)
+
+USAGE
+=====
+When someone connects to the ttylink port of you system (usually port 87)
+the inetd program will spawn a ttylinkd process. This process will send a
+welcome and then ask the user to type in their callsign.
+A talk invitation is then sent to the sysop with the given user name to
+reply. If the sysop wants to talk to the user, they then use the talk
+command.
+Either party can finish the conversation in the usual way.
+
+
+BUGS / TO DO
+============
+- Get some real documentation on ntalkd to make sure that I am doing things
+ right.
+- Allow the sysop to be on another system (if users of ttylinkd want this).
+
+
+CREDITS
+=======
+This program and documentation Copyright (C) 1997 Craig Small VK2XLZ
+(csmall@gonzo.triode.net.au), (csmall@gonzo.vk2xlz.ampr.org).
+Please read the file ttylinkd.c for full notice.
+Thanks to Tomi Manninen OH2BNS for the AX.25 patches in 0.02
+Thanks to Tomi again for the short callsign fix in 0.03 \ No newline at end of file
diff --git a/user_call/Makefile.am b/user_call/Makefile.am
index 0a176b9..24cf7d7 100644
--- a/user_call/Makefile.am
+++ b/user_call/Makefile.am
@@ -2,11 +2,30 @@
installconf:
-sbin_PROGRAMS = ax25_call netrom_call rose_call
+sbin_PROGRAMS = ax25_call netrom_call rose_call tcp_call
-man_MANS = ax25_call.8 netrom_call.8 rose_call.8
+man_MANS = ax25_call.8 netrom_call.8 rose_call.8 tcp_call.8
-EXTRA_DIST = $(man_MANS)
+docdir=${prefix}/doc/ax25-tools
+doc_DATA= README.user_call
-LDADD = $(AX25_LIB)
+EXTRA_DIST = $(man_MANS) $(doc_DATA)
+
+LDADD = $(AX25_LIB) $(Z_LIB)
+
+ax25_call_SOURCES = ax25_call.c \
+ user_io.c \
+ user_io.h
+
+netrom_call_SOURCES = netrom_call.c \
+ user_io.c \
+ user_io.h
+
+rose_call_SOURCES = rose_call.c \
+ user_io.c \
+ user_io.h
+
+tcp_call_SOURCES = tcp_call.c \
+ user_io.c \
+ user_io.h
diff --git a/user_call/Makefile.in b/user_call/Makefile.in
index cf78c65..8935ee8 100644
--- a/user_call/Makefile.in
+++ b/user_call/Makefile.in
@@ -68,13 +68,28 @@ UTIL_LIB = @UTIL_LIB@
VERSION = @VERSION@
Z_LIB = @Z_LIB@
-sbin_PROGRAMS = ax25_call netrom_call rose_call
+sbin_PROGRAMS = ax25_call netrom_call rose_call tcp_call
-man_MANS = ax25_call.8 netrom_call.8 rose_call.8
+man_MANS = ax25_call.8 netrom_call.8 rose_call.8 tcp_call.8
-EXTRA_DIST = $(man_MANS)
+docdir = ${prefix}/doc/ax25-tools
+doc_DATA = README.user_call
+
+EXTRA_DIST = $(man_MANS) $(doc_DATA)
+
+LDADD = $(AX25_LIB) $(Z_LIB)
+
+ax25_call_SOURCES = ax25_call.c user_io.c user_io.h
+
+
+netrom_call_SOURCES = netrom_call.c user_io.c user_io.h
+
+
+rose_call_SOURCES = rose_call.c user_io.c user_io.h
+
+
+tcp_call_SOURCES = tcp_call.c user_io.c user_io.h
-LDADD = $(AX25_LIB)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = ../config.h
CONFIG_CLEAN_FILES =
@@ -89,21 +104,22 @@ X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@
X_EXTRA_LIBS = @X_EXTRA_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
-ax25_call_SOURCES = ax25_call.c
-ax25_call_OBJECTS = ax25_call.o
+ax25_call_OBJECTS = ax25_call.o user_io.o
ax25_call_LDADD = $(LDADD)
ax25_call_DEPENDENCIES =
ax25_call_LDFLAGS =
-netrom_call_SOURCES = netrom_call.c
-netrom_call_OBJECTS = netrom_call.o
+netrom_call_OBJECTS = netrom_call.o user_io.o
netrom_call_LDADD = $(LDADD)
netrom_call_DEPENDENCIES =
netrom_call_LDFLAGS =
-rose_call_SOURCES = rose_call.c
-rose_call_OBJECTS = rose_call.o
+rose_call_OBJECTS = rose_call.o user_io.o
rose_call_LDADD = $(LDADD)
rose_call_DEPENDENCIES =
rose_call_LDFLAGS =
+tcp_call_OBJECTS = tcp_call.o user_io.o
+tcp_call_LDADD = $(LDADD)
+tcp_call_DEPENDENCIES =
+tcp_call_LDFLAGS =
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
@@ -112,15 +128,17 @@ man8dir = $(mandir)/man8
MANS = $(man_MANS)
NROFF = nroff
-DIST_COMMON = README Makefile.am Makefile.in
+DATA = $(doc_DATA)
+
+DIST_COMMON = Makefile.am Makefile.in
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
TAR = tar
GZIP_ENV = --best
-SOURCES = ax25_call.c netrom_call.c rose_call.c
-OBJECTS = ax25_call.o netrom_call.o rose_call.o
+SOURCES = $(ax25_call_SOURCES) $(netrom_call_SOURCES) $(rose_call_SOURCES) $(tcp_call_SOURCES)
+OBJECTS = $(ax25_call_OBJECTS) $(netrom_call_OBJECTS) $(rose_call_OBJECTS) $(tcp_call_OBJECTS)
all: all-redirect
.SUFFIXES:
@@ -189,6 +207,10 @@ rose_call: $(rose_call_OBJECTS) $(rose_call_DEPENDENCIES)
@rm -f rose_call
$(LINK) $(rose_call_LDFLAGS) $(rose_call_OBJECTS) $(rose_call_LDADD) $(LIBS)
+tcp_call: $(tcp_call_OBJECTS) $(tcp_call_DEPENDENCIES)
+ @rm -f tcp_call
+ $(LINK) $(tcp_call_LDFLAGS) $(tcp_call_OBJECTS) $(tcp_call_LDADD) $(LIBS)
+
install-man8:
$(mkinstalldirs) $(DESTDIR)$(man8dir)
@list='$(man8_MANS)'; \
@@ -228,6 +250,25 @@ uninstall-man:
@$(NORMAL_UNINSTALL)
$(MAKE) $(AM_MAKEFLAGS) uninstall-man8
+install-docDATA: $(doc_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(docdir)
+ @list='$(doc_DATA)'; for p in $$list; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p; \
+ fi; fi; \
+ done
+
+uninstall-docDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(doc_DATA)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(docdir)/$$p; \
+ done
+
tags: TAGS
ID: $(HEADERS) $(SOURCES) $(LISP)
@@ -272,9 +313,6 @@ distdir: $(DISTFILES)
|| cp -p $$d/$$file $(distdir)/$$file || :; \
fi; \
done
-ax25_call.o: ax25_call.c ../config.h
-netrom_call.o: netrom_call.c ../config.h
-rose_call.o: rose_call.c ../config.h
info-am:
info: info-am
@@ -287,20 +325,21 @@ installcheck: installcheck-am
install-exec-am: install-sbinPROGRAMS
install-exec: install-exec-am
-install-data-am: install-man
+install-data-am: install-man install-docDATA
install-data: install-data-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
install: install-am
-uninstall-am: uninstall-sbinPROGRAMS uninstall-man
+uninstall-am: uninstall-sbinPROGRAMS uninstall-man uninstall-docDATA
uninstall: uninstall-am
-all-am: Makefile $(PROGRAMS) $(MANS)
+all-am: Makefile $(PROGRAMS) $(MANS) $(DATA)
all-redirect: all-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
installdirs:
- $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man8
+ $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man8 \
+ $(DESTDIR)$(docdir)
mostlyclean-generic:
@@ -339,13 +378,13 @@ maintainer-clean: maintainer-clean-am
clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \
install-sbinPROGRAMS mostlyclean-compile distclean-compile \
clean-compile maintainer-clean-compile install-man8 uninstall-man8 \
-install-man uninstall-man tags mostlyclean-tags distclean-tags \
-clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
-check-am installcheck-am installcheck install-exec-am install-exec \
-install-data-am install-data install-am install uninstall-am uninstall \
-all-redirect all-am all installdirs mostlyclean-generic \
-distclean-generic clean-generic maintainer-clean-generic clean \
-mostlyclean distclean maintainer-clean
+install-man uninstall-man uninstall-docDATA install-docDATA tags \
+mostlyclean-tags distclean-tags clean-tags maintainer-clean-tags \
+distdir info-am info dvi-am dvi check check-am installcheck-am \
+installcheck install-exec-am install-exec install-data-am install-data \
+install-am install uninstall-am uninstall all-redirect all-am all \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
installconf:
diff --git a/user_call/README b/user_call/README.user_call
index beee347..beee347 100644
--- a/user_call/README
+++ b/user_call/README.user_call
diff --git a/user_call/ax25_call.8 b/user_call/ax25_call.8
index ab93de0..e7542e4 100644
--- a/user_call/ax25_call.8
+++ b/user_call/ax25_call.8
@@ -1,13 +1,20 @@
-.TH AX25_CALL 8 "11 December 1996" Linux "Linux Programmer's Manual"
+.TH AX25_CALL 8 "4 July 1999" Linux "Linux Programmer's Manual"
.SH NAME
-ax25_call \- make an AX.25 connection
+ax25_call, netrom_call, rose_call, tcp_call \- make an AX.25, NET/ROM,
+ROSE or TCP connection
.SH SYNOPSIS
-.B ax25_call port local_call remote_call [digipeaters ...]
+.B ax25_call [-c] [-i paclen] [-o paclen] port local_call remote_call [digipeaters ...]
+.sp
+.B netrom_call [-c] [-i paclen] [-o paclen] port local_call remote_netrom_addr
+.sp
+.B rose_call [-c] [-i paclen] [-o paclen] port local_call remote_call remote_rose_addr
+.sp
+.B tcp_call [-c] [-i paclen] [-o paclen] remote_addr remote_port
.SH DESCRIPTION
.LP
-.B ax25_call
-establishes an AX.25 connection in a manner suitable for calling from either
-the
+.B ax25_call, netrom_call, rose_call and tcp_call
+establish an AX.25, NET/ROM, ROSE or a TCP connection in a manner
+suitable for calling from either the
.B ax25d
program directly, or from the
.B node
@@ -15,10 +22,48 @@ program as an external command. By setting the command line arguments
appropriately it is possible to set the local callsign from which the call
will be made. No translation of the end of lines is performed by this
program.
+.sp
+For
+.B netrom_call
+the remote_netrom_addr parameter may either be in the form of a single
+callsign or as a NET/ROM alias and callsign pair separated by
+colon. For example NMCLUS:GB7BPQ.
+.sp
+For
+.B rose_call
+the remote_rose_addr parameter must be in the form of a ten digit
+ROSE address.
+.sp
+For
+.B tcp_call
+the remote_addr parameter must be a dotted-quad IP address or a
+hostname and the remote_port must be a service name (see services(5))
+or a port number.
+.SH OPTIONS
+.TP 12
+.BI \-c
+Enables zlib based compression on the incoming connection. Compression
+algorithm is the same as in LinuxNode (see node(8)).
+.TP 12
+.BI "\-i paclen"
+The maximum frame length to be used on the incoming connection. The
+default is 256 for ax25_call and rose_call, 236 for netrom_call and
+1024 for tcp_call.
+.TP 12
+.BI "\-o paclen"
+The maximum frame length to be used on the outgoing connection. The
+default is 256 for ax25_call and rose_call, 236 for netrom_call and
+1024 for tcp_call.
.SH FILES
.br
/etc/ax25/axports
+.br
+/etc/ax25/nrports
+.br
+/etc/ax25/rsports
.SH "SEE ALSO"
-.BR ax25 (4).
+.BR ax25(4), netrom(4), rose(4), tcp(4).
.SH AUTHOR
Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>
+.br
+Tomi Manninen OH2BNS <tomi.manninen@hut.fi>
diff --git a/user_call/ax25_call.c b/user_call/ax25_call.c
index 235feb9..cbedf63 100644
--- a/user_call/ax25_call.c
+++ b/user_call/ax25_call.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -8,8 +9,8 @@
#include <sys/time.h>
#include <sys/types.h>
-
#include <sys/socket.h>
+
#ifdef HAVE_NETAX25_AX25_H
#include <netax25/ax25.h>
#else
@@ -24,27 +25,46 @@
#include <netax25/axlib.h>
#include <netax25/axconfig.h>
-void alarm_handler(int sig)
-{
-}
+#include "user_io.h"
-void err(char *message)
+void alarm_handler(int sig)
{
- write(STDOUT_FILENO, message, strlen(message));
- exit(1);
}
int main(int argc, char **argv)
{
- char buffer[512], *addr;
- fd_set read_fd;
- int n, s, addrlen = sizeof(struct full_sockaddr_ax25);
+ char buffer[256], *addr;
+ int s, addrlen = sizeof(struct full_sockaddr_ax25);
struct full_sockaddr_ax25 axbind, axconnect;
+ while ((s = getopt(argc, argv, "ci:o:")) != -1) {
+ switch (s) {
+ case 'c':
+ init_compress();
+ compression = 1;
+ break;
+ case 'i':
+ paclen_in = atoi(optarg);
+ break;
+ case 'o':
+ paclen_out = atoi(optarg);
+ break;
+ case ':':
+ case '?':
+ err("ERROR: invalid option usage\r");
+ return 1;
+ }
+ }
+
+ if (paclen_in < 1 || paclen_out < 1) {
+ err("ERROR: invalid paclen\r");
+ return 1;
+ }
+
/*
* Arguments should be "ax25_call port mycall remcall [digis ...]"
*/
- if (argc < 4) {
+ if ((argc - optind) < 3) {
strcpy(buffer, "ERROR: invalid number of parameters\r");
err(buffer);
}
@@ -60,22 +80,22 @@ int main(int argc, char **argv)
axconnect.fsa_ax25.sax25_family = axbind.fsa_ax25.sax25_family = AF_AX25;
axbind.fsa_ax25.sax25_ndigis = 1;
- if ((addr = ax25_config_get_addr(argv[1])) == NULL) {
- sprintf(buffer, "ERROR: invalid AX.25 port name - %s\r", argv[1]);
+ if ((addr = ax25_config_get_addr(argv[optind])) == NULL) {
+ sprintf(buffer, "ERROR: invalid AX.25 port name - %s\r", argv[optind]);
err(buffer);
}
if (ax25_aton_entry(addr, axbind.fsa_digipeater[0].ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid AX.25 port callsign - %s\r", argv[1]);
+ sprintf(buffer, "ERROR: invalid AX.25 port callsign - %s\r", argv[optind]);
err(buffer);
}
- if (ax25_aton_entry(argv[2], axbind.fsa_ax25.sax25_call.ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[2]);
+ if (ax25_aton_entry(argv[optind + 1], axbind.fsa_ax25.sax25_call.ax25_call) == -1) {
+ sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[optind + 1]);
err(buffer);
}
- if (ax25_aton_arglist(argv + 3, &axconnect) == -1) {
+ if (ax25_aton_arglist(argv + optind + 2, &axconnect) == -1) {
sprintf(buffer, "ERROR: invalid destination callsign or digipeater\r");
err(buffer);
}
@@ -96,8 +116,8 @@ int main(int argc, char **argv)
err(buffer);
}
- sprintf(buffer, "Connecting to %s ...\r", argv[3]);
- write(STDOUT_FILENO, buffer, strlen(buffer));
+ sprintf(buffer, "Connecting to %s ...\r", argv[optind + 2]);
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
/*
* If no response in 30 seconds, go away.
@@ -134,34 +154,14 @@ int main(int argc, char **argv)
alarm(0);
strcpy(buffer, "*** Connected\r");
- write(STDOUT_FILENO, buffer, strlen(buffer));
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
- /*
- * Loop until one end of the connection goes away.
- */
- for (;;) {
- FD_ZERO(&read_fd);
- FD_SET(STDIN_FILENO, &read_fd);
- FD_SET(s, &read_fd);
-
- select(s + 1, &read_fd, NULL, NULL, NULL);
-
- if (FD_ISSET(s, &read_fd)) {
- if ((n = read(s, buffer, 512)) == -1) {
- strcpy(buffer, "\r*** Disconnected\r");
- err(buffer);
- }
- write(STDOUT_FILENO, buffer, n);
- }
+ select_loop(s);
- if (FD_ISSET(STDIN_FILENO, &read_fd)) {
- if ((n = read(STDIN_FILENO, buffer, 512)) == -1) {
- close(s);
- break;
- }
- write(s, buffer, n);
- }
- }
+ strcpy(buffer, "\r*** Disconnected\r");
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
+
+ end_compress();
return 0;
}
diff --git a/user_call/netrom_call.8 b/user_call/netrom_call.8
index 1a11989..41ea354 100644
--- a/user_call/netrom_call.8
+++ b/user_call/netrom_call.8
@@ -1,28 +1 @@
-.TH NETROM_CALL 8 "11 December 1996" Linux "Linux Programmer's Manual"
-.SH NAME
-netrom_call \- make a NET/ROM connection
-.SH SYNOPSIS
-.B netrom_call port local_call remote_addr
-.SH DESCRIPTION
-.LP
-.B netrom_call
-establishes a NET/ROM connection in a manner suitable for calling from either
-the
-.B ax25d
-program directly, or from the
-.B node
-program as an external command. By setting the command line arguments
-appropriately it is possible to set the local callsign from which the call
-will be made. No translation of the end of line conventions is performed by
-this program.
-.sp 1
-The remote_addr parameter may either be in the form of a single callsign or
-as a NET/ROM alias and callsign pair seperated by colon. For example
-NMCLUS:GB7BPQ.
-.SH FILES
-.br
-/etc/ax25/nrports
-.SH "SEE ALSO"
-.BR netrom (4).
-.SH AUTHOR
-Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>
+.so man8/ax25_call.8
diff --git a/user_call/netrom_call.c b/user_call/netrom_call.c
index deb877e..ca4c1c9 100644
--- a/user_call/netrom_call.c
+++ b/user_call/netrom_call.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -8,8 +9,8 @@
#include <sys/time.h>
#include <sys/types.h>
-
#include <sys/socket.h>
+
#ifdef HAVE_NETAX25_AX25_H
#include <netax25/ax25.h>
#else
@@ -30,27 +31,49 @@
#include <netax25/axconfig.h>
#include <netax25/nrconfig.h>
-void alarm_handler(int sig)
-{
-}
+#include "user_io.h"
-void err(char *message)
+void alarm_handler(int sig)
{
- write(STDOUT_FILENO, message, strlen(message));
- exit(1);
}
int main(int argc, char **argv)
{
- char buffer[512], *addr;
- fd_set read_fd;
- int n, s, addrlen = sizeof(struct full_sockaddr_ax25);
+ char buffer[256], *addr;
+ int s, addrlen = sizeof(struct full_sockaddr_ax25);
struct full_sockaddr_ax25 nrbind, nrconnect;
+ paclen_in = 236;
+ paclen_out = 236;
+
+ while ((s = getopt(argc, argv, "ci:o:")) != -1) {
+ switch (s) {
+ case 'c':
+ init_compress();
+ compression = 1;
+ break;
+ case 'i':
+ paclen_in = atoi(optarg);
+ break;
+ case 'o':
+ paclen_out = atoi(optarg);
+ break;
+ case ':':
+ case '?':
+ err("ERROR: invalid option usage\r");
+ return 1;
+ }
+ }
+
+ if (paclen_in < 1 || paclen_out < 1) {
+ err("ERROR: invalid paclen\r");
+ return 1;
+ }
+
/*
* Arguments should be "netrom_call port mycall remaddr"
*/
- if (argc != 4) {
+ if ((argc - optind) != 3) {
strcpy(buffer, "ERROR: invalid number of parameters\r");
err(buffer);
}
@@ -67,28 +90,28 @@ int main(int argc, char **argv)
nrbind.fsa_ax25.sax25_ndigis = 1;
nrconnect.fsa_ax25.sax25_ndigis = 0;
- if ((addr = nr_config_get_addr(argv[1])) == NULL) {
- sprintf(buffer, "ERROR: invalid NET/ROM port name - %s\r", argv[1]);
+ if ((addr = nr_config_get_addr(argv[optind])) == NULL) {
+ sprintf(buffer, "ERROR: invalid NET/ROM port name - %s\r", argv[optind]);
err(buffer);
}
if (ax25_aton_entry(addr, nrbind.fsa_ax25.sax25_call.ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid NET/ROM port callsign - %s\r", argv[1]);
+ sprintf(buffer, "ERROR: invalid NET/ROM port callsign - %s\r", argv[optind]);
err(buffer);
}
- if (ax25_aton_entry(argv[2], nrbind.fsa_digipeater[0].ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[2]);
+ if (ax25_aton_entry(argv[optind + 1], nrbind.fsa_digipeater[0].ax25_call) == -1) {
+ sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[optind + 1]);
err(buffer);
}
- if ((addr = strchr(argv[3], ':')) == NULL)
- addr = argv[3];
+ if ((addr = strchr(argv[optind + 2], ':')) == NULL)
+ addr = argv[optind + 2];
else
addr++;
if (ax25_aton_entry(addr, nrconnect.fsa_ax25.sax25_call.ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[3]);
+ sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[optind + 2]);
err(buffer);
}
@@ -108,8 +131,8 @@ int main(int argc, char **argv)
err(buffer);
}
- sprintf(buffer, "Connecting to %s ...\r", argv[3]);
- write(STDOUT_FILENO, buffer, strlen(buffer));
+ sprintf(buffer, "Connecting to %s ...\r", argv[optind + 2]);
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
/*
* If no response in 30 seconds, go away.
@@ -146,34 +169,14 @@ int main(int argc, char **argv)
alarm(0);
strcpy(buffer, "*** Connected\r");
- write(STDOUT_FILENO, buffer, strlen(buffer));
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
- /*
- * Loop until one end of the connection goes away.
- */
- for (;;) {
- FD_ZERO(&read_fd);
- FD_SET(STDIN_FILENO, &read_fd);
- FD_SET(s, &read_fd);
-
- select(s + 1, &read_fd, NULL, NULL, NULL);
-
- if (FD_ISSET(s, &read_fd)) {
- if ((n = read(s, buffer, 512)) == -1) {
- strcpy(buffer, "\r*** Disconnected\r");
- err(buffer);
- }
- write(STDOUT_FILENO, buffer, n);
- }
+ select_loop(s);
- if (FD_ISSET(STDIN_FILENO, &read_fd)) {
- if ((n = read(STDIN_FILENO, buffer, 512)) == -1) {
- close(s);
- break;
- }
- write(s, buffer, n);
- }
- }
+ strcpy(buffer, "\r*** Disconnected\r");
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
+
+ end_compress();
return 0;
}
diff --git a/user_call/rose_call.8 b/user_call/rose_call.8
index 9eb888e..41ea354 100644
--- a/user_call/rose_call.8
+++ b/user_call/rose_call.8
@@ -1,26 +1 @@
-.TH ROSE_CALL 8 "11 December 1996" Linux "Linux Programmer's Manual"
-.SH NAME
-rose_call \- make a ROSE connection
-.SH SYNOPSIS
-.B rose_call port local_call remote_call remote_rose_addr
-.SH DESCRIPTION
-.LP
-.B rose_call
-establishes a ROSE connection in a manner suitable for calling from either
-the
-.B ax25d
-program directly, or from the
-.B node
-program as an external command. By setting the command line arguments
-appropriately it is possible to set the local callsign from which the call
-will be made. No translation of the end of line conventions is performed by
-this program.
-.sp 1
-The remote_rose_addr parameter must be in the form of a ten digit ROSE address.
-.SH FILES
-.br
-/etc/ax25/rsports
-.SH "SEE ALSO"
-.BR rose (4).
-.SH AUTHOR
-Jonathan Naylor G4KLX <g4klx@g4klx.demon.co.uk>
+.so man8/ax25_call.8
diff --git a/user_call/rose_call.c b/user_call/rose_call.c
index 10e235b..51308a2 100644
--- a/user_call/rose_call.c
+++ b/user_call/rose_call.c
@@ -1,3 +1,4 @@
+#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
@@ -8,8 +9,8 @@
#include <sys/time.h>
#include <sys/types.h>
-
#include <sys/socket.h>
+
#ifdef HAVE_NETAX25_AX25_H
#include <netax25/ax25.h>
#else
@@ -25,27 +26,46 @@
#include <netax25/axconfig.h>
#include <netax25/rsconfig.h>
-void alarm_handler(int sig)
-{
-}
+#include "user_io.h"
-void err(char *message)
+void alarm_handler(int sig)
{
- write(STDOUT_FILENO, message, strlen(message));
- exit(1);
}
int main(int argc, char **argv)
{
- char buffer[512], *addr;
- fd_set read_fd;
- int n, s, addrlen = sizeof(struct sockaddr_rose);
+ char buffer[256], *addr;
+ int s, addrlen = sizeof(struct sockaddr_rose);
struct sockaddr_rose rosebind, roseconnect;
+ while ((s = getopt(argc, argv, "ci:o:")) != -1) {
+ switch (s) {
+ case 'c':
+ init_compress();
+ compression = 1;
+ break;
+ case 'i':
+ paclen_in = atoi(optarg);
+ break;
+ case 'o':
+ paclen_out = atoi(optarg);
+ break;
+ case ':':
+ case '?':
+ err("ERROR: invalid option usage\r");
+ return 1;
+ }
+ }
+
+ if (paclen_in < 1 || paclen_out < 1) {
+ err("ERROR: invalid paclen\r");
+ return 1;
+ }
+
/*
* Arguments should be "rose_call port mycall remcall remaddr"
*/
- if (argc != 5) {
+ if ((argc - optind) != 4) {
strcpy(buffer, "ERROR: invalid number of parameters\r");
err(buffer);
}
@@ -61,28 +81,28 @@ int main(int argc, char **argv)
roseconnect.srose_family = rosebind.srose_family = AF_ROSE;
roseconnect.srose_ndigis = rosebind.srose_ndigis = 0;
- if ((addr = rs_config_get_addr(argv[1])) == NULL) {
- sprintf(buffer, "ERROR: invalid Rose port name - %s\r", argv[1]);
+ if ((addr = rs_config_get_addr(argv[optind])) == NULL) {
+ sprintf(buffer, "ERROR: invalid Rose port name - %s\r", argv[optind]);
err(buffer);
}
if (rose_aton(addr, rosebind.srose_addr.rose_addr) == -1) {
- sprintf(buffer, "ERROR: invalid Rose port address - %s\r", argv[1]);
+ sprintf(buffer, "ERROR: invalid Rose port address - %s\r", argv[optind]);
err(buffer);
}
- if (ax25_aton_entry(argv[2], rosebind.srose_call.ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[2]);
+ if (ax25_aton_entry(argv[optind + 1], rosebind.srose_call.ax25_call) == -1) {
+ sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[optind + 1]);
err(buffer);
}
- if (ax25_aton_entry(argv[3], roseconnect.srose_call.ax25_call) == -1) {
- sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[3]);
+ if (ax25_aton_entry(argv[optind + 2], roseconnect.srose_call.ax25_call) == -1) {
+ sprintf(buffer, "ERROR: invalid callsign - %s\r", argv[optind + 2]);
err(buffer);
}
- if (rose_aton(argv[4], roseconnect.srose_addr.rose_addr) == -1) {
- sprintf(buffer, "ERROR: invalid Rose address - %s\r", argv[4]);
+ if (rose_aton(argv[optind + 3], roseconnect.srose_addr.rose_addr) == -1) {
+ sprintf(buffer, "ERROR: invalid Rose address - %s\r", argv[optind + 3]);
err(buffer);
}
@@ -102,8 +122,8 @@ int main(int argc, char **argv)
err(buffer);
}
- sprintf(buffer, "Connecting to %s @ %s ...\r", argv[3], argv[4]);
- write(STDOUT_FILENO, buffer, strlen(buffer));
+ sprintf(buffer, "Connecting to %s @ %s ...\r", argv[optind + 2], argv[optind + 3]);
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
/*
* If no response in 30 seconds, go away.
@@ -140,34 +160,14 @@ int main(int argc, char **argv)
alarm(0);
strcpy(buffer, "*** Connected\r");
- write(STDOUT_FILENO, buffer, strlen(buffer));
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
- /*
- * Loop until one end of the connection goes away.
- */
- for (;;) {
- FD_ZERO(&read_fd);
- FD_SET(STDIN_FILENO, &read_fd);
- FD_SET(s, &read_fd);
-
- select(s + 1, &read_fd, NULL, NULL, NULL);
-
- if (FD_ISSET(s, &read_fd)) {
- if ((n = read(s, buffer, 512)) == -1) {
- strcpy(buffer, "\r*** Disconnected\r");
- err(buffer);
- }
- write(STDOUT_FILENO, buffer, n);
- }
+ select_loop(s);
- if (FD_ISSET(STDIN_FILENO, &read_fd)) {
- if ((n = read(STDIN_FILENO, buffer, 512)) == -1) {
- close(s);
- break;
- }
- write(s, buffer, n);
- }
- }
+ strcpy(buffer, "\r*** Disconnected\r");
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
+
+ end_compress();
return 0;
}
diff --git a/user_call/tcp_call.8 b/user_call/tcp_call.8
new file mode 100644
index 0000000..41ea354
--- /dev/null
+++ b/user_call/tcp_call.8
@@ -0,0 +1 @@
+.so man8/ax25_call.8
diff --git a/user_call/tcp_call.c b/user_call/tcp_call.c
new file mode 100644
index 0000000..c3b5e3c
--- /dev/null
+++ b/user_call/tcp_call.c
@@ -0,0 +1,139 @@
+#include <stdlib.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <netdb.h>
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+
+#include "user_io.h"
+
+void alarm_handler(int sig)
+{
+}
+
+int main(int argc, char **argv)
+{
+ char buffer[256];
+ int s, addrlen = sizeof(struct sockaddr_in);
+ struct sockaddr_in addr;
+ struct hostent *hp;
+ struct servent *sp;
+ int verbose = 1;
+
+ paclen_in = 1024;
+ paclen_out = 1024;
+
+ while ((s = getopt(argc, argv, "ci:o:q")) != -1) {
+ switch (s) {
+ case 'c':
+ init_compress();
+ compression = 1;
+ break;
+ case 'i':
+ paclen_in = atoi(optarg);
+ break;
+ case 'o':
+ paclen_out = atoi(optarg);
+ break;
+ case 'q':
+ verbose = 0;
+ break;
+ case ':':
+ case '?':
+ err("ERROR: invalid option usage\n");
+ return 1;
+ }
+ }
+
+ if (paclen_in < 1 || paclen_out < 1) {
+ err("ERROR: invalid paclen\n");
+ return 1;
+ }
+
+ /*
+ * Arguments should be "tcp_call remaddr remport"
+ */
+ if ((argc - optind) != 2) {
+ strcpy(buffer, "ERROR: invalid number of parameters\n");
+ err(buffer);
+ }
+
+ /*
+ * Open the socket into the kernel.
+ */
+ if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+ sprintf(buffer, "ERROR: can't open socket: %s\n", strerror(errno));
+ err(buffer);
+ }
+
+ /*
+ * Resolve the hostname.
+ */
+ hp = gethostbyname(argv[optind]);
+ if (hp == NULL) {
+ err("ERROR: Unknown host\n");
+ }
+ addr.sin_family = AF_INET;
+ addr.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
+
+ /*
+ * And the service name.
+ */
+ if ((sp = getservbyname(argv[optind+1], "tcp")) != NULL)
+ addr.sin_port = sp->s_port;
+ else
+ addr.sin_port = htons(atoi(argv[optind+1]));
+
+ if (addr.sin_port == 0) {
+ err("ERROR: Unknown service\n");
+ }
+
+ if (verbose) {
+ sprintf(buffer, "*** Connecting to %s ...\n", hp->h_name);
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
+ }
+
+ /*
+ * If no response in 30 seconds, go away.
+ */
+ alarm(30);
+
+ signal(SIGALRM, alarm_handler);
+
+ /*
+ * Lets try and connect to the far end.
+ */
+ if (connect(s, (struct sockaddr *)&addr, addrlen) != 0) {
+ sprintf(buffer, "ERROR: can't connect: %s\n", strerror(errno));
+ err(buffer);
+ }
+
+ /*
+ * We got there.
+ */
+ alarm(0);
+
+ if (verbose) {
+ strcpy(buffer, "*** Connected\n");
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
+ }
+
+ select_loop(s);
+
+ if (verbose) {
+ strcpy(buffer, "\n*** Disconnected\n");
+ user_write(STDOUT_FILENO, buffer, strlen(buffer));
+ }
+
+ end_compress();
+
+ return 0;
+}
diff --git a/user_call/user_io.c b/user_call/user_io.c
new file mode 100644
index 0000000..2e594f6
--- /dev/null
+++ b/user_call/user_io.c
@@ -0,0 +1,215 @@
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "config.h"
+#include "user_io.h"
+
+int compression = 0;
+int paclen_in = 256;
+int paclen_out = 256;
+
+/* This is for select_loop() */
+static unsigned char buf[8192];
+
+#ifdef HAVE_ZLIB_H
+#include <zlib.h>
+
+/* Error in (de)compression happened? */
+static int compression_error = 0;
+
+/* These are for the (de)compressor */
+static unsigned char input_buffer[8192];
+static unsigned char output_buffer[8192];
+
+static z_stream incoming_stream;
+static z_stream outgoing_stream;
+#endif
+
+#define min(a,b) ((a) < (b) ? (a) : (b))
+
+void err(char *message)
+{
+ user_write(STDOUT_FILENO, message, strlen(message));
+ exit(1);
+}
+
+void init_compress(void)
+{
+#ifdef HAVE_ZLIB_H
+ inflateInit(&incoming_stream);
+ deflateInit(&outgoing_stream, 9);
+
+ incoming_stream.next_in = input_buffer;
+#else
+ err("*** Compression support not available!!!\r\n");
+#endif
+}
+
+void end_compress(void)
+{
+#ifdef HAVE_ZLIB_H
+ inflateEnd(&incoming_stream);
+ deflateEnd(&outgoing_stream);
+#endif
+}
+
+static int flush_output(int fd, const void *buf, size_t count)
+{
+ int cnt = count;
+
+ while (cnt > 0) {
+ write(fd, buf, min(paclen_out, cnt));
+ buf += paclen_out;
+ cnt -= paclen_out;
+ }
+
+ return count;
+}
+
+int user_write(int fd, const void *buf, size_t count)
+{
+#ifdef HAVE_ZLIB_H
+ int status;
+#endif
+
+ if (count == 0)
+ return 0;
+
+#ifndef HAVE_ZLIB_H
+ return flush_output(fd, buf, count);
+#else
+ /* Only output to stdout can be compressed */
+ if (fd != STDOUT_FILENO || !compression)
+ return flush_output(fd, buf, count);
+
+ if (compression_error) {
+ errno = 0;
+ return -1;
+ }
+
+ /* Input is the contents of the input buffer. */
+ outgoing_stream.next_in = (unsigned char *)buf;
+ outgoing_stream.avail_in = count;
+
+ /* Loop compressing until deflate() returns with avail_out != 0. */
+ do {
+ /* Set up fixed-size output buffer. */
+ outgoing_stream.next_out = output_buffer;
+ outgoing_stream.avail_out = sizeof(output_buffer);
+
+ /* Compress as much data into the buffer as possible. */
+ status = deflate(&outgoing_stream, Z_PARTIAL_FLUSH);
+
+ if (status != Z_OK) {
+ compression_error = status;
+ errno = 0;
+ return -1;
+ }
+
+ /* Now send the compressed data */
+ flush_output(fd, output_buffer, sizeof(output_buffer) - outgoing_stream.avail_out);
+
+ } while (outgoing_stream.avail_out == 0);
+
+ return count;
+#endif
+}
+
+int user_read(int fd, void *buf, size_t count)
+{
+#ifdef HAVE_ZLIB_H
+ int status, len;
+#endif
+
+ if (count == 0)
+ return 0;
+
+#ifndef HAVE_ZLIB_H
+ return read(fd, buf, count);
+#else
+ /* Only input from stdin can be compressed */
+ if (fd != STDIN_FILENO || !compression)
+ return read(fd, buf, count);
+
+ if (compression_error) {
+ errno = 0;
+ return -1;
+ }
+
+ incoming_stream.next_out = buf;
+ incoming_stream.avail_out = count;
+
+ for (;;) {
+ status = inflate(&incoming_stream, Z_SYNC_FLUSH);
+
+ if (count - incoming_stream.avail_out > 0)
+ return count - incoming_stream.avail_out;
+
+ if (status != Z_OK && status != Z_BUF_ERROR) {
+ compression_error = status;
+ errno = 0;
+ return -1;
+ }
+
+ incoming_stream.next_in = input_buffer;
+ incoming_stream.avail_in = 0;
+
+ if ((len = read(fd, input_buffer, sizeof(input_buffer))) < 0)
+ return -1;
+
+ incoming_stream.avail_in = len;
+ }
+
+ return 0;
+#endif
+}
+
+int select_loop(int s)
+{
+ fd_set read_fd;
+ int n;
+
+ if (fcntl(s, F_SETFL, O_NONBLOCK) == -1) {
+ close(s);
+ return -1;
+ }
+ if (fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK) == -1) {
+ close(s);
+ return -1;
+ }
+
+ /*
+ * Loop until one end of the connection goes away.
+ */
+ for (;;) {
+ FD_ZERO(&read_fd);
+ FD_SET(STDIN_FILENO, &read_fd);
+ FD_SET(s, &read_fd);
+
+ select(s + 1, &read_fd, NULL, NULL, NULL);
+
+ if (FD_ISSET(s, &read_fd)) {
+ while ((n = user_read(s, buf, 8192)) > 0)
+ user_write(STDOUT_FILENO, buf, n);
+ if (n == 0 || errno != EAGAIN) {
+ close(s);
+ break;
+ }
+ }
+
+ if (FD_ISSET(STDIN_FILENO, &read_fd)) {
+ while ((n = user_read(STDIN_FILENO, buf, 8192)) > 0)
+ user_write(s, buf, n);
+ if (n == 0 || errno != EAGAIN) {
+ close(s);
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
diff --git a/user_call/user_io.h b/user_call/user_io.h
new file mode 100644
index 0000000..98099a5
--- /dev/null
+++ b/user_call/user_io.h
@@ -0,0 +1,12 @@
+extern void err(char *message);
+
+extern int user_write(int fd, const void *buf, size_t count);
+extern int user_read(int fd, void *buf, size_t count);
+extern int select_loop(int s);
+
+extern void init_compress(void);
+extern void end_compress(void);
+
+extern int compression;
+extern int paclen_in;
+extern int paclen_out;
diff --git a/yamdrv/Makefile.am b/yamdrv/Makefile.am
new file mode 100644
index 0000000..b8f6a21
--- /dev/null
+++ b/yamdrv/Makefile.am
@@ -0,0 +1,16 @@
+
+sbin_PROGRAMS = yamcfg mcs2h
+
+yamcfg_SOURCES = yamcfg.c yam.h
+
+mcs2h_SOURCES = mcs2h.c
+
+docdir=${prefix}/doc/ax25-tools
+doc_DATA = README.yamdrv \
+ yam08-2.0.36-patch.diff \
+ yam08-2.2.1-patch.diff
+
+EXTRA_DIST = $(doc_DATA)
+
+installconf:
+
diff --git a/yamdrv/Makefile.in b/yamdrv/Makefile.in
new file mode 100644
index 0000000..84c0512
--- /dev/null
+++ b/yamdrv/Makefile.in
@@ -0,0 +1,323 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+AWK = @AWK@
+AX25IO_LIB = @AX25IO_LIB@
+AX25_LIB = @AX25_LIB@
+CC = @CC@
+MAKEINFO = @MAKEINFO@
+NCURSES_LIB = @NCURSES_LIB@
+PACKAGE = @PACKAGE@
+UTIL_LIB = @UTIL_LIB@
+VERSION = @VERSION@
+Z_LIB = @Z_LIB@
+
+sbin_PROGRAMS = yamcfg mcs2h
+
+yamcfg_SOURCES = yamcfg.c yam.h
+
+mcs2h_SOURCES = mcs2h.c
+
+docdir = ${prefix}/doc/ax25-tools
+doc_DATA = README.yamdrv yam08-2.0.36-patch.diff yam08-2.2.1-patch.diff
+
+
+EXTRA_DIST = $(doc_DATA)
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+PROGRAMS = $(sbin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+X_EXTRA_LIBS = @X_EXTRA_LIBS@
+X_PRE_LIBS = @X_PRE_LIBS@
+yamcfg_OBJECTS = yamcfg.o
+yamcfg_LDADD = $(LDADD)
+yamcfg_DEPENDENCIES =
+yamcfg_LDFLAGS =
+mcs2h_OBJECTS = mcs2h.o
+mcs2h_LDADD = $(LDADD)
+mcs2h_DEPENDENCIES =
+mcs2h_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DATA = $(doc_DATA)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(yamcfg_SOURCES) $(mcs2h_SOURCES)
+OBJECTS = $(yamcfg_OBJECTS) $(mcs2h_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps yamdrv/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-sbinPROGRAMS:
+
+clean-sbinPROGRAMS:
+ -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+
+distclean-sbinPROGRAMS:
+
+maintainer-clean-sbinPROGRAMS:
+
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(sbindir)
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-sbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+.c.o:
+ $(COMPILE) -c $<
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+yamcfg: $(yamcfg_OBJECTS) $(yamcfg_DEPENDENCIES)
+ @rm -f yamcfg
+ $(LINK) $(yamcfg_LDFLAGS) $(yamcfg_OBJECTS) $(yamcfg_LDADD) $(LIBS)
+
+mcs2h: $(mcs2h_OBJECTS) $(mcs2h_DEPENDENCIES)
+ @rm -f mcs2h
+ $(LINK) $(mcs2h_LDFLAGS) $(mcs2h_OBJECTS) $(mcs2h_LDADD) $(LIBS)
+
+install-docDATA: $(doc_DATA)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(docdir)
+ @list='$(doc_DATA)'; for p in $$list; do \
+ if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p"; \
+ $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p; \
+ else if test -f $$p; then \
+ echo " $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p"; \
+ $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p; \
+ fi; fi; \
+ done
+
+uninstall-docDATA:
+ @$(NORMAL_UNINSTALL)
+ list='$(doc_DATA)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(docdir)/$$p; \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = yamdrv
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-sbinPROGRAMS
+install-exec: install-exec-am
+
+install-data-am: install-docDATA
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-sbinPROGRAMS uninstall-docDATA
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(DATA)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(docdir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-sbinPROGRAMS mostlyclean-compile \
+ mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-sbinPROGRAMS clean-compile clean-tags clean-generic \
+ mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-sbinPROGRAMS distclean-compile distclean-tags \
+ distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-sbinPROGRAMS \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-sbinPROGRAMS distclean-sbinPROGRAMS \
+clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \
+install-sbinPROGRAMS mostlyclean-compile distclean-compile \
+clean-compile maintainer-clean-compile uninstall-docDATA \
+install-docDATA tags mostlyclean-tags distclean-tags clean-tags \
+maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+installconf:
+
+# 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/yamdrv/README.yamdrv b/yamdrv/README.yamdrv
new file mode 100644
index 0000000..f76ac10
--- /dev/null
+++ b/yamdrv/README.yamdrv
@@ -0,0 +1,92 @@
+1998/07/29 Version 0.5
+----------
+
+Driver now supports up to 4 yam modems.
+yam0 default to COM1 0x3f8 irq4
+yam1 default to COM2 0x2f8 irq3
+yam2 default to COM3 0x3e8 irq4
+yam3 default to COM4 0x3e8 irq3
+
+1998/09/01 Version 0.6
+----------
+
+Added : bitrate/baudrate configuration.
+Added : mcs file may be loaded from yamcfg.
+ One mcs file is affected to each bitrate.
+
+ mcs data for 1200 and 9600 bds are preloaded in the driver
+ but may be changed by yamcfg.
+
+options of yamcfg :
+
+ [iobase <iobase>]
+ [irq <irq>]
+ [bitrate <bitrate>]
+ [baudrate <baudrate>]
+ [duplex <mode>]
+ [hold <delay>]
+ [txdelay <txdelay>]
+ [txtail <txtail>]
+ [slottime <slottime>]
+ [persist <persistence>]
+ [load <bitrate> <filename.mcs>]
+
+/proc/net/yam gives the current configuration
+
+
+1998/09/12 Version 0.7
+----------
+
+A patch to the kernel tree 2.0.36 has been created.
+To patch the kernel, do the following :
+
+cd /usr/src
+cat PATH_OF_THE_FILE/yam08-2.2.1-patch.diff | patch -p0
+
+cd linux
+run "make menuconfig" (or other) to configure the yam options.
+
+------------
+
+The program yamcfg get or set the parameters of the yam driver
+yamcfg -h gives a minimum help
+
+Example setup of yam0 for 1 serial port (com2) :
+
+ file /etc/ax25/axports :
+ port0 F1OAT-9 9600 256 2 VHF (9600 bit/s)
+
+ commands :
+ setserial /dev/cua0 port 0 # to avoid conflict with yam driver
+ insmod yam
+ yamcfg yam0 io 0x2f8 irq 3
+ ifconfig yam0 hw ax25 f1oat-9 up
+
+
+
+Example setup of yam0,3 for 4 serial port (com1->com4) :
+
+ file /etc/ax25/axports :
+ port0 F1OAT-9 9600 256 2 VHF (9600 bit/s)
+ port1 F1OAT-8 9600 256 2 UHF1 (9600 bit/s)
+ port2 F1OAT-7 9600 256 2 UHF2 (9600 bit/s)
+ port3 F1OAT-8 9600 256 2 UHF3 (9600 bit/s)
+
+ commands :
+ setserial /dev/cua0 port 0 # to avoid conflict with yam driver
+ setserial /dev/cua1 port 0 # to avoid conflict with yam driver
+ setserial /dev/cua2 port 0 # to avoid conflict with yam driver
+ setserial /dev/cua3 port 0 # to avoid conflict with yam driver
+ insmod yam
+ yamcfg yam2 irq 5
+ yamcfg yam3 irq 7
+ ifconfig yam0 hw ax25 f1oat-9 up
+ ifconfig yam1 hw ax25 f1oat-8 up
+ ifconfig yam2 hw ax25 f1oat-7 up
+ ifconfig yam3 hw ax25 f1oat-6 up
+
+
+
+Good test !!!
+
+73's Frederic F1OAT and Jean-Paul F6FBB
diff --git a/yamdrv/mcs2h.c b/yamdrv/mcs2h.c
new file mode 100644
index 0000000..6914965
--- /dev/null
+++ b/yamdrv/mcs2h.c
@@ -0,0 +1,106 @@
+#include <stdio.h>
+#include <time.h>
+#include <string.h>
+
+int in2hex(char *ptr)
+{
+ char str[3];
+ int val;
+
+ memcpy(str, ptr, 2);
+ str[2] = '\0';
+
+ sscanf(str, "%x", &val);
+
+ return val;
+}
+
+unsigned char swap(unsigned char c)
+{
+ unsigned char r = 0;
+ int i;
+
+ for (i = 0 ; i < 8 ; i++)
+ {
+ r <<= 1;
+ if (c & 1)
+ r |= 1;
+ c >>= 1;
+ }
+ return r;
+}
+
+int in4hex(char *ptr)
+{
+ char str[5];
+ int val;
+
+ memcpy(str, ptr, 4);
+ str[4] = '\0';
+
+ sscanf(str, "%x", &val);
+
+ return val;
+}
+
+int main(int ac, char *av[])
+{
+ int nb, add, type, i;
+ int first = 1;
+ time_t temps;
+ FILE *fptr;
+ char buf[256];
+
+ if (ac != 3)
+ {
+ fprintf(stderr, "format : mcs2h 1200|9600 filename\n");
+ return 1;
+ }
+
+ fptr = fopen(av[2], "r");
+ if (fptr == NULL)
+ {
+ fprintf(stderr, "file %s not found\n", av[2]);
+ return 1;
+ }
+
+ time(&temps);
+
+ printf( "/*\n"
+ " *\n"
+ " * File %s converted to h format by mcs2h\n"
+ " *\n"
+ " * (C) F6FBB 1998\n"
+ " *\n"
+ " * %s"
+ " *\n"
+ " */\n\n",
+ av[2], ctime(&temps));
+
+ printf("static unsigned char bits_%s[]= {\n", av[1]);
+
+ while (fgets(buf, sizeof(buf), fptr))
+ {
+ nb = in2hex(buf+1);
+ add = in4hex(buf+3);
+ type = in2hex(buf+7);
+
+ if (type != 0)
+ continue;
+
+ if (first)
+ first = 0;
+ else
+ printf(",\n");
+
+ for (i = 0 ; i < nb ; i++)
+ {
+ printf("0x%02x%s", swap(in2hex(buf+9+i*2)), (i < (nb-1)) ? "," : "");
+ }
+ }
+
+ printf(" };\n");
+
+ fclose(fptr);
+ return 0;
+}
diff --git a/yamdrv/yam.h b/yamdrv/yam.h
new file mode 100644
index 0000000..7fe2822
--- /dev/null
+++ b/yamdrv/yam.h
@@ -0,0 +1,82 @@
+/*****************************************************************************/
+
+/*
+ * yam.h -- YAM radio modem driver.
+ *
+ * Copyright (C) 1998 Frederic Rible F1OAT (frible@teaser.fr)
+ * Adapted from baycom.c driver written by Thomas Sailer (sailer@ife.ee.ethz.ch)
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ *
+ */
+
+/*****************************************************************************/
+
+#define SIOCYAMRESERVED (0)
+#define SIOCYAMSCFG (1) /* Set configuration */
+#define SIOCYAMGCFG (2) /* Get configuration */
+#define SIOCYAMSMCS (3) /* Set mcs data */
+
+#define YAM_IOBASE (1 << 0)
+#define YAM_IRQ (1 << 1)
+#define YAM_BITRATE (1 << 2) /* Bit rate of radio port ->57600 */
+#define YAM_MODE (1 << 3) /* 0=simplex 1=duplex 2=duplex+tempo */
+#define YAM_HOLDDLY (1 << 4) /* duplex tempo (sec) */
+#define YAM_TXDELAY (1 << 5) /* Tx Delay (ms) */
+#define YAM_TXTAIL (1 << 6) /* Tx Tail (ms) */
+#define YAM_PERSIST (1 << 7) /* Persist (ms) */
+#define YAM_SLOTTIME (1 << 8) /* Slottime (ms) */
+#define YAM_BAUDRATE (1 << 9) /* Baud rate of rs232 port ->115200 */
+
+#define YAM_MAXBITRATE 57600
+#define YAM_MAXBAUDRATE 115200
+#define YAM_MAXMODE 2
+#define YAM_MAXHOLDDLY 99
+#define YAM_MAXTXDELAY 999
+#define YAM_MAXTXTAIL 999
+#define YAM_MAXPERSIST 255
+#define YAM_MAXSLOTTIME 999
+
+#define YAM_FPGA_SIZE 5302
+
+struct yamcfg {
+ unsigned int mask; /* Mask of commands */
+ unsigned int iobase; /* IO Base of COM port */
+ unsigned int irq; /* IRQ of COM port */
+ unsigned int bitrate; /* Bit rate of radio port */
+ unsigned int baudrate; /* Baud rate of the RS232 port */
+ unsigned int txdelay; /* TxDelay */
+ unsigned int txtail; /* TxTail */
+ unsigned int persist; /* Persistence */
+ unsigned int slottime; /* Slottime */
+ unsigned int mode; /* mode 0 (simp), 1(Dupl), 2(Dupl+delay) */
+ unsigned int holddly; /* PTT delay in FullDuplex 2 mode */
+};
+
+struct yamdrv_ioctl_cfg {
+ int cmd;
+ struct yamcfg cfg;
+};
+
+struct yamdrv_ioctl_mcs {
+ int cmd;
+ int bitrate;
+ unsigned char bits[YAM_FPGA_SIZE];
+};
diff --git a/yamdrv/yam08-2.0.36-patch.diff b/yamdrv/yam08-2.0.36-patch.diff
new file mode 100755
index 0000000..07e0712
--- /dev/null
+++ b/yamdrv/yam08-2.0.36-patch.diff
@@ -0,0 +1,2180 @@
+diff -u --recursive --new-file linux.prev/Documentation/Configure.help linux/Documentation/Configure.help
+--- linux.prev/Documentation/Configure.help Sat Sep 12 23:12:05 1998
++++ linux/Documentation/Configure.help Sat Sep 12 23:07:13 1998
+@@ -2284,6 +2284,13 @@
+ running kernel whenever you want), say M here and read
+ Documentation/modules.txt.
+
++YAM driver for AX.25
++CONFIG_YAM
++ Support for the YAM modem on serial port. If you want to compile this
++ as a module ( = code which can be inserted in and removed from the
++ running kernel whenever you want), say M here and read
++ Documentation/modules.txt.
++
+ BAYCOM ser12 and par96 driver for AX.25
+ CONFIG_BAYCOM
+ This is an experimental driver for Baycom style simple amateur radio
+diff -u --recursive --new-file linux.prev/drivers/net/Config.in linux/drivers/net/Config.in
+--- linux.prev/drivers/net/Config.in Sat Sep 12 23:11:49 1998
++++ linux/drivers/net/Config.in Sat Sep 12 22:02:40 1998
+@@ -46,6 +46,7 @@
+ tristate 'Z8530 SCC KISS emulation driver for AX.25' CONFIG_SCC
+ tristate 'STRIP (Metricom starmode radio IP)' CONFIG_STRIP
+ tristate 'AT&T WaveLAN & DEC RoamAbout DS support' CONFIG_WAVELAN
++ tristate 'YAM driver for AX.25' CONFIG_YAM
+ fi
+ #
+ # Ethernet
+diff -u --recursive --new-file linux.prev/drivers/net/Makefile linux/drivers/net/Makefile
+--- linux.prev/drivers/net/Makefile Sat Sep 12 23:11:49 1998
++++ linux/drivers/net/Makefile Sat Sep 12 22:01:01 1998
+@@ -515,6 +515,14 @@
+ endif
+ endif
+
++ifeq ($(CONFIG_YAM),y)
++L_OBJS += yam.o
++else
++ ifeq ($(CONFIG_YAM),m)
++ M_OBJS += yam.o
++ endif
++endif
++
+ ifeq ($(CONFIG_PI),y)
+ L_OBJS += pi2.o
+ else
+diff -u --recursive --new-file linux.prev/drivers/net/Space.c linux/drivers/net/Space.c
+--- linux.prev/drivers/net/Space.c Sat Sep 12 23:11:49 1998
++++ linux/drivers/net/Space.c Sat Sep 12 22:01:42 1998
+@@ -352,6 +352,16 @@
+ #define NEXT_DEV (&mkiss_bootstrap)
+ #endif /* MKISS */
+
++#if defined(CONFIG_YAM)
++ /* To be exact, this node just hooks the initialization
++ routines to the device structures. */
++extern int yam_init(struct device *);
++static struct device yam_bootstrap = {
++ "yam", 0x0, 0x0, 0x0, 0x0, 0, 0, 0, 0, 0, NEXT_DEV, yam_init, };
++#undef NEXT_DEV
++#define NEXT_DEV (&yam_bootstrap)
++#endif /* CONFIG_YAM */
++
+ #if defined(CONFIG_STRIP)
+ extern int strip_init_ctrl_dev(struct device *);
+ static struct device strip_bootstrap = {
+diff -u --recursive --new-file linux.prev/include/linux/yam.h linux/include/linux/yam.h
+--- linux.prev/include/linux/yam.h Thu Jan 1 00:00:00 1970
++++ linux/include/linux/yam.h Sat Sep 12 22:03:24 1998
+@@ -0,0 +1,82 @@
++/*****************************************************************************/
++
++/*
++ * yam.h -- YAM radio modem driver.
++ *
++ * Copyright (C) 1998 Frederic Rible F1OAT (frible@teaser.fr)
++ * Adapted from baycom.c driver written by Thomas Sailer (sailer@ife.ee.ethz.ch)
++ *
++ * 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 2 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, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Please note that the GPL allows you to use the driver, NOT the radio.
++ * In order to use the radio, you need a license from the communications
++ * authority of your country.
++ *
++ *
++ */
++
++/*****************************************************************************/
++
++#define SIOCYAMRESERVED (0)
++#define SIOCYAMSCFG (1) /* Set configuration */
++#define SIOCYAMGCFG (2) /* Get configuration */
++#define SIOCYAMSMCS (3) /* Set mcs data */
++
++#define YAM_IOBASE (1 << 0)
++#define YAM_IRQ (1 << 1)
++#define YAM_BITRATE (1 << 2) /* Bit rate of radio port ->57600 */
++#define YAM_MODE (1 << 3) /* 0=simplex 1=duplex 2=duplex+tempo */
++#define YAM_HOLDDLY (1 << 4) /* duplex tempo (sec) */
++#define YAM_TXDELAY (1 << 5) /* Tx Delay (ms) */
++#define YAM_TXTAIL (1 << 6) /* Tx Tail (ms) */
++#define YAM_PERSIST (1 << 7) /* Persist (ms) */
++#define YAM_SLOTTIME (1 << 8) /* Slottime (ms) */
++#define YAM_BAUDRATE (1 << 9) /* Baud rate of rs232 port ->115200 */
++
++#define YAM_MAXBITRATE 57600
++#define YAM_MAXBAUDRATE 115200
++#define YAM_MAXMODE 2
++#define YAM_MAXHOLDDLY 99
++#define YAM_MAXTXDELAY 999
++#define YAM_MAXTXTAIL 999
++#define YAM_MAXPERSIST 255
++#define YAM_MAXSLOTTIME 999
++
++#define YAM_FPGA_SIZE 5302
++
++struct yamcfg {
++ unsigned int mask; /* Mask of commands */
++ unsigned int iobase; /* IO Base of COM port */
++ unsigned int irq; /* IRQ of COM port */
++ unsigned int bitrate; /* Bit rate of radio port */
++ unsigned int baudrate; /* Baud rate of the RS232 port */
++ unsigned int txdelay; /* TxDelay */
++ unsigned int txtail; /* TxTail */
++ unsigned int persist; /* Persistence */
++ unsigned int slottime; /* Slottime */
++ unsigned int mode; /* mode 0 (simp), 1(Dupl), 2(Dupl+delay) */
++ unsigned int holddly; /* PTT delay in FullDuplex 2 mode */
++};
++
++struct yamdrv_ioctl_cfg {
++ int cmd;
++ struct yamcfg cfg;
++};
++
++struct yamdrv_ioctl_mcs {
++ int cmd;
++ int bitrate;
++ unsigned char bits[YAM_FPGA_SIZE];
++};
+diff -u --recursive --new-file linux.prev/drivers/net/yam1200.h linux/drivers/net/yam1200.h
+--- linux.prev/drivers/net/yam1200.h Thu Jan 1 00:00:00 1970
++++ linux/drivers/net/yam1200.h Sat Sep 12 22:03:34 1998
+@@ -0,0 +1,343 @@
++/*
++ *
++ * File yam1k2b5.mcs converted to h format by mcs2h
++ *
++ * (C) F6FBB 1998
++ *
++ * Tue Aug 25 20:24:08 1998
++ *
++ */
++
++static unsigned char bits_1200[]= {
++0xff,0xf2,0x00,0xa5,0xad,0xff,0xfe,0x9f,0xff,0xef,0xf3,0xcb,0xff,0xdb,0xfc,0xf2,
++0xff,0xf6,0xff,0x3c,0xbf,0xfd,0xbf,0xdf,0x6e,0x3f,0x6f,0xf1,0x7d,0xb4,0xfd,0xbf,
++0xdf,0x6f,0x3f,0x6f,0xf7,0x0b,0xff,0xdb,0xfd,0xf2,0xff,0xf6,0xff,0xff,0xff,0xff,
++0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xdf,0xff,0xff,0xff,0xef,0xff,0xff,0xff,
++0xfd,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xbf,
++0xff,0xff,0xf7,0xff,0xff,0xfb,0xff,0xff,0xff,0xfc,0xff,0xfe,0xff,0xff,0xff,0xf0,
++0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xf1,0xff,0xff,0xfe,0x7f,0xbf,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xfb,0xff,0xff,0xff,0xf0,0x9f,
++0xff,0xff,0xff,0xfe,0xff,0xfd,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xf7,0xff,
++0xff,0xff,0xfb,0xff,0xfb,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf7,0xff,0xff,0xfb,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xef,0xff,0xf0,0x5f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xef,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xbf,0xff,0xff,0xdf,0xf7,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xfb,0xfe,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,
++0xff,0xff,0xff,0xfd,0xff,0xbf,0xf1,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xfb,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x6f,0xff,0xff,0xff,
++0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xf7,0xff,0xff,0xf1,0xff,0xff,0xf7,0xbf,0xe7,0xff,0xff,0xff,0xff,0xfb,
++0xff,0xff,0xff,0xff,0xff,0xff,0x77,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xdb,
++0xff,0xff,0xf5,0xa5,0xfd,0x4b,0x6e,0xef,0x33,0x32,0xdd,0xd3,0x4a,0xd6,0x92,0xfe,
++0xb3,0x3f,0xbd,0xf1,0xfa,0xdb,0xfe,0xf7,0xf6,0x96,0xbd,0xbd,0xff,0xbd,0xff,0xed,
++0x7f,0x6b,0x7f,0xfb,0xdf,0xfe,0xfb,0xfe,0x90,0xcf,0xff,0xff,0xff,0xfe,0xbe,0xef,
++0xff,0xff,0xdb,0x5f,0xf6,0xff,0xf6,0x8f,0xfd,0xa5,0xdd,0xff,0xff,0xff,0xff,0x6f,
++0x7f,0xdb,0xf1,0xfc,0xbf,0xff,0x6f,0xff,0xef,0xfc,0x5b,0x5d,0xda,0xdf,0xf4,0xff,
++0xf2,0xff,0xfd,0xbf,0xff,0xff,0xff,0xd0,0x1f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xfb,0xef,0xb7,0xfc,0x33,0xff,0xfb,0xff,0x04,0x6a,0xf3,0x3c,0x36,0xff,0xf0,
++0x0f,0xf1,0x0f,0xff,0xff,0xff,0xf3,0x15,0x72,0x0f,0xf1,0x6f,0xff,0xfe,0x94,0x3f,
++0xff,0xff,0xff,0x7b,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf0,
++0xf7,0xef,0xb7,0xfc,0x33,0xff,0xff,0xff,0x04,0x6a,0xf3,0x3c,0x36,0xff,0xf0,0x0f,
++0xf1,0x0f,0xff,0xff,0xff,0xf3,0x15,0x73,0x8f,0xf2,0x6f,0xff,0xfe,0x94,0x3f,0xff,
++0xff,0xff,0x7d,0x9f,0xff,0xf0,0x0f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0x9e,
++0xff,0xfc,0xef,0xd3,0xfb,0xff,0x7f,0xf5,0x5f,0xfe,0x59,0xff,0xff,0xff,0xfc,0xf1,
++0xfe,0x7f,0xff,0xff,0xfa,0x17,0xff,0xe7,0xef,0xef,0xff,0xff,0x3f,0xf1,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xf5,0xff,0xbf,0xff,0xfc,0xea,
++0xff,0xf0,0xff,0xff,0xbf,0xf9,0x3f,0xb1,0xef,0xff,0xd7,0xff,0xfb,0xff,0xf0,0xff,
++0xff,0xf3,0xff,0xdf,0xff,0x7b,0xff,0xfd,0xff,0xf6,0xff,0xbf,0xff,0xff,0xbf,0xff,
++0xff,0xff,0xda,0xf0,0xff,0xff,0xff,0xff,0xfe,0xf2,0xc0,0x01,0x00,0x00,0x02,0x02,
++0x02,0x02,0x00,0x40,0x40,0x40,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0x00,0x00,
++0x00,0x00,0x00,0x00,0x19,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
++0x00,0x3c,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xfb,0xff,0xfd,0xff,
++0xff,0x7f,0xff,0xff,0xbf,0xff,0xef,0xff,0xff,0xfd,0xff,0xff,0xf1,0xff,0xdf,0xff,
++0xff,0xff,0xff,0xff,0xff,0xbf,0xfe,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xdf,
++0xdb,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xf0,0xbf,0xdf,0xff,0x7f,0xff,0xff,0xff,0xff,
++0xdf,0xdf,0xff,0xef,0xff,0x9e,0xef,0xff,0xff,0x7f,0xff,0xf1,0xef,0xff,0xff,0xff,
++0xf7,0xfa,0xbf,0xff,0xff,0xfe,0x47,0xef,0xff,0xbd,0xf6,0xff,0xff,0xdf,0xf5,0xf0,
++0xf0,0xef,0xff,0xff,0xff,0xfe,0xf8,0x30,0x00,0x00,0x00,0x04,0x00,0x01,0x02,0x08,
++0x16,0x00,0x00,0x00,0x80,0x00,0x01,0x02,0x00,0x80,0x01,0x0c,0x02,0x00,0x00,0x01,
++0x00,0x00,0x20,0x00,0x00,0x06,0x00,0x20,0x00,0x10,0x00,0x14,0x00,0x04,0xc1,0xf0,
++0x2f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0x7f,
++0xec,0xff,0xff,0xfa,0xff,0xbf,0xff,0x6f,0xff,0xe1,0xff,0xff,0xff,0xff,0xbd,0xfe,
++0x46,0xff,0xef,0x7f,0xcd,0xdf,0xff,0xff,0xfd,0xff,0xbd,0xff,0x7f,0x7f,0xf0,0x4f,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x0f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0xa4,0xbc,0xcd,0x6d,0x6b,0x6f,0x5b,0xdc,0x33,
++0x5a,0xf6,0xf7,0xf6,0xb3,0x3f,0xbd,0xc1,0xfa,0x5a,0xf6,0xf6,0xb6,0xf7,0xff,0xbd,
++0xbb,0x3c,0xce,0xcf,0x34,0xef,0x33,0xbb,0xcc,0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,
++0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,0xf6,0xd6,0xff,0xfd,0xfd,0xbf,0xff,0xad,
++0xbf,0xf9,0x7f,0x6f,0xfc,0xdb,0xf1,0xfd,0xbf,0xff,0x6f,0xff,0xff,0xda,0xdb,0xfc,
++0xdb,0xff,0x76,0x8f,0xf6,0xff,0xcd,0xab,0xfe,0xfb,0xff,0xd0,0xff,0xff,0xff,0xff,
++0xfe,0xff,0x9f,0xff,0xf4,0x20,0xaf,0x6d,0x0b,0xc1,0x7b,0xff,0xff,0xff,0xcb,0xff,
++0x3f,0xf0,0xef,0x7f,0x0f,0xf1,0xc3,0x3c,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x0b,
++0x1d,0x6a,0x64,0x05,0x6b,0x99,0x01,0xff,0xfd,0xef,0xf0,0x2f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xf4,0x00,0x2f,0xcc,0x0b,0xc3,0x7f,0xff,0xff,0xff,0x0a,0xdf,0xbf,
++0xfd,0x7f,0xff,0xff,0xf1,0xc3,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x4a,0x0e,
++0x96,0x64,0x02,0x97,0x99,0x10,0xff,0xff,0xff,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xfe,0x84,0xf9,0xd5,0x27,0xf1,0x7f,0xff,0xf8,0xeb,0xdf,0xf3,0xcf,0x3f,
++0x1f,0xff,0xf7,0x11,0xff,0xcf,0xff,0xfe,0x67,0xff,0xff,0xff,0xff,0xc4,0xff,0xff,
++0xb3,0xa1,0xff,0xf9,0xe0,0xff,0xff,0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xf5,0xff,
++0xff,0xfb,0x7f,0xe0,0xff,0xc7,0xfe,0x7f,0x3f,0xff,0xfd,0x77,0x8d,0x7f,0x0f,0xff,
++0xc3,0xff,0xf1,0xbf,0x8f,0xcf,0xff,0xff,0xdd,0x7b,0xff,0xf6,0xfa,0xf7,0xff,0x40,
++0x9f,0xf9,0x7f,0xd8,0xff,0xff,0xfa,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xf1,0xc0,0x00,
++0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x10,0x00,0x00,0x10,
++0x00,0x01,0x00,0x10,0x20,0x20,0x00,0x00,0x10,0x00,0x04,0x01,0x05,0x00,0x00,0x00,
++0x00,0x40,0x40,0x00,0x00,0x3c,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,
++0xff,0xff,0xfe,0x7f,0x7f,0xff,0xef,0xff,0xff,0xdf,0xff,0xff,0xdf,0xff,0xef,0xf7,
++0xf1,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xf7,0xff,0xff,0xff,0xfc,0xfd,0xff,0x7f,
++0x7e,0xff,0xff,0xff,0xdb,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xf0,0xbb,0xff,0xff,0xff,
++0xff,0xff,0xfe,0xeb,0xfd,0x6f,0xff,0xf7,0xfe,0xf5,0x7f,0xff,0xff,0x7f,0xbf,0xb1,
++0xff,0xff,0x9f,0xbf,0xfb,0xff,0xfe,0xff,0xfe,0xff,0xf7,0xeb,0xdf,0xbf,0x5f,0xdd,
++0xff,0xdb,0xfd,0xd0,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xf8,0x30,0x20,0x00,0x42,0x00,
++0x00,0x00,0x30,0x18,0x04,0x08,0x09,0x21,0x82,0x80,0x02,0x00,0x08,0x00,0x01,0x00,
++0x00,0x00,0x0c,0x20,0x10,0x00,0x11,0x00,0x44,0x84,0x00,0x20,0x20,0x84,0x80,0x00,
++0x00,0x00,0xc1,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xf7,0xff,0xfb,0xdd,0xf9,0xff,
++0xda,0xff,0xdc,0xdd,0xfc,0xfb,0xff,0xbf,0xfb,0x3e,0xd7,0x96,0xfe,0x61,0xf7,0xff,
++0x7f,0xff,0x3f,0xfd,0xff,0xdf,0xcf,0xf7,0xdf,0xf7,0xbf,0xfd,0xff,0xfe,0xef,0xef,
++0xfe,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf3,0xbd,0xfd,0x4b,0x74,0xcf,
++0x73,0x5b,0xcb,0x3b,0xdf,0xfe,0xf7,0xfe,0xd3,0x75,0xac,0xa1,0xfb,0xdf,0xfe,0xf7,
++0x76,0x96,0xb5,0x24,0xbd,0xa5,0xad,0x49,0x2f,0x69,0x2b,0x52,0x5b,0xbd,0xff,0xff,
++0xf0,0xcf,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,0xf6,0xfe,0xff,0xcc,
++0xa7,0xfb,0xad,0xff,0x7f,0x6f,0xff,0x6d,0x7f,0xdb,0xf1,0xfd,0xbf,0xff,0x6f,0xff,
++0x6f,0xff,0xdb,0xff,0xdb,0xff,0xf6,0x97,0xf6,0xff,0xb5,0xb5,0xff,0xff,0xff,0xd0,
++0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0xa5,0xbc,0x43,0xfc,0x7c,0x03,0xe7,
++0xff,0xff,0x20,0xff,0xff,0xff,0xcc,0xfd,0x7d,0xf1,0xff,0xff,0xff,0xff,0xd5,0x59,
++0xba,0x56,0x66,0x6a,0xad,0x9a,0xa9,0x9a,0x97,0xa5,0xaa,0xbb,0xff,0xff,0xf0,0x0f,
++0xff,0xff,0xff,0xfe,0xfe,0xfb,0xff,0xfd,0xf7,0xfd,0x43,0xff,0xfd,0x6b,0xe7,0xff,
++0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0x3f,0xf1,0xff,0xff,0xff,0xff,0xd5,0x59,0xb5,
++0xa6,0x66,0x6a,0xad,0x9a,0xa9,0x99,0x6b,0x5a,0xaa,0xff,0xff,0xb7,0xf0,0x3f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0x9c,0xf7,0xfd,0xd2,0x41,0xff,0xff,0xf2,0x7f,
++0x8f,0xff,0xff,0x3d,0xf3,0xff,0x17,0xf1,0xff,0xff,0xff,0xff,0xff,0x7f,0xdf,0xfc,
++0x8f,0x38,0xff,0xef,0x23,0xff,0xfb,0xf7,0xc8,0xff,0xff,0xff,0xf0,0x9f,0xff,0xff,
++0xff,0xfe,0xf5,0x7f,0xff,0xfd,0xff,0xe4,0xff,0xeb,0xff,0xcf,0xbf,0xfa,0xff,0xab,
++0xef,0xff,0xfb,0xff,0xf3,0xfd,0x61,0xff,0xff,0xff,0xff,0xfa,0xff,0xfb,0xfd,0x0d,
++0xff,0xfe,0xff,0x43,0x7f,0xfe,0xbf,0xd0,0xfd,0xff,0xfa,0xf0,0x3f,0xff,0xff,0xff,
++0xfe,0xf3,0xc0,0x00,0x00,0x00,0x02,0x00,0x02,0x01,0x00,0x60,0xc0,0x40,0x00,0x00,
++0x00,0x00,0x34,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x88,0x00,
++0x00,0x03,0x00,0x00,0x40,0x00,0x40,0x00,0x00,0x3c,0xf0,0x3f,0xff,0xff,0xff,0xfe,
++0xfd,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0xbf,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf7,0xf1,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xfd,0xff,
++0xff,0xff,0xff,0xfe,0xfe,0x5f,0xff,0xff,0xcb,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xf0,
++0xff,0xff,0xfd,0xff,0xef,0xe3,0xde,0xee,0xd9,0xc5,0x93,0xff,0xff,0xfe,0xfe,0xff,
++0xfb,0xee,0xfe,0xf1,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xbf,0xf7,0xff,0xff,0x7f,
++0xaf,0xbd,0xdf,0xdf,0xfb,0xf3,0xf3,0xf0,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xf8,0x34,
++0x00,0x06,0x61,0x00,0x18,0x01,0xa0,0x05,0x17,0x00,0x20,0x05,0x28,0x20,0x00,0x00,
++0x05,0x00,0x41,0x00,0x00,0x40,0x00,0x09,0x00,0x01,0x20,0x86,0x82,0x08,0x40,0x03,
++0x80,0x30,0x70,0x08,0x14,0x02,0xc1,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xff,0xbd,0xef,0xfb,0xff,0xff,0xfb,0x9c,0x7f,0xef,0xdf,0xff,0xbf,0xeb,0xde,
++0xff,0xc1,0x7f,0xff,0xfb,0x7f,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,0xdf,0xbf,0xef,
++0x3f,0xf7,0x8f,0xef,0x7f,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xbd,
++0xdf,0xef,0x7d,0x6d,0x2b,0x5a,0x5d,0xd2,0xdf,0xf6,0x92,0xb6,0xb2,0xb3,0xac,0xa1,
++0xfb,0xdf,0xfe,0xf1,0xee,0xf5,0xf6,0xbc,0x6b,0xbd,0x7d,0xaf,0x1a,0xef,0x5f,0x6b,
++0xc6,0xff,0xff,0xff,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,
++0xf6,0xff,0xf6,0xb7,0xfd,0xad,0xfd,0xbf,0xf3,0x6f,0xff,0x6f,0xff,0xdb,0xd1,0xfd,
++0xbf,0xff,0x6f,0xf5,0x6b,0xbc,0x5b,0x3c,0xda,0xef,0x16,0xaf,0x16,0xff,0xcd,0xab,
++0xff,0x6f,0xff,0xd0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfc,0xbf,0xff,0xff,
++0xff,0x6c,0x03,0x10,0xc1,0xf3,0xff,0xf3,0x3a,0xf3,0xca,0xff,0xaf,0xf1,0xff,0xff,
++0xff,0xff,0xd9,0x96,0xa6,0x65,0xa6,0x66,0x6a,0x95,0x69,0x69,0x6a,0x5a,0x5a,0xff,
++0xff,0x5f,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,
++0xea,0x0f,0x50,0xc3,0xf3,0x7f,0xff,0xf3,0xf3,0xc3,0xff,0xaf,0xf1,0xff,0xff,0xff,
++0xff,0xd9,0x96,0xa6,0x65,0xa6,0x66,0x6a,0x95,0x69,0x69,0x6a,0x5a,0x5a,0xff,0xff,
++0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xd7,0xff,0xff,0x5f,0xc1,
++0x3f,0xf7,0x5e,0xf5,0xce,0x9e,0x5f,0x3f,0x17,0xff,0xf3,0xe1,0xff,0xff,0xff,0xff,
++0xd8,0xff,0xfa,0xfe,0x67,0xff,0xfe,0xbf,0x5a,0xff,0xff,0xaf,0xf5,0xff,0xff,0xff,
++0xf0,0x2f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xfd,0xff,0xf7,0xff,0xfd,0x4e,0x3d,
++0x3f,0xe7,0x0b,0xbf,0x8f,0xf9,0xff,0xeb,0xe3,0xff,0xe1,0xff,0xff,0xfc,0xff,0xc7,
++0x9f,0xff,0x3e,0x39,0xe5,0xff,0xcf,0x9b,0xf9,0xff,0xff,0xc5,0xff,0xff,0xfa,0xf0,
++0x5f,0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
++0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x20,
++0x00,0x01,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xf0,0x4f,
++0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xbf,
++0x3f,0xff,0xff,0xbf,0xff,0xff,0xff,0xfb,0xf1,0xff,0xff,0xff,0xff,0xf7,0xff,0xf7,
++0xff,0xed,0xff,0xfb,0xfe,0xff,0x7f,0xff,0x7f,0xdf,0xff,0xff,0xdd,0xf0,0x3f,0xff,
++0xff,0xff,0xfe,0xf0,0xff,0xff,0xf3,0xff,0xf7,0xff,0xfe,0x5f,0xff,0xf7,0xff,0xff,
++0xdf,0xff,0xff,0xff,0xf7,0xfe,0x7b,0xf1,0xff,0xfd,0xfd,0xff,0xdf,0xdf,0xff,0x7d,
++0x73,0xf9,0xff,0xc3,0x7e,0xfe,0xff,0xef,0xd7,0xff,0xcf,0xd0,0xf0,0x6f,0xff,0xff,
++0xff,0xfe,0xf8,0x30,0x00,0x00,0x40,0x04,0x00,0x01,0x41,0x20,0x00,0x04,0x00,0x02,
++0xd5,0x09,0x00,0x02,0x80,0x02,0x01,0x00,0x00,0x00,0x0a,0x04,0x00,0x07,0x00,0x01,
++0x50,0x01,0x80,0x02,0x61,0x40,0x41,0x0c,0x14,0x08,0xc1,0xf0,0x9f,0xff,0xff,0xff,
++0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xdf,0xcb,0x5f,0xfe,0xef,0xff,0xfe,
++0xff,0x3f,0xff,0x7f,0xfd,0xc1,0xff,0xff,0x7f,0xff,0xdf,0xfd,0xfc,0xfd,0xf7,0xee,
++0xff,0xff,0x4e,0xff,0xdf,0xcf,0xdb,0xeb,0xff,0xff,0xf0,0x1f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,0xfe,0x7f,
++0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,
++0xf7,0xfb,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0x7f,0xff,0xff,0xff,0x7f,0xff,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xdd,0xff,
++0xff,0xff,0xa5,0xff,0x6f,0x6b,0xe9,0x6f,0xda,0xca,0xfb,0xdd,0xee,0xf7,0xf6,0xb2,
++0xb3,0xa4,0xa1,0x5b,0x5b,0xf6,0xd7,0xf4,0xf7,0x7b,0xbd,0xbd,0xad,0xcf,0xef,0x7f,
++0x6b,0x7f,0x3b,0xdf,0xdb,0xff,0xff,0x30,0xcf,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,
++0xff,0xff,0xff,0xf6,0xfe,0x96,0xff,0xfd,0xb5,0xfd,0xbf,0xad,0x7f,0xff,0x6f,0xff,
++0xde,0xd1,0xad,0xad,0xe9,0xff,0xf1,0xec,0xef,0xde,0x3f,0xcb,0xff,0xf6,0xff,0x32,
++0xff,0xc5,0xbd,0xff,0xff,0xff,0xd0,0xbf,0xff,0xff,0xff,0xfe,0xfe,0xfb,0xff,0xf4,
++0x28,0xbf,0xff,0xfd,0xfb,0xd3,0xff,0xff,0x42,0xff,0xff,0xff,0xea,0xb3,0xfc,0xc3,
++0xc1,0xff,0x33,0xff,0xc0,0x15,0x6b,0x70,0xff,0xf0,0xf2,0x4f,0xff,0xfc,0x3e,0x97,
++0x3c,0xff,0xff,0xfd,0xef,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0x78,
++0xbf,0xff,0xfd,0xf3,0xef,0x55,0xff,0x7e,0xff,0xff,0xff,0xea,0xb3,0xfc,0xc3,0xc1,
++0xff,0x33,0xff,0xc0,0x15,0x6f,0xff,0x0f,0xf0,0xf0,0x0f,0xff,0xfc,0x3d,0x6b,0xc3,
++0xff,0xff,0xfe,0xf7,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfc,0xff,
++0xff,0x23,0xf8,0x7f,0xff,0x4e,0xff,0xff,0xff,0xfb,0xf9,0x17,0xff,0xf6,0xf1,0xff,
++0xcf,0xef,0xff,0xff,0x13,0xdf,0xe6,0x2f,0xc7,0xff,0xff,0xe7,0xc1,0xfd,0xff,0xfe,
++0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xff,0xfe,0xae,0xff,
++0xff,0x7f,0x3b,0x3f,0xfc,0x7f,0xfc,0xef,0xff,0xfc,0xe2,0x7b,0xff,0xf1,0xfd,0xed,
++0xef,0xff,0xff,0x35,0x73,0xff,0xff,0xfe,0xfa,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,
++0xff,0xfa,0xf0,0x8f,0xff,0xff,0xff,0xfe,0xf1,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
++0x00,0x00,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x00,0x0c,0x04,0x01,0x40,0x40,0x00,
++0x00,0x30,0x28,0x04,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,
++0x38,0xf0,0x0f,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xfb,0xff,0x7f,
++0xff,0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xdf,0xdf,0xff,
++0xff,0xff,0xff,0xed,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xbf,0xbf,0xff,0xff,0xc3,
++0xf0,0x3f,0xff,0xff,0xff,0xfe,0xf0,0xbf,0xfd,0xff,0xbf,0xff,0xff,0xfd,0xff,0xff,
++0xff,0xff,0xff,0xfd,0x7b,0xff,0x7f,0xff,0xbd,0xff,0xf1,0xef,0xff,0xff,0xfd,0xdf,
++0xfd,0xfb,0xff,0xff,0xbf,0xbe,0xff,0xcd,0x7f,0xfc,0xf7,0xf7,0x6f,0xbf,0xd8,0xf0,
++0xef,0xff,0xff,0xff,0xfe,0xf8,0x30,0x00,0x00,0x00,0x04,0x00,0x00,0xa0,0x00,0x00,
++0xc0,0x00,0x00,0x20,0x34,0x00,0x00,0x00,0x0c,0x81,0x00,0x20,0xa4,0x20,0x00,0x10,
++0x08,0x04,0x48,0x08,0x00,0x40,0x93,0x00,0x10,0x00,0x38,0x18,0x20,0xc1,0xf0,0x3f,
++0xff,0xff,0xff,0xfe,0xff,0xfb,0xff,0xff,0xb9,0xdf,0xfe,0xb3,0xff,0xff,0xe7,0xfd,
++0xff,0xff,0x3b,0xff,0x7f,0xff,0xbf,0xff,0xc1,0xff,0xfc,0xff,0xff,0x3f,0x77,0xfe,
++0xfe,0xcf,0xff,0xbf,0xfd,0xbf,0xff,0xfe,0xed,0xf2,0xfd,0xf7,0xff,0xf0,0x2f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xbf,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xf3,0xad,0xcf,0xef,0x70,0xc9,0x73,0x3b,0xdf,0x5b,0x4a,
++0xf6,0xb7,0xfe,0xd7,0xf5,0xbc,0xc1,0x33,0xca,0xd6,0xb7,0x6e,0xf7,0xfb,0xbd,0xc5,
++0x24,0xcf,0x6f,0x2f,0x4d,0x2b,0xba,0x5a,0xff,0xff,0xff,0xf0,0xaf,0xff,0xff,0xff,
++0xfe,0xbf,0xff,0xff,0xff,0xff,0xf6,0xf6,0xd7,0xff,0xff,0xad,0xbd,0xff,0xff,0xff,
++0xef,0xf7,0x7f,0xfc,0x5b,0xb1,0xfd,0xbd,0x75,0x6f,0xef,0x6a,0xfd,0x5b,0xfb,0xdb,
++0x3a,0xbf,0x8e,0x9f,0xff,0xbf,0xfd,0xff,0x6f,0xff,0xd0,0x6f,0xff,0xff,0xff,0xfe,
++0xff,0xbb,0xff,0xf0,0x3f,0xff,0xff,0xfd,0xfb,0x7f,0xde,0xff,0xff,0x5a,0xd6,0xbf,
++0xd8,0x2a,0xbf,0xbf,0xf1,0xe5,0xff,0xcc,0xc0,0xa9,0x70,0xff,0xf3,0x3c,0x3c,0xfd,
++0x57,0xfd,0x98,0x03,0x00,0xc3,0xff,0xff,0xff,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0x3d,0xbf,0xff,0xfd,0xfb,0xff,0xdb,0xff,0xff,0x0f,0xfc,0x3f,0xd8,
++0x2a,0xbf,0xbf,0xf1,0xef,0xff,0xcc,0xc0,0x96,0xbe,0xff,0xf3,0x3f,0xff,0xfd,0x57,
++0xfd,0x99,0x0f,0xff,0xc3,0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xf1,0xe7,0xff,0xff,0xf3,0x8e,0x7b,0xff,0xa8,0xff,0xdf,0x7f,0x8e,0x78,0x73,
++0xff,0xf1,0x51,0x62,0xff,0xfc,0x4b,0xff,0xf3,0xff,0x7e,0xcf,0xf9,0xff,0xfd,0xff,
++0xff,0x7f,0xff,0xe0,0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,
++0xfb,0xfd,0xae,0xff,0xfc,0xfe,0x6f,0x3f,0xf8,0xfd,0x77,0xaf,0xfe,0x37,0xfe,0x7b,
++0xff,0xb1,0x8c,0xff,0xef,0xfd,0xf8,0xe7,0xbf,0xff,0xf1,0xfe,0x3e,0xf7,0xfe,0x95,
++0x3e,0xbf,0xff,0xff,0xff,0xfa,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xf1,0xc0,0x00,0x00,
++0x01,0x04,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x08,
++0x41,0x80,0x10,0x00,0x00,0x08,0x10,0x84,0x00,0x0c,0x04,0x02,0x61,0x00,0x00,0x81,
++0x00,0x00,0x00,0x00,0x3d,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,
++0xff,0xff,0x7f,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,
++0x7f,0xbf,0xf7,0x7f,0xef,0xff,0xef,0xff,0xf7,0xfd,0xff,0xff,0xfd,0x7f,0xff,0xbe,
++0xdf,0xff,0xff,0xd9,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xf0,0xbb,0xff,0x7f,0xfb,0xff,
++0xfb,0xff,0xbf,0xff,0xf3,0x7f,0xfb,0xfd,0xeb,0x7f,0xdf,0xfa,0xff,0xde,0xf0,0xed,
++0xff,0xb1,0xf7,0xf9,0x1f,0xb5,0x5b,0xfe,0x7e,0xf7,0xbe,0xfd,0x7f,0x5f,0xb5,0xf7,
++0xff,0xff,0xd0,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf8,0x30,0x01,0x00,0x07,0x42,0x01,
++0x00,0x6a,0x18,0x50,0x80,0x00,0x00,0x02,0x40,0x01,0x01,0x20,0x01,0x01,0x24,0x14,
++0x21,0x10,0x02,0x08,0x07,0x08,0x00,0x40,0x10,0x80,0x58,0x00,0x84,0x80,0x18,0x10,
++0x40,0xc1,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf7,0xff,0xdb,0xb7,0xf3,
++0xdf,0x7c,0xf8,0x74,0xff,0xff,0x6f,0x7d,0x3f,0x7e,0xec,0x7f,0xc1,0xf5,0xff,0xcf,
++0x6f,0x9f,0xf9,0xdf,0xbe,0xe5,0xe7,0xff,0xd7,0xf3,0xdd,0xfb,0xff,0xfc,0xff,0xbf,
++0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf0,0x2f,0xff,0xff,0xff,0xfe,0xd7,0xff,0xff,0xff,0xb4,0xcf,0xef,0x77,0x6f,0x73,
++0x3a,0x4a,0x3a,0xcb,0xd4,0xf7,0x2e,0xd6,0xbd,0xbd,0xa1,0x3b,0xdf,0xd6,0xf7,0xee,
++0xd3,0x35,0xbd,0xfb,0xbd,0xce,0xeb,0x2b,0x4d,0x2f,0xbb,0xda,0xff,0xff,0xfe,0xb0,
++0x5f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdf,0x5f,0x36,0xaf,0x3f,0xed,0xb7,
++0xf5,0xfd,0xf3,0x2b,0xef,0x77,0xff,0xfb,0xda,0xb1,0xbd,0xa3,0x77,0x69,0x7f,0x4f,
++0xff,0xdb,0xfa,0x5b,0xff,0xf2,0xfe,0xff,0x96,0xff,0xff,0xfe,0xdf,0xff,0xd0,0xaf,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0x8f,0xfd,0x40,0x6f,0x9e,0x83,0x5a,0x0f,
++0xfa,0xc3,0xff,0xff,0xfc,0xe9,0x7f,0xf3,0x01,0xd0,0x00,0xfe,0xbf,0xcd,0x3f,0xf0,
++0xef,0xfc,0xc5,0x0c,0x3f,0xfd,0x68,0x0b,0xff,0xff,0xff,0xfe,0xdf,0xf0,0xff,0xff,
++0xff,0xff,0xfe,0xff,0xbb,0xff,0xfd,0x85,0xff,0xd4,0x6f,0x9f,0xc3,0x5a,0x0f,0xff,
++0xff,0xff,0xff,0xfc,0xe9,0x7f,0xf3,0x01,0xf0,0xfb,0xc2,0xbf,0xfc,0x00,0x37,0xef,
++0xfc,0xcd,0xbc,0x3f,0xff,0x0c,0xbf,0xff,0xff,0xff,0xff,0xff,0xf0,0x5f,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0xd9,0xf7,0xd1,0xb7,0x7e,0x7f,0xf1,0xe4,0xfd,0xff,
++0xfb,0xfb,0xff,0x5f,0xff,0x7f,0xb1,0xbc,0x0f,0x67,0xeb,0xb8,0x3f,0xff,0xe2,0xff,
++0xe9,0xff,0xfd,0xe3,0xff,0x3f,0x9f,0xc2,0xff,0xff,0xff,0xf0,0x9f,0xff,0xff,0xff,
++0xfe,0xf5,0x7f,0xff,0xf0,0x3f,0xbc,0xff,0xd5,0xf5,0xce,0x3f,0xfe,0xff,0xfe,0x6d,
++0xff,0xf1,0xbf,0x7b,0xff,0xf1,0xfd,0xff,0x4f,0xff,0x87,0xff,0xae,0xff,0xb1,0xf8,
++0xfe,0xff,0xff,0x78,0x01,0xb9,0xff,0xff,0xff,0xfa,0xf0,0x2f,0xff,0xff,0xff,0xfe,
++0xf3,0xc0,0x00,0x00,0x00,0x04,0x02,0x13,0x02,0x00,0x80,0x40,0x00,0x90,0x10,0x00,
++0x10,0x00,0x02,0x00,0x01,0x20,0x80,0x12,0x10,0x00,0x40,0x08,0x00,0x04,0x00,0x00,
++0x02,0x00,0x01,0x40,0x00,0x80,0x00,0x00,0x3c,0xf0,0xef,0xff,0xff,0xff,0xfe,0xfd,
++0x1f,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x7f,0xff,0x7f,0xf7,0xdf,0xf7,0xff,
++0xf7,0xfb,0xeb,0xd1,0xff,0xff,0xff,0xff,0xef,0xf7,0xff,0xff,0xfb,0xff,0xfe,0xff,
++0xff,0x7e,0xff,0xfb,0xff,0xff,0xff,0xdb,0xf0,0xff,0xff,0xff,0xff,0xfe,0xf0,0xff,
++0xff,0xb7,0xeb,0xf7,0xdf,0xff,0xfe,0xf5,0x6b,0xe7,0xed,0xf7,0x3e,0xec,0xff,0x54,
++0xef,0x6f,0xf1,0xf5,0xaf,0x6f,0xf6,0xfd,0xff,0xdd,0x7b,0xff,0xef,0xbf,0x7f,0xff,
++0xff,0xf7,0xff,0xf3,0x5f,0xf7,0xd0,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xf8,0x30,0x00,
++0x80,0x40,0x04,0x00,0x81,0x2c,0x04,0x24,0x00,0x02,0x01,0xc8,0x02,0x00,0x02,0x24,
++0x00,0x01,0xb4,0x42,0xdc,0x44,0x02,0x15,0x90,0x02,0x03,0x48,0x39,0x10,0x02,0x24,
++0xa0,0xba,0x00,0x00,0x40,0xc1,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xfe,0xfc,0xf7,0xf0,0xee,0xb6,0x5d,0xfd,0xf5,0xff,0xdb,0xf7,0x7f,0x7f,0xbe,0xff,
++0xc1,0xfe,0xbf,0xfa,0xfa,0x5f,0xff,0xad,0xff,0xef,0xff,0x7f,0xdf,0x7f,0xfe,0xbf,
++0xb7,0x94,0xbf,0xff,0xff,0xf0,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0x8f,0xff,0xff,0xff,0xfe,0xd7,0xff,0xff,0xfb,0xb5,0xff,
++0xef,0x7c,0xeb,0x2b,0x52,0x5b,0x3b,0xda,0xd4,0xf3,0x36,0x96,0xb5,0xbd,0xf1,0xfb,
++0xda,0xee,0xf6,0xfe,0xd3,0x35,0xbd,0xdf,0xad,0xcf,0xef,0x7e,0xcd,0x6b,0xbb,0xdf,
++0xff,0xff,0xfd,0xb0,0xef,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xd3,0x5f,0xf6,
++0xff,0xf6,0xff,0xfd,0xad,0xfd,0xff,0x7f,0xef,0xff,0x6f,0x7f,0xdb,0xf1,0xa5,0xa3,
++0x7f,0x6f,0x6b,0x4f,0xff,0xdb,0xfb,0xcb,0xff,0xf6,0xff,0xf4,0xd7,0xfd,0xbf,0xfe,
++0xdf,0xff,0xd0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf7,0xdf,0xff,0xff,0xff,
++0x3f,0x7f,0xfc,0xe5,0xff,0x20,0xfe,0xff,0xff,0xdf,0x7f,0xff,0xf1,0x7f,0xff,0xfe,
++0xff,0xf0,0x7c,0x3d,0x4f,0xf3,0xc3,0x3f,0xff,0xff,0x6f,0xc3,0xff,0x0f,0xff,0xff,
++0xaf,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xff,0xff,0xfb,0xb7,0xe0,0x0f,0xff,0xff,0x2b,
++0xff,0x7d,0xbf,0xff,0xdf,0xff,0xff,0xf8,0x9f,0x7f,0xff,0xf1,0x55,0xff,0xff,0xff,
++0xfd,0x7c,0x3c,0xff,0xf3,0xc3,0x3f,0xff,0xff,0xef,0xc3,0xff,0xdf,0xff,0xff,0xff,
++0xf0,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0x9f,0xbf,0x7f,
++0xf9,0x19,0x47,0x8e,0xe7,0x9f,0x3f,0x17,0xff,0xfc,0x81,0xc1,0x7e,0xf3,0xd9,0xf9,
++0x73,0xdf,0xf4,0x7f,0xfa,0xff,0xff,0xff,0xfb,0x7f,0x77,0xc7,0xff,0xff,0xff,0xf0,
++0x2f,0xff,0xff,0xff,0xfe,0xf5,0xf7,0xff,0xfb,0xff,0xf7,0x3f,0xfc,0xbf,0x3e,0x3f,
++0xec,0xff,0x81,0xaf,0xfe,0x4f,0xf3,0xbb,0xff,0xf0,0x7e,0xff,0x6f,0xff,0x87,0xff,
++0xbb,0xff,0xd5,0xfc,0xff,0x7f,0xfc,0x6f,0xff,0xef,0xe7,0xff,0xff,0xfa,0xf0,0x3f,
++0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
++0x00,0x30,0x10,0x60,0x20,0x00,0x08,0x00,0x01,0x20,0x80,0x00,0x10,0x00,0x04,0x00,
++0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x40,0x00,0x08,0x20,0x3c,0xf0,0x6f,0xff,
++0xff,0xff,0xfe,0xf5,0xbf,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0x7f,0xfe,0x3f,0xff,
++0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xf1,0xdf,0xdf,0xff,0xff,0xff,0x7f,0xdf,0xff,
++0xfd,0xbd,0xff,0xff,0xff,0xfb,0xdf,0xff,0xff,0xff,0xff,0x5b,0xf0,0xff,0xff,0xff,
++0xff,0xfe,0xf0,0xbf,0xbf,0xbf,0xff,0xf7,0xfb,0xff,0xfe,0xee,0xfa,0xff,0xff,0xff,
++0x3d,0x3b,0xff,0xff,0xfe,0xfb,0xf1,0xff,0xbf,0x7b,0xff,0xff,0xef,0xff,0xbf,0xff,
++0xff,0xff,0xff,0xff,0xfe,0xff,0xf7,0xef,0xff,0xfb,0xd0,0xf0,0xdf,0xff,0xff,0xff,
++0xfe,0xf8,0x30,0x00,0x00,0x00,0x00,0x00,0x0b,0x10,0x05,0x01,0x00,0x08,0x00,0x02,
++0x01,0x01,0x00,0x00,0x10,0x01,0xc8,0x08,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,
++0x00,0x80,0x02,0x00,0x00,0x40,0x24,0x80,0x00,0xc1,0xf0,0x3f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xf7,0xfd,0xf7,0xfa,0xef,0xee,0xf9,0xfd,0xff,0xf7,0xfe,0xbf,
++0x1f,0xfd,0x9e,0xfd,0xd1,0xef,0xff,0xf7,0x7f,0x9f,0xff,0xef,0xff,0xf6,0xff,0xfe,
++0xfe,0x7b,0xff,0xbd,0xff,0x7e,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xf7,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xdf,0xfd,0xff,0xff,0xdf,0xff,
++0xff,0x5f,0xf1,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xef,0xff,
++0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfb,0xff,0xff,0xef,0xfb,0xfd,
++0xff,0xf1,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xf7,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xe7,0xff,
++0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xff,0xfb,0xff,0xfb,0xf1,
++0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7b,0xff,0xff,0xff,0x7f,0xff,0xf1,0xff,
++0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xef,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x57,0xff,0xfe,0xbf,0xfb,0xf1,0xff,0xff,
++0xfd,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xd7,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf7,0xdb,0xff,0xdb,0xfd,
++0xf6,0xff,0xf6,0xff,0x3c,0xbc,0xbc,0xbf,0xdf,0x6f,0xef,0x2f,0xf1,0x3c,0xbf,0xbc,
++0xbf,0xdf,0x6f,0xff,0x6f,0xf7,0xdb,0xff,0xdb,0xfd,0xf6,0xff,0xf6,0xff,0xff,0xff,
++0x01,0xe2,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff };
+diff -u --recursive --new-file linux.prev/drivers/net/yam9600.h linux/drivers/net/yam9600.h
+--- linux.prev/drivers/net/yam9600.h Thu Jan 1 00:00:00 1970
++++ linux/drivers/net/yam9600.h Sat Sep 12 22:03:34 1998
+@@ -0,0 +1,343 @@
++/*
++ *
++ * File yam111.mcs converted to h format by mcs2h
++ *
++ * (C) F6FBB 1998
++ *
++ * Tue Aug 25 20:23:03 1998
++ *
++ */
++
++static unsigned char bits_9600[]= {
++0xff,0xf2,0x00,0xa5,0xad,0xff,0xfe,0x9f,0xff,0xef,0xfb,0xcb,0xff,0xdb,0xfe,0xf2,
++0xff,0xf6,0xff,0x9c,0xbf,0xfd,0xbf,0xef,0x2e,0x3f,0x6f,0xf1,0xfd,0xb4,0xfd,0xbf,
++0xff,0x6f,0xff,0x6f,0xff,0x0b,0xff,0xdb,0xff,0xf2,0xff,0xf6,0xff,0xff,0xff,0xff,
++0xf0,0x6f,0xff,0xff,0xff,0xfe,0xff,0xfd,0xdf,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,
++0xfb,0xff,0xff,0xf7,0xff,0xff,0xff,0xfe,0xff,0x7f,0xf1,0xff,0xfe,0xff,0xbf,0xbf,
++0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0xff,0xff,0xf0,
++0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xf7,
++0xff,0xff,0xf7,0xef,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0x7e,0xff,0xff,
++0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xf0,0xdf,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xef,0xff,0xf3,0xfb,0xfe,0xff,0xf1,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xdf,0xff,0xf0,0x7f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xdf,0xff,0xff,0xff,0xf7,0xf1,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xf0,0x0f,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf5,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,
++0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xef,0xff,0x7f,0xff,0xef,
++0xff,0xef,0xff,0x7f,0xef,0xf1,0xff,0xef,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xf0,0x9f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xbd,0xff,0xef,0x7f,0xef,0x7f,0xfb,0xdf,0xd3,0x5a,0xfe,0xd7,0xd6,
++0xf7,0x7f,0xbd,0xf1,0xbb,0x5d,0xd6,0xf7,0xfe,0x96,0xff,0xbd,0xaf,0xad,0xbf,0xef,
++0x7f,0x6b,0x7f,0xfb,0xd6,0xfe,0xf7,0xff,0x10,0xef,0xff,0xff,0xff,0xfe,0xbe,0xef,
++0xff,0xff,0xdb,0xff,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xfd,0xbf,0xff,0x7f,0xff,0x7f,
++0xdf,0xdb,0xf1,0xfd,0x35,0xff,0x6f,0xff,0x6f,0xff,0xdb,0xff,0xcb,0xff,0xf6,0xff,
++0xf2,0xfd,0xfd,0xbf,0xff,0xff,0xff,0xd0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xff,0xcc,0xc0,0x3f,0xff,
++0xff,0xf1,0x24,0xf0,0xff,0xff,0xcf,0xef,0x3f,0xff,0xf0,0xff,0xff,0xff,0xfc,0x3f,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xff,0xcc,0xc0,0x3f,0xff,0xff,
++0xf1,0x00,0xf0,0xff,0xff,0xcf,0xdf,0xff,0xff,0xf0,0xff,0xff,0xff,0xfc,0x3f,0xff,
++0xff,0xff,0x7d,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xfe,0x7f,0xdf,0xff,0xff,0xff,0xf1,
++0xff,0xcf,0xff,0xf3,0xff,0x97,0xff,0xff,0x8f,0xe7,0xff,0xff,0xfc,0x71,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xf5,0xff,0xbf,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0xf7,0xef,0xff,0xff,0xfc,0x7b,0xff,0xf1,0x3f,
++0xff,0xef,0xff,0xcf,0xe3,0xe3,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xbf,0xff,
++0xbf,0xff,0xda,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xf2,0xc0,0x00,0x00,0x00,0x00,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
++0x01,0x3c,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0x9f,0xff,
++0xff,0xff,0xf7,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xdb,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xf0,0xbb,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xfb,0xdf,0xbf,0xf1,0xfe,0xfd,0xf7,0xff,
++0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0xfd,0xf2,
++0xf0,0x1f,0xff,0xff,0xff,0xfe,0xf8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
++0x00,0x00,0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x04,0x24,0x00,
++0x40,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x01,0xc0,0xf0,
++0x4f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xbf,0xff,0xff,0x6f,0xff,0xdf,0xff,0xd1,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xff,0xff,0xdf,0xff,0xfb,0xff,0xfb,0xef,0xff,0xff,0xee,0xff,0xff,0x7f,0xf0,0xdf,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x8f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,0xad,0xff,0x69,0x2a,0xed,0x6b,0xfb,0xdf,0x3a,
++0xdc,0xf4,0x96,0xee,0xb3,0x3d,0x35,0xc1,0xbb,0xdd,0xfe,0xf6,0xfe,0xd6,0xb5,0xad,
++0xbf,0xa5,0xad,0x49,0x2f,0x4f,0x2b,0xda,0x5f,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,
++0xff,0xfe,0xbf,0xff,0xff,0xfb,0x5b,0xf7,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xfd,0xa5,
++0xf3,0x6f,0xf3,0x6e,0xfa,0x7b,0xd1,0xfd,0xb5,0x77,0x6f,0xe9,0x6f,0xff,0xdb,0xfb,
++0xdb,0xdf,0xf6,0xff,0xf6,0xff,0xfd,0x3f,0xfe,0xf7,0xff,0xd0,0x4f,0xff,0xff,0xff,
++0xfe,0xff,0x9f,0xff,0xff,0x0f,0xff,0xc0,0x3f,0x9c,0x03,0xff,0xff,0x8b,0xa5,0xfe,
++0x80,0x3e,0xc2,0xbf,0xac,0xb1,0x24,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xa3,
++0xff,0xfd,0x6b,0xff,0xff,0xf0,0xa5,0xff,0xff,0xff,0xf0,0xaf,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0x0f,0xff,0xc0,0x3f,0xd4,0x6b,0xff,0xff,0xdb,0xff,0xfe,0x86,
++0xbf,0xc2,0xbf,0x30,0xa1,0x24,0xff,0xff,0xff,0xff,0xcc,0xff,0x0f,0xff,0xa3,0xff,
++0x05,0x6b,0xff,0xff,0xf0,0xa5,0xff,0xff,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xfb,0xc7,0xff,0xc4,0xff,0xff,0x7f,0xff,0xec,0xfe,0x7f,0xdf,0xd8,0xb9,
++0x47,0xfc,0x36,0xc1,0xdf,0xff,0xff,0xf9,0xff,0xf3,0xff,0xf7,0xff,0xfc,0xff,0xfd,
++0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xf5,0xff,
++0xff,0xff,0xff,0xfe,0xff,0xff,0x7e,0xbd,0x3f,0xff,0x2b,0xfe,0x2f,0xf5,0xa3,0xfc,
++0x5b,0xfe,0x61,0x9f,0x7f,0xef,0xff,0xff,0xa7,0xfb,0xff,0xff,0xfa,0xfe,0xff,0x33,
++0xf1,0xff,0xbf,0xff,0xff,0xff,0xfa,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xf1,0xc0,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x30,0x24,0x04,
++0x00,0x01,0x00,0x80,0x40,0x00,0x08,0x00,0x00,0x00,0x02,0x01,0x01,0x00,0x02,0x00,
++0x00,0x00,0x00,0x00,0x01,0x3d,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xfd,0xbd,0xff,0xfd,
++0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0x7f,0xf6,0xef,0xbf,0xf7,0xff,0x73,0xeb,
++0xf1,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xf9,0xff,0xfd,0xfe,0xff,0xff,
++0xff,0xff,0xff,0xff,0xd9,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xf0,0xbf,0x7f,0xff,0xff,
++0xff,0x7f,0xff,0xff,0xde,0xff,0xff,0xef,0xdd,0xde,0x77,0xf2,0xfb,0xed,0xe7,0xf1,
++0x73,0xfd,0xfd,0xdf,0xff,0x7d,0xbe,0xdf,0xff,0xfb,0xff,0xef,0xff,0xef,0xff,0xff,
++0xff,0xff,0xff,0xd0,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xf8,0x30,0x20,0x02,0x00,0x22,
++0x40,0xc0,0x00,0x00,0x00,0x08,0x00,0x02,0x41,0x02,0x12,0x00,0x21,0x87,0x81,0x00,
++0x00,0x80,0x04,0x0b,0x28,0x01,0xb0,0x00,0x82,0x00,0x40,0x00,0x00,0x00,0x00,0x00,
++0x00,0x00,0xc1,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,
++0xf7,0xff,0xfe,0x7f,0xed,0x79,0xff,0xde,0xeb,0x7f,0x74,0xf7,0xf7,0xe1,0xf9,0xff,
++0xf6,0x5f,0x7f,0xff,0xff,0xff,0xd7,0xdb,0xef,0xff,0xbb,0xff,0xff,0xff,0xcc,0xff,
++0xff,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xf0,0x0f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0x3d,0xcd,0x49,0x7f,0x6f,
++0x2b,0xba,0x5c,0xd2,0xda,0xf6,0xf3,0x3e,0xf7,0xff,0xbd,0xf1,0xfa,0xdf,0xfe,0xf7,
++0xcc,0xf6,0xbb,0xa5,0xb3,0xad,0xbf,0x6f,0x7d,0x6f,0x6b,0xdb,0xdf,0xbd,0xff,0xfe,
++0xb0,0x5f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xfb,0xdb,0x57,0xf6,0xfe,0x9f,0xd5,
++0xb7,0xff,0xaf,0xe5,0x3f,0xff,0xff,0x6f,0xff,0xdb,0xf1,0xfd,0xbf,0xff,0x6f,0x69,
++0x6c,0xdf,0xda,0xdf,0xcb,0xff,0xf6,0xff,0x76,0xfd,0xfd,0xbf,0xff,0xff,0xff,0xd0,
++0x3f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfd,0xbd,0x08,0x03,0x89,0x4f,0x5a,
++0x0f,0xf0,0xff,0xf8,0xbf,0xff,0xff,0xff,0xff,0xf1,0x5a,0xff,0xff,0xff,0xff,0xf3,
++0xfa,0xa0,0xf0,0xf2,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfc,0xfd,0x00,0x6b,0xff,0xff,0x5a,0x0f,
++0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0x5a,0xff,0xff,0xff,0xff,0xb3,0xf5,
++0x50,0xf0,0xf0,0xff,0xff,0xff,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x7f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0xbc,0xff,0xe4,0xe7,0x71,0xff,0xf9,0xc4,0xf4,
++0x7f,0x7f,0xcf,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xfb,0xf7,0x73,0xbf,0x14,
++0xff,0xe6,0xff,0xff,0xe1,0x7d,0xff,0xff,0xe7,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,
++0xff,0xfe,0xf5,0xff,0xff,0xfe,0xd2,0xfa,0xff,0xc4,0xf4,0x5c,0xbf,0xfa,0xff,0xff,
++0xec,0x7e,0xbf,0xff,0xff,0xff,0xf1,0xff,0xff,0xef,0xff,0xff,0x6b,0xdb,0xff,0xdf,
++0xf9,0xfb,0xbf,0xff,0xf1,0xff,0xbf,0xff,0xff,0xff,0xfb,0xf0,0xbf,0xff,0xff,0xff,
++0xfe,0xf3,0xc0,0x00,0x02,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x80,0x00,
++0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x20,0x00,0x00,0x00,0x00,
++0x01,0x00,0x01,0x00,0x00,0x80,0x02,0x00,0x01,0x3c,0xf0,0x5f,0xff,0xff,0xff,0xfe,
++0xfd,0xbf,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0x7f,0xff,0xdf,0xff,0xef,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xfb,0xff,0xfd,0xff,
++0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xc3,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xf0,
++0xff,0xdf,0xff,0xff,0xf7,0x23,0xff,0xff,0xfd,0xff,0xef,0xff,0xfe,0x7f,0x7d,0xf7,
++0xfe,0xff,0x7f,0x71,0xff,0xfb,0x7f,0xff,0xff,0xff,0x6e,0xfd,0xf7,0xfd,0xff,0xbf,
++0xff,0xbf,0xf9,0xfd,0xff,0xdf,0xef,0xf0,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xf8,0x30,
++0x40,0x01,0x00,0x83,0x00,0x00,0x00,0x0c,0x06,0x08,0x04,0x26,0x26,0x00,0x00,0x06,
++0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x08,0x80,0x00,0x20,0x01,0x20,
++0x00,0x02,0x00,0x30,0x00,0x00,0xc1,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xff,0x7b,0x3f,0xf7,0xff,0xd7,0xfe,0xfe,0xfb,0xfe,0x3b,0xfe,0xbd,0xff,0x2f,
++0xff,0x71,0xff,0xfb,0x7f,0xe7,0xff,0xf9,0xef,0xff,0xd7,0xfa,0xff,0xb7,0xbb,0xfe,
++0xff,0xff,0x74,0xff,0xf7,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf0,0x8f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xb5,
++0xbd,0x6f,0x7c,0xeb,0x7f,0xfb,0xdb,0xd3,0x4b,0xee,0xd6,0xf6,0xb7,0xfd,0xac,0xa1,
++0xfb,0xdf,0xfe,0xf7,0xf4,0x96,0xbd,0xb4,0xc5,0xa5,0xaf,0x6f,0x69,0x4f,0x7f,0xba,
++0xdb,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,
++0xf6,0xff,0xf6,0xff,0xbd,0xbf,0xa5,0xbf,0xff,0x7d,0x7f,0xef,0xff,0xfb,0xf1,0xfd,
++0xbf,0xff,0x6f,0xff,0x6b,0x7a,0xdb,0xff,0xdb,0xdf,0xf6,0xfe,0xb6,0xfd,0xfd,0xbf,
++0xfe,0xf7,0xff,0xd0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xf4,0x2f,0xff,
++0xfc,0x43,0x6b,0xff,0xff,0xff,0x0d,0xff,0xfc,0x33,0x3f,0xf0,0x5f,0xf1,0xff,0xff,
++0xff,0xff,0xf9,0xde,0xf0,0x4c,0xfe,0x77,0xaf,0xff,0xff,0xef,0xff,0xf0,0xff,0xdb,
++0xff,0x5f,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,0xfe,0xf7,0xff,0xf0,0x2f,0xff,0xfd,
++0x43,0x7f,0xff,0xff,0xf1,0x0f,0xff,0xfc,0x33,0x3f,0xff,0xaf,0xf1,0xff,0xff,0xff,
++0xff,0xf6,0xd7,0xff,0xbc,0xfd,0xbd,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,
++0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0xfb,0xf1,
++0xbf,0xff,0xf9,0xfd,0xcf,0xf2,0x70,0xff,0x1f,0x9f,0xf3,0xf1,0xff,0xff,0xff,0xff,
++0xfc,0xf7,0xff,0x13,0x9f,0xfc,0xff,0xff,0x84,0xf7,0xff,0xff,0x47,0xff,0xff,0xff,
++0xf0,0xbf,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xff,0xf1,0xfc,0xff,0xfe,0xfe,0x79,
++0x3f,0xff,0x1d,0x46,0xcf,0xff,0xcf,0xfc,0x7b,0xff,0xf1,0xff,0xff,0xff,0xff,0xed,
++0xf3,0xab,0xff,0xcb,0xff,0xf8,0xff,0xfc,0xf5,0xff,0xbf,0xff,0xff,0xff,0xfa,0xf0,
++0x8f,0xff,0xff,0xff,0xfe,0xf3,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
++0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x04,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x20,
++0x0c,0x00,0x00,0x04,0x01,0x00,0x01,0x00,0x00,0x80,0x00,0x00,0x01,0x3c,0xf0,0x7f,
++0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xfe,0xff,
++0xdf,0xff,0xff,0xf7,0xff,0xff,0xff,0xef,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,
++0xff,0xdf,0xff,0xff,0xfb,0xf7,0x7f,0xff,0xfe,0xff,0xff,0xbf,0xdb,0xf0,0xff,0xff,
++0xff,0xff,0xfe,0xf0,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0x7f,0xf7,0xff,
++0xbf,0xbf,0xcf,0xff,0xff,0xff,0x3e,0xf1,0x7f,0xff,0xff,0xef,0xff,0xff,0xff,0xfe,
++0xff,0xfd,0xff,0xbf,0xbd,0xfe,0xff,0xfb,0xf7,0xdf,0xfb,0xd0,0xf0,0x9f,0xff,0xff,
++0xff,0xfe,0xf8,0x30,0x20,0x00,0x40,0x01,0x80,0xc0,0x30,0x00,0x00,0x20,0x00,0x10,
++0x50,0x88,0x20,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,
++0x00,0x00,0x01,0x80,0x08,0x00,0x00,0xa0,0x00,0x10,0xc1,0xf0,0xef,0xff,0xff,0xff,
++0xfe,0xfd,0xef,0x7f,0xff,0xff,0xbf,0xff,0xf7,0xff,0xef,0xfb,0xfd,0x77,0xef,0xbf,
++0xf7,0x7f,0xff,0xff,0xbf,0xd1,0x7f,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xaf,0xff,
++0xdf,0xf7,0xfb,0xff,0xfd,0xff,0xfc,0xff,0xfd,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x3f,0xff,0xff,0xff,0xfe,0xdd,0xff,
++0xff,0xff,0xa5,0xfd,0x6f,0x7d,0x6d,0x7f,0x52,0xdf,0x5a,0x4b,0xee,0xb6,0xee,0xf2,
++0xbb,0xac,0xa1,0x5b,0x4d,0xd6,0xf7,0xfe,0xb2,0xbd,0x35,0xb5,0xb5,0xdd,0x6f,0x7f,
++0xe9,0x5f,0x52,0xdf,0xbd,0xff,0xff,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,
++0xff,0xdb,0xfe,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xfd,0xb5,0xbf,0xf9,0x7f,0x6f,0xff,
++0xdb,0xf1,0xfd,0xbf,0xff,0x6f,0xff,0x69,0x7f,0xdb,0xff,0xd3,0xff,0xf6,0xfe,0xf2,
++0xff,0xad,0xbf,0xff,0xff,0xff,0xd0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,
++0x30,0x0f,0xff,0xff,0xfd,0x6b,0xca,0xff,0xf0,0x0f,0xd6,0xbf,0xcf,0x3f,0xff,0xff,
++0xf1,0xff,0xff,0xff,0xca,0xfe,0xbf,0xff,0xf0,0x05,0xaf,0x0f,0xff,0xfc,0xf0,0xcf,
++0xf0,0xff,0xff,0xff,0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,0x30,
++0x0f,0xff,0xff,0xfc,0x3f,0xca,0xff,0x0f,0x0f,0xd6,0xbf,0xff,0xff,0xf5,0x5f,0xf1,
++0xff,0x8b,0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xfc,0xf0,0xcf,0xf0,
++0xff,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xcf,0xff,
++0xff,0xbf,0x9f,0x3f,0xfe,0xfc,0xff,0x4f,0xff,0xff,0xff,0xff,0xff,0xf7,0xf1,0xff,
++0xdf,0xfe,0x7e,0x3f,0x9f,0xf4,0xfc,0x7f,0xfc,0xff,0xff,0x3f,0xff,0x3f,0xfe,0x3f,
++0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xfb,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xbf,0xfb,0xff,0xf8,0xed,0xff,0x8f,0xff,0xbb,0xff,0xb1,0xf3,0xef,
++0x8f,0xf7,0xff,0xff,0xdb,0xff,0xff,0xff,0xef,0xbf,0xfd,0x79,0xbf,0xbf,0xff,0xff,
++0xff,0xfb,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,0x00,0x04,0x00,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x04,0x08,0x08,0x01,0x01,0x00,0x90,
++0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x00,0x01,
++0x3c,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0x9f,0xff,0xaf,0xdf,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,
++0xbf,0xef,0xff,0xff,0xff,0xed,0xff,0xff,0xff,0xef,0xff,0xbf,0xff,0xff,0xff,0xc3,
++0xf0,0x3f,0xff,0xff,0xff,0xfe,0xf0,0xff,0xfd,0xff,0xff,0xff,0xfb,0xff,0xbb,0xff,
++0xff,0xff,0x7f,0xf6,0xff,0x7f,0xfb,0xfd,0xed,0xff,0xf1,0xff,0xfe,0x7f,0xff,0xff,
++0xff,0x5f,0xff,0xf7,0xff,0x7e,0xff,0xfd,0xff,0xef,0xff,0xff,0xff,0xef,0xf0,0xf0,
++0x8f,0xff,0xff,0xff,0xfe,0xf8,0x30,0x80,0x00,0x04,0x00,0x00,0x40,0x02,0x00,0x03,
++0x00,0x05,0x04,0x20,0x00,0x00,0x01,0xd0,0x00,0x81,0x00,0x20,0x04,0x04,0x00,0x00,
++0x81,0x04,0x08,0x80,0x10,0x00,0xc0,0x00,0x00,0x00,0x20,0x00,0x08,0xc1,0xf0,0x6f,
++0xff,0xff,0xff,0xfe,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xf3,0xfd,0xff,0xed,0xfc,
++0xff,0xff,0x9f,0xfb,0xfd,0xff,0xff,0xff,0xf1,0xff,0xff,0x7f,0xfb,0x3e,0xff,0x9f,
++0xff,0xff,0xff,0xff,0xfd,0xf9,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xf0,0x6f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xcf,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xfd,0xbd,0xff,0xef,0x7c,0xeb,0x7f,0xfb,0xdb,0xfa,0xdc,
++0xee,0xf7,0xf6,0xd7,0xf5,0x2d,0xa1,0xbb,0xdd,0xee,0xf7,0x54,0xf7,0xfb,0x2c,0xb5,
++0xb4,0xbd,0x6b,0x6f,0xef,0x6f,0xbb,0xdf,0xff,0xff,0xff,0xf0,0x1f,0xff,0xff,0xff,
++0xfe,0xbf,0xff,0xff,0xff,0xfb,0xff,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xff,0xbf,0xef,
++0x6f,0xff,0x6f,0xfa,0xdb,0xf1,0xc5,0xbd,0xf5,0x6f,0xff,0x6f,0xca,0xdb,0xff,0xdb,
++0xfb,0xf6,0x97,0xf6,0xff,0xfd,0xbf,0xfe,0xf7,0xff,0xd0,0x9f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8b,0x7f,0xff,0xff,0xe7,0x63,0xff,0xff,
++0xff,0xfc,0x77,0xdf,0xf1,0xdb,0xff,0xd6,0xa8,0x3f,0xff,0xff,0x08,0x2f,0xf0,0xff,
++0xc3,0xff,0xeb,0xff,0xff,0xff,0xff,0xff,0x5f,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xfc,0xff,0xcf,0xf1,0xdb,0xff,0xd6,0xa8,0x3f,0xff,0xff,0x08,0x2f,0xf0,0xff,0xc3,
++0xff,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xbf,0xff,0xca,0xff,0x9f,0xff,0xfa,0xb9,0xe7,
++0x9f,0xf3,0x81,0xff,0xff,0xfc,0x73,0xd7,0xff,0xff,0x77,0xff,0xfd,0xff,0xfc,0xff,
++0xff,0xff,0xff,0xcf,0xff,0xff,0xff,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,
++0xff,0xf7,0xde,0xff,0xfe,0x7e,0xff,0xbf,0xff,0xbf,0xf1,0xb3,0xff,0xff,0xe3,0xfb,
++0xff,0xe1,0x1f,0x7f,0xff,0xf8,0x78,0xff,0xfb,0x1e,0xff,0xf7,0xfe,0xe7,0xff,0xff,
++0xff,0xbf,0xff,0xff,0xff,0xfa,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x04,0x00,
++0x01,0x80,0x40,0x40,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
++0x80,0x00,0x00,0x01,0x3c,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xfb,0xff,
++0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xf7,0xf1,
++0xfd,0xff,0xff,0xff,0xdf,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,
++0xff,0xff,0xff,0xdb,0xf0,0x8f,0xff,0xff,0xff,0xfe,0xf0,0xff,0xdf,0xff,0xff,0x7f,
++0xff,0xff,0xff,0xbe,0xd7,0xff,0xed,0xbd,0x7e,0xbf,0xfe,0xf6,0x7f,0xbf,0x71,0xff,
++0xff,0xda,0xff,0xf9,0xff,0xbf,0x7f,0xfe,0xff,0x6f,0x7f,0xff,0xff,0xff,0xff,0xff,
++0x7f,0xff,0xd0,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xf8,0x30,0x42,0x00,0x00,0x00,0x00,
++0x80,0xc1,0x00,0x00,0x90,0x00,0xc4,0x00,0x00,0x12,0x20,0x43,0x22,0x81,0x84,0x00,
++0x00,0x14,0x00,0x01,0x00,0x08,0x80,0x00,0x02,0x00,0x02,0x00,0x04,0x02,0x00,0x00,
++0x10,0xc1,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xff,0xff,0xfd,0xff,0xff,0xdd,0xfe,0xff,
++0xb6,0x76,0xe5,0xbc,0xf9,0xf7,0xaf,0x5f,0xbf,0xfc,0xdf,0xcf,0xf1,0xff,0xef,0x79,
++0xff,0xbd,0xff,0xef,0xff,0xff,0xf7,0x6f,0x5f,0xff,0xff,0xfd,0xef,0xef,0xbf,0xff,
++0xff,0xf0,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf0,0xff,0xff,0xff,0xff,0xfe,0xdb,0xff,0xff,0xfd,0x2d,0xff,0x69,0x2a,0xef,0x77,
++0xbb,0xdd,0x5a,0xdf,0xf6,0xf6,0xd6,0xf7,0x7d,0xbd,0xd1,0xb2,0x4a,0xd6,0xb2,0xbe,
++0x97,0xf5,0xbd,0xb3,0xad,0xff,0xef,0x7f,0x69,0x6b,0xfb,0xdf,0xff,0xff,0xff,0xf0,
++0x2f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,0xf6,0xfe,0x9f,0xd4,0xbf,
++0xed,0xaf,0xff,0x6b,0x6f,0xf7,0xff,0xdd,0xdb,0x31,0xfd,0xbf,0xff,0x6f,0x7f,0xff,
++0xff,0xdb,0xff,0xcb,0xdf,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xfe,0xf7,0xff,0xd0,0x8f,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0x1f,0xff,0x46,0x2f,0x9f,0xff,0xff,0xff,
++0xa5,0xff,0xff,0xff,0xdf,0xb7,0xff,0xff,0xf1,0xff,0xff,0xff,0xf7,0xe9,0x6a,0xbf,
++0xff,0xff,0xfd,0xff,0xff,0xfd,0x55,0x57,0xff,0xff,0xff,0xff,0xaf,0xf0,0x4f,0xff,
++0xff,0xff,0xfe,0xfe,0xdf,0xff,0xfd,0x1f,0xff,0x46,0x2f,0x9f,0xff,0xff,0xff,0xa5,
++0xff,0xff,0xff,0xc0,0x37,0xff,0xff,0xf1,0x99,0x8e,0xdc,0x7f,0xe9,0x6a,0xbf,0xff,
++0xf0,0x0f,0xff,0xff,0xfd,0x55,0x57,0xff,0xff,0xff,0xff,0xff,0xf0,0x0f,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0x07,0xff,0xc0,0xbe,0xff,0xff,0xcf,0xef,0x9f,0xff,
++0xff,0xfb,0xff,0xe7,0xff,0xff,0xa1,0xe3,0xce,0x3c,0x58,0x3f,0xf3,0xff,0xfd,0xef,
++0xf9,0xff,0xff,0xf7,0xf1,0x7f,0xff,0xcb,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,
++0xfe,0xf5,0x7f,0xff,0xf0,0xff,0xfe,0xff,0xc4,0x75,0xe7,0xb9,0xff,0xff,0xff,0xef,
++0xff,0xc7,0x37,0x3b,0xff,0xf0,0x13,0x9e,0x0f,0xf4,0xff,0xfe,0xfb,0xff,0xff,0xf9,
++0xfc,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xfa,0xf0,0xef,0xff,0xff,0xff,0xfe,
++0xf3,0xc0,0x01,0x00,0x00,0x02,0x00,0x02,0x22,0x00,0x00,0xc0,0x40,0x00,0x40,0x00,
++0x04,0x08,0x04,0x0a,0x01,0x01,0x10,0x20,0x20,0x00,0x00,0x04,0x08,0x08,0x04,0x00,
++0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x3c,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xfd,
++0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0xcf,0x9d,0xff,
++0xff,0xf7,0xfd,0xf1,0xff,0xff,0xff,0xee,0xbf,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xf0,0xff,
++0xff,0xff,0xf7,0xf7,0xff,0xff,0xfe,0xbf,0xf7,0xff,0xff,0x5b,0xff,0xbf,0xf7,0xff,
++0xfd,0x7f,0x71,0xfd,0xff,0xed,0xf7,0xfe,0xef,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,
++0xff,0xff,0xef,0xff,0x7f,0xff,0xd0,0xf0,0xff,0xff,0xff,0xff,0xfe,0xf8,0x30,0x11,
++0x00,0x48,0x60,0x40,0x82,0x60,0x24,0x60,0x00,0xcc,0x00,0x80,0x04,0x01,0x00,0x00,
++0x14,0x01,0x0c,0x04,0x00,0x30,0x00,0x00,0x00,0x08,0x08,0x00,0x01,0x00,0xc2,0x00,
++0x00,0x02,0x00,0x80,0x00,0xc1,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xf7,0x7b,0xff,0xf3,0xeb,0xbf,0xff,0xf7,0xff,0xff,0xff,0xe7,0x5d,0x3f,0xff,0xf6,
++0xd1,0xfd,0xff,0xeb,0xf7,0x3d,0xff,0xff,0xff,0x5f,0xff,0x7f,0x7f,0xf3,0xff,0xff,
++0xef,0xfd,0xbf,0xff,0xff,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,0xb5,0xdf,
++0x6f,0x7d,0x69,0x7f,0xfb,0xdf,0x52,0x5f,0xf6,0xf7,0xfe,0xf6,0xf3,0xbd,0xb1,0xda,
++0xcd,0xfe,0xf6,0xee,0xd2,0xbd,0xa5,0xaf,0xbd,0xff,0x6f,0x7c,0xeb,0x2b,0xfa,0xda,
++0xff,0xfe,0xdf,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,0xf6,
++0xff,0xf6,0xff,0xbd,0xbf,0xcd,0xbf,0xeb,0x6f,0xf7,0x6f,0xdf,0xdb,0x51,0xfd,0xbd,
++0xff,0x6f,0xff,0x6f,0xfb,0x5b,0xff,0xdb,0xff,0xf6,0xfe,0xf6,0xfd,0xfd,0xbf,0xfe,
++0xf7,0xff,0xd0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfa,0x50,0xff,0xff,0xff,
++0xf0,0x6f,0xff,0xff,0xf0,0x96,0xff,0xff,0xc6,0x2b,0xff,0xff,0xf1,0xfc,0xff,0xff,
++0xf7,0xdb,0xc3,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xc1,0x4f,0xc3,0xff,0xff,0xff,
++0xaf,0xf0,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,0xa0,0xff,0xff,0xff,0xf0,
++0x6f,0xff,0xff,0xf0,0x96,0xff,0xff,0xc6,0x2b,0xff,0xff,0xf1,0x5a,0xff,0xff,0xff,
++0xf3,0xc3,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xc1,0x4f,0xc3,0xff,0xff,0xff,0xff,
++0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0x9f,0xf0,0x7f,
++0xff,0xf9,0xfc,0x4f,0xf3,0xff,0x27,0xeb,0xff,0xfc,0x81,0xfc,0x7f,0xfe,0x7b,0xff,
++0xf7,0xff,0x12,0x7f,0xff,0xff,0xff,0xff,0x18,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,
++0x7f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xff,0xdf,0xfe,0xff,0xfc,0x7e,0x7f,0xbf,
++0xff,0xff,0xaf,0xef,0xff,0xdf,0xdf,0xfb,0xff,0xf1,0xc3,0xfe,0x6f,0xf1,0xcf,0x3f,
++0xfb,0xff,0xff,0xcf,0xfe,0xff,0xff,0xfe,0x7f,0xbf,0xff,0xff,0xbf,0xfa,0xf0,0xdf,
++0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
++0x20,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
++0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x00,0x02,0x80,0x00,0x02,0x3c,0xf0,0x2f,0xff,
++0xff,0xff,0xfe,0xfd,0xbf,0xff,0xfb,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xf1,0xff,0x7f,0xff,0xff,0xff,0xff,0xef,0xff,
++0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xf0,0x2f,0xff,0xff,
++0xff,0xfe,0xf0,0xff,0xff,0xff,0xfb,0xff,0xbf,0xff,0xff,0xff,0xff,0xf7,0xbf,0xfb,
++0xff,0xff,0xff,0xdf,0xf7,0xff,0xf1,0xf7,0xbf,0xfb,0xff,0xff,0xff,0x7f,0xde,0xff,
++0xff,0xff,0xff,0xff,0xff,0xed,0xf7,0xff,0xff,0x7f,0xd0,0xf0,0x3f,0xff,0xff,0xff,
++0xfe,0xf8,0x30,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x80,
++0x20,0x01,0x01,0x92,0x00,0x01,0x01,0x00,0xe0,0x1c,0x60,0x20,0x30,0x08,0x08,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0xc1,0xf0,0x6f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xdb,0xfe,0xff,0xff,0xdf,0xff,0xfc,0x7f,0xfb,0xbf,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xf6,0xff,0xf7,0x7e,0x3f,0xff,0x7f,0xff,0xff,0xff,0xf7,
++0xff,0xff,0xff,0xed,0xff,0xdf,0xff,0xb7,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xbf,0xff,0xdf,
++0x57,0xef,0xf1,0xfd,0xfe,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xfb,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xdf,0xff,
++0xff,0xf1,0xfd,0xff,0x7f,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0xf0,0x9f,0xff,0xff,0xff,0xfe,0xf7,0xfd,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,
++0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,
++0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xfb,0xff,0xff,0xff,0xfe,0xff,0xff,0xfb,0x6f,0xff,0xfe,0xbf,0xff,0xf1,0xff,
++0xf7,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,
++0xff,0xff,0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xfb,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0x57,0xff,0xfd,0xbf,0xff,0xf1,0xff,0xef,
++0xfe,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,
++0xde,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf7,0xdb,0xff,0xdb,0xfd,
++0xf6,0xff,0xf6,0xff,0x3c,0xbc,0xbc,0xbf,0xdf,0x6f,0xe7,0x2f,0xf1,0x3c,0xbf,0xfd,
++0xbf,0xdf,0x6f,0xff,0x6f,0xf7,0xdb,0xff,0xdb,0xfd,0xf6,0xff,0xf6,0xff,0xff,0xff,
++0x02,0x01,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff };
+diff -u --recursive --new-file linux.prev/drivers/net/yam.c linux/drivers/net/yam.c
+--- linux.prev/drivers/net/yam.c Thu Jan 1 00:00:00 1970
++++ linux/drivers/net/yam.c Sat Sep 12 22:54:35 1998
+@@ -0,0 +1,1330 @@
++/*****************************************************************************/
++
++/*
++ * yam.c -- YAM radio modem driver.
++ *
++ * Copyright (C) 1998 Frederic Rible F1OAT (frible@teaser.fr)
++ * Adapted from baycom.c driver written by Thomas Sailer (sailer@ife.ee.ethz.ch)
++ *
++ * 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 2 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, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Please note that the GPL allows you to use the driver, NOT the radio.
++ * In order to use the radio, you need a license from the communications
++ * authority of your country.
++ *
++ *
++ * History:
++ * 0.0 F1OAT 06.06.98 Begin of work with baycom.c source code V 0.3
++ * 0.1 F1OAT 07.06.98 Add timer polling routine for channel arbitration
++ * 0.2 F6FBB 08.06.98 Added delay after FPGA programming
++ * 0.3 F6FBB 29.07.98 Delayed PTT implementation for dupmode=2
++ * 0.4 F6FBB 30.07.98 Added TxTail, Slottime and Persistance
++ * 0.5 F6FBB 01.08.98 Shared IRQs, /proc/net and network statistics
++ * 0.6 F6FBB 25.08.98 Added 1200Bds format
++ * 0.7 F6FBB 12.09.98 Added to the kernel configuration
++ */
++
++/*****************************************************************************/
++
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/net.h>
++#include <linux/in.h>
++#include <linux/if.h>
++#include <linux/malloc.h>
++#include <linux/errno.h>
++#include <asm/bitops.h>
++#include <asm/io.h>
++#include <asm/system.h>
++#include <linux/interrupt.h>
++#include <linux/ioport.h>
++
++#include <linux/netdevice.h>
++#include <linux/if_arp.h>
++#include <linux/etherdevice.h>
++#include <linux/skbuff.h>
++#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
++/* prototypes for ax25_encapsulate and ax25_rebuild_header */
++#include <net/ax25.h>
++#endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */
++
++/* make genksyms happy */
++#include <linux/ip.h>
++#include <linux/udp.h>
++#include <linux/tcp.h>
++#include <linux/net_alias.h>
++
++#include <linux/kernel.h>
++#include <linux/proc_fs.h>
++
++#include <linux/yam.h>
++#include "yam9600.h"
++#include "yam1200.h"
++
++/* --------------------------------------------------------------------- */
++
++/*
++ * currently this module is supposed to support both module styles, i.e.
++ * the old one present up to about 2.1.9, and the new one functioning
++ * starting with 2.1.21. The reason is I have a kit allowing to compile
++ * this module also under 2.0.x which was requested by several people.
++ * This will go in 2.2
++ */
++#include <linux/version.h>
++
++#if LINUX_VERSION_CODE >= 0x20100
++#include <asm/uaccess.h>
++#else
++#include <asm/segment.h>
++#include <linux/mm.h>
++
++#undef put_user
++#undef get_user
++
++#define put_user(x,ptr) ({ __put_user((unsigned long)(x),(ptr),sizeof(*(ptr))); 0; })
++#define get_user(x,ptr) ({ x = ((__typeof__(*(ptr)))__get_user((ptr),sizeof(*(ptr)))); 0; })
++
++extern inline int copy_from_user(void *to, const void *from, unsigned long n)
++{
++ int i = verify_area(VERIFY_READ, from, n);
++ if (i)
++ return i;
++ memcpy_fromfs(to, from, n);
++ return 0;
++}
++
++extern inline int copy_to_user(void *to, const void *from, unsigned long n)
++{
++ int i = verify_area(VERIFY_WRITE, to, n);
++ if (i)
++ return i;
++ memcpy_tofs(to, from, n);
++ return 0;
++}
++#endif
++
++#if LINUX_VERSION_CODE < 0x20115
++extern __inline__ void dev_init_buffers(struct device *dev)
++{
++ int i;
++ for(i=0;i<DEV_NUMBUFFS;i++)
++ {
++ skb_queue_head_init(&dev->buffs[i]);
++ }
++}
++#endif
++
++#if LINUX_VERSION_CODE >= 0x20123
++#include <linux/init.h>
++#else
++#define __init
++#define __initdata
++#define __initfunc(x) x
++#endif
++
++/* --------------------------------------------------------------------- */
++
++static const char yam_drvname[] = "yam";
++static const char yam_drvinfo[] = KERN_INFO "yam: (C) 1998 Frederic Rible F1OAT\n"
++KERN_INFO "yam: version 0.7 compiled " __TIME__ " " __DATE__ "\n";
++
++/* --------------------------------------------------------------------- */
++
++#define YAM_9600 1
++#define YAM_1200 2
++
++#define NR_PORTS 4
++#define YAM_MAGIC 0xF10A7654
++
++/* Transmitter states */
++
++#define TX_OFF 0
++#define TX_HEAD 1
++#define TX_DATA 2
++#define TX_CRC1 3
++#define TX_CRC2 4
++#define TX_TAIL 5
++
++#define YAM_MAX_FRAME 1024
++
++#define DEFAULT_BITRATE 9600 /* bps */
++#define DEFAULT_HOLDD 10 /* sec */
++#define DEFAULT_TXD 300 /* ms */
++#define DEFAULT_TXTAIL 10 /* ms */
++#define DEFAULT_SLOT 100 /* ms */
++#define DEFAULT_PERS 64 /* 0->255 */
++
++struct yam_port {
++ int magic;
++ int bitrate;
++ int baudrate;
++ int iobase;
++ int irq;
++ int dupmode;
++ char name[16];
++
++ struct device dev;
++
++ /* Stats section */
++
++#if LINUX_VERSION_CODE < 0x20119
++ struct enet_statistics stats;
++#else
++ struct net_device_stats stats;
++#endif
++ int nb_rxint;
++ int nb_mdint;
++
++ /* Parameters section */
++
++ int txd; /* tx delay */
++ int holdd; /* duplex ptt delay */
++ int txtail; /* txtail delay */
++ int slot; /* slottime */
++ int pers; /* persistence */
++
++ /* Tx section */
++
++ int tx_state;
++ int tx_count;
++ int slotcnt;
++ unsigned char tx_buf[YAM_MAX_FRAME];
++ int tx_len;
++ int tx_crcl, tx_crch;
++ struct sk_buff_head send_queue; /* Packets awaiting transmission */
++
++ /* Rx section */
++
++ int dcd;
++ unsigned char rx_buf[YAM_MAX_FRAME];
++ int rx_len;
++ int rx_crcl, rx_crch;
++};
++
++struct yam_mcs {
++ unsigned char bits[YAM_FPGA_SIZE];
++ int bitrate;
++ struct yam_mcs *next;
++};
++
++static struct yam_port yam_ports[NR_PORTS];
++
++static struct yam_mcs *yam_data = NULL;
++
++static unsigned irqs[16];
++
++static char ax25_bcast[7] =
++{'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1};
++static char ax25_test[7] =
++{'L' << 1, 'I' << 1, 'N' << 1, 'U' << 1, 'X' << 1, ' ' << 1, '1' << 1};
++
++static struct timer_list yam_timer;
++
++/* --------------------------------------------------------------------- */
++
++#define RBR(iobase) (iobase+0)
++#define THR(iobase) (iobase+0)
++#define IER(iobase) (iobase+1)
++#define IIR(iobase) (iobase+2)
++#define FCR(iobase) (iobase+2)
++#define LCR(iobase) (iobase+3)
++#define MCR(iobase) (iobase+4)
++#define LSR(iobase) (iobase+5)
++#define MSR(iobase) (iobase+6)
++#define SCR(iobase) (iobase+7)
++#define DLL(iobase) (iobase+0)
++#define DLM(iobase) (iobase+1)
++
++#define YAM_EXTENT 8
++
++/* Interrupt Identification Register Bit Masks */
++#define IIR_NOPEND 1
++#define IIR_MSR 0
++#define IIR_TX 2
++#define IIR_RX 4
++#define IIR_LSR 6
++#define IIR_TIMEOUT 12 /* Fifo mode only */
++
++#define IIR_MASK 0x0F
++
++/* Interrupt Enable Register Bit Masks */
++#define IER_RX 1 /* enable rx interrupt */
++#define IER_TX 2 /* enable tx interrupt */
++#define IER_LSR 4 /* enable line status interrupts */
++#define IER_MSR 8 /* enable modem status interrupts */
++
++/* Modem Control Register Bit Masks */
++#define MCR_DTR 0x01 /* DTR output */
++#define MCR_RTS 0x02 /* RTS output */
++#define MCR_OUT1 0x04 /* OUT1 output (not accessible in RS232) */
++#define MCR_OUT2 0x08 /* Master Interrupt enable (must be set on PCs) */
++#define MCR_LOOP 0x10 /* Loopback enable */
++
++/* Modem Status Register Bit Masks */
++#define MSR_DCTS 0x01 /* Delta CTS input */
++#define MSR_DDSR 0x02 /* Delta DSR */
++#define MSR_DRIN 0x04 /* Delta RI */
++#define MSR_DDCD 0x08 /* Delta DCD */
++#define MSR_CTS 0x10 /* CTS input */
++#define MSR_DSR 0x20 /* DSR input */
++#define MSR_RING 0x40 /* RI input */
++#define MSR_DCD 0x80 /* DCD input */
++
++/* line status register bit mask */
++#define LSR_RXC 0x01
++#define LSR_OE 0x02
++#define LSR_PE 0x04
++#define LSR_FE 0x08
++#define LSR_BREAK 0x10
++#define LSR_THRE 0x20
++#define LSR_TSRE 0x40
++
++/* Line Control Register Bit Masks */
++#define LCR_DLAB 0x80
++#define LCR_BREAK 0x40
++#define LCR_PZERO 0x28
++#define LCR_PEVEN 0x18
++#define LCR_PODD 0x08
++#define LCR_STOP1 0x00
++#define LCR_STOP2 0x04
++#define LCR_BIT5 0x00
++#define LCR_BIT6 0x02
++#define LCR_BIT7 0x01
++#define LCR_BIT8 0x03
++
++/* YAM Modem <-> UART Port mapping */
++
++#define TX_RDY MSR_DCTS /* transmitter ready to send */
++#define RX_DCD MSR_DCD /* carrier detect */
++#define RX_FLAG MSR_RING /* hdlc flag received */
++#define FPGA_DONE MSR_DSR /* FPGA is configured */
++#define PTT_ON (MCR_RTS|MCR_OUT2) /* activate PTT */
++#define PTT_OFF (MCR_DTR|MCR_OUT2) /* release PTT */
++
++#define ENABLE_RXINT IER_RX /* enable uart rx interrupt during rx */
++#define ENABLE_TXINT IER_MSR /* enable uart ms interrupt during tx */
++#define ENABLE_RTXINT (IER_RX|IER_MSR) /* full duplex operations */
++
++#define MIN(a, b) (((a) < (b)) ? (a) : (b))
++#define MAX(a, b) (((a) > (b)) ? (a) : (b))
++
++/*************************************************************************
++* CRC Tables
++************************************************************************/
++
++static const unsigned char chktabl[256]=
++{ 0x00,0x89,0x12,0x9b,0x24,0xad,0x36,0xbf,0x48,0xc1,0x5a,0xd3,0x6c,0xe5,0x7e,
++ 0xf7,0x81,0x08,0x93,0x1a,0xa5,0x2c,0xb7,0x3e,0xc9,0x40,0xdb,0x52,0xed,0x64,
++ 0xff,0x76,0x02,0x8b,0x10,0x99,0x26,0xaf,0x34,0xbd,0x4a,0xc3,0x58,0xd1,0x6e,
++ 0xe7,0x7c,0xf5,0x83,0x0a,0x91,0x18,0xa7,0x2e,0xb5,0x3c,0xcb,0x42,0xd9,0x50,
++ 0xef,0x66,0xfd,0x74,0x04,0x8d,0x16,0x9f,0x20,0xa9,0x32,0xbb,0x4c,0xc5,0x5e,
++ 0xd7,0x68,0xe1,0x7a,0xf3,0x85,0x0c,0x97,0x1e,0xa1,0x28,0xb3,0x3a,0xcd,0x44,
++ 0xdf,0x56,0xe9,0x60,0xfb,0x72,0x06,0x8f,0x14,0x9d,0x22,0xab,0x30,0xb9,0x4e,
++ 0xc7,0x5c,0xd5,0x6a,0xe3,0x78,0xf1,0x87,0x0e,0x95,0x1c,0xa3,0x2a,0xb1,0x38,
++ 0xcf,0x46,0xdd,0x54,0xeb,0x62,0xf9,0x70,0x08,0x81,0x1a,0x93,0x2c,0xa5,0x3e,
++ 0xb7,0x40,0xc9,0x52,0xdb,0x64,0xed,0x76,0xff,0x89,0x00,0x9b,0x12,0xad,0x24,
++ 0xbf,0x36,0xc1,0x48,0xd3,0x5a,0xe5,0x6c,0xf7,0x7e,0x0a,0x83,0x18,0x91,0x2e,
++ 0xa7,0x3c,0xb5,0x42,0xcb,0x50,0xd9,0x66,0xef,0x74,0xfd,0x8b,0x02,0x99,0x10,
++ 0xaf,0x26,0xbd,0x34,0xc3,0x4a,0xd1,0x58,0xe7,0x6e,0xf5,0x7c,0x0c,0x85,0x1e,
++ 0x97,0x28,0xa1,0x3a,0xb3,0x44,0xcd,0x56,0xdf,0x60,0xe9,0x72,0xfb,0x8d,0x04,
++ 0x9f,0x16,0xa9,0x20,0xbb,0x32,0xc5,0x4c,0xd7,0x5e,0xe1,0x68,0xf3,0x7a,0x0e,
++ 0x87,0x1c,0x95,0x2a,0xa3,0x38,0xb1,0x46,0xcf,0x54,0xdd,0x62,0xeb,0x70,0xf9,
++ 0x8f,0x06,0x9d,0x14,0xab,0x22,0xb9,0x30,0xc7,0x4e,0xd5,0x5c,0xe3,0x6a,0xf1,
++ 0x78};
++static const unsigned char chktabh[256]=
++{ 0x00,0x11,0x23,0x32,0x46,0x57,0x65,0x74,0x8c,0x9d,0xaf,0xbe,0xca,0xdb,0xe9,
++ 0xf8,0x10,0x01,0x33,0x22,0x56,0x47,0x75,0x64,0x9c,0x8d,0xbf,0xae,0xda,0xcb,
++ 0xf9,0xe8,0x21,0x30,0x02,0x13,0x67,0x76,0x44,0x55,0xad,0xbc,0x8e,0x9f,0xeb,
++ 0xfa,0xc8,0xd9,0x31,0x20,0x12,0x03,0x77,0x66,0x54,0x45,0xbd,0xac,0x9e,0x8f,
++ 0xfb,0xea,0xd8,0xc9,0x42,0x53,0x61,0x70,0x04,0x15,0x27,0x36,0xce,0xdf,0xed,
++ 0xfc,0x88,0x99,0xab,0xba,0x52,0x43,0x71,0x60,0x14,0x05,0x37,0x26,0xde,0xcf,
++ 0xfd,0xec,0x98,0x89,0xbb,0xaa,0x63,0x72,0x40,0x51,0x25,0x34,0x06,0x17,0xef,
++ 0xfe,0xcc,0xdd,0xa9,0xb8,0x8a,0x9b,0x73,0x62,0x50,0x41,0x35,0x24,0x16,0x07,
++ 0xff,0xee,0xdc,0xcd,0xb9,0xa8,0x9a,0x8b,0x84,0x95,0xa7,0xb6,0xc2,0xd3,0xe1,
++ 0xf0,0x08,0x19,0x2b,0x3a,0x4e,0x5f,0x6d,0x7c,0x94,0x85,0xb7,0xa6,0xd2,0xc3,
++ 0xf1,0xe0,0x18,0x09,0x3b,0x2a,0x5e,0x4f,0x7d,0x6c,0xa5,0xb4,0x86,0x97,0xe3,
++ 0xf2,0xc0,0xd1,0x29,0x38,0x0a,0x1b,0x6f,0x7e,0x4c,0x5d,0xb5,0xa4,0x96,0x87,
++ 0xf3,0xe2,0xd0,0xc1,0x39,0x28,0x1a,0x0b,0x7f,0x6e,0x5c,0x4d,0xc6,0xd7,0xe5,
++ 0xf4,0x80,0x91,0xa3,0xb2,0x4a,0x5b,0x69,0x78,0x0c,0x1d,0x2f,0x3e,0xd6,0xc7,
++ 0xf5,0xe4,0x90,0x81,0xb3,0xa2,0x5a,0x4b,0x79,0x68,0x1c,0x0d,0x3f,0x2e,0xe7,
++ 0xf6,0xc4,0xd5,0xa1,0xb0,0x82,0x93,0x6b,0x7a,0x48,0x59,0x2d,0x3c,0x0e,0x1f,
++ 0xf7,0xe6,0xd4,0xc5,0xb1,0xa0,0x92,0x83,0x7b,0x6a,0x58,0x49,0x3d,0x2c,0x1e,
++ 0x0f};
++
++/*************************************************************************
++* FPGA functions
++************************************************************************/
++
++static void delay(int ms)
++{
++ unsigned long timeout = jiffies + ((ms*HZ)/1000);
++ while (jiffies < timeout);
++}
++
++/*
++ * reset FPGA
++ */
++
++static void fpga_reset(int iobase)
++{
++ outb(0, IER(iobase));
++ outb(LCR_DLAB|LCR_BIT5, LCR(iobase));
++ outb(1, DLL(iobase));
++ outb(0, DLM(iobase));
++
++ outb(LCR_BIT5, LCR(iobase));
++ inb(LSR(iobase));
++ inb(MSR(iobase));
++ /* turn off FPGA supply voltage */
++ outb(MCR_OUT1|MCR_OUT2, MCR(iobase));
++ delay(100);
++ /* turn on FPGA supply voltage again */
++ outb(MCR_DTR|MCR_RTS|MCR_OUT1|MCR_OUT2, MCR(iobase));
++ delay(100);
++}
++
++/*
++ * send one byte to FPGA
++ */
++
++static int fpga_write(int iobase, unsigned char wrd)
++{
++ unsigned char bit;
++ int k;
++ unsigned long timeout = jiffies + HZ/10;
++
++ for (k=0; k<8; k++) {
++ bit = (wrd&0x80)?(MCR_RTS|MCR_DTR):MCR_DTR;
++ outb(bit|MCR_OUT1|MCR_OUT2, MCR(iobase));
++ wrd <<=1 ;
++ outb(0xfc, THR(iobase));
++ while ((inb(LSR(iobase)) & LSR_TSRE) == 0)
++ if (jiffies > timeout) return -1;
++ }
++
++ return 0;
++}
++
++#ifdef MODULE
++static void free_mcs(void)
++{
++ struct yam_mcs *p;
++
++ while (yam_data) {
++ p = yam_data;
++ yam_data = yam_data->next;
++ kfree(p);
++ }
++}
++#endif
++
++static unsigned char *add_mcs(unsigned char *bits, int bitrate)
++{
++ struct yam_mcs *p;
++
++ /* If it already exists, replace the bit data */
++ p = yam_data;
++ while (p) {
++ if (p->bitrate == bitrate) {
++ memcpy(p->bits, bits, YAM_FPGA_SIZE);
++ return p->bits;
++ }
++ p = p->next;
++ }
++
++ /* Allocate a new mcs */
++ p = kmalloc(sizeof(struct yam_mcs), GFP_ATOMIC);
++ if (p == NULL) {
++ printk(KERN_WARNING "YAM: no memory to allocate mcs\n");
++ return NULL;
++ }
++
++ memcpy(p->bits, bits, YAM_FPGA_SIZE);
++ p->bitrate = bitrate;
++ p->next = yam_data;
++ yam_data = p;
++
++ return p->bits;
++}
++
++static unsigned char *get_mcs(int bitrate)
++{
++ struct yam_mcs *p;
++
++ p = yam_data;
++ while (p) {
++ if (p->bitrate == bitrate)
++ return p->bits;
++ p = p->next;
++ }
++
++ /* Load predefined mcs data */
++ switch (bitrate) {
++ case 1200 :
++ return add_mcs(bits_1200, bitrate);
++ default :
++ return add_mcs(bits_9600, bitrate);
++ }
++}
++
++/*
++ * download bitstream to FPGA
++ * data is contained in bits[] array in fpgaconf.h
++ */
++
++static int fpga_download(int iobase, int bitrate)
++{
++ int i, rc;
++ unsigned char *pbits;
++
++ pbits = get_mcs(bitrate);
++ if (pbits == NULL)
++ return -1;
++
++ fpga_reset(iobase);
++ for(i = 0 ; i < YAM_FPGA_SIZE ; i++) {
++ if (fpga_write(iobase, pbits[i])) {
++ printk("yam: error in write cycle\n");
++ return -1; /* write... */
++ }
++ }
++
++ fpga_write(iobase, 0xFF);
++ rc = inb(MSR(iobase)); /* check DONE signal */
++
++ /* Necesary for some hardwares */
++ delay(50);
++
++ return (rc & MSR_DSR) ? 0 : -1;
++}
++
++
++/************************************************************************
++* Serial port init
++************************************************************************/
++
++static void yam_set_uart(struct device *dev)
++{
++ struct yam_port *yp = (struct yam_port *)dev->priv;
++ int divisor = 115200/yp->baudrate;
++
++ outb(0, IER(dev->base_addr));
++ outb(LCR_DLAB|LCR_BIT8, LCR(dev->base_addr));
++ outb(divisor, DLL(dev->base_addr));
++ outb(0, DLM(dev->base_addr));
++ outb(LCR_BIT8, LCR(dev->base_addr));
++ outb(PTT_OFF, MCR(dev->base_addr));
++ outb(0x00, FCR(dev->base_addr));
++
++ /* Flush pending irq */
++
++ inb(RBR(dev->base_addr));
++ inb(MSR(dev->base_addr));
++
++ /* Enable rx irq */
++
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ /* if (yp->dupmode) {
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ }
++ else {
++ outb(ENABLE_RXINT, IER(dev->base_addr));
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ } */
++}
++
++
++/* --------------------------------------------------------------------- */
++
++enum uart { c_uart_unknown, c_uart_8250,
++ c_uart_16450, c_uart_16550, c_uart_16550A};
++static const char *uart_str[] =
++ { "unknown", "8250", "16450", "16550", "16550A" };
++
++static enum uart yam_check_uart(unsigned int iobase)
++{
++ unsigned char b1,b2,b3;
++ enum uart u;
++ enum uart uart_tab[] =
++ { c_uart_16450, c_uart_unknown, c_uart_16550, c_uart_16550A };
++
++ b1 = inb(MCR(iobase));
++ outb(b1 | 0x10, MCR(iobase)); /* loopback mode */
++ b2 = inb(MSR(iobase));
++ outb(0x1a, MCR(iobase));
++ b3 = inb(MSR(iobase)) & 0xf0;
++ outb(b1, MCR(iobase)); /* restore old values */
++ outb(b2, MSR(iobase));
++ if (b3 != 0x90)
++ return c_uart_unknown;
++ inb(RBR(iobase));
++ inb(RBR(iobase));
++ outb(0x01, FCR(iobase)); /* enable FIFOs */
++ u = uart_tab[(inb(IIR(iobase)) >> 6) & 3];
++ if (u == c_uart_16450) {
++ outb(0x5a, SCR(iobase));
++ b1 = inb(SCR(iobase));
++ outb(0xa5, SCR(iobase));
++ b2 = inb(SCR(iobase));
++ if ((b1 != 0x5a) || (b2 != 0xa5))
++ u = c_uart_8250;
++ }
++ return u;
++}
++
++/******************************************************************************
++* Rx Section
++******************************************************************************/
++static void inline yam_rx_flag(struct device *dev, struct yam_port *yp)
++{
++ if (yp->dcd && yp->rx_len >= 3 && yp->rx_len < YAM_MAX_FRAME) {
++ int pkt_len = yp->rx_len - 2 + 1; /* -CRC + kiss */
++ struct sk_buff *skb;
++
++ if ((yp->rx_crch & yp->rx_crcl) != 0xFF) {
++ /* Bad crc */
++ }
++ else {
++ if (!(skb = dev_alloc_skb(pkt_len))) {
++ printk("%s: memory squeeze, dropping packet\n", dev->name);
++ ++yp->stats.rx_dropped;
++ }
++ else {
++ unsigned char *cp;
++ skb->dev = dev;
++ cp = skb_put(skb, pkt_len);
++ *cp++ = 0; /* KISS kludge */
++ memcpy(cp, yp->rx_buf, pkt_len - 1);
++ skb->protocol = htons(ETH_P_AX25);
++ skb->mac.raw = skb->data;
++ netif_rx(skb);
++ ++yp->stats.rx_packets;
++ }
++ }
++ }
++ yp->rx_len = 0;
++ yp->rx_crcl = 0x21;
++ yp->rx_crch = 0xf3;
++}
++
++static void inline yam_rx_byte(struct device *dev, struct yam_port *yp, unsigned char rxb)
++{
++ if (yp->rx_len < YAM_MAX_FRAME) {
++ unsigned char c = yp->rx_crcl;
++ yp->rx_crcl = (chktabl[c]^yp->rx_crch);
++ yp->rx_crch = (chktabh[c]^rxb);
++ yp->rx_buf[yp->rx_len++] = rxb;
++ }
++}
++
++/********************************************************************************
++* TX Section
++********************************************************************************/
++
++static void ptt_on(struct device *dev)
++{
++ /* struct yam_port *yp = (struct yam_port *)dev->priv; */
++
++ outb(PTT_ON, MCR(dev->base_addr));
++ /* inb(MSR(dev->base_addr));
++ if (yp->dupmode) {
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ }
++ else {
++ outb(ENABLE_TXINT, IER(dev->base_addr));
++ } */
++}
++
++static void ptt_off(struct device *dev)
++{
++ /* struct yam_port *yp = (struct yam_port *)dev->priv; */
++
++ outb(PTT_OFF, MCR(dev->base_addr));
++ /* if (yp->dupmode) {
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ }
++ else {
++ inb(RBR(dev->base_addr));
++ outb(ENABLE_RXINT, IER(dev->base_addr));
++ } */
++}
++
++static int yam_send_packet(struct sk_buff *skb, struct device *dev)
++{
++ struct yam_port *yp = dev->priv;
++
++ if (skb == NULL) {
++ dev_tint(dev);
++ return 0;
++ }
++ skb_queue_tail(&yp->send_queue, skb);
++ dev->trans_start = jiffies;
++ return 0;
++}
++
++static void yam_start_tx(struct device *dev, struct yam_port *yp)
++{
++ if ((yp->tx_state == TX_TAIL) || (yp->txd == 0))
++ yp->tx_count = 1;
++ else
++ yp->tx_count = (yp->bitrate*yp->txd)/8000;
++ yp->tx_state = TX_HEAD;
++ ptt_on(dev);
++}
++
++static unsigned short random_seed;
++
++static inline unsigned short random_num(void)
++{
++ random_seed = 28629 * random_seed + 157;
++ return random_seed;
++}
++
++static void yam_arbitrate(struct device *dev)
++{
++ struct yam_port *yp = dev->priv;
++
++ if (!yp || yp->magic != YAM_MAGIC
++ || yp->tx_state!=TX_OFF || skb_queue_empty(&yp->send_queue)) {
++ return;
++ }
++
++ /* tx_state is TX_OFF and there is data to send */
++
++ if (yp->dupmode) {
++ /* Full duplex mode, don't wait */
++ yam_start_tx(dev, yp);
++ return;
++ }
++
++ if (yp->dcd) {
++ /* DCD on, wait slotime ... */
++ yp->slotcnt = yp->slot / 10;
++ return;
++ }
++
++ /* Is slottime passed ? */
++ if ((--yp->slotcnt) > 0)
++ return;
++
++ yp->slotcnt = yp->slot / 10;
++
++ /* is random > persist ? */
++ if ((random_num() % 256) > yp->pers)
++ return;
++
++ yam_start_tx(dev, yp);
++}
++
++static void yam_dotimer(unsigned long dummy)
++{
++ int i;
++
++ for (i = 0; i < NR_PORTS; i++) {
++ struct device *dev = &yam_ports[i].dev;
++ if (dev->start) yam_arbitrate(dev);
++ }
++ yam_timer.expires = jiffies + HZ/100;
++ add_timer(&yam_timer);
++}
++
++static void yam_tx_byte(struct device *dev, struct yam_port *yp)
++{
++ struct sk_buff *skb;
++ unsigned char b, temp;
++
++ switch (yp->tx_state) {
++ case TX_OFF:
++ break;
++ case TX_HEAD:
++ if (--yp->tx_count <= 0) {
++ if (!(skb = skb_dequeue(&yp->send_queue))) {
++ ptt_off(dev);
++ yp->tx_state = TX_OFF;
++ break;
++ }
++ yp->tx_state = TX_DATA;
++ if (skb->data[0] != 0) {
++/* do_kiss_params(s, skb->data, skb->len);*/
++ dev_kfree_skb(skb, FREE_WRITE);
++ break;
++ }
++ yp->tx_len = skb->len-1; /* strip KISS byte */
++ if (yp->tx_len >= YAM_MAX_FRAME || yp->tx_len < 2) {
++ dev_kfree_skb(skb, FREE_WRITE);
++ break;
++ }
++ memcpy(yp->tx_buf, skb->data+1, yp->tx_len);
++ dev_kfree_skb(skb, FREE_WRITE);
++ yp->tx_count = 0;
++ yp->tx_crcl = 0x21;
++ yp->tx_crch = 0xf3;
++ yp->tx_state = TX_DATA;
++ }
++ break;
++ case TX_DATA:
++ b = yp->tx_buf[yp->tx_count++];
++ outb(b, THR(dev->base_addr));
++ temp = yp->tx_crcl;
++ yp->tx_crcl = chktabl[temp]^yp->tx_crch;
++ yp->tx_crch = chktabh[temp]^b;
++ if (yp->tx_count >= yp->tx_len) {
++ yp->tx_state = TX_CRC1;
++ }
++ break;
++ case TX_CRC1:
++ yp->tx_crch = chktabl[yp->tx_crcl]^yp->tx_crch;
++ yp->tx_crcl = chktabh[yp->tx_crcl]^chktabl[yp->tx_crch]^0xff;
++ outb(yp->tx_crcl, THR(dev->base_addr));
++ yp->tx_state = TX_CRC2;
++ break;
++ case TX_CRC2:
++ outb(chktabh[yp->tx_crch]^0xFF, THR(dev->base_addr));
++ if (skb_queue_empty(&yp->send_queue)) {
++ yp->tx_count = (yp->bitrate*yp->txtail)/8000;
++ if (yp->dupmode == 2) yp->tx_count += (yp->bitrate*yp->holdd)/8;
++ if (yp->tx_count == 0) yp->tx_count = 1;
++ yp->tx_state = TX_TAIL;
++ }
++ else {
++ yp->tx_count = 1;
++ yp->tx_state = TX_HEAD;
++ }
++ ++yp->stats.tx_packets;
++ break;
++ case TX_TAIL:
++ if (--yp->tx_count <= 0) {
++ yp->tx_state = TX_OFF;
++ ptt_off(dev);
++ }
++ break;
++ }
++}
++
++/***********************************************************************************
++* ISR routine
++************************************************************************************/
++
++static void yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++ struct device *dev;
++ struct yam_port *yp;
++ unsigned char iir;
++ int counter = 100;
++ int i;
++
++ sti();
++
++ for (i = 0 ; i < NR_PORTS ; i++) {
++ yp = &yam_ports[i];
++ dev = &yp->dev;
++
++ if (!dev->start)
++ continue;
++
++ while ( (iir = IIR_MASK & inb(IIR(dev->base_addr)) ) != IIR_NOPEND) {
++ unsigned char msr = inb(MSR(dev->base_addr));
++ unsigned char lsr = inb(LSR(dev->base_addr));
++ unsigned char rxb;
++
++ if (lsr & LSR_OE)
++ ++yp->stats.rx_fifo_errors;
++
++ yp->dcd = (msr & RX_DCD) ? 1 : 0;
++
++ if (--counter <= 0) {
++ printk("%s: too many irq iir=%d\n", dev->name, iir);
++ return;
++ }
++
++ if (msr & TX_RDY) {
++ ++yp->nb_mdint;
++ yam_tx_byte(dev, yp);
++ }
++
++ if (lsr & LSR_RXC) {
++ ++yp->nb_rxint;
++ rxb = inb(RBR(dev->base_addr));
++ if (msr & RX_FLAG) yam_rx_flag(dev, yp);
++ else yam_rx_byte(dev, yp, rxb);
++ }
++ /*
++ switch (iir) {
++ case IIR_MSR:
++ ++yp->nb_mdint;
++ if (msr & TX_RDY) yam_tx_byte(dev, yp);
++ break;
++ case IIR_RX:
++ ++yp->nb_rxint;
++ rxb = inb(RBR(dev->base_addr));
++ if (msr & RX_FLAG) yam_rx_flag(dev, yp);
++ else yam_rx_byte(dev, yp, rxb);
++ break;
++ }
++ */
++ }
++ }
++}
++
++static int yam_net_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
++{
++ int len = 0;
++ int i;
++ off_t pos = 0;
++ off_t begin = 0;
++
++ cli();
++
++ for (i = 0; i < NR_PORTS; i++)
++ {
++ if (yam_ports[i].iobase == 0 || yam_ports[i].irq == 0)
++ continue;
++ len += sprintf(buffer+len, "Device %s\n", yam_ports[i].name);
++ len += sprintf(buffer+len, " Up %d\n", yam_ports[i].dev.start);
++ len += sprintf(buffer+len, " Speed %u\n", yam_ports[i].bitrate);
++ len += sprintf(buffer+len, " IoBase 0x%x\n", yam_ports[i].iobase);
++ len += sprintf(buffer+len, " BaudRate %u\n", yam_ports[i].baudrate);
++ len += sprintf(buffer+len, " IRQ %u\n", yam_ports[i].irq);
++ len += sprintf(buffer+len, " TxState %u\n", yam_ports[i].tx_state);
++ len += sprintf(buffer+len, " Duplex %u\n", yam_ports[i].dupmode);
++ len += sprintf(buffer+len, " HoldDly %u\n", yam_ports[i].holdd);
++ len += sprintf(buffer+len, " TxDelay %u\n", yam_ports[i].txd);
++ len += sprintf(buffer+len, " TxTail %u\n", yam_ports[i].txtail);
++ len += sprintf(buffer+len, " SlotTime %u\n", yam_ports[i].slot);
++ len += sprintf(buffer+len, " Persist %u\n", yam_ports[i].pers);
++ len += sprintf(buffer+len, " TxFrames %u\n", yam_ports[i].stats.tx_packets);
++ len += sprintf(buffer+len, " RxFrames %u\n", yam_ports[i].stats.rx_packets);
++ len += sprintf(buffer+len, " TxInt %u\n", yam_ports[i].nb_mdint);
++ len += sprintf(buffer+len, " RxInt %u\n", yam_ports[i].nb_rxint);
++ len += sprintf(buffer+len, " RxOver %u\n", yam_ports[i].stats.rx_fifo_errors);
++ len += sprintf(buffer+len, "\n");
++
++ pos = begin + len;
++
++ if (pos < offset) {
++ len = 0;
++ begin = pos;
++ }
++
++ if (pos > offset + length)
++ break;
++ }
++
++ sti();
++
++ *start = buffer + (offset - begin);
++ len -= (offset - begin);
++
++ if (len > length) len = length;
++
++ return len;
++}
++
++#ifdef CONFIG_INET
++#ifndef PROC_NET_YAM
++#define PROC_NET_YAM (PROC_NET_LAST+10) /* Sorry again... */
++#endif
++
++struct proc_dir_entry yam_proc_dir_entry =
++{
++ PROC_NET_YAM, 3, "yam", S_IFREG | S_IRUGO, 1, 0, 0, 0,
++ &proc_net_inode_operations, yam_net_get_info
++};
++
++#define yam_net_procfs_init() proc_net_register(&yam_proc_dir_entry);
++#define yam_net_procfs_remove() proc_net_unregister(PROC_NET_YAM);
++#else
++#define yam_net_procfs_init()
++#define yam_net_procfs_remove()
++#endif
++
++/* --------------------------------------------------------------------- */
++
++#if LINUX_VERSION_CODE >= 0x20119
++static struct net_device_stats *yam_get_stats(struct device *dev)
++#else
++static struct enet_statistics *yam_get_stats(struct device *dev)
++#endif
++{
++ struct yam_port *yp;
++
++ if (!dev || !dev->priv)
++ return NULL;
++
++ yp = (struct yam_port *)dev->priv;
++ if (yp->magic != YAM_MAGIC)
++ return NULL;
++
++ /*
++ * Get the current statistics. This may be called with the
++ * card open or closed.
++ */
++ return &yp->stats;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_open(struct device *dev)
++{
++ struct yam_port *yp = (struct yam_port *)dev->priv;
++ enum uart u;
++ int i;
++
++ printk(KERN_INFO "Trying %s at iobase 0x%lx irq %u\n", dev->name, dev->base_addr, dev->irq);
++
++ if (!dev || !yp || !yp->bitrate)
++ return -ENXIO;
++ if (!dev->base_addr || dev->base_addr > 0x1000-YAM_EXTENT ||
++ dev->irq < 2 || dev->irq > 15) {
++ return -ENXIO;
++ }
++ if (check_region(dev->base_addr, YAM_EXTENT)) {
++ printk("%s: cannot 0x%lx busy\n", dev->name, dev->base_addr);
++ return -EACCES;
++ }
++ if ((u = yam_check_uart(dev->base_addr)) == c_uart_unknown) {
++ printk("%s: cannot find uart type\n", dev->name);
++ return -EIO;
++ }
++
++ if (fpga_download(dev->base_addr, yp->bitrate)) {
++ printk("%s: cannot init FPGA\n", dev->name);
++ return -EIO;
++ }
++
++ outb(0, IER(dev->base_addr));
++ if (request_irq(dev->irq, yam_interrupt, SA_INTERRUPT|SA_SHIRQ, dev->name, NULL)) {
++ printk("%s: irq %d busy\n", dev->name, dev->irq);
++ return -EBUSY;
++ }
++
++ request_region(dev->base_addr, YAM_EXTENT, dev->name);
++
++ yam_set_uart(dev);
++ dev->start = 1;
++ yp->slotcnt = yp->slot / 10;
++
++ /* Reset overruns for all ports - FPGA programming makes overruns */
++ for (i = 0 ; i < NR_PORTS ; i++) {
++ inb(LSR(yam_ports[i].dev.base_addr));
++ yam_ports[i].stats.rx_fifo_errors = 0;
++ }
++
++ printk(KERN_INFO "%s at iobase 0x%lx irq %u uart %s\n", dev->name, dev->base_addr, dev->irq,
++ uart_str[u]);
++ MOD_INC_USE_COUNT;
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_close(struct device *dev)
++{
++ struct sk_buff *skb;
++ struct yam_port *yp = (struct yam_port *)dev->priv;
++
++ if (!dev || !yp)
++ return -EINVAL;
++ /*
++ * disable interrupts
++ */
++ outb(0, IER(dev->base_addr));
++ outb(1, MCR(dev->base_addr));
++ /* Remove IRQ handler if last */
++ free_irq(dev->irq, NULL);
++ release_region(dev->base_addr, YAM_EXTENT);
++ dev->start = 0;
++ dev->tbusy = 1;
++ while ((skb = skb_dequeue(&yp->send_queue)))
++ dev_kfree_skb(skb, FREE_WRITE);
++
++ printk(KERN_INFO "%s: close yam at iobase 0x%lx irq %u\n",
++ yam_drvname, dev->base_addr, dev->irq);
++ MOD_DEC_USE_COUNT;
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
++{
++ struct yam_port *yp = (struct yam_port *)dev->priv;
++ struct yamdrv_ioctl_cfg yi;
++ struct yamdrv_ioctl_mcs *ym;
++ int ioctl_cmd;
++
++ if (copy_from_user(&ioctl_cmd, ifr->ifr_data, sizeof(int)))
++ return -EFAULT;
++
++ if (yp == NULL || yp->magic != YAM_MAGIC)
++ return -EINVAL;
++
++ if (!suser()) return -EPERM;
++
++ if (cmd != SIOCDEVPRIVATE)
++ return -EINVAL;
++
++ switch(ioctl_cmd) {
++
++ case SIOCYAMRESERVED:
++ return -EINVAL; /* unused */
++
++ case SIOCYAMSMCS:
++ if (dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++ ym = kmalloc(sizeof(struct yamdrv_ioctl_mcs), GFP_ATOMIC);
++ ym->bitrate = 9600;
++ if (copy_from_user(ym, ifr->ifr_data, sizeof(struct yamdrv_ioctl_mcs)))
++ return -EFAULT;
++ if (ym->bitrate > YAM_MAXBITRATE) return -EINVAL;
++ add_mcs(ym->bits, ym->bitrate);
++ kfree(ym);
++ break;
++
++ case SIOCYAMSCFG:
++ if (copy_from_user(&yi, ifr->ifr_data, sizeof(struct yamdrv_ioctl_cfg)))
++ return -EFAULT;
++
++ if ((yi.cfg.mask & YAM_IOBASE) && dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++ if ((yi.cfg.mask & YAM_IRQ) && dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++ if ((yi.cfg.mask & YAM_BITRATE) && dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++ if ((yi.cfg.mask & YAM_BAUDRATE) && dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++
++ if (yi.cfg.mask & YAM_IOBASE) {
++ yp->iobase = yi.cfg.iobase;
++ dev->base_addr = yi.cfg.iobase;
++ }
++ if (yi.cfg.mask & YAM_IRQ) {
++ if (yi.cfg.irq > 15) return -EINVAL;
++ yp->irq = yi.cfg.irq;
++ dev->irq = yi.cfg.irq;
++ }
++ if (yi.cfg.mask & YAM_BITRATE) {
++ if (yi.cfg.bitrate > YAM_MAXBITRATE) return -EINVAL;
++ yp->bitrate = yi.cfg.bitrate;
++ }
++ if (yi.cfg.mask & YAM_BAUDRATE) {
++ if (yi.cfg.baudrate > YAM_MAXBAUDRATE) return -EINVAL;
++ yp->baudrate = yi.cfg.baudrate;
++ }
++ if (yi.cfg.mask & YAM_MODE) {
++ if (yi.cfg.mode > YAM_MAXMODE) return -EINVAL;
++ yp->dupmode = yi.cfg.mode;
++ }
++ if (yi.cfg.mask & YAM_HOLDDLY) {
++ if (yi.cfg.holddly > YAM_MAXHOLDDLY) return -EINVAL;
++ yp->holdd = yi.cfg.holddly;
++ }
++ if (yi.cfg.mask & YAM_TXDELAY) {
++ if (yi.cfg.txdelay > YAM_MAXTXDELAY) return -EINVAL;
++ yp->txd = yi.cfg.txdelay;
++ }
++ if (yi.cfg.mask & YAM_TXTAIL) {
++ if (yi.cfg.txtail > YAM_MAXTXTAIL) return -EINVAL;
++ yp->txtail = yi.cfg.txtail;
++ }
++ if (yi.cfg.mask & YAM_PERSIST) {
++ if (yi.cfg.persist > YAM_MAXPERSIST) return -EINVAL;
++ yp->pers = yi.cfg.persist;
++ }
++ if (yi.cfg.mask & YAM_SLOTTIME) {
++ if (yi.cfg.slottime > YAM_MAXSLOTTIME) return -EINVAL;
++ yp->slot = yi.cfg.slottime;
++ yp->slotcnt = yp->slot / 10;
++ }
++ break;
++
++ case SIOCYAMGCFG:
++ yi.cfg.mask = 0xffffffff;
++ yi.cfg.iobase = yp->iobase;
++ yi.cfg.irq = yp->irq;
++ yi.cfg.bitrate = yp->bitrate;
++ yi.cfg.baudrate = yp->baudrate;
++ yi.cfg.mode = yp->dupmode;
++ yi.cfg.txdelay = yp->txd;
++ yi.cfg.holddly = yp->holdd;
++ yi.cfg.txtail = yp->txtail;
++ yi.cfg.persist = yp->pers;
++ yi.cfg.slottime = yp->slot;
++ if (copy_to_user(ifr->ifr_data, &yi, sizeof(struct yamdrv_ioctl_cfg)))
++ return -EFAULT;
++ break;
++
++ default:
++ return -EINVAL;
++
++ }
++
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_set_mac_address(struct device *dev, void *addr)
++{
++ struct sockaddr *sa = (struct sockaddr *)addr;
++
++ /* addr is an AX.25 shifted ASCII mac address */
++ memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_probe(struct device *dev)
++{
++ struct yam_port *yp;
++
++ if (!dev)
++ return -ENXIO;
++
++ yp = (struct yam_port *)dev->priv;
++
++ dev->open = yam_open;
++ dev->stop = yam_close;
++ dev->do_ioctl = yam_ioctl;
++ dev->hard_start_xmit = yam_send_packet;
++ dev->get_stats = yam_get_stats;
++
++ dev_init_buffers(dev);
++ skb_queue_head_init(&yp->send_queue);
++
++#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
++ dev->hard_header = ax25_encapsulate;
++ dev->rebuild_header = ax25_rebuild_header;
++#else /* CONFIG_AX25 || CONFIG_AX25_MODULE */
++ dev->hard_header = NULL;
++ dev->rebuild_header = NULL;
++#endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */
++
++ dev->set_mac_address = yam_set_mac_address;
++
++ dev->type = ARPHRD_AX25; /* AF_AX25 device */
++ dev->hard_header_len = 73; /* We do digipeaters now */
++ dev->mtu = 256; /* AX25 is the default */
++ dev->addr_len = 7; /* sizeof an ax.25 address */
++ memcpy(dev->broadcast, ax25_bcast, 7);
++ memcpy(dev->dev_addr, ax25_test, 7);
++
++ /* New style flags */
++ dev->flags = 0;
++ dev->family = AF_INET;
++ dev->pa_addr = 0;
++ dev->pa_brdaddr = 0;
++ dev->pa_mask = 0;
++ dev->pa_alen = sizeof(unsigned long);
++
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++__initfunc(int yam_init(struct device *dev))
++{
++ int i;
++
++ printk(yam_drvinfo);
++
++ /* Clears the IRQ table */
++ memset(irqs, 0, sizeof(irqs));
++ memset(yam_ports, 0, sizeof(yam_ports));
++
++ for(i = 0; i < NR_PORTS; i++) {
++ sprintf(yam_ports[i].name, "yam%d", i);
++ yam_ports[i].magic = YAM_MAGIC;
++ yam_ports[i].bitrate = DEFAULT_BITRATE;
++ yam_ports[i].baudrate = DEFAULT_BITRATE * 2;
++ yam_ports[i].iobase = 0;
++ yam_ports[i].irq = 0;
++ yam_ports[i].dupmode = 0;
++ yam_ports[i].holdd = DEFAULT_HOLDD;
++ yam_ports[i].txd = DEFAULT_TXD;
++ yam_ports[i].txtail = DEFAULT_TXTAIL;
++ yam_ports[i].slot = DEFAULT_SLOT;
++ yam_ports[i].pers = DEFAULT_PERS;
++
++ dev = &yam_ports[i].dev;
++
++ dev->priv = &yam_ports[i];
++ dev->name = yam_ports[i].name;
++ dev->base_addr = yam_ports[i].iobase;
++ dev->irq = yam_ports[i].irq;
++ dev->init = yam_probe;
++ dev->if_port = 0;
++ dev->start = 0;
++ dev->tbusy = 1;
++
++ if (register_netdev(dev)) {
++ printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name);
++ return -ENXIO;
++ }
++ }
++
++ yam_timer.function = yam_dotimer;
++ yam_timer.expires = jiffies + HZ/100;
++ add_timer(&yam_timer);
++
++ yam_net_procfs_init();
++
++ /* do not keep this device */
++ return 1;
++}
++
++/* --------------------------------------------------------------------- */
++
++#ifdef MODULE
++
++/*
++ * command line settable parameters
++ */
++
++#if LINUX_VERSION_CODE >= 0x20115
++
++MODULE_AUTHOR("Frederic Rible F1OAT frible@teaser.fr");
++MODULE_DESCRIPTION("Yam amateur radio modem driver");
++
++#endif
++
++__initfunc(int init_module(void))
++{
++ int ret = yam_init(NULL);
++
++ return (ret == 1) ? 0 : ret;
++}
++
++/* --------------------------------------------------------------------- */
++
++void cleanup_module(void)
++{
++ int i;
++
++ del_timer(&yam_timer);
++ for(i = 0; i < NR_PORTS; i++) {
++ struct device *dev = &yam_ports[i].dev;
++ if (!dev->priv) continue;
++ if (dev->start) yam_close(dev);
++ unregister_netdev(dev);
++ }
++ free_mcs();
++ yam_net_procfs_remove();
++}
++
++#endif /* MODULE */
++/* --------------------------------------------------------------------- */
diff --git a/yamdrv/yam08-2.2.1-patch.diff b/yamdrv/yam08-2.2.1-patch.diff
new file mode 100644
index 0000000..0906155
--- /dev/null
+++ b/yamdrv/yam08-2.2.1-patch.diff
@@ -0,0 +1,2172 @@
+diff -u --recursive --new-file linux.prev/Documentation/Configure.help linux/Documentation/Configure.help
+--- linux.prev/Documentation/Configure.help Sat Sep 12 23:12:05 1998
++++ linux/Documentation/Configure.help Sat Sep 12 23:07:13 1998
+@@ -3178,6 +2875,13 @@
+ ### Don't know what's going on here.
+ ###
+ #
++YAM driver for AX.25
++CONFIG_YAM
++ Support for the YAM modem on serial port. If you want to compile this
++ as a module ( = code which can be inserted in and removed from the
++ running kernel whenever you want), say M here and read
++ Documentation/modules.txt.
++
+ BAYCOM picpar and par96 driver for AX.25
+ CONFIG_BAYCOM_PAR
+ This is a driver for Baycom style simple amateur radio modems that
+diff -u --recursive --new-file linux.prev/drivers/net/hamradio/Config.in linux/drivers/net/hamradio/Config.in
+--- linux.prev/drivers/net/hamradio/Config.in Sat Sep 12 23:11:49 1998
++++ linux/drivers/net/hamradio/Config.in Sat Sep 12 22:02:40 1998
+@@ -28,3 +28,5 @@
+ bool ' soundmodem support for 4800 baud PSK modulation' CONFIG_SOUNDMODEM_PSK4800
+ bool ' soundmodem support for 9600 baud FSK G3RUH modulation' CONFIG_SOUNDMODEM_FSK9600
+ fi
++
++tristate 'YAM driver for AX.25' CONFIG_YAM
+diff -u --recursive --new-file linux.prev/drivers/net/hamradio/Makefile linux/drivers/net/hamradio/Makefile
+--- linux.prev/drivers/net/hamradio/Makefile Sat Sep 12 23:11:49 1998
++++ linux/drivers/net/hamradio/Makefile Sat Sep 12 22:01:01 1998
+@@ -53,6 +53,14 @@
+ endif
+ endif
+
++ifeq ($(CONFIG_YAM),y)
++L_OBJS += yam.o
++else
++ ifeq ($(CONFIG_YAM),m)
++ M_OBJS += yam.o
++ endif
++endif
++
+ ifeq ($(CONFIG_PI),y)
+ L_OBJS += pi2.o
+ else
+diff -u --recursive --new-file linux.prev/drivers/net/Space.c linux/drivers/net/Space.c
+--- linux.prev/drivers/net/Space.c Sat Sep 12 23:11:49 1998
++++ linux/drivers/net/Space.c Sat Sep 12 22:01:42 1998
+@@ -660,6 +660,16 @@
+ #define NEXT_DEV (&mkiss_bootstrap)
+ #endif /* MKISS */
+
++#if defined(CONFIG_YAM)
++ /* To be exact, this node just hooks the initialization
++ routines to the device structures. */
++extern int yam_init(struct device *);
++static struct device yam_bootstrap = {
++ "yam", 0x0, 0x0, 0x0, 0x0, 0, 0, 0, 0, 0, NEXT_DEV, yam_init, };
++#undef NEXT_DEV
++#define NEXT_DEV (&yam_bootstrap)
++#endif /* CONFIG_YAM */
++
+ #if defined(CONFIG_STRIP)
+ extern int strip_init_ctrl_dev(struct device *);
+ static struct device strip_bootstrap = {
+diff -u --recursive --new-file linux.prev/include/linux/yam.h linux/include/linux/yam.h
+--- linux.prev/include/linux/yam.h Thu Jan 1 00:00:00 1970
++++ linux/include/linux/yam.h Sat Sep 12 22:03:24 1998
+@@ -0,0 +1,82 @@
++/*****************************************************************************/
++
++/*
++ * yam.h -- YAM radio modem driver.
++ *
++ * Copyright (C) 1998 Frederic Rible F1OAT (frible@teaser.fr)
++ * Adapted from baycom.c driver written by Thomas Sailer (sailer@ife.ee.ethz.ch)
++ *
++ * 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 2 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, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Please note that the GPL allows you to use the driver, NOT the radio.
++ * In order to use the radio, you need a license from the communications
++ * authority of your country.
++ *
++ *
++ */
++
++/*****************************************************************************/
++
++#define SIOCYAMRESERVED (0)
++#define SIOCYAMSCFG (1) /* Set configuration */
++#define SIOCYAMGCFG (2) /* Get configuration */
++#define SIOCYAMSMCS (3) /* Set mcs data */
++
++#define YAM_IOBASE (1 << 0)
++#define YAM_IRQ (1 << 1)
++#define YAM_BITRATE (1 << 2) /* Bit rate of radio port ->57600 */
++#define YAM_MODE (1 << 3) /* 0=simplex 1=duplex 2=duplex+tempo */
++#define YAM_HOLDDLY (1 << 4) /* duplex tempo (sec) */
++#define YAM_TXDELAY (1 << 5) /* Tx Delay (ms) */
++#define YAM_TXTAIL (1 << 6) /* Tx Tail (ms) */
++#define YAM_PERSIST (1 << 7) /* Persist (ms) */
++#define YAM_SLOTTIME (1 << 8) /* Slottime (ms) */
++#define YAM_BAUDRATE (1 << 9) /* Baud rate of rs232 port ->115200 */
++
++#define YAM_MAXBITRATE 57600
++#define YAM_MAXBAUDRATE 115200
++#define YAM_MAXMODE 2
++#define YAM_MAXHOLDDLY 99
++#define YAM_MAXTXDELAY 999
++#define YAM_MAXTXTAIL 999
++#define YAM_MAXPERSIST 255
++#define YAM_MAXSLOTTIME 999
++
++#define YAM_FPGA_SIZE 5302
++
++struct yamcfg {
++ unsigned int mask; /* Mask of commands */
++ unsigned int iobase; /* IO Base of COM port */
++ unsigned int irq; /* IRQ of COM port */
++ unsigned int bitrate; /* Bit rate of radio port */
++ unsigned int baudrate; /* Baud rate of the RS232 port */
++ unsigned int txdelay; /* TxDelay */
++ unsigned int txtail; /* TxTail */
++ unsigned int persist; /* Persistence */
++ unsigned int slottime; /* Slottime */
++ unsigned int mode; /* mode 0 (simp), 1(Dupl), 2(Dupl+delay) */
++ unsigned int holddly; /* PTT delay in FullDuplex 2 mode */
++};
++
++struct yamdrv_ioctl_cfg {
++ int cmd;
++ struct yamcfg cfg;
++};
++
++struct yamdrv_ioctl_mcs {
++ int cmd;
++ int bitrate;
++ unsigned char bits[YAM_FPGA_SIZE];
++};
+diff -u --recursive --new-file linux.prev/drivers/net/hamradio/yam1200.h linux/drivers/net/hamradio/yam1200.h
+--- linux.prev/drivers/net/hamradio/yam1200.h Thu Jan 1 00:00:00 1970
++++ linux/drivers/net/hamradio/yam1200.h Sat Sep 12 22:03:34 1998
+@@ -0,0 +1,343 @@
++/*
++ *
++ * File yam1k2b5.mcs converted to h format by mcs2h
++ *
++ * (C) F6FBB 1998
++ *
++ * Tue Aug 25 20:24:08 1998
++ *
++ */
++
++static unsigned char bits_1200[]= {
++0xff,0xf2,0x00,0xa5,0xad,0xff,0xfe,0x9f,0xff,0xef,0xf3,0xcb,0xff,0xdb,0xfc,0xf2,
++0xff,0xf6,0xff,0x3c,0xbf,0xfd,0xbf,0xdf,0x6e,0x3f,0x6f,0xf1,0x7d,0xb4,0xfd,0xbf,
++0xdf,0x6f,0x3f,0x6f,0xf7,0x0b,0xff,0xdb,0xfd,0xf2,0xff,0xf6,0xff,0xff,0xff,0xff,
++0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xdf,0xff,0xff,0xff,0xef,0xff,0xff,0xff,
++0xfd,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xbf,
++0xff,0xff,0xf7,0xff,0xff,0xfb,0xff,0xff,0xff,0xfc,0xff,0xfe,0xff,0xff,0xff,0xf0,
++0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xf1,0xff,0xff,0xfe,0x7f,0xbf,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xfb,0xff,0xff,0xff,0xf0,0x9f,
++0xff,0xff,0xff,0xfe,0xff,0xfd,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xf7,0xff,
++0xff,0xff,0xfb,0xff,0xfb,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf7,0xff,0xff,0xfb,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xef,0xff,0xf0,0x5f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xef,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xbf,0xff,0xff,0xdf,0xf7,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xfb,0xfe,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,
++0xff,0xff,0xff,0xfd,0xff,0xbf,0xf1,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xfb,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x6f,0xff,0xff,0xff,
++0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xf7,0xff,0xff,0xf1,0xff,0xff,0xf7,0xbf,0xe7,0xff,0xff,0xff,0xff,0xfb,
++0xff,0xff,0xff,0xff,0xff,0xff,0x77,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xdb,
++0xff,0xff,0xf5,0xa5,0xfd,0x4b,0x6e,0xef,0x33,0x32,0xdd,0xd3,0x4a,0xd6,0x92,0xfe,
++0xb3,0x3f,0xbd,0xf1,0xfa,0xdb,0xfe,0xf7,0xf6,0x96,0xbd,0xbd,0xff,0xbd,0xff,0xed,
++0x7f,0x6b,0x7f,0xfb,0xdf,0xfe,0xfb,0xfe,0x90,0xcf,0xff,0xff,0xff,0xfe,0xbe,0xef,
++0xff,0xff,0xdb,0x5f,0xf6,0xff,0xf6,0x8f,0xfd,0xa5,0xdd,0xff,0xff,0xff,0xff,0x6f,
++0x7f,0xdb,0xf1,0xfc,0xbf,0xff,0x6f,0xff,0xef,0xfc,0x5b,0x5d,0xda,0xdf,0xf4,0xff,
++0xf2,0xff,0xfd,0xbf,0xff,0xff,0xff,0xd0,0x1f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xfb,0xef,0xb7,0xfc,0x33,0xff,0xfb,0xff,0x04,0x6a,0xf3,0x3c,0x36,0xff,0xf0,
++0x0f,0xf1,0x0f,0xff,0xff,0xff,0xf3,0x15,0x72,0x0f,0xf1,0x6f,0xff,0xfe,0x94,0x3f,
++0xff,0xff,0xff,0x7b,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf0,
++0xf7,0xef,0xb7,0xfc,0x33,0xff,0xff,0xff,0x04,0x6a,0xf3,0x3c,0x36,0xff,0xf0,0x0f,
++0xf1,0x0f,0xff,0xff,0xff,0xf3,0x15,0x73,0x8f,0xf2,0x6f,0xff,0xfe,0x94,0x3f,0xff,
++0xff,0xff,0x7d,0x9f,0xff,0xf0,0x0f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0x9e,
++0xff,0xfc,0xef,0xd3,0xfb,0xff,0x7f,0xf5,0x5f,0xfe,0x59,0xff,0xff,0xff,0xfc,0xf1,
++0xfe,0x7f,0xff,0xff,0xfa,0x17,0xff,0xe7,0xef,0xef,0xff,0xff,0x3f,0xf1,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xf5,0xff,0xbf,0xff,0xfc,0xea,
++0xff,0xf0,0xff,0xff,0xbf,0xf9,0x3f,0xb1,0xef,0xff,0xd7,0xff,0xfb,0xff,0xf0,0xff,
++0xff,0xf3,0xff,0xdf,0xff,0x7b,0xff,0xfd,0xff,0xf6,0xff,0xbf,0xff,0xff,0xbf,0xff,
++0xff,0xff,0xda,0xf0,0xff,0xff,0xff,0xff,0xfe,0xf2,0xc0,0x01,0x00,0x00,0x02,0x02,
++0x02,0x02,0x00,0x40,0x40,0x40,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0x00,0x00,
++0x00,0x00,0x00,0x00,0x19,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
++0x00,0x3c,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xfb,0xff,0xfd,0xff,
++0xff,0x7f,0xff,0xff,0xbf,0xff,0xef,0xff,0xff,0xfd,0xff,0xff,0xf1,0xff,0xdf,0xff,
++0xff,0xff,0xff,0xff,0xff,0xbf,0xfe,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xdf,
++0xdb,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xf0,0xbf,0xdf,0xff,0x7f,0xff,0xff,0xff,0xff,
++0xdf,0xdf,0xff,0xef,0xff,0x9e,0xef,0xff,0xff,0x7f,0xff,0xf1,0xef,0xff,0xff,0xff,
++0xf7,0xfa,0xbf,0xff,0xff,0xfe,0x47,0xef,0xff,0xbd,0xf6,0xff,0xff,0xdf,0xf5,0xf0,
++0xf0,0xef,0xff,0xff,0xff,0xfe,0xf8,0x30,0x00,0x00,0x00,0x04,0x00,0x01,0x02,0x08,
++0x16,0x00,0x00,0x00,0x80,0x00,0x01,0x02,0x00,0x80,0x01,0x0c,0x02,0x00,0x00,0x01,
++0x00,0x00,0x20,0x00,0x00,0x06,0x00,0x20,0x00,0x10,0x00,0x14,0x00,0x04,0xc1,0xf0,
++0x2f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0x7f,
++0xec,0xff,0xff,0xfa,0xff,0xbf,0xff,0x6f,0xff,0xe1,0xff,0xff,0xff,0xff,0xbd,0xfe,
++0x46,0xff,0xef,0x7f,0xcd,0xdf,0xff,0xff,0xfd,0xff,0xbd,0xff,0x7f,0x7f,0xf0,0x4f,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x0f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0xa4,0xbc,0xcd,0x6d,0x6b,0x6f,0x5b,0xdc,0x33,
++0x5a,0xf6,0xf7,0xf6,0xb3,0x3f,0xbd,0xc1,0xfa,0x5a,0xf6,0xf6,0xb6,0xf7,0xff,0xbd,
++0xbb,0x3c,0xce,0xcf,0x34,0xef,0x33,0xbb,0xcc,0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,
++0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,0xf6,0xd6,0xff,0xfd,0xfd,0xbf,0xff,0xad,
++0xbf,0xf9,0x7f,0x6f,0xfc,0xdb,0xf1,0xfd,0xbf,0xff,0x6f,0xff,0xff,0xda,0xdb,0xfc,
++0xdb,0xff,0x76,0x8f,0xf6,0xff,0xcd,0xab,0xfe,0xfb,0xff,0xd0,0xff,0xff,0xff,0xff,
++0xfe,0xff,0x9f,0xff,0xf4,0x20,0xaf,0x6d,0x0b,0xc1,0x7b,0xff,0xff,0xff,0xcb,0xff,
++0x3f,0xf0,0xef,0x7f,0x0f,0xf1,0xc3,0x3c,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x0b,
++0x1d,0x6a,0x64,0x05,0x6b,0x99,0x01,0xff,0xfd,0xef,0xf0,0x2f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xf4,0x00,0x2f,0xcc,0x0b,0xc3,0x7f,0xff,0xff,0xff,0x0a,0xdf,0xbf,
++0xfd,0x7f,0xff,0xff,0xf1,0xc3,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x4a,0x0e,
++0x96,0x64,0x02,0x97,0x99,0x10,0xff,0xff,0xff,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xfe,0x84,0xf9,0xd5,0x27,0xf1,0x7f,0xff,0xf8,0xeb,0xdf,0xf3,0xcf,0x3f,
++0x1f,0xff,0xf7,0x11,0xff,0xcf,0xff,0xfe,0x67,0xff,0xff,0xff,0xff,0xc4,0xff,0xff,
++0xb3,0xa1,0xff,0xf9,0xe0,0xff,0xff,0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xf5,0xff,
++0xff,0xfb,0x7f,0xe0,0xff,0xc7,0xfe,0x7f,0x3f,0xff,0xfd,0x77,0x8d,0x7f,0x0f,0xff,
++0xc3,0xff,0xf1,0xbf,0x8f,0xcf,0xff,0xff,0xdd,0x7b,0xff,0xf6,0xfa,0xf7,0xff,0x40,
++0x9f,0xf9,0x7f,0xd8,0xff,0xff,0xfa,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xf1,0xc0,0x00,
++0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x10,0x00,0x00,0x10,
++0x00,0x01,0x00,0x10,0x20,0x20,0x00,0x00,0x10,0x00,0x04,0x01,0x05,0x00,0x00,0x00,
++0x00,0x40,0x40,0x00,0x00,0x3c,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,
++0xff,0xff,0xfe,0x7f,0x7f,0xff,0xef,0xff,0xff,0xdf,0xff,0xff,0xdf,0xff,0xef,0xf7,
++0xf1,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xf7,0xff,0xff,0xff,0xfc,0xfd,0xff,0x7f,
++0x7e,0xff,0xff,0xff,0xdb,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xf0,0xbb,0xff,0xff,0xff,
++0xff,0xff,0xfe,0xeb,0xfd,0x6f,0xff,0xf7,0xfe,0xf5,0x7f,0xff,0xff,0x7f,0xbf,0xb1,
++0xff,0xff,0x9f,0xbf,0xfb,0xff,0xfe,0xff,0xfe,0xff,0xf7,0xeb,0xdf,0xbf,0x5f,0xdd,
++0xff,0xdb,0xfd,0xd0,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xf8,0x30,0x20,0x00,0x42,0x00,
++0x00,0x00,0x30,0x18,0x04,0x08,0x09,0x21,0x82,0x80,0x02,0x00,0x08,0x00,0x01,0x00,
++0x00,0x00,0x0c,0x20,0x10,0x00,0x11,0x00,0x44,0x84,0x00,0x20,0x20,0x84,0x80,0x00,
++0x00,0x00,0xc1,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xf7,0xff,0xfb,0xdd,0xf9,0xff,
++0xda,0xff,0xdc,0xdd,0xfc,0xfb,0xff,0xbf,0xfb,0x3e,0xd7,0x96,0xfe,0x61,0xf7,0xff,
++0x7f,0xff,0x3f,0xfd,0xff,0xdf,0xcf,0xf7,0xdf,0xf7,0xbf,0xfd,0xff,0xfe,0xef,0xef,
++0xfe,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf3,0xbd,0xfd,0x4b,0x74,0xcf,
++0x73,0x5b,0xcb,0x3b,0xdf,0xfe,0xf7,0xfe,0xd3,0x75,0xac,0xa1,0xfb,0xdf,0xfe,0xf7,
++0x76,0x96,0xb5,0x24,0xbd,0xa5,0xad,0x49,0x2f,0x69,0x2b,0x52,0x5b,0xbd,0xff,0xff,
++0xf0,0xcf,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,0xf6,0xfe,0xff,0xcc,
++0xa7,0xfb,0xad,0xff,0x7f,0x6f,0xff,0x6d,0x7f,0xdb,0xf1,0xfd,0xbf,0xff,0x6f,0xff,
++0x6f,0xff,0xdb,0xff,0xdb,0xff,0xf6,0x97,0xf6,0xff,0xb5,0xb5,0xff,0xff,0xff,0xd0,
++0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0xa5,0xbc,0x43,0xfc,0x7c,0x03,0xe7,
++0xff,0xff,0x20,0xff,0xff,0xff,0xcc,0xfd,0x7d,0xf1,0xff,0xff,0xff,0xff,0xd5,0x59,
++0xba,0x56,0x66,0x6a,0xad,0x9a,0xa9,0x9a,0x97,0xa5,0xaa,0xbb,0xff,0xff,0xf0,0x0f,
++0xff,0xff,0xff,0xfe,0xfe,0xfb,0xff,0xfd,0xf7,0xfd,0x43,0xff,0xfd,0x6b,0xe7,0xff,
++0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0x3f,0xf1,0xff,0xff,0xff,0xff,0xd5,0x59,0xb5,
++0xa6,0x66,0x6a,0xad,0x9a,0xa9,0x99,0x6b,0x5a,0xaa,0xff,0xff,0xb7,0xf0,0x3f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0x9c,0xf7,0xfd,0xd2,0x41,0xff,0xff,0xf2,0x7f,
++0x8f,0xff,0xff,0x3d,0xf3,0xff,0x17,0xf1,0xff,0xff,0xff,0xff,0xff,0x7f,0xdf,0xfc,
++0x8f,0x38,0xff,0xef,0x23,0xff,0xfb,0xf7,0xc8,0xff,0xff,0xff,0xf0,0x9f,0xff,0xff,
++0xff,0xfe,0xf5,0x7f,0xff,0xfd,0xff,0xe4,0xff,0xeb,0xff,0xcf,0xbf,0xfa,0xff,0xab,
++0xef,0xff,0xfb,0xff,0xf3,0xfd,0x61,0xff,0xff,0xff,0xff,0xfa,0xff,0xfb,0xfd,0x0d,
++0xff,0xfe,0xff,0x43,0x7f,0xfe,0xbf,0xd0,0xfd,0xff,0xfa,0xf0,0x3f,0xff,0xff,0xff,
++0xfe,0xf3,0xc0,0x00,0x00,0x00,0x02,0x00,0x02,0x01,0x00,0x60,0xc0,0x40,0x00,0x00,
++0x00,0x00,0x34,0x04,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x88,0x00,
++0x00,0x03,0x00,0x00,0x40,0x00,0x40,0x00,0x00,0x3c,0xf0,0x3f,0xff,0xff,0xff,0xfe,
++0xfd,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7f,0xbf,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf7,0xf1,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xfd,0xff,
++0xff,0xff,0xff,0xfe,0xfe,0x5f,0xff,0xff,0xcb,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xf0,
++0xff,0xff,0xfd,0xff,0xef,0xe3,0xde,0xee,0xd9,0xc5,0x93,0xff,0xff,0xfe,0xfe,0xff,
++0xfb,0xee,0xfe,0xf1,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xbf,0xf7,0xff,0xff,0x7f,
++0xaf,0xbd,0xdf,0xdf,0xfb,0xf3,0xf3,0xf0,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xf8,0x34,
++0x00,0x06,0x61,0x00,0x18,0x01,0xa0,0x05,0x17,0x00,0x20,0x05,0x28,0x20,0x00,0x00,
++0x05,0x00,0x41,0x00,0x00,0x40,0x00,0x09,0x00,0x01,0x20,0x86,0x82,0x08,0x40,0x03,
++0x80,0x30,0x70,0x08,0x14,0x02,0xc1,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xff,0xbd,0xef,0xfb,0xff,0xff,0xfb,0x9c,0x7f,0xef,0xdf,0xff,0xbf,0xeb,0xde,
++0xff,0xc1,0x7f,0xff,0xfb,0x7f,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,0xdf,0xbf,0xef,
++0x3f,0xf7,0x8f,0xef,0x7f,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xbd,
++0xdf,0xef,0x7d,0x6d,0x2b,0x5a,0x5d,0xd2,0xdf,0xf6,0x92,0xb6,0xb2,0xb3,0xac,0xa1,
++0xfb,0xdf,0xfe,0xf1,0xee,0xf5,0xf6,0xbc,0x6b,0xbd,0x7d,0xaf,0x1a,0xef,0x5f,0x6b,
++0xc6,0xff,0xff,0xff,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,
++0xf6,0xff,0xf6,0xb7,0xfd,0xad,0xfd,0xbf,0xf3,0x6f,0xff,0x6f,0xff,0xdb,0xd1,0xfd,
++0xbf,0xff,0x6f,0xf5,0x6b,0xbc,0x5b,0x3c,0xda,0xef,0x16,0xaf,0x16,0xff,0xcd,0xab,
++0xff,0x6f,0xff,0xd0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfc,0xbf,0xff,0xff,
++0xff,0x6c,0x03,0x10,0xc1,0xf3,0xff,0xf3,0x3a,0xf3,0xca,0xff,0xaf,0xf1,0xff,0xff,
++0xff,0xff,0xd9,0x96,0xa6,0x65,0xa6,0x66,0x6a,0x95,0x69,0x69,0x6a,0x5a,0x5a,0xff,
++0xff,0x5f,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,
++0xea,0x0f,0x50,0xc3,0xf3,0x7f,0xff,0xf3,0xf3,0xc3,0xff,0xaf,0xf1,0xff,0xff,0xff,
++0xff,0xd9,0x96,0xa6,0x65,0xa6,0x66,0x6a,0x95,0x69,0x69,0x6a,0x5a,0x5a,0xff,0xff,
++0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xd7,0xff,0xff,0x5f,0xc1,
++0x3f,0xf7,0x5e,0xf5,0xce,0x9e,0x5f,0x3f,0x17,0xff,0xf3,0xe1,0xff,0xff,0xff,0xff,
++0xd8,0xff,0xfa,0xfe,0x67,0xff,0xfe,0xbf,0x5a,0xff,0xff,0xaf,0xf5,0xff,0xff,0xff,
++0xf0,0x2f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xfd,0xff,0xf7,0xff,0xfd,0x4e,0x3d,
++0x3f,0xe7,0x0b,0xbf,0x8f,0xf9,0xff,0xeb,0xe3,0xff,0xe1,0xff,0xff,0xfc,0xff,0xc7,
++0x9f,0xff,0x3e,0x39,0xe5,0xff,0xcf,0x9b,0xf9,0xff,0xff,0xc5,0xff,0xff,0xfa,0xf0,
++0x5f,0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
++0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x20,0x00,0x20,
++0x00,0x01,0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xf0,0x4f,
++0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xbf,
++0x3f,0xff,0xff,0xbf,0xff,0xff,0xff,0xfb,0xf1,0xff,0xff,0xff,0xff,0xf7,0xff,0xf7,
++0xff,0xed,0xff,0xfb,0xfe,0xff,0x7f,0xff,0x7f,0xdf,0xff,0xff,0xdd,0xf0,0x3f,0xff,
++0xff,0xff,0xfe,0xf0,0xff,0xff,0xf3,0xff,0xf7,0xff,0xfe,0x5f,0xff,0xf7,0xff,0xff,
++0xdf,0xff,0xff,0xff,0xf7,0xfe,0x7b,0xf1,0xff,0xfd,0xfd,0xff,0xdf,0xdf,0xff,0x7d,
++0x73,0xf9,0xff,0xc3,0x7e,0xfe,0xff,0xef,0xd7,0xff,0xcf,0xd0,0xf0,0x6f,0xff,0xff,
++0xff,0xfe,0xf8,0x30,0x00,0x00,0x40,0x04,0x00,0x01,0x41,0x20,0x00,0x04,0x00,0x02,
++0xd5,0x09,0x00,0x02,0x80,0x02,0x01,0x00,0x00,0x00,0x0a,0x04,0x00,0x07,0x00,0x01,
++0x50,0x01,0x80,0x02,0x61,0x40,0x41,0x0c,0x14,0x08,0xc1,0xf0,0x9f,0xff,0xff,0xff,
++0xfe,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0xdf,0xcb,0x5f,0xfe,0xef,0xff,0xfe,
++0xff,0x3f,0xff,0x7f,0xfd,0xc1,0xff,0xff,0x7f,0xff,0xdf,0xfd,0xfc,0xfd,0xf7,0xee,
++0xff,0xff,0x4e,0xff,0xdf,0xcf,0xdb,0xeb,0xff,0xff,0xf0,0x1f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,0xfe,0x7f,
++0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,
++0xf7,0xfb,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0x7f,0xff,0xff,0xff,0x7f,0xff,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xdd,0xff,
++0xff,0xff,0xa5,0xff,0x6f,0x6b,0xe9,0x6f,0xda,0xca,0xfb,0xdd,0xee,0xf7,0xf6,0xb2,
++0xb3,0xa4,0xa1,0x5b,0x5b,0xf6,0xd7,0xf4,0xf7,0x7b,0xbd,0xbd,0xad,0xcf,0xef,0x7f,
++0x6b,0x7f,0x3b,0xdf,0xdb,0xff,0xff,0x30,0xcf,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,
++0xff,0xff,0xff,0xf6,0xfe,0x96,0xff,0xfd,0xb5,0xfd,0xbf,0xad,0x7f,0xff,0x6f,0xff,
++0xde,0xd1,0xad,0xad,0xe9,0xff,0xf1,0xec,0xef,0xde,0x3f,0xcb,0xff,0xf6,0xff,0x32,
++0xff,0xc5,0xbd,0xff,0xff,0xff,0xd0,0xbf,0xff,0xff,0xff,0xfe,0xfe,0xfb,0xff,0xf4,
++0x28,0xbf,0xff,0xfd,0xfb,0xd3,0xff,0xff,0x42,0xff,0xff,0xff,0xea,0xb3,0xfc,0xc3,
++0xc1,0xff,0x33,0xff,0xc0,0x15,0x6b,0x70,0xff,0xf0,0xf2,0x4f,0xff,0xfc,0x3e,0x97,
++0x3c,0xff,0xff,0xfd,0xef,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfe,0x78,
++0xbf,0xff,0xfd,0xf3,0xef,0x55,0xff,0x7e,0xff,0xff,0xff,0xea,0xb3,0xfc,0xc3,0xc1,
++0xff,0x33,0xff,0xc0,0x15,0x6f,0xff,0x0f,0xf0,0xf0,0x0f,0xff,0xfc,0x3d,0x6b,0xc3,
++0xff,0xff,0xfe,0xf7,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfc,0xff,
++0xff,0x23,0xf8,0x7f,0xff,0x4e,0xff,0xff,0xff,0xfb,0xf9,0x17,0xff,0xf6,0xf1,0xff,
++0xcf,0xef,0xff,0xff,0x13,0xdf,0xe6,0x2f,0xc7,0xff,0xff,0xe7,0xc1,0xfd,0xff,0xfe,
++0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xff,0xfe,0xae,0xff,
++0xff,0x7f,0x3b,0x3f,0xfc,0x7f,0xfc,0xef,0xff,0xfc,0xe2,0x7b,0xff,0xf1,0xfd,0xed,
++0xef,0xff,0xff,0x35,0x73,0xff,0xff,0xfe,0xfa,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,
++0xff,0xfa,0xf0,0x8f,0xff,0xff,0xff,0xfe,0xf1,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,
++0x00,0x00,0x00,0x80,0x00,0x00,0x40,0x00,0x00,0x00,0x0c,0x04,0x01,0x40,0x40,0x00,
++0x00,0x30,0x28,0x04,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,
++0x38,0xf0,0x0f,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xfb,0xff,0x7f,
++0xff,0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xdf,0xdf,0xff,
++0xff,0xff,0xff,0xed,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xbf,0xbf,0xff,0xff,0xc3,
++0xf0,0x3f,0xff,0xff,0xff,0xfe,0xf0,0xbf,0xfd,0xff,0xbf,0xff,0xff,0xfd,0xff,0xff,
++0xff,0xff,0xff,0xfd,0x7b,0xff,0x7f,0xff,0xbd,0xff,0xf1,0xef,0xff,0xff,0xfd,0xdf,
++0xfd,0xfb,0xff,0xff,0xbf,0xbe,0xff,0xcd,0x7f,0xfc,0xf7,0xf7,0x6f,0xbf,0xd8,0xf0,
++0xef,0xff,0xff,0xff,0xfe,0xf8,0x30,0x00,0x00,0x00,0x04,0x00,0x00,0xa0,0x00,0x00,
++0xc0,0x00,0x00,0x20,0x34,0x00,0x00,0x00,0x0c,0x81,0x00,0x20,0xa4,0x20,0x00,0x10,
++0x08,0x04,0x48,0x08,0x00,0x40,0x93,0x00,0x10,0x00,0x38,0x18,0x20,0xc1,0xf0,0x3f,
++0xff,0xff,0xff,0xfe,0xff,0xfb,0xff,0xff,0xb9,0xdf,0xfe,0xb3,0xff,0xff,0xe7,0xfd,
++0xff,0xff,0x3b,0xff,0x7f,0xff,0xbf,0xff,0xc1,0xff,0xfc,0xff,0xff,0x3f,0x77,0xfe,
++0xfe,0xcf,0xff,0xbf,0xfd,0xbf,0xff,0xfe,0xed,0xf2,0xfd,0xf7,0xff,0xf0,0x2f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xbf,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xf3,0xad,0xcf,0xef,0x70,0xc9,0x73,0x3b,0xdf,0x5b,0x4a,
++0xf6,0xb7,0xfe,0xd7,0xf5,0xbc,0xc1,0x33,0xca,0xd6,0xb7,0x6e,0xf7,0xfb,0xbd,0xc5,
++0x24,0xcf,0x6f,0x2f,0x4d,0x2b,0xba,0x5a,0xff,0xff,0xff,0xf0,0xaf,0xff,0xff,0xff,
++0xfe,0xbf,0xff,0xff,0xff,0xff,0xf6,0xf6,0xd7,0xff,0xff,0xad,0xbd,0xff,0xff,0xff,
++0xef,0xf7,0x7f,0xfc,0x5b,0xb1,0xfd,0xbd,0x75,0x6f,0xef,0x6a,0xfd,0x5b,0xfb,0xdb,
++0x3a,0xbf,0x8e,0x9f,0xff,0xbf,0xfd,0xff,0x6f,0xff,0xd0,0x6f,0xff,0xff,0xff,0xfe,
++0xff,0xbb,0xff,0xf0,0x3f,0xff,0xff,0xfd,0xfb,0x7f,0xde,0xff,0xff,0x5a,0xd6,0xbf,
++0xd8,0x2a,0xbf,0xbf,0xf1,0xe5,0xff,0xcc,0xc0,0xa9,0x70,0xff,0xf3,0x3c,0x3c,0xfd,
++0x57,0xfd,0x98,0x03,0x00,0xc3,0xff,0xff,0xff,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0x3d,0xbf,0xff,0xfd,0xfb,0xff,0xdb,0xff,0xff,0x0f,0xfc,0x3f,0xd8,
++0x2a,0xbf,0xbf,0xf1,0xef,0xff,0xcc,0xc0,0x96,0xbe,0xff,0xf3,0x3f,0xff,0xfd,0x57,
++0xfd,0x99,0x0f,0xff,0xc3,0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xf1,0xe7,0xff,0xff,0xf3,0x8e,0x7b,0xff,0xa8,0xff,0xdf,0x7f,0x8e,0x78,0x73,
++0xff,0xf1,0x51,0x62,0xff,0xfc,0x4b,0xff,0xf3,0xff,0x7e,0xcf,0xf9,0xff,0xfd,0xff,
++0xff,0x7f,0xff,0xe0,0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,
++0xfb,0xfd,0xae,0xff,0xfc,0xfe,0x6f,0x3f,0xf8,0xfd,0x77,0xaf,0xfe,0x37,0xfe,0x7b,
++0xff,0xb1,0x8c,0xff,0xef,0xfd,0xf8,0xe7,0xbf,0xff,0xf1,0xfe,0x3e,0xf7,0xfe,0x95,
++0x3e,0xbf,0xff,0xff,0xff,0xfa,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xf1,0xc0,0x00,0x00,
++0x01,0x04,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x08,
++0x41,0x80,0x10,0x00,0x00,0x08,0x10,0x84,0x00,0x0c,0x04,0x02,0x61,0x00,0x00,0x81,
++0x00,0x00,0x00,0x00,0x3d,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,
++0xff,0xff,0x7f,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,
++0x7f,0xbf,0xf7,0x7f,0xef,0xff,0xef,0xff,0xf7,0xfd,0xff,0xff,0xfd,0x7f,0xff,0xbe,
++0xdf,0xff,0xff,0xd9,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xf0,0xbb,0xff,0x7f,0xfb,0xff,
++0xfb,0xff,0xbf,0xff,0xf3,0x7f,0xfb,0xfd,0xeb,0x7f,0xdf,0xfa,0xff,0xde,0xf0,0xed,
++0xff,0xb1,0xf7,0xf9,0x1f,0xb5,0x5b,0xfe,0x7e,0xf7,0xbe,0xfd,0x7f,0x5f,0xb5,0xf7,
++0xff,0xff,0xd0,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf8,0x30,0x01,0x00,0x07,0x42,0x01,
++0x00,0x6a,0x18,0x50,0x80,0x00,0x00,0x02,0x40,0x01,0x01,0x20,0x01,0x01,0x24,0x14,
++0x21,0x10,0x02,0x08,0x07,0x08,0x00,0x40,0x10,0x80,0x58,0x00,0x84,0x80,0x18,0x10,
++0x40,0xc1,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf7,0xff,0xdb,0xb7,0xf3,
++0xdf,0x7c,0xf8,0x74,0xff,0xff,0x6f,0x7d,0x3f,0x7e,0xec,0x7f,0xc1,0xf5,0xff,0xcf,
++0x6f,0x9f,0xf9,0xdf,0xbe,0xe5,0xe7,0xff,0xd7,0xf3,0xdd,0xfb,0xff,0xfc,0xff,0xbf,
++0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf0,0x2f,0xff,0xff,0xff,0xfe,0xd7,0xff,0xff,0xff,0xb4,0xcf,0xef,0x77,0x6f,0x73,
++0x3a,0x4a,0x3a,0xcb,0xd4,0xf7,0x2e,0xd6,0xbd,0xbd,0xa1,0x3b,0xdf,0xd6,0xf7,0xee,
++0xd3,0x35,0xbd,0xfb,0xbd,0xce,0xeb,0x2b,0x4d,0x2f,0xbb,0xda,0xff,0xff,0xfe,0xb0,
++0x5f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdf,0x5f,0x36,0xaf,0x3f,0xed,0xb7,
++0xf5,0xfd,0xf3,0x2b,0xef,0x77,0xff,0xfb,0xda,0xb1,0xbd,0xa3,0x77,0x69,0x7f,0x4f,
++0xff,0xdb,0xfa,0x5b,0xff,0xf2,0xfe,0xff,0x96,0xff,0xff,0xfe,0xdf,0xff,0xd0,0xaf,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0x8f,0xfd,0x40,0x6f,0x9e,0x83,0x5a,0x0f,
++0xfa,0xc3,0xff,0xff,0xfc,0xe9,0x7f,0xf3,0x01,0xd0,0x00,0xfe,0xbf,0xcd,0x3f,0xf0,
++0xef,0xfc,0xc5,0x0c,0x3f,0xfd,0x68,0x0b,0xff,0xff,0xff,0xfe,0xdf,0xf0,0xff,0xff,
++0xff,0xff,0xfe,0xff,0xbb,0xff,0xfd,0x85,0xff,0xd4,0x6f,0x9f,0xc3,0x5a,0x0f,0xff,
++0xff,0xff,0xff,0xfc,0xe9,0x7f,0xf3,0x01,0xf0,0xfb,0xc2,0xbf,0xfc,0x00,0x37,0xef,
++0xfc,0xcd,0xbc,0x3f,0xff,0x0c,0xbf,0xff,0xff,0xff,0xff,0xff,0xf0,0x5f,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0xd9,0xf7,0xd1,0xb7,0x7e,0x7f,0xf1,0xe4,0xfd,0xff,
++0xfb,0xfb,0xff,0x5f,0xff,0x7f,0xb1,0xbc,0x0f,0x67,0xeb,0xb8,0x3f,0xff,0xe2,0xff,
++0xe9,0xff,0xfd,0xe3,0xff,0x3f,0x9f,0xc2,0xff,0xff,0xff,0xf0,0x9f,0xff,0xff,0xff,
++0xfe,0xf5,0x7f,0xff,0xf0,0x3f,0xbc,0xff,0xd5,0xf5,0xce,0x3f,0xfe,0xff,0xfe,0x6d,
++0xff,0xf1,0xbf,0x7b,0xff,0xf1,0xfd,0xff,0x4f,0xff,0x87,0xff,0xae,0xff,0xb1,0xf8,
++0xfe,0xff,0xff,0x78,0x01,0xb9,0xff,0xff,0xff,0xfa,0xf0,0x2f,0xff,0xff,0xff,0xfe,
++0xf3,0xc0,0x00,0x00,0x00,0x04,0x02,0x13,0x02,0x00,0x80,0x40,0x00,0x90,0x10,0x00,
++0x10,0x00,0x02,0x00,0x01,0x20,0x80,0x12,0x10,0x00,0x40,0x08,0x00,0x04,0x00,0x00,
++0x02,0x00,0x01,0x40,0x00,0x80,0x00,0x00,0x3c,0xf0,0xef,0xff,0xff,0xff,0xfe,0xfd,
++0x1f,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0x7f,0xff,0x7f,0xf7,0xdf,0xf7,0xff,
++0xf7,0xfb,0xeb,0xd1,0xff,0xff,0xff,0xff,0xef,0xf7,0xff,0xff,0xfb,0xff,0xfe,0xff,
++0xff,0x7e,0xff,0xfb,0xff,0xff,0xff,0xdb,0xf0,0xff,0xff,0xff,0xff,0xfe,0xf0,0xff,
++0xff,0xb7,0xeb,0xf7,0xdf,0xff,0xfe,0xf5,0x6b,0xe7,0xed,0xf7,0x3e,0xec,0xff,0x54,
++0xef,0x6f,0xf1,0xf5,0xaf,0x6f,0xf6,0xfd,0xff,0xdd,0x7b,0xff,0xef,0xbf,0x7f,0xff,
++0xff,0xf7,0xff,0xf3,0x5f,0xf7,0xd0,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xf8,0x30,0x00,
++0x80,0x40,0x04,0x00,0x81,0x2c,0x04,0x24,0x00,0x02,0x01,0xc8,0x02,0x00,0x02,0x24,
++0x00,0x01,0xb4,0x42,0xdc,0x44,0x02,0x15,0x90,0x02,0x03,0x48,0x39,0x10,0x02,0x24,
++0xa0,0xba,0x00,0x00,0x40,0xc1,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xfe,0xfc,0xf7,0xf0,0xee,0xb6,0x5d,0xfd,0xf5,0xff,0xdb,0xf7,0x7f,0x7f,0xbe,0xff,
++0xc1,0xfe,0xbf,0xfa,0xfa,0x5f,0xff,0xad,0xff,0xef,0xff,0x7f,0xdf,0x7f,0xfe,0xbf,
++0xb7,0x94,0xbf,0xff,0xff,0xf0,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0x8f,0xff,0xff,0xff,0xfe,0xd7,0xff,0xff,0xfb,0xb5,0xff,
++0xef,0x7c,0xeb,0x2b,0x52,0x5b,0x3b,0xda,0xd4,0xf3,0x36,0x96,0xb5,0xbd,0xf1,0xfb,
++0xda,0xee,0xf6,0xfe,0xd3,0x35,0xbd,0xdf,0xad,0xcf,0xef,0x7e,0xcd,0x6b,0xbb,0xdf,
++0xff,0xff,0xfd,0xb0,0xef,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xd3,0x5f,0xf6,
++0xff,0xf6,0xff,0xfd,0xad,0xfd,0xff,0x7f,0xef,0xff,0x6f,0x7f,0xdb,0xf1,0xa5,0xa3,
++0x7f,0x6f,0x6b,0x4f,0xff,0xdb,0xfb,0xcb,0xff,0xf6,0xff,0xf4,0xd7,0xfd,0xbf,0xfe,
++0xdf,0xff,0xd0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf7,0xdf,0xff,0xff,0xff,
++0x3f,0x7f,0xfc,0xe5,0xff,0x20,0xfe,0xff,0xff,0xdf,0x7f,0xff,0xf1,0x7f,0xff,0xfe,
++0xff,0xf0,0x7c,0x3d,0x4f,0xf3,0xc3,0x3f,0xff,0xff,0x6f,0xc3,0xff,0x0f,0xff,0xff,
++0xaf,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xff,0xff,0xfb,0xb7,0xe0,0x0f,0xff,0xff,0x2b,
++0xff,0x7d,0xbf,0xff,0xdf,0xff,0xff,0xf8,0x9f,0x7f,0xff,0xf1,0x55,0xff,0xff,0xff,
++0xfd,0x7c,0x3c,0xff,0xf3,0xc3,0x3f,0xff,0xff,0xef,0xc3,0xff,0xdf,0xff,0xff,0xff,
++0xf0,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xef,0xff,0xff,0x9f,0xbf,0x7f,
++0xf9,0x19,0x47,0x8e,0xe7,0x9f,0x3f,0x17,0xff,0xfc,0x81,0xc1,0x7e,0xf3,0xd9,0xf9,
++0x73,0xdf,0xf4,0x7f,0xfa,0xff,0xff,0xff,0xfb,0x7f,0x77,0xc7,0xff,0xff,0xff,0xf0,
++0x2f,0xff,0xff,0xff,0xfe,0xf5,0xf7,0xff,0xfb,0xff,0xf7,0x3f,0xfc,0xbf,0x3e,0x3f,
++0xec,0xff,0x81,0xaf,0xfe,0x4f,0xf3,0xbb,0xff,0xf0,0x7e,0xff,0x6f,0xff,0x87,0xff,
++0xbb,0xff,0xd5,0xfc,0xff,0x7f,0xfc,0x6f,0xff,0xef,0xe7,0xff,0xff,0xfa,0xf0,0x3f,
++0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
++0x00,0x30,0x10,0x60,0x20,0x00,0x08,0x00,0x01,0x20,0x80,0x00,0x10,0x00,0x04,0x00,
++0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x80,0x40,0x00,0x08,0x20,0x3c,0xf0,0x6f,0xff,
++0xff,0xff,0xfe,0xf5,0xbf,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0x7f,0xfe,0x3f,0xff,
++0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xf1,0xdf,0xdf,0xff,0xff,0xff,0x7f,0xdf,0xff,
++0xfd,0xbd,0xff,0xff,0xff,0xfb,0xdf,0xff,0xff,0xff,0xff,0x5b,0xf0,0xff,0xff,0xff,
++0xff,0xfe,0xf0,0xbf,0xbf,0xbf,0xff,0xf7,0xfb,0xff,0xfe,0xee,0xfa,0xff,0xff,0xff,
++0x3d,0x3b,0xff,0xff,0xfe,0xfb,0xf1,0xff,0xbf,0x7b,0xff,0xff,0xef,0xff,0xbf,0xff,
++0xff,0xff,0xff,0xff,0xfe,0xff,0xf7,0xef,0xff,0xfb,0xd0,0xf0,0xdf,0xff,0xff,0xff,
++0xfe,0xf8,0x30,0x00,0x00,0x00,0x00,0x00,0x0b,0x10,0x05,0x01,0x00,0x08,0x00,0x02,
++0x01,0x01,0x00,0x00,0x10,0x01,0xc8,0x08,0x00,0x00,0x00,0x00,0x42,0x02,0x00,0x00,
++0x00,0x80,0x02,0x00,0x00,0x40,0x24,0x80,0x00,0xc1,0xf0,0x3f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xf7,0xfd,0xf7,0xfa,0xef,0xee,0xf9,0xfd,0xff,0xf7,0xfe,0xbf,
++0x1f,0xfd,0x9e,0xfd,0xd1,0xef,0xff,0xf7,0x7f,0x9f,0xff,0xef,0xff,0xf6,0xff,0xfe,
++0xfe,0x7b,0xff,0xbd,0xff,0x7e,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xf7,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xdf,0xfd,0xff,0xff,0xdf,0xff,
++0xff,0x5f,0xf1,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xef,0xff,
++0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfb,0xff,0xff,0xef,0xfb,0xfd,
++0xff,0xf1,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xf7,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xe7,0xff,
++0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xff,0xfb,0xff,0xfb,0xf1,
++0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7b,0xff,0xff,0xff,0x7f,0xff,0xf1,0xff,
++0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xef,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x57,0xff,0xfe,0xbf,0xfb,0xf1,0xff,0xff,
++0xfd,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xd7,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf7,0xdb,0xff,0xdb,0xfd,
++0xf6,0xff,0xf6,0xff,0x3c,0xbc,0xbc,0xbf,0xdf,0x6f,0xef,0x2f,0xf1,0x3c,0xbf,0xbc,
++0xbf,0xdf,0x6f,0xff,0x6f,0xf7,0xdb,0xff,0xdb,0xfd,0xf6,0xff,0xf6,0xff,0xff,0xff,
++0x01,0xe2,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff };
+diff -u --recursive --new-file linux.prev/drivers/net/hamradio/yam9600.h linux/drivers/net/hamradio/yam9600.h
+--- linux.prev/drivers/net/hamradio/yam9600.h Thu Jan 1 00:00:00 1970
++++ linux/drivers/net/hamradio/yam9600.h Sat Sep 12 22:03:34 1998
+@@ -0,0 +1,343 @@
++/*
++ *
++ * File yam111.mcs converted to h format by mcs2h
++ *
++ * (C) F6FBB 1998
++ *
++ * Tue Aug 25 20:23:03 1998
++ *
++ */
++
++static unsigned char bits_9600[]= {
++0xff,0xf2,0x00,0xa5,0xad,0xff,0xfe,0x9f,0xff,0xef,0xfb,0xcb,0xff,0xdb,0xfe,0xf2,
++0xff,0xf6,0xff,0x9c,0xbf,0xfd,0xbf,0xef,0x2e,0x3f,0x6f,0xf1,0xfd,0xb4,0xfd,0xbf,
++0xff,0x6f,0xff,0x6f,0xff,0x0b,0xff,0xdb,0xff,0xf2,0xff,0xf6,0xff,0xff,0xff,0xff,
++0xf0,0x6f,0xff,0xff,0xff,0xfe,0xff,0xfd,0xdf,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,
++0xfb,0xff,0xff,0xf7,0xff,0xff,0xff,0xfe,0xff,0x7f,0xf1,0xff,0xfe,0xff,0xbf,0xbf,
++0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xfe,0xff,0xfe,0xff,0xff,0xff,0xf0,
++0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xf7,
++0xff,0xff,0xf7,0xef,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0x7e,0xff,0xff,
++0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xf0,0xdf,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xef,0xff,0xf3,0xfb,0xfe,0xff,0xf1,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xdf,0xff,0xf0,0x7f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xdf,0xff,0xff,0xff,0xf7,0xf1,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xf0,0x0f,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf5,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,
++0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xef,0xff,0x7f,0xff,0xef,
++0xff,0xef,0xff,0x7f,0xef,0xf1,0xff,0xef,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xf0,0x9f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xbd,0xff,0xef,0x7f,0xef,0x7f,0xfb,0xdf,0xd3,0x5a,0xfe,0xd7,0xd6,
++0xf7,0x7f,0xbd,0xf1,0xbb,0x5d,0xd6,0xf7,0xfe,0x96,0xff,0xbd,0xaf,0xad,0xbf,0xef,
++0x7f,0x6b,0x7f,0xfb,0xd6,0xfe,0xf7,0xff,0x10,0xef,0xff,0xff,0xff,0xfe,0xbe,0xef,
++0xff,0xff,0xdb,0xff,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xfd,0xbf,0xff,0x7f,0xff,0x7f,
++0xdf,0xdb,0xf1,0xfd,0x35,0xff,0x6f,0xff,0x6f,0xff,0xdb,0xff,0xcb,0xff,0xf6,0xff,
++0xf2,0xfd,0xfd,0xbf,0xff,0xff,0xff,0xd0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xff,0xcc,0xc0,0x3f,0xff,
++0xff,0xf1,0x24,0xf0,0xff,0xff,0xcf,0xef,0x3f,0xff,0xf0,0xff,0xff,0xff,0xfc,0x3f,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x55,0xff,0xcc,0xc0,0x3f,0xff,0xff,
++0xf1,0x00,0xf0,0xff,0xff,0xcf,0xdf,0xff,0xff,0xf0,0xff,0xff,0xff,0xfc,0x3f,0xff,
++0xff,0xff,0x7d,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xfe,0x7f,0xdf,0xff,0xff,0xff,0xf1,
++0xff,0xcf,0xff,0xf3,0xff,0x97,0xff,0xff,0x8f,0xe7,0xff,0xff,0xfc,0x71,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xf5,0xff,0xbf,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0xf7,0xef,0xff,0xff,0xfc,0x7b,0xff,0xf1,0x3f,
++0xff,0xef,0xff,0xcf,0xe3,0xe3,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xbf,0xff,
++0xbf,0xff,0xda,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xf2,0xc0,0x00,0x00,0x00,0x00,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
++0x01,0x3c,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0x9f,0xff,
++0xff,0xff,0xf7,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xdb,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xf0,0xbb,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xfb,0xdf,0xbf,0xf1,0xfe,0xfd,0xf7,0xff,
++0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x77,0xfd,0xf2,
++0xf0,0x1f,0xff,0xff,0xff,0xfe,0xf8,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
++0x00,0x00,0x00,0x02,0x00,0x90,0x00,0x00,0x00,0x0c,0x01,0x00,0x00,0x04,0x24,0x00,
++0x40,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x01,0xc0,0xf0,
++0x4f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xbf,0xff,0xff,0x6f,0xff,0xdf,0xff,0xd1,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xff,0xff,0xdf,0xff,0xfb,0xff,0xfb,0xef,0xff,0xff,0xee,0xff,0xff,0x7f,0xf0,0xdf,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x8f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,0xad,0xff,0x69,0x2a,0xed,0x6b,0xfb,0xdf,0x3a,
++0xdc,0xf4,0x96,0xee,0xb3,0x3d,0x35,0xc1,0xbb,0xdd,0xfe,0xf6,0xfe,0xd6,0xb5,0xad,
++0xbf,0xa5,0xad,0x49,0x2f,0x4f,0x2b,0xda,0x5f,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,
++0xff,0xfe,0xbf,0xff,0xff,0xfb,0x5b,0xf7,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xfd,0xa5,
++0xf3,0x6f,0xf3,0x6e,0xfa,0x7b,0xd1,0xfd,0xb5,0x77,0x6f,0xe9,0x6f,0xff,0xdb,0xfb,
++0xdb,0xdf,0xf6,0xff,0xf6,0xff,0xfd,0x3f,0xfe,0xf7,0xff,0xd0,0x4f,0xff,0xff,0xff,
++0xfe,0xff,0x9f,0xff,0xff,0x0f,0xff,0xc0,0x3f,0x9c,0x03,0xff,0xff,0x8b,0xa5,0xfe,
++0x80,0x3e,0xc2,0xbf,0xac,0xb1,0x24,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xa3,
++0xff,0xfd,0x6b,0xff,0xff,0xf0,0xa5,0xff,0xff,0xff,0xf0,0xaf,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0x0f,0xff,0xc0,0x3f,0xd4,0x6b,0xff,0xff,0xdb,0xff,0xfe,0x86,
++0xbf,0xc2,0xbf,0x30,0xa1,0x24,0xff,0xff,0xff,0xff,0xcc,0xff,0x0f,0xff,0xa3,0xff,
++0x05,0x6b,0xff,0xff,0xf0,0xa5,0xff,0xff,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xfb,0xc7,0xff,0xc4,0xff,0xff,0x7f,0xff,0xec,0xfe,0x7f,0xdf,0xd8,0xb9,
++0x47,0xfc,0x36,0xc1,0xdf,0xff,0xff,0xf9,0xff,0xf3,0xff,0xf7,0xff,0xfc,0xff,0xfd,
++0x3f,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xf5,0xff,
++0xff,0xff,0xff,0xfe,0xff,0xff,0x7e,0xbd,0x3f,0xff,0x2b,0xfe,0x2f,0xf5,0xa3,0xfc,
++0x5b,0xfe,0x61,0x9f,0x7f,0xef,0xff,0xff,0xa7,0xfb,0xff,0xff,0xfa,0xfe,0xff,0x33,
++0xf1,0xff,0xbf,0xff,0xff,0xff,0xfa,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xf1,0xc0,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x30,0x24,0x04,
++0x00,0x01,0x00,0x80,0x40,0x00,0x08,0x00,0x00,0x00,0x02,0x01,0x01,0x00,0x02,0x00,
++0x00,0x00,0x00,0x00,0x01,0x3d,0xf0,0x2f,0xff,0xff,0xff,0xfe,0xfd,0xbd,0xff,0xfd,
++0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0x7f,0xf6,0xef,0xbf,0xf7,0xff,0x73,0xeb,
++0xf1,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xf9,0xff,0xfd,0xfe,0xff,0xff,
++0xff,0xff,0xff,0xff,0xd9,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xf0,0xbf,0x7f,0xff,0xff,
++0xff,0x7f,0xff,0xff,0xde,0xff,0xff,0xef,0xdd,0xde,0x77,0xf2,0xfb,0xed,0xe7,0xf1,
++0x73,0xfd,0xfd,0xdf,0xff,0x7d,0xbe,0xdf,0xff,0xfb,0xff,0xef,0xff,0xef,0xff,0xff,
++0xff,0xff,0xff,0xd0,0xf0,0xbf,0xff,0xff,0xff,0xfe,0xf8,0x30,0x20,0x02,0x00,0x22,
++0x40,0xc0,0x00,0x00,0x00,0x08,0x00,0x02,0x41,0x02,0x12,0x00,0x21,0x87,0x81,0x00,
++0x00,0x80,0x04,0x0b,0x28,0x01,0xb0,0x00,0x82,0x00,0x40,0x00,0x00,0x00,0x00,0x00,
++0x00,0x00,0xc1,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,
++0xf7,0xff,0xfe,0x7f,0xed,0x79,0xff,0xde,0xeb,0x7f,0x74,0xf7,0xf7,0xe1,0xf9,0xff,
++0xf6,0x5f,0x7f,0xff,0xff,0xff,0xd7,0xdb,0xef,0xff,0xbb,0xff,0xff,0xff,0xcc,0xff,
++0xff,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xf0,0x0f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0x3d,0xcd,0x49,0x7f,0x6f,
++0x2b,0xba,0x5c,0xd2,0xda,0xf6,0xf3,0x3e,0xf7,0xff,0xbd,0xf1,0xfa,0xdf,0xfe,0xf7,
++0xcc,0xf6,0xbb,0xa5,0xb3,0xad,0xbf,0x6f,0x7d,0x6f,0x6b,0xdb,0xdf,0xbd,0xff,0xfe,
++0xb0,0x5f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xfb,0xdb,0x57,0xf6,0xfe,0x9f,0xd5,
++0xb7,0xff,0xaf,0xe5,0x3f,0xff,0xff,0x6f,0xff,0xdb,0xf1,0xfd,0xbf,0xff,0x6f,0x69,
++0x6c,0xdf,0xda,0xdf,0xcb,0xff,0xf6,0xff,0x76,0xfd,0xfd,0xbf,0xff,0xff,0xff,0xd0,
++0x3f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfd,0xbd,0x08,0x03,0x89,0x4f,0x5a,
++0x0f,0xf0,0xff,0xf8,0xbf,0xff,0xff,0xff,0xff,0xf1,0x5a,0xff,0xff,0xff,0xff,0xf3,
++0xfa,0xa0,0xf0,0xf2,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfc,0xfd,0x00,0x6b,0xff,0xff,0x5a,0x0f,
++0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0x5a,0xff,0xff,0xff,0xff,0xb3,0xf5,
++0x50,0xf0,0xf0,0xff,0xff,0xff,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x7f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0xbc,0xff,0xe4,0xe7,0x71,0xff,0xf9,0xc4,0xf4,
++0x7f,0x7f,0xcf,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xfb,0xf7,0x73,0xbf,0x14,
++0xff,0xe6,0xff,0xff,0xe1,0x7d,0xff,0xff,0xe7,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,
++0xff,0xfe,0xf5,0xff,0xff,0xfe,0xd2,0xfa,0xff,0xc4,0xf4,0x5c,0xbf,0xfa,0xff,0xff,
++0xec,0x7e,0xbf,0xff,0xff,0xff,0xf1,0xff,0xff,0xef,0xff,0xff,0x6b,0xdb,0xff,0xdf,
++0xf9,0xfb,0xbf,0xff,0xf1,0xff,0xbf,0xff,0xff,0xff,0xfb,0xf0,0xbf,0xff,0xff,0xff,
++0xfe,0xf3,0xc0,0x00,0x02,0x00,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x00,0x80,0x00,
++0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x20,0x00,0x00,0x00,0x00,
++0x01,0x00,0x01,0x00,0x00,0x80,0x02,0x00,0x01,0x3c,0xf0,0x5f,0xff,0xff,0xff,0xfe,
++0xfd,0xbf,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0x7f,0xff,0xdf,0xff,0xef,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xfb,0xff,0xfd,0xff,
++0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xc3,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xf0,
++0xff,0xdf,0xff,0xff,0xf7,0x23,0xff,0xff,0xfd,0xff,0xef,0xff,0xfe,0x7f,0x7d,0xf7,
++0xfe,0xff,0x7f,0x71,0xff,0xfb,0x7f,0xff,0xff,0xff,0x6e,0xfd,0xf7,0xfd,0xff,0xbf,
++0xff,0xbf,0xf9,0xfd,0xff,0xdf,0xef,0xf0,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xf8,0x30,
++0x40,0x01,0x00,0x83,0x00,0x00,0x00,0x0c,0x06,0x08,0x04,0x26,0x26,0x00,0x00,0x06,
++0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x00,0x70,0x08,0x80,0x00,0x20,0x01,0x20,
++0x00,0x02,0x00,0x30,0x00,0x00,0xc1,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xff,0x7b,0x3f,0xf7,0xff,0xd7,0xfe,0xfe,0xfb,0xfe,0x3b,0xfe,0xbd,0xff,0x2f,
++0xff,0x71,0xff,0xfb,0x7f,0xe7,0xff,0xf9,0xef,0xff,0xd7,0xfa,0xff,0xb7,0xbb,0xfe,
++0xff,0xff,0x74,0xff,0xf7,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf0,0x8f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xb5,
++0xbd,0x6f,0x7c,0xeb,0x7f,0xfb,0xdb,0xd3,0x4b,0xee,0xd6,0xf6,0xb7,0xfd,0xac,0xa1,
++0xfb,0xdf,0xfe,0xf7,0xf4,0x96,0xbd,0xb4,0xc5,0xa5,0xaf,0x6f,0x69,0x4f,0x7f,0xba,
++0xdb,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,
++0xf6,0xff,0xf6,0xff,0xbd,0xbf,0xa5,0xbf,0xff,0x7d,0x7f,0xef,0xff,0xfb,0xf1,0xfd,
++0xbf,0xff,0x6f,0xff,0x6b,0x7a,0xdb,0xff,0xdb,0xdf,0xf6,0xfe,0xb6,0xfd,0xfd,0xbf,
++0xfe,0xf7,0xff,0xd0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xf4,0x2f,0xff,
++0xfc,0x43,0x6b,0xff,0xff,0xff,0x0d,0xff,0xfc,0x33,0x3f,0xf0,0x5f,0xf1,0xff,0xff,
++0xff,0xff,0xf9,0xde,0xf0,0x4c,0xfe,0x77,0xaf,0xff,0xff,0xef,0xff,0xf0,0xff,0xdb,
++0xff,0x5f,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,0xfe,0xf7,0xff,0xf0,0x2f,0xff,0xfd,
++0x43,0x7f,0xff,0xff,0xf1,0x0f,0xff,0xfc,0x33,0x3f,0xff,0xaf,0xf1,0xff,0xff,0xff,
++0xff,0xf6,0xd7,0xff,0xbc,0xfd,0xbd,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,
++0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0xfb,0xf1,
++0xbf,0xff,0xf9,0xfd,0xcf,0xf2,0x70,0xff,0x1f,0x9f,0xf3,0xf1,0xff,0xff,0xff,0xff,
++0xfc,0xf7,0xff,0x13,0x9f,0xfc,0xff,0xff,0x84,0xf7,0xff,0xff,0x47,0xff,0xff,0xff,
++0xf0,0xbf,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xff,0xf1,0xfc,0xff,0xfe,0xfe,0x79,
++0x3f,0xff,0x1d,0x46,0xcf,0xff,0xcf,0xfc,0x7b,0xff,0xf1,0xff,0xff,0xff,0xff,0xed,
++0xf3,0xab,0xff,0xcb,0xff,0xf8,0xff,0xfc,0xf5,0xff,0xbf,0xff,0xff,0xff,0xfa,0xf0,
++0x8f,0xff,0xff,0xff,0xfe,0xf3,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
++0x00,0x00,0x20,0x00,0x20,0x00,0x00,0x04,0x08,0x01,0x00,0x00,0x00,0x00,0x00,0x20,
++0x0c,0x00,0x00,0x04,0x01,0x00,0x01,0x00,0x00,0x80,0x00,0x00,0x01,0x3c,0xf0,0x7f,
++0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xfe,0xff,
++0xdf,0xff,0xff,0xf7,0xff,0xff,0xff,0xef,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xeb,
++0xff,0xdf,0xff,0xff,0xfb,0xf7,0x7f,0xff,0xfe,0xff,0xff,0xbf,0xdb,0xf0,0xff,0xff,
++0xff,0xff,0xfe,0xf0,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0x7f,0xf7,0xff,
++0xbf,0xbf,0xcf,0xff,0xff,0xff,0x3e,0xf1,0x7f,0xff,0xff,0xef,0xff,0xff,0xff,0xfe,
++0xff,0xfd,0xff,0xbf,0xbd,0xfe,0xff,0xfb,0xf7,0xdf,0xfb,0xd0,0xf0,0x9f,0xff,0xff,
++0xff,0xfe,0xf8,0x30,0x20,0x00,0x40,0x01,0x80,0xc0,0x30,0x00,0x00,0x20,0x00,0x10,
++0x50,0x88,0x20,0x00,0x00,0x13,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,
++0x00,0x00,0x01,0x80,0x08,0x00,0x00,0xa0,0x00,0x10,0xc1,0xf0,0xef,0xff,0xff,0xff,
++0xfe,0xfd,0xef,0x7f,0xff,0xff,0xbf,0xff,0xf7,0xff,0xef,0xfb,0xfd,0x77,0xef,0xbf,
++0xf7,0x7f,0xff,0xff,0xbf,0xd1,0x7f,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xaf,0xff,
++0xdf,0xf7,0xfb,0xff,0xfd,0xff,0xfc,0xff,0xfd,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x3f,0xff,0xff,0xff,0xfe,0xdd,0xff,
++0xff,0xff,0xa5,0xfd,0x6f,0x7d,0x6d,0x7f,0x52,0xdf,0x5a,0x4b,0xee,0xb6,0xee,0xf2,
++0xbb,0xac,0xa1,0x5b,0x4d,0xd6,0xf7,0xfe,0xb2,0xbd,0x35,0xb5,0xb5,0xdd,0x6f,0x7f,
++0xe9,0x5f,0x52,0xdf,0xbd,0xff,0xff,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,
++0xff,0xdb,0xfe,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xfd,0xb5,0xbf,0xf9,0x7f,0x6f,0xff,
++0xdb,0xf1,0xfd,0xbf,0xff,0x6f,0xff,0x69,0x7f,0xdb,0xff,0xd3,0xff,0xf6,0xfe,0xf2,
++0xff,0xad,0xbf,0xff,0xff,0xff,0xd0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,
++0x30,0x0f,0xff,0xff,0xfd,0x6b,0xca,0xff,0xf0,0x0f,0xd6,0xbf,0xcf,0x3f,0xff,0xff,
++0xf1,0xff,0xff,0xff,0xca,0xfe,0xbf,0xff,0xf0,0x05,0xaf,0x0f,0xff,0xfc,0xf0,0xcf,
++0xf0,0xff,0xff,0xff,0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,0x30,
++0x0f,0xff,0xff,0xfc,0x3f,0xca,0xff,0x0f,0x0f,0xd6,0xbf,0xff,0xff,0xf5,0x5f,0xf1,
++0xff,0x8b,0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xfc,0xf0,0xcf,0xf0,
++0xff,0xff,0xff,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xcf,0xff,
++0xff,0xbf,0x9f,0x3f,0xfe,0xfc,0xff,0x4f,0xff,0xff,0xff,0xff,0xff,0xf7,0xf1,0xff,
++0xdf,0xfe,0x7e,0x3f,0x9f,0xf4,0xfc,0x7f,0xfc,0xff,0xff,0x3f,0xff,0x3f,0xfe,0x3f,
++0xff,0xff,0xff,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xfb,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xbf,0xfb,0xff,0xf8,0xed,0xff,0x8f,0xff,0xbb,0xff,0xb1,0xf3,0xef,
++0x8f,0xf7,0xff,0xff,0xdb,0xff,0xff,0xff,0xef,0xbf,0xfd,0x79,0xbf,0xbf,0xff,0xff,
++0xff,0xfb,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,0x00,0x04,0x00,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x04,0x08,0x08,0x01,0x01,0x00,0x90,
++0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x00,0x01,
++0x3c,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0x9f,0xff,0xaf,0xdf,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,
++0xbf,0xef,0xff,0xff,0xff,0xed,0xff,0xff,0xff,0xef,0xff,0xbf,0xff,0xff,0xff,0xc3,
++0xf0,0x3f,0xff,0xff,0xff,0xfe,0xf0,0xff,0xfd,0xff,0xff,0xff,0xfb,0xff,0xbb,0xff,
++0xff,0xff,0x7f,0xf6,0xff,0x7f,0xfb,0xfd,0xed,0xff,0xf1,0xff,0xfe,0x7f,0xff,0xff,
++0xff,0x5f,0xff,0xf7,0xff,0x7e,0xff,0xfd,0xff,0xef,0xff,0xff,0xff,0xef,0xf0,0xf0,
++0x8f,0xff,0xff,0xff,0xfe,0xf8,0x30,0x80,0x00,0x04,0x00,0x00,0x40,0x02,0x00,0x03,
++0x00,0x05,0x04,0x20,0x00,0x00,0x01,0xd0,0x00,0x81,0x00,0x20,0x04,0x04,0x00,0x00,
++0x81,0x04,0x08,0x80,0x10,0x00,0xc0,0x00,0x00,0x00,0x20,0x00,0x08,0xc1,0xf0,0x6f,
++0xff,0xff,0xff,0xfe,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xf3,0xfd,0xff,0xed,0xfc,
++0xff,0xff,0x9f,0xfb,0xfd,0xff,0xff,0xff,0xf1,0xff,0xff,0x7f,0xfb,0x3e,0xff,0x9f,
++0xff,0xff,0xff,0xff,0xfd,0xf9,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xf0,0x6f,0xff,
++0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xcf,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xfd,0xbd,0xff,0xef,0x7c,0xeb,0x7f,0xfb,0xdb,0xfa,0xdc,
++0xee,0xf7,0xf6,0xd7,0xf5,0x2d,0xa1,0xbb,0xdd,0xee,0xf7,0x54,0xf7,0xfb,0x2c,0xb5,
++0xb4,0xbd,0x6b,0x6f,0xef,0x6f,0xbb,0xdf,0xff,0xff,0xff,0xf0,0x1f,0xff,0xff,0xff,
++0xfe,0xbf,0xff,0xff,0xff,0xfb,0xff,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xff,0xbf,0xef,
++0x6f,0xff,0x6f,0xfa,0xdb,0xf1,0xc5,0xbd,0xf5,0x6f,0xff,0x6f,0xca,0xdb,0xff,0xdb,
++0xfb,0xf6,0x97,0xf6,0xff,0xfd,0xbf,0xfe,0xf7,0xff,0xd0,0x9f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8b,0x7f,0xff,0xff,0xe7,0x63,0xff,0xff,
++0xff,0xfc,0x77,0xdf,0xf1,0xdb,0xff,0xd6,0xa8,0x3f,0xff,0xff,0x08,0x2f,0xf0,0xff,
++0xc3,0xff,0xeb,0xff,0xff,0xff,0xff,0xff,0x5f,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xfc,0xff,0xcf,0xf1,0xdb,0xff,0xd6,0xa8,0x3f,0xff,0xff,0x08,0x2f,0xf0,0xff,0xc3,
++0xff,0xeb,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xbf,0xff,0xca,0xff,0x9f,0xff,0xfa,0xb9,0xe7,
++0x9f,0xf3,0x81,0xff,0xff,0xfc,0x73,0xd7,0xff,0xff,0x77,0xff,0xfd,0xff,0xfc,0xff,
++0xff,0xff,0xff,0xcf,0xff,0xff,0xff,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,
++0xff,0xf7,0xde,0xff,0xfe,0x7e,0xff,0xbf,0xff,0xbf,0xf1,0xb3,0xff,0xff,0xe3,0xfb,
++0xff,0xe1,0x1f,0x7f,0xff,0xf8,0x78,0xff,0xfb,0x1e,0xff,0xf7,0xfe,0xe7,0xff,0xff,
++0xff,0xbf,0xff,0xff,0xff,0xfa,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x04,0x00,
++0x01,0x80,0x40,0x40,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,
++0x80,0x00,0x00,0x01,0x3c,0xf0,0xaf,0xff,0xff,0xff,0xfe,0xfd,0xbf,0xff,0xfb,0xff,
++0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xf7,0xf1,
++0xfd,0xff,0xff,0xff,0xdf,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,
++0xff,0xff,0xff,0xdb,0xf0,0x8f,0xff,0xff,0xff,0xfe,0xf0,0xff,0xdf,0xff,0xff,0x7f,
++0xff,0xff,0xff,0xbe,0xd7,0xff,0xed,0xbd,0x7e,0xbf,0xfe,0xf6,0x7f,0xbf,0x71,0xff,
++0xff,0xda,0xff,0xf9,0xff,0xbf,0x7f,0xfe,0xff,0x6f,0x7f,0xff,0xff,0xff,0xff,0xff,
++0x7f,0xff,0xd0,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xf8,0x30,0x42,0x00,0x00,0x00,0x00,
++0x80,0xc1,0x00,0x00,0x90,0x00,0xc4,0x00,0x00,0x12,0x20,0x43,0x22,0x81,0x84,0x00,
++0x00,0x14,0x00,0x01,0x00,0x08,0x80,0x00,0x02,0x00,0x02,0x00,0x04,0x02,0x00,0x00,
++0x10,0xc1,0xf0,0x1f,0xff,0xff,0xff,0xfe,0xff,0xff,0xfd,0xff,0xff,0xdd,0xfe,0xff,
++0xb6,0x76,0xe5,0xbc,0xf9,0xf7,0xaf,0x5f,0xbf,0xfc,0xdf,0xcf,0xf1,0xff,0xef,0x79,
++0xff,0xbd,0xff,0xef,0xff,0xff,0xf7,0x6f,0x5f,0xff,0xff,0xfd,0xef,0xef,0xbf,0xff,
++0xff,0xf0,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xf0,0xff,0xff,0xff,0xff,0xfe,0xdb,0xff,0xff,0xfd,0x2d,0xff,0x69,0x2a,0xef,0x77,
++0xbb,0xdd,0x5a,0xdf,0xf6,0xf6,0xd6,0xf7,0x7d,0xbd,0xd1,0xb2,0x4a,0xd6,0xb2,0xbe,
++0x97,0xf5,0xbd,0xb3,0xad,0xff,0xef,0x7f,0x69,0x6b,0xfb,0xdf,0xff,0xff,0xff,0xf0,
++0x2f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,0xf6,0xfe,0x9f,0xd4,0xbf,
++0xed,0xaf,0xff,0x6b,0x6f,0xf7,0xff,0xdd,0xdb,0x31,0xfd,0xbf,0xff,0x6f,0x7f,0xff,
++0xff,0xdb,0xff,0xcb,0xdf,0xf6,0xff,0xf6,0xff,0xfd,0xbf,0xfe,0xf7,0xff,0xd0,0x8f,
++0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfd,0x1f,0xff,0x46,0x2f,0x9f,0xff,0xff,0xff,
++0xa5,0xff,0xff,0xff,0xdf,0xb7,0xff,0xff,0xf1,0xff,0xff,0xff,0xf7,0xe9,0x6a,0xbf,
++0xff,0xff,0xfd,0xff,0xff,0xfd,0x55,0x57,0xff,0xff,0xff,0xff,0xaf,0xf0,0x4f,0xff,
++0xff,0xff,0xfe,0xfe,0xdf,0xff,0xfd,0x1f,0xff,0x46,0x2f,0x9f,0xff,0xff,0xff,0xa5,
++0xff,0xff,0xff,0xc0,0x37,0xff,0xff,0xf1,0x99,0x8e,0xdc,0x7f,0xe9,0x6a,0xbf,0xff,
++0xf0,0x0f,0xff,0xff,0xfd,0x55,0x57,0xff,0xff,0xff,0xff,0xff,0xf0,0x0f,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0x07,0xff,0xc0,0xbe,0xff,0xff,0xcf,0xef,0x9f,0xff,
++0xff,0xfb,0xff,0xe7,0xff,0xff,0xa1,0xe3,0xce,0x3c,0x58,0x3f,0xf3,0xff,0xfd,0xef,
++0xf9,0xff,0xff,0xf7,0xf1,0x7f,0xff,0xcb,0xff,0xff,0xff,0xf0,0x2f,0xff,0xff,0xff,
++0xfe,0xf5,0x7f,0xff,0xf0,0xff,0xfe,0xff,0xc4,0x75,0xe7,0xb9,0xff,0xff,0xff,0xef,
++0xff,0xc7,0x37,0x3b,0xff,0xf0,0x13,0x9e,0x0f,0xf4,0xff,0xfe,0xfb,0xff,0xff,0xf9,
++0xfc,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xfa,0xf0,0xef,0xff,0xff,0xff,0xfe,
++0xf3,0xc0,0x01,0x00,0x00,0x02,0x00,0x02,0x22,0x00,0x00,0xc0,0x40,0x00,0x40,0x00,
++0x04,0x08,0x04,0x0a,0x01,0x01,0x10,0x20,0x20,0x00,0x00,0x04,0x08,0x08,0x04,0x00,
++0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x3c,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xfd,
++0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0x7f,0xff,0x7f,0xff,0xcf,0x9d,0xff,
++0xff,0xf7,0xfd,0xf1,0xff,0xff,0xff,0xee,0xbf,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xf0,0xff,
++0xff,0xff,0xf7,0xf7,0xff,0xff,0xfe,0xbf,0xf7,0xff,0xff,0x5b,0xff,0xbf,0xf7,0xff,
++0xfd,0x7f,0x71,0xfd,0xff,0xed,0xf7,0xfe,0xef,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,
++0xff,0xff,0xef,0xff,0x7f,0xff,0xd0,0xf0,0xff,0xff,0xff,0xff,0xfe,0xf8,0x30,0x11,
++0x00,0x48,0x60,0x40,0x82,0x60,0x24,0x60,0x00,0xcc,0x00,0x80,0x04,0x01,0x00,0x00,
++0x14,0x01,0x0c,0x04,0x00,0x30,0x00,0x00,0x00,0x08,0x08,0x00,0x01,0x00,0xc2,0x00,
++0x00,0x02,0x00,0x80,0x00,0xc1,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
++0xf7,0x7b,0xff,0xf3,0xeb,0xbf,0xff,0xf7,0xff,0xff,0xff,0xe7,0x5d,0x3f,0xff,0xf6,
++0xd1,0xfd,0xff,0xeb,0xf7,0x3d,0xff,0xff,0xff,0x5f,0xff,0x7f,0x7f,0xf3,0xff,0xff,
++0xef,0xfd,0xbf,0xff,0xff,0xf0,0x5f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,0xb5,0xdf,
++0x6f,0x7d,0x69,0x7f,0xfb,0xdf,0x52,0x5f,0xf6,0xf7,0xfe,0xf6,0xf3,0xbd,0xb1,0xda,
++0xcd,0xfe,0xf6,0xee,0xd2,0xbd,0xa5,0xaf,0xbd,0xff,0x6f,0x7c,0xeb,0x2b,0xfa,0xda,
++0xff,0xfe,0xdf,0xf0,0x4f,0xff,0xff,0xff,0xfe,0xbf,0xff,0xff,0xff,0xdb,0xff,0xf6,
++0xff,0xf6,0xff,0xbd,0xbf,0xcd,0xbf,0xeb,0x6f,0xf7,0x6f,0xdf,0xdb,0x51,0xfd,0xbd,
++0xff,0x6f,0xff,0x6f,0xfb,0x5b,0xff,0xdb,0xff,0xf6,0xfe,0xf6,0xfd,0xfd,0xbf,0xfe,
++0xf7,0xff,0xd0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xfa,0x50,0xff,0xff,0xff,
++0xf0,0x6f,0xff,0xff,0xf0,0x96,0xff,0xff,0xc6,0x2b,0xff,0xff,0xf1,0xfc,0xff,0xff,
++0xf7,0xdb,0xc3,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xc1,0x4f,0xc3,0xff,0xff,0xff,
++0xaf,0xf0,0x9f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf5,0xa0,0xff,0xff,0xff,0xf0,
++0x6f,0xff,0xff,0xf0,0x96,0xff,0xff,0xc6,0x2b,0xff,0xff,0xf1,0x5a,0xff,0xff,0xff,
++0xf3,0xc3,0xff,0x00,0xff,0xff,0xff,0xff,0xff,0xc1,0x4f,0xc3,0xff,0xff,0xff,0xff,
++0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0x9f,0xf0,0x7f,
++0xff,0xf9,0xfc,0x4f,0xf3,0xff,0x27,0xeb,0xff,0xfc,0x81,0xfc,0x7f,0xfe,0x7b,0xff,
++0xf7,0xff,0x12,0x7f,0xff,0xff,0xff,0xff,0x18,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,
++0x7f,0xff,0xff,0xff,0xfe,0xf5,0xff,0xff,0xff,0xdf,0xfe,0xff,0xfc,0x7e,0x7f,0xbf,
++0xff,0xff,0xaf,0xef,0xff,0xdf,0xdf,0xfb,0xff,0xf1,0xc3,0xfe,0x6f,0xf1,0xcf,0x3f,
++0xfb,0xff,0xff,0xcf,0xfe,0xff,0xff,0xfe,0x7f,0xbf,0xff,0xff,0xbf,0xfa,0xf0,0xdf,
++0xff,0xff,0xff,0xfe,0xf3,0xc0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
++0x20,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
++0x00,0x00,0x00,0x02,0x00,0x00,0x80,0x00,0x02,0x80,0x00,0x02,0x3c,0xf0,0x2f,0xff,
++0xff,0xff,0xfe,0xfd,0xbf,0xff,0xfb,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xf1,0xff,0x7f,0xff,0xff,0xff,0xff,0xef,0xff,
++0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xf0,0x2f,0xff,0xff,
++0xff,0xfe,0xf0,0xff,0xff,0xff,0xfb,0xff,0xbf,0xff,0xff,0xff,0xff,0xf7,0xbf,0xfb,
++0xff,0xff,0xff,0xdf,0xf7,0xff,0xf1,0xf7,0xbf,0xfb,0xff,0xff,0xff,0x7f,0xde,0xff,
++0xff,0xff,0xff,0xff,0xff,0xed,0xf7,0xff,0xff,0x7f,0xd0,0xf0,0x3f,0xff,0xff,0xff,
++0xfe,0xf8,0x30,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x80,
++0x20,0x01,0x01,0x92,0x00,0x01,0x01,0x00,0xe0,0x1c,0x60,0x20,0x30,0x08,0x08,0x00,
++0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0xc1,0xf0,0x6f,0xff,0xff,0xff,0xfe,
++0xff,0xff,0xff,0xff,0xff,0xdb,0xfe,0xff,0xff,0xdf,0xff,0xfc,0x7f,0xfb,0xbf,0xff,
++0xff,0xff,0xff,0xff,0xf1,0xf6,0xff,0xf7,0x7e,0x3f,0xff,0x7f,0xff,0xff,0xff,0xf7,
++0xff,0xff,0xff,0xed,0xff,0xdf,0xff,0xb7,0xff,0xf0,0x3f,0xff,0xff,0xff,0xfe,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,
++0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xbf,0xff,0xdf,
++0x57,0xef,0xf1,0xfd,0xfe,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xfb,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x7f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
++0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xdf,0xff,
++0xff,0xf1,0xfd,0xff,0x7f,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xfe,0xff,0xff,0xff,0xff,0xf0,0x9f,0xff,0xff,0xff,0xfe,0xf7,0xfd,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,
++0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xf0,0x6f,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,
++0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xfb,0xff,0xff,0xff,0xfe,0xff,0xff,0xfb,0x6f,0xff,0xfe,0xbf,0xff,0xf1,0xff,
++0xf7,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,
++0xff,0xff,0xff,0xf0,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xfb,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0x57,0xff,0xfd,0xbf,0xff,0xf1,0xff,0xef,
++0xfe,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,
++0xde,0xff,0xf0,0xcf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xf7,0xdb,0xff,0xdb,0xfd,
++0xf6,0xff,0xf6,0xff,0x3c,0xbc,0xbc,0xbf,0xdf,0x6f,0xe7,0x2f,0xf1,0x3c,0xbf,0xfd,
++0xbf,0xdf,0x6f,0xff,0x6f,0xf7,0xdb,0xff,0xdb,0xfd,0xf6,0xff,0xf6,0xff,0xff,0xff,
++0x02,0x01,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
++0xff,0xff,0xff,0xff,0xff,0xff };
+diff -u --recursive --new-file linux.prev/drivers/net/hamradio/yam.c linux/drivers/net/hamradio/yam.c
+--- linux.prev/drivers/net/hamradio/yam.c Thu Jan 1 00:00:00 1970
++++ linux/drivers/net/hamradio/yam.c Sat Sep 12 22:54:35 1998
+@@ -0,0 +1,1324 @@
++/*****************************************************************************/
++
++/*
++ * yam.c -- YAM radio modem driver.
++ *
++ * Copyright (C) 1998 Frederic Rible F1OAT (frible@teaser.fr)
++ * Adapted from baycom.c driver written by Thomas Sailer (sailer@ife.ee.ethz.ch)
++ *
++ * 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 2 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, write to the Free Software
++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++ *
++ * Please note that the GPL allows you to use the driver, NOT the radio.
++ * In order to use the radio, you need a license from the communications
++ * authority of your country.
++ *
++ *
++ * History:
++ * 0.0 F1OAT 06.06.98 Begin of work with baycom.c source code V 0.3
++ * 0.1 F1OAT 07.06.98 Add timer polling routine for channel arbitration
++ * 0.2 F6FBB 08.06.98 Added delay after FPGA programming
++ * 0.3 F6FBB 29.07.98 Delayed PTT implementation for dupmode=2
++ * 0.4 F6FBB 30.07.98 Added TxTail, Slottime and Persistance
++ * 0.5 F6FBB 01.08.98 Shared IRQs, /proc/net and network statistics
++ * 0.6 F6FBB 25.08.98 Added 1200Bds format
++ * 0.7 F6FBB 12.09.98 Added to the kernel configuration
++ */
++
++/*****************************************************************************/
++
++#include <linux/config.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/net.h>
++#include <linux/in.h>
++#include <linux/if.h>
++#include <linux/malloc.h>
++#include <linux/errno.h>
++#include <asm/bitops.h>
++#include <asm/io.h>
++#include <asm/system.h>
++#include <linux/interrupt.h>
++#include <linux/ioport.h>
++
++#include <linux/netdevice.h>
++#include <linux/if_arp.h>
++#include <linux/etherdevice.h>
++#include <linux/skbuff.h>
++#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
++/* prototypes for ax25_encapsulate and ax25_rebuild_header */
++#include <net/ax25.h>
++#endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */
++
++/* make genksyms happy */
++#include <linux/ip.h>
++#include <linux/udp.h>
++#include <linux/tcp.h>
++
++#include <linux/kernel.h>
++#include <linux/proc_fs.h>
++
++#include <linux/yam.h>
++#include "yam9600.h"
++#include "yam1200.h"
++
++/* --------------------------------------------------------------------- */
++
++/*
++ * currently this module is supposed to support both module styles, i.e.
++ * the old one present up to about 2.1.9, and the new one functioning
++ * starting with 2.1.21. The reason is I have a kit allowing to compile
++ * this module also under 2.0.x which was requested by several people.
++ * This will go in 2.2
++ */
++#include <linux/version.h>
++
++#if LINUX_VERSION_CODE >= 0x20100
++#include <asm/uaccess.h>
++#else
++#include <asm/segment.h>
++#include <linux/mm.h>
++
++#undef put_user
++#undef get_user
++
++#define put_user(x,ptr) ({ __put_user((unsigned long)(x),(ptr),sizeof(*(ptr))); 0; })
++#define get_user(x,ptr) ({ x = ((__typeof__(*(ptr)))__get_user((ptr),sizeof(*(ptr)))); 0; })
++
++extern inline int copy_from_user(void *to, const void *from, unsigned long n)
++{
++ int i = verify_area(VERIFY_READ, from, n);
++ if (i)
++ return i;
++ memcpy_fromfs(to, from, n);
++ return 0;
++}
++
++extern inline int copy_to_user(void *to, const void *from, unsigned long n)
++{
++ int i = verify_area(VERIFY_WRITE, to, n);
++ if (i)
++ return i;
++ memcpy_tofs(to, from, n);
++ return 0;
++}
++#endif
++
++#if LINUX_VERSION_CODE < 0x20115
++extern __inline__ void dev_init_buffers(struct device *dev)
++{
++ int i;
++ for(i=0;i<DEV_NUMBUFFS;i++)
++ {
++ skb_queue_head_init(&dev->buffs[i]);
++ }
++}
++#endif
++
++#if LINUX_VERSION_CODE >= 0x20123
++#include <linux/init.h>
++#else
++#define __init
++#define __initdata
++#define __initfunc(x) x
++#endif
++
++/* --------------------------------------------------------------------- */
++
++static const char yam_drvname[] = "yam";
++static const char yam_drvinfo[] = KERN_INFO "yam: (C) 1998 Frederic Rible F1OAT\n"
++KERN_INFO "yam: version 0.7 compiled " __TIME__ " " __DATE__ "\n";
++
++/* --------------------------------------------------------------------- */
++
++#define YAM_9600 1
++#define YAM_1200 2
++
++#define NR_PORTS 4
++#define YAM_MAGIC 0xF10A7654
++
++/* Transmitter states */
++
++#define TX_OFF 0
++#define TX_HEAD 1
++#define TX_DATA 2
++#define TX_CRC1 3
++#define TX_CRC2 4
++#define TX_TAIL 5
++
++#define YAM_MAX_FRAME 1024
++
++#define DEFAULT_BITRATE 9600 /* bps */
++#define DEFAULT_HOLDD 10 /* sec */
++#define DEFAULT_TXD 300 /* ms */
++#define DEFAULT_TXTAIL 10 /* ms */
++#define DEFAULT_SLOT 100 /* ms */
++#define DEFAULT_PERS 64 /* 0->255 */
++
++struct yam_port {
++ int magic;
++ int bitrate;
++ int baudrate;
++ int iobase;
++ int irq;
++ int dupmode;
++ char name[16];
++
++ struct device dev;
++
++ /* Stats section */
++
++#if LINUX_VERSION_CODE < 0x20119
++ struct enet_statistics stats;
++#else
++ struct net_device_stats stats;
++#endif
++ int nb_rxint;
++ int nb_mdint;
++
++ /* Parameters section */
++
++ int txd; /* tx delay */
++ int holdd; /* duplex ptt delay */
++ int txtail; /* txtail delay */
++ int slot; /* slottime */
++ int pers; /* persistence */
++
++ /* Tx section */
++
++ int tx_state;
++ int tx_count;
++ int slotcnt;
++ unsigned char tx_buf[YAM_MAX_FRAME];
++ int tx_len;
++ int tx_crcl, tx_crch;
++ struct sk_buff_head send_queue; /* Packets awaiting transmission */
++
++ /* Rx section */
++
++ int dcd;
++ unsigned char rx_buf[YAM_MAX_FRAME];
++ int rx_len;
++ int rx_crcl, rx_crch;
++};
++
++struct yam_mcs {
++ unsigned char bits[YAM_FPGA_SIZE];
++ int bitrate;
++ struct yam_mcs *next;
++};
++
++static struct yam_port yam_ports[NR_PORTS];
++
++static struct yam_mcs *yam_data = NULL;
++
++static unsigned irqs[16];
++
++static char ax25_bcast[7] =
++{'Q' << 1, 'S' << 1, 'T' << 1, ' ' << 1, ' ' << 1, ' ' << 1, '0' << 1};
++static char ax25_test[7] =
++{'L' << 1, 'I' << 1, 'N' << 1, 'U' << 1, 'X' << 1, ' ' << 1, '1' << 1};
++
++static struct timer_list yam_timer;
++
++/* --------------------------------------------------------------------- */
++
++#define RBR(iobase) (iobase+0)
++#define THR(iobase) (iobase+0)
++#define IER(iobase) (iobase+1)
++#define IIR(iobase) (iobase+2)
++#define FCR(iobase) (iobase+2)
++#define LCR(iobase) (iobase+3)
++#define MCR(iobase) (iobase+4)
++#define LSR(iobase) (iobase+5)
++#define MSR(iobase) (iobase+6)
++#define SCR(iobase) (iobase+7)
++#define DLL(iobase) (iobase+0)
++#define DLM(iobase) (iobase+1)
++
++#define YAM_EXTENT 8
++
++/* Interrupt Identification Register Bit Masks */
++#define IIR_NOPEND 1
++#define IIR_MSR 0
++#define IIR_TX 2
++#define IIR_RX 4
++#define IIR_LSR 6
++#define IIR_TIMEOUT 12 /* Fifo mode only */
++
++#define IIR_MASK 0x0F
++
++/* Interrupt Enable Register Bit Masks */
++#define IER_RX 1 /* enable rx interrupt */
++#define IER_TX 2 /* enable tx interrupt */
++#define IER_LSR 4 /* enable line status interrupts */
++#define IER_MSR 8 /* enable modem status interrupts */
++
++/* Modem Control Register Bit Masks */
++#define MCR_DTR 0x01 /* DTR output */
++#define MCR_RTS 0x02 /* RTS output */
++#define MCR_OUT1 0x04 /* OUT1 output (not accessible in RS232) */
++#define MCR_OUT2 0x08 /* Master Interrupt enable (must be set on PCs) */
++#define MCR_LOOP 0x10 /* Loopback enable */
++
++/* Modem Status Register Bit Masks */
++#define MSR_DCTS 0x01 /* Delta CTS input */
++#define MSR_DDSR 0x02 /* Delta DSR */
++#define MSR_DRIN 0x04 /* Delta RI */
++#define MSR_DDCD 0x08 /* Delta DCD */
++#define MSR_CTS 0x10 /* CTS input */
++#define MSR_DSR 0x20 /* DSR input */
++#define MSR_RING 0x40 /* RI input */
++#define MSR_DCD 0x80 /* DCD input */
++
++/* line status register bit mask */
++#define LSR_RXC 0x01
++#define LSR_OE 0x02
++#define LSR_PE 0x04
++#define LSR_FE 0x08
++#define LSR_BREAK 0x10
++#define LSR_THRE 0x20
++#define LSR_TSRE 0x40
++
++/* Line Control Register Bit Masks */
++#define LCR_DLAB 0x80
++#define LCR_BREAK 0x40
++#define LCR_PZERO 0x28
++#define LCR_PEVEN 0x18
++#define LCR_PODD 0x08
++#define LCR_STOP1 0x00
++#define LCR_STOP2 0x04
++#define LCR_BIT5 0x00
++#define LCR_BIT6 0x02
++#define LCR_BIT7 0x01
++#define LCR_BIT8 0x03
++
++/* YAM Modem <-> UART Port mapping */
++
++#define TX_RDY MSR_DCTS /* transmitter ready to send */
++#define RX_DCD MSR_DCD /* carrier detect */
++#define RX_FLAG MSR_RING /* hdlc flag received */
++#define FPGA_DONE MSR_DSR /* FPGA is configured */
++#define PTT_ON (MCR_RTS|MCR_OUT2) /* activate PTT */
++#define PTT_OFF (MCR_DTR|MCR_OUT2) /* release PTT */
++
++#define ENABLE_RXINT IER_RX /* enable uart rx interrupt during rx */
++#define ENABLE_TXINT IER_MSR /* enable uart ms interrupt during tx */
++#define ENABLE_RTXINT (IER_RX|IER_MSR) /* full duplex operations */
++
++#define MIN(a, b) (((a) < (b)) ? (a) : (b))
++#define MAX(a, b) (((a) > (b)) ? (a) : (b))
++
++/*************************************************************************
++* CRC Tables
++************************************************************************/
++
++static const unsigned char chktabl[256]=
++{ 0x00,0x89,0x12,0x9b,0x24,0xad,0x36,0xbf,0x48,0xc1,0x5a,0xd3,0x6c,0xe5,0x7e,
++ 0xf7,0x81,0x08,0x93,0x1a,0xa5,0x2c,0xb7,0x3e,0xc9,0x40,0xdb,0x52,0xed,0x64,
++ 0xff,0x76,0x02,0x8b,0x10,0x99,0x26,0xaf,0x34,0xbd,0x4a,0xc3,0x58,0xd1,0x6e,
++ 0xe7,0x7c,0xf5,0x83,0x0a,0x91,0x18,0xa7,0x2e,0xb5,0x3c,0xcb,0x42,0xd9,0x50,
++ 0xef,0x66,0xfd,0x74,0x04,0x8d,0x16,0x9f,0x20,0xa9,0x32,0xbb,0x4c,0xc5,0x5e,
++ 0xd7,0x68,0xe1,0x7a,0xf3,0x85,0x0c,0x97,0x1e,0xa1,0x28,0xb3,0x3a,0xcd,0x44,
++ 0xdf,0x56,0xe9,0x60,0xfb,0x72,0x06,0x8f,0x14,0x9d,0x22,0xab,0x30,0xb9,0x4e,
++ 0xc7,0x5c,0xd5,0x6a,0xe3,0x78,0xf1,0x87,0x0e,0x95,0x1c,0xa3,0x2a,0xb1,0x38,
++ 0xcf,0x46,0xdd,0x54,0xeb,0x62,0xf9,0x70,0x08,0x81,0x1a,0x93,0x2c,0xa5,0x3e,
++ 0xb7,0x40,0xc9,0x52,0xdb,0x64,0xed,0x76,0xff,0x89,0x00,0x9b,0x12,0xad,0x24,
++ 0xbf,0x36,0xc1,0x48,0xd3,0x5a,0xe5,0x6c,0xf7,0x7e,0x0a,0x83,0x18,0x91,0x2e,
++ 0xa7,0x3c,0xb5,0x42,0xcb,0x50,0xd9,0x66,0xef,0x74,0xfd,0x8b,0x02,0x99,0x10,
++ 0xaf,0x26,0xbd,0x34,0xc3,0x4a,0xd1,0x58,0xe7,0x6e,0xf5,0x7c,0x0c,0x85,0x1e,
++ 0x97,0x28,0xa1,0x3a,0xb3,0x44,0xcd,0x56,0xdf,0x60,0xe9,0x72,0xfb,0x8d,0x04,
++ 0x9f,0x16,0xa9,0x20,0xbb,0x32,0xc5,0x4c,0xd7,0x5e,0xe1,0x68,0xf3,0x7a,0x0e,
++ 0x87,0x1c,0x95,0x2a,0xa3,0x38,0xb1,0x46,0xcf,0x54,0xdd,0x62,0xeb,0x70,0xf9,
++ 0x8f,0x06,0x9d,0x14,0xab,0x22,0xb9,0x30,0xc7,0x4e,0xd5,0x5c,0xe3,0x6a,0xf1,
++ 0x78};
++static const unsigned char chktabh[256]=
++{ 0x00,0x11,0x23,0x32,0x46,0x57,0x65,0x74,0x8c,0x9d,0xaf,0xbe,0xca,0xdb,0xe9,
++ 0xf8,0x10,0x01,0x33,0x22,0x56,0x47,0x75,0x64,0x9c,0x8d,0xbf,0xae,0xda,0xcb,
++ 0xf9,0xe8,0x21,0x30,0x02,0x13,0x67,0x76,0x44,0x55,0xad,0xbc,0x8e,0x9f,0xeb,
++ 0xfa,0xc8,0xd9,0x31,0x20,0x12,0x03,0x77,0x66,0x54,0x45,0xbd,0xac,0x9e,0x8f,
++ 0xfb,0xea,0xd8,0xc9,0x42,0x53,0x61,0x70,0x04,0x15,0x27,0x36,0xce,0xdf,0xed,
++ 0xfc,0x88,0x99,0xab,0xba,0x52,0x43,0x71,0x60,0x14,0x05,0x37,0x26,0xde,0xcf,
++ 0xfd,0xec,0x98,0x89,0xbb,0xaa,0x63,0x72,0x40,0x51,0x25,0x34,0x06,0x17,0xef,
++ 0xfe,0xcc,0xdd,0xa9,0xb8,0x8a,0x9b,0x73,0x62,0x50,0x41,0x35,0x24,0x16,0x07,
++ 0xff,0xee,0xdc,0xcd,0xb9,0xa8,0x9a,0x8b,0x84,0x95,0xa7,0xb6,0xc2,0xd3,0xe1,
++ 0xf0,0x08,0x19,0x2b,0x3a,0x4e,0x5f,0x6d,0x7c,0x94,0x85,0xb7,0xa6,0xd2,0xc3,
++ 0xf1,0xe0,0x18,0x09,0x3b,0x2a,0x5e,0x4f,0x7d,0x6c,0xa5,0xb4,0x86,0x97,0xe3,
++ 0xf2,0xc0,0xd1,0x29,0x38,0x0a,0x1b,0x6f,0x7e,0x4c,0x5d,0xb5,0xa4,0x96,0x87,
++ 0xf3,0xe2,0xd0,0xc1,0x39,0x28,0x1a,0x0b,0x7f,0x6e,0x5c,0x4d,0xc6,0xd7,0xe5,
++ 0xf4,0x80,0x91,0xa3,0xb2,0x4a,0x5b,0x69,0x78,0x0c,0x1d,0x2f,0x3e,0xd6,0xc7,
++ 0xf5,0xe4,0x90,0x81,0xb3,0xa2,0x5a,0x4b,0x79,0x68,0x1c,0x0d,0x3f,0x2e,0xe7,
++ 0xf6,0xc4,0xd5,0xa1,0xb0,0x82,0x93,0x6b,0x7a,0x48,0x59,0x2d,0x3c,0x0e,0x1f,
++ 0xf7,0xe6,0xd4,0xc5,0xb1,0xa0,0x92,0x83,0x7b,0x6a,0x58,0x49,0x3d,0x2c,0x1e,
++ 0x0f};
++
++/*************************************************************************
++* FPGA functions
++************************************************************************/
++
++static void delay(int ms)
++{
++ unsigned long timeout = jiffies + ((ms*HZ)/1000);
++ while (jiffies < timeout);
++}
++
++/*
++ * reset FPGA
++ */
++
++static void fpga_reset(int iobase)
++{
++ outb(0, IER(iobase));
++ outb(LCR_DLAB|LCR_BIT5, LCR(iobase));
++ outb(1, DLL(iobase));
++ outb(0, DLM(iobase));
++
++ outb(LCR_BIT5, LCR(iobase));
++ inb(LSR(iobase));
++ inb(MSR(iobase));
++ /* turn off FPGA supply voltage */
++ outb(MCR_OUT1|MCR_OUT2, MCR(iobase));
++ delay(100);
++ /* turn on FPGA supply voltage again */
++ outb(MCR_DTR|MCR_RTS|MCR_OUT1|MCR_OUT2, MCR(iobase));
++ delay(100);
++}
++
++/*
++ * send one byte to FPGA
++ */
++
++static int fpga_write(int iobase, unsigned char wrd)
++{
++ unsigned char bit;
++ int k;
++ unsigned long timeout = jiffies + HZ/10;
++
++ for (k=0; k<8; k++) {
++ bit = (wrd&0x80)?(MCR_RTS|MCR_DTR):MCR_DTR;
++ outb(bit|MCR_OUT1|MCR_OUT2, MCR(iobase));
++ wrd <<=1 ;
++ outb(0xfc, THR(iobase));
++ while ((inb(LSR(iobase)) & LSR_TSRE) == 0)
++ if (jiffies > timeout) return -1;
++ }
++
++ return 0;
++}
++
++#ifdef MODULE
++static void free_mcs(void)
++{
++ struct yam_mcs *p;
++
++ while (yam_data) {
++ p = yam_data;
++ yam_data = yam_data->next;
++ kfree(p);
++ }
++}
++#endif
++
++static unsigned char *add_mcs(unsigned char *bits, int bitrate)
++{
++ struct yam_mcs *p;
++
++ /* If it already exists, replace the bit data */
++ p = yam_data;
++ while (p) {
++ if (p->bitrate == bitrate) {
++ memcpy(p->bits, bits, YAM_FPGA_SIZE);
++ return p->bits;
++ }
++ p = p->next;
++ }
++
++ /* Allocate a new mcs */
++ p = kmalloc(sizeof(struct yam_mcs), GFP_ATOMIC);
++ if (p == NULL) {
++ printk(KERN_WARNING "YAM: no memory to allocate mcs\n");
++ return NULL;
++ }
++
++ memcpy(p->bits, bits, YAM_FPGA_SIZE);
++ p->bitrate = bitrate;
++ p->next = yam_data;
++ yam_data = p;
++
++ return p->bits;
++}
++
++static unsigned char *get_mcs(int bitrate)
++{
++ struct yam_mcs *p;
++
++ p = yam_data;
++ while (p) {
++ if (p->bitrate == bitrate)
++ return p->bits;
++ p = p->next;
++ }
++
++ /* Load predefined mcs data */
++ switch (bitrate) {
++ case 1200 :
++ return add_mcs(bits_1200, bitrate);
++ default :
++ return add_mcs(bits_9600, bitrate);
++ }
++}
++
++/*
++ * download bitstream to FPGA
++ * data is contained in bits[] array in fpgaconf.h
++ */
++
++static int fpga_download(int iobase, int bitrate)
++{
++ int i, rc;
++ unsigned char *pbits;
++
++ pbits = get_mcs(bitrate);
++ if (pbits == NULL)
++ return -1;
++
++ fpga_reset(iobase);
++ for(i = 0 ; i < YAM_FPGA_SIZE ; i++) {
++ if (fpga_write(iobase, pbits[i])) {
++ printk("yam: error in write cycle\n");
++ return -1; /* write... */
++ }
++ }
++
++ fpga_write(iobase, 0xFF);
++ rc = inb(MSR(iobase)); /* check DONE signal */
++
++ /* Necesary for some hardwares */
++ delay(50);
++
++ return (rc & MSR_DSR) ? 0 : -1;
++}
++
++
++/************************************************************************
++* Serial port init
++************************************************************************/
++
++static void yam_set_uart(struct device *dev)
++{
++ struct yam_port *yp = (struct yam_port *)dev->priv;
++ int divisor = 115200/yp->baudrate;
++
++ outb(0, IER(dev->base_addr));
++ outb(LCR_DLAB|LCR_BIT8, LCR(dev->base_addr));
++ outb(divisor, DLL(dev->base_addr));
++ outb(0, DLM(dev->base_addr));
++ outb(LCR_BIT8, LCR(dev->base_addr));
++ outb(PTT_OFF, MCR(dev->base_addr));
++ outb(0x00, FCR(dev->base_addr));
++
++ /* Flush pending irq */
++
++ inb(RBR(dev->base_addr));
++ inb(MSR(dev->base_addr));
++
++ /* Enable rx irq */
++
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ /* if (yp->dupmode) {
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ }
++ else {
++ outb(ENABLE_RXINT, IER(dev->base_addr));
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ } */
++}
++
++
++/* --------------------------------------------------------------------- */
++
++enum uart { c_uart_unknown, c_uart_8250,
++ c_uart_16450, c_uart_16550, c_uart_16550A};
++static const char *uart_str[] =
++ { "unknown", "8250", "16450", "16550", "16550A" };
++
++static enum uart yam_check_uart(unsigned int iobase)
++{
++ unsigned char b1,b2,b3;
++ enum uart u;
++ enum uart uart_tab[] =
++ { c_uart_16450, c_uart_unknown, c_uart_16550, c_uart_16550A };
++
++ b1 = inb(MCR(iobase));
++ outb(b1 | 0x10, MCR(iobase)); /* loopback mode */
++ b2 = inb(MSR(iobase));
++ outb(0x1a, MCR(iobase));
++ b3 = inb(MSR(iobase)) & 0xf0;
++ outb(b1, MCR(iobase)); /* restore old values */
++ outb(b2, MSR(iobase));
++ if (b3 != 0x90)
++ return c_uart_unknown;
++ inb(RBR(iobase));
++ inb(RBR(iobase));
++ outb(0x01, FCR(iobase)); /* enable FIFOs */
++ u = uart_tab[(inb(IIR(iobase)) >> 6) & 3];
++ if (u == c_uart_16450) {
++ outb(0x5a, SCR(iobase));
++ b1 = inb(SCR(iobase));
++ outb(0xa5, SCR(iobase));
++ b2 = inb(SCR(iobase));
++ if ((b1 != 0x5a) || (b2 != 0xa5))
++ u = c_uart_8250;
++ }
++ return u;
++}
++
++/******************************************************************************
++* Rx Section
++******************************************************************************/
++static void inline yam_rx_flag(struct device *dev, struct yam_port *yp)
++{
++ if (yp->dcd && yp->rx_len >= 3 && yp->rx_len < YAM_MAX_FRAME) {
++ int pkt_len = yp->rx_len - 2 + 1; /* -CRC + kiss */
++ struct sk_buff *skb;
++
++ if ((yp->rx_crch & yp->rx_crcl) != 0xFF) {
++ /* Bad crc */
++ }
++ else {
++ if (!(skb = dev_alloc_skb(pkt_len))) {
++ printk("%s: memory squeeze, dropping packet\n", dev->name);
++ ++yp->stats.rx_dropped;
++ }
++ else {
++ unsigned char *cp;
++ skb->dev = dev;
++ cp = skb_put(skb, pkt_len);
++ *cp++ = 0; /* KISS kludge */
++ memcpy(cp, yp->rx_buf, pkt_len - 1);
++ skb->protocol = htons(ETH_P_AX25);
++ skb->mac.raw = skb->data;
++ netif_rx(skb);
++ ++yp->stats.rx_packets;
++ }
++ }
++ }
++ yp->rx_len = 0;
++ yp->rx_crcl = 0x21;
++ yp->rx_crch = 0xf3;
++}
++
++static void inline yam_rx_byte(struct device *dev, struct yam_port *yp, unsigned char rxb)
++{
++ if (yp->rx_len < YAM_MAX_FRAME) {
++ unsigned char c = yp->rx_crcl;
++ yp->rx_crcl = (chktabl[c]^yp->rx_crch);
++ yp->rx_crch = (chktabh[c]^rxb);
++ yp->rx_buf[yp->rx_len++] = rxb;
++ }
++}
++
++/********************************************************************************
++* TX Section
++********************************************************************************/
++
++static void ptt_on(struct device *dev)
++{
++ /* struct yam_port *yp = (struct yam_port *)dev->priv; */
++
++ outb(PTT_ON, MCR(dev->base_addr));
++ /* inb(MSR(dev->base_addr));
++ if (yp->dupmode) {
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ }
++ else {
++ outb(ENABLE_TXINT, IER(dev->base_addr));
++ } */
++}
++
++static void ptt_off(struct device *dev)
++{
++ /* struct yam_port *yp = (struct yam_port *)dev->priv; */
++
++ outb(PTT_OFF, MCR(dev->base_addr));
++ /* if (yp->dupmode) {
++ outb(ENABLE_RTXINT, IER(dev->base_addr));
++ }
++ else {
++ inb(RBR(dev->base_addr));
++ outb(ENABLE_RXINT, IER(dev->base_addr));
++ } */
++}
++
++static int yam_send_packet(struct sk_buff *skb, struct device *dev)
++{
++ struct yam_port *yp = dev->priv;
++
++ if (skb == NULL) {
++ /* dev_tint(dev); */
++ return 0;
++ }
++ skb_queue_tail(&yp->send_queue, skb);
++ dev->trans_start = jiffies;
++ return 0;
++}
++
++static void yam_start_tx(struct device *dev, struct yam_port *yp)
++{
++ if ((yp->tx_state == TX_TAIL) || (yp->txd == 0))
++ yp->tx_count = 1;
++ else
++ yp->tx_count = (yp->bitrate*yp->txd)/8000;
++ yp->tx_state = TX_HEAD;
++ ptt_on(dev);
++}
++
++static unsigned short random_seed;
++
++static inline unsigned short random_num(void)
++{
++ random_seed = 28629 * random_seed + 157;
++ return random_seed;
++}
++
++static void yam_arbitrate(struct device *dev)
++{
++ struct yam_port *yp = dev->priv;
++
++ if (!yp || yp->magic != YAM_MAGIC
++ || yp->tx_state!=TX_OFF || skb_queue_empty(&yp->send_queue)) {
++ return;
++ }
++
++ /* tx_state is TX_OFF and there is data to send */
++
++ if (yp->dupmode) {
++ /* Full duplex mode, don't wait */
++ yam_start_tx(dev, yp);
++ return;
++ }
++
++ if (yp->dcd) {
++ /* DCD on, wait slotime ... */
++ yp->slotcnt = yp->slot / 10;
++ return;
++ }
++
++ /* Is slottime passed ? */
++ if ((--yp->slotcnt) > 0)
++ return;
++
++ yp->slotcnt = yp->slot / 10;
++
++ /* is random > persist ? */
++ if ((random_num() % 256) > yp->pers)
++ return;
++
++ yam_start_tx(dev, yp);
++}
++
++static void yam_dotimer(unsigned long dummy)
++{
++ int i;
++
++ for (i = 0; i < NR_PORTS; i++) {
++ struct device *dev = &yam_ports[i].dev;
++ if (dev->start) yam_arbitrate(dev);
++ }
++ yam_timer.expires = jiffies + HZ/100;
++ add_timer(&yam_timer);
++}
++
++static void yam_tx_byte(struct device *dev, struct yam_port *yp)
++{
++ struct sk_buff *skb;
++ unsigned char b, temp;
++
++ switch (yp->tx_state) {
++ case TX_OFF:
++ break;
++ case TX_HEAD:
++ if (--yp->tx_count <= 0) {
++ if (!(skb = skb_dequeue(&yp->send_queue))) {
++ ptt_off(dev);
++ yp->tx_state = TX_OFF;
++ break;
++ }
++ yp->tx_state = TX_DATA;
++ if (skb->data[0] != 0) {
++/* do_kiss_params(s, skb->data, skb->len);*/
++ dev_kfree_skb(skb);
++ break;
++ }
++ yp->tx_len = skb->len-1; /* strip KISS byte */
++ if (yp->tx_len >= YAM_MAX_FRAME || yp->tx_len < 2) {
++ dev_kfree_skb(skb);
++ break;
++ }
++ memcpy(yp->tx_buf, skb->data+1, yp->tx_len);
++ dev_kfree_skb(skb);
++ yp->tx_count = 0;
++ yp->tx_crcl = 0x21;
++ yp->tx_crch = 0xf3;
++ yp->tx_state = TX_DATA;
++ }
++ break;
++ case TX_DATA:
++ b = yp->tx_buf[yp->tx_count++];
++ outb(b, THR(dev->base_addr));
++ temp = yp->tx_crcl;
++ yp->tx_crcl = chktabl[temp]^yp->tx_crch;
++ yp->tx_crch = chktabh[temp]^b;
++ if (yp->tx_count >= yp->tx_len) {
++ yp->tx_state = TX_CRC1;
++ }
++ break;
++ case TX_CRC1:
++ yp->tx_crch = chktabl[yp->tx_crcl]^yp->tx_crch;
++ yp->tx_crcl = chktabh[yp->tx_crcl]^chktabl[yp->tx_crch]^0xff;
++ outb(yp->tx_crcl, THR(dev->base_addr));
++ yp->tx_state = TX_CRC2;
++ break;
++ case TX_CRC2:
++ outb(chktabh[yp->tx_crch]^0xFF, THR(dev->base_addr));
++ if (skb_queue_empty(&yp->send_queue)) {
++ yp->tx_count = (yp->bitrate*yp->txtail)/8000;
++ if (yp->dupmode == 2) yp->tx_count += (yp->bitrate*yp->holdd)/8;
++ if (yp->tx_count == 0) yp->tx_count = 1;
++ yp->tx_state = TX_TAIL;
++ }
++ else {
++ yp->tx_count = 1;
++ yp->tx_state = TX_HEAD;
++ }
++ ++yp->stats.tx_packets;
++ break;
++ case TX_TAIL:
++ if (--yp->tx_count <= 0) {
++ yp->tx_state = TX_OFF;
++ ptt_off(dev);
++ }
++ break;
++ }
++}
++
++/***********************************************************************************
++* ISR routine
++************************************************************************************/
++
++static void yam_interrupt(int irq, void *dev_id, struct pt_regs *regs)
++{
++ struct device *dev;
++ struct yam_port *yp;
++ unsigned char iir;
++ int counter = 100;
++ int i;
++
++ sti();
++
++ for (i = 0 ; i < NR_PORTS ; i++) {
++ yp = &yam_ports[i];
++ dev = &yp->dev;
++
++ if (!dev->start)
++ continue;
++
++ while ( (iir = IIR_MASK & inb(IIR(dev->base_addr)) ) != IIR_NOPEND) {
++ unsigned char msr = inb(MSR(dev->base_addr));
++ unsigned char lsr = inb(LSR(dev->base_addr));
++ unsigned char rxb;
++
++ if (lsr & LSR_OE)
++ ++yp->stats.rx_fifo_errors;
++
++ yp->dcd = (msr & RX_DCD) ? 1 : 0;
++
++ if (--counter <= 0) {
++ printk("%s: too many irq iir=%d\n", dev->name, iir);
++ return;
++ }
++
++ if (msr & TX_RDY) {
++ ++yp->nb_mdint;
++ yam_tx_byte(dev, yp);
++ }
++
++ if (lsr & LSR_RXC) {
++ ++yp->nb_rxint;
++ rxb = inb(RBR(dev->base_addr));
++ if (msr & RX_FLAG) yam_rx_flag(dev, yp);
++ else yam_rx_byte(dev, yp, rxb);
++ }
++ /*
++ switch (iir) {
++ case IIR_MSR:
++ ++yp->nb_mdint;
++ if (msr & TX_RDY) yam_tx_byte(dev, yp);
++ break;
++ case IIR_RX:
++ ++yp->nb_rxint;
++ rxb = inb(RBR(dev->base_addr));
++ if (msr & RX_FLAG) yam_rx_flag(dev, yp);
++ else yam_rx_byte(dev, yp, rxb);
++ break;
++ }
++ */
++ }
++ }
++}
++
++static int yam_net_get_info(char *buffer, char **start, off_t offset, int length, int dummy)
++{
++ int len = 0;
++ int i;
++ off_t pos = 0;
++ off_t begin = 0;
++
++ cli();
++
++ for (i = 0; i < NR_PORTS; i++)
++ {
++ if (yam_ports[i].iobase == 0 || yam_ports[i].irq == 0)
++ continue;
++ len += sprintf(buffer+len, "Device %s\n", yam_ports[i].name);
++ len += sprintf(buffer+len, " Up %d\n", yam_ports[i].dev.start);
++ len += sprintf(buffer+len, " Speed %u\n", yam_ports[i].bitrate);
++ len += sprintf(buffer+len, " IoBase 0x%x\n", yam_ports[i].iobase);
++ len += sprintf(buffer+len, " BaudRate %u\n", yam_ports[i].baudrate);
++ len += sprintf(buffer+len, " IRQ %u\n", yam_ports[i].irq);
++ len += sprintf(buffer+len, " TxState %u\n", yam_ports[i].tx_state);
++ len += sprintf(buffer+len, " Duplex %u\n", yam_ports[i].dupmode);
++ len += sprintf(buffer+len, " HoldDly %u\n", yam_ports[i].holdd);
++ len += sprintf(buffer+len, " TxDelay %u\n", yam_ports[i].txd);
++ len += sprintf(buffer+len, " TxTail %u\n", yam_ports[i].txtail);
++ len += sprintf(buffer+len, " SlotTime %u\n", yam_ports[i].slot);
++ len += sprintf(buffer+len, " Persist %u\n", yam_ports[i].pers);
++ len += sprintf(buffer+len, " TxFrames %lu\n", yam_ports[i].stats.tx_packets);
++ len += sprintf(buffer+len, " RxFrames %lu\n", yam_ports[i].stats.rx_packets);
++ len += sprintf(buffer+len, " TxInt %u\n", yam_ports[i].nb_mdint);
++ len += sprintf(buffer+len, " RxInt %u\n", yam_ports[i].nb_rxint);
++ len += sprintf(buffer+len, " RxOver %lu\n", yam_ports[i].stats.rx_fifo_errors);
++ len += sprintf(buffer+len, "\n");
++
++ pos = begin + len;
++
++ if (pos < offset) {
++ len = 0;
++ begin = pos;
++ }
++
++ if (pos > offset + length)
++ break;
++ }
++
++ sti();
++
++ *start = buffer + (offset - begin);
++ len -= (offset - begin);
++
++ if (len > length) len = length;
++
++ return len;
++}
++
++#ifdef CONFIG_INET
++#ifndef PROC_NET_YAM
++#define PROC_NET_YAM (PROC_NET_LAST+10) /* Sorry again... */
++#endif
++
++struct proc_dir_entry yam_proc_dir_entry =
++{
++ PROC_NET_YAM, 3, "yam", S_IFREG | S_IRUGO, 1, 0, 0, 0,
++ &proc_net_inode_operations, yam_net_get_info
++};
++
++#define yam_net_procfs_init() proc_net_register(&yam_proc_dir_entry);
++#define yam_net_procfs_remove() proc_net_unregister(PROC_NET_YAM);
++#else
++#define yam_net_procfs_init()
++#define yam_net_procfs_remove()
++#endif
++
++/* --------------------------------------------------------------------- */
++
++#if LINUX_VERSION_CODE >= 0x20119
++static struct net_device_stats *yam_get_stats(struct device *dev)
++#else
++static struct enet_statistics *yam_get_stats(struct device *dev)
++#endif
++{
++ struct yam_port *yp;
++
++ if (!dev || !dev->priv)
++ return NULL;
++
++ yp = (struct yam_port *)dev->priv;
++ if (yp->magic != YAM_MAGIC)
++ return NULL;
++
++ /*
++ * Get the current statistics. This may be called with the
++ * card open or closed.
++ */
++ return &yp->stats;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_open(struct device *dev)
++{
++ struct yam_port *yp = (struct yam_port *)dev->priv;
++ enum uart u;
++ int i;
++
++ printk(KERN_INFO "Trying %s at iobase 0x%lx irq %u\n", dev->name, dev->base_addr, dev->irq);
++
++ if (!dev || !yp || !yp->bitrate)
++ return -ENXIO;
++ if (!dev->base_addr || dev->base_addr > 0x1000-YAM_EXTENT ||
++ dev->irq < 2 || dev->irq > 15) {
++ return -ENXIO;
++ }
++ if (check_region(dev->base_addr, YAM_EXTENT)) {
++ printk("%s: cannot 0x%lx busy\n", dev->name, dev->base_addr);
++ return -EACCES;
++ }
++ if ((u = yam_check_uart(dev->base_addr)) == c_uart_unknown) {
++ printk("%s: cannot find uart type\n", dev->name);
++ return -EIO;
++ }
++
++ if (fpga_download(dev->base_addr, yp->bitrate)) {
++ printk("%s: cannot init FPGA\n", dev->name);
++ return -EIO;
++ }
++
++ outb(0, IER(dev->base_addr));
++ if (request_irq(dev->irq, yam_interrupt, SA_INTERRUPT|SA_SHIRQ, dev->name, NULL)) {
++ printk("%s: irq %d busy\n", dev->name, dev->irq);
++ return -EBUSY;
++ }
++
++ request_region(dev->base_addr, YAM_EXTENT, dev->name);
++
++ yam_set_uart(dev);
++ dev->start = 1;
++ yp->slotcnt = yp->slot / 10;
++
++ /* Reset overruns for all ports - FPGA programming makes overruns */
++ for (i = 0 ; i < NR_PORTS ; i++) {
++ inb(LSR(yam_ports[i].dev.base_addr));
++ yam_ports[i].stats.rx_fifo_errors = 0;
++ }
++
++ printk(KERN_INFO "%s at iobase 0x%lx irq %u uart %s\n", dev->name, dev->base_addr, dev->irq,
++ uart_str[u]);
++ MOD_INC_USE_COUNT;
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_close(struct device *dev)
++{
++ struct sk_buff *skb;
++ struct yam_port *yp = (struct yam_port *)dev->priv;
++
++ if (!dev || !yp)
++ return -EINVAL;
++ /*
++ * disable interrupts
++ */
++ outb(0, IER(dev->base_addr));
++ outb(1, MCR(dev->base_addr));
++ /* Remove IRQ handler if last */
++ free_irq(dev->irq, NULL);
++ release_region(dev->base_addr, YAM_EXTENT);
++ dev->start = 0;
++ dev->tbusy = 1;
++ while ((skb = skb_dequeue(&yp->send_queue)))
++ dev_kfree_skb(skb);
++
++ printk(KERN_INFO "%s: close yam at iobase 0x%lx irq %u\n",
++ yam_drvname, dev->base_addr, dev->irq);
++ MOD_DEC_USE_COUNT;
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
++{
++ struct yam_port *yp = (struct yam_port *)dev->priv;
++ struct yamdrv_ioctl_cfg yi;
++ struct yamdrv_ioctl_mcs *ym;
++ int ioctl_cmd;
++
++ if (copy_from_user(&ioctl_cmd, ifr->ifr_data, sizeof(int)))
++ return -EFAULT;
++
++ if (yp == NULL || yp->magic != YAM_MAGIC)
++ return -EINVAL;
++
++ if (!suser()) return -EPERM;
++
++ if (cmd != SIOCDEVPRIVATE)
++ return -EINVAL;
++
++ switch(ioctl_cmd) {
++
++ case SIOCYAMRESERVED:
++ return -EINVAL; /* unused */
++
++ case SIOCYAMSMCS:
++ if (dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++ ym = kmalloc(sizeof(struct yamdrv_ioctl_mcs), GFP_ATOMIC);
++ ym->bitrate = 9600;
++ if (copy_from_user(ym, ifr->ifr_data, sizeof(struct yamdrv_ioctl_mcs)))
++ return -EFAULT;
++ if (ym->bitrate > YAM_MAXBITRATE) return -EINVAL;
++ add_mcs(ym->bits, ym->bitrate);
++ kfree(ym);
++ break;
++
++ case SIOCYAMSCFG:
++ if (copy_from_user(&yi, ifr->ifr_data, sizeof(struct yamdrv_ioctl_cfg)))
++ return -EFAULT;
++
++ if ((yi.cfg.mask & YAM_IOBASE) && dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++ if ((yi.cfg.mask & YAM_IRQ) && dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++ if ((yi.cfg.mask & YAM_BITRATE) && dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++ if ((yi.cfg.mask & YAM_BAUDRATE) && dev->start)
++ return -EINVAL; /* Cannot change this parameter when up */
++
++ if (yi.cfg.mask & YAM_IOBASE) {
++ yp->iobase = yi.cfg.iobase;
++ dev->base_addr = yi.cfg.iobase;
++ }
++ if (yi.cfg.mask & YAM_IRQ) {
++ if (yi.cfg.irq > 15) return -EINVAL;
++ yp->irq = yi.cfg.irq;
++ dev->irq = yi.cfg.irq;
++ }
++ if (yi.cfg.mask & YAM_BITRATE) {
++ if (yi.cfg.bitrate > YAM_MAXBITRATE) return -EINVAL;
++ yp->bitrate = yi.cfg.bitrate;
++ }
++ if (yi.cfg.mask & YAM_BAUDRATE) {
++ if (yi.cfg.baudrate > YAM_MAXBAUDRATE) return -EINVAL;
++ yp->baudrate = yi.cfg.baudrate;
++ }
++ if (yi.cfg.mask & YAM_MODE) {
++ if (yi.cfg.mode > YAM_MAXMODE) return -EINVAL;
++ yp->dupmode = yi.cfg.mode;
++ }
++ if (yi.cfg.mask & YAM_HOLDDLY) {
++ if (yi.cfg.holddly > YAM_MAXHOLDDLY) return -EINVAL;
++ yp->holdd = yi.cfg.holddly;
++ }
++ if (yi.cfg.mask & YAM_TXDELAY) {
++ if (yi.cfg.txdelay > YAM_MAXTXDELAY) return -EINVAL;
++ yp->txd = yi.cfg.txdelay;
++ }
++ if (yi.cfg.mask & YAM_TXTAIL) {
++ if (yi.cfg.txtail > YAM_MAXTXTAIL) return -EINVAL;
++ yp->txtail = yi.cfg.txtail;
++ }
++ if (yi.cfg.mask & YAM_PERSIST) {
++ if (yi.cfg.persist > YAM_MAXPERSIST) return -EINVAL;
++ yp->pers = yi.cfg.persist;
++ }
++ if (yi.cfg.mask & YAM_SLOTTIME) {
++ if (yi.cfg.slottime > YAM_MAXSLOTTIME) return -EINVAL;
++ yp->slot = yi.cfg.slottime;
++ yp->slotcnt = yp->slot / 10;
++ }
++ break;
++
++ case SIOCYAMGCFG:
++ yi.cfg.mask = 0xffffffff;
++ yi.cfg.iobase = yp->iobase;
++ yi.cfg.irq = yp->irq;
++ yi.cfg.bitrate = yp->bitrate;
++ yi.cfg.baudrate = yp->baudrate;
++ yi.cfg.mode = yp->dupmode;
++ yi.cfg.txdelay = yp->txd;
++ yi.cfg.holddly = yp->holdd;
++ yi.cfg.txtail = yp->txtail;
++ yi.cfg.persist = yp->pers;
++ yi.cfg.slottime = yp->slot;
++ if (copy_to_user(ifr->ifr_data, &yi, sizeof(struct yamdrv_ioctl_cfg)))
++ return -EFAULT;
++ break;
++
++ default:
++ return -EINVAL;
++
++ }
++
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_set_mac_address(struct device *dev, void *addr)
++{
++ struct sockaddr *sa = (struct sockaddr *)addr;
++
++ /* addr is an AX.25 shifted ASCII mac address */
++ memcpy(dev->dev_addr, sa->sa_data, dev->addr_len);
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++static int yam_probe(struct device *dev)
++{
++ struct yam_port *yp;
++
++ if (!dev)
++ return -ENXIO;
++
++ yp = (struct yam_port *)dev->priv;
++
++ dev->open = yam_open;
++ dev->stop = yam_close;
++ dev->do_ioctl = yam_ioctl;
++ dev->hard_start_xmit = yam_send_packet;
++ dev->get_stats = yam_get_stats;
++
++ dev_init_buffers(dev);
++ skb_queue_head_init(&yp->send_queue);
++
++#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
++ dev->hard_header = ax25_encapsulate;
++ dev->rebuild_header = ax25_rebuild_header;
++#else /* CONFIG_AX25 || CONFIG_AX25_MODULE */
++ dev->hard_header = NULL;
++ dev->rebuild_header = NULL;
++#endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */
++
++ dev->set_mac_address = yam_set_mac_address;
++
++ dev->type = ARPHRD_AX25; /* AF_AX25 device */
++ dev->hard_header_len = 73; /* We do digipeaters now */
++ dev->mtu = 256; /* AX25 is the default */
++ dev->addr_len = 7; /* sizeof an ax.25 address */
++ memcpy(dev->broadcast, ax25_bcast, 7);
++ memcpy(dev->dev_addr, ax25_test, 7);
++
++ /* New style flags */
++ dev->flags = 0;
++
++ return 0;
++}
++
++/* --------------------------------------------------------------------- */
++
++__initfunc(int yam_init(struct device *dev))
++{
++ int i;
++
++ printk(yam_drvinfo);
++
++ /* Clears the IRQ table */
++ memset(irqs, 0, sizeof(irqs));
++ memset(yam_ports, 0, sizeof(yam_ports));
++
++ for(i = 0; i < NR_PORTS; i++) {
++ sprintf(yam_ports[i].name, "yam%d", i);
++ yam_ports[i].magic = YAM_MAGIC;
++ yam_ports[i].bitrate = DEFAULT_BITRATE;
++ yam_ports[i].baudrate = DEFAULT_BITRATE * 2;
++ yam_ports[i].iobase = 0;
++ yam_ports[i].irq = 0;
++ yam_ports[i].dupmode = 0;
++ yam_ports[i].holdd = DEFAULT_HOLDD;
++ yam_ports[i].txd = DEFAULT_TXD;
++ yam_ports[i].txtail = DEFAULT_TXTAIL;
++ yam_ports[i].slot = DEFAULT_SLOT;
++ yam_ports[i].pers = DEFAULT_PERS;
++
++ dev = &yam_ports[i].dev;
++
++ dev->priv = &yam_ports[i];
++ dev->name = yam_ports[i].name;
++ dev->base_addr = yam_ports[i].iobase;
++ dev->irq = yam_ports[i].irq;
++ dev->init = yam_probe;
++ dev->if_port = 0;
++ dev->start = 0;
++ dev->tbusy = 1;
++
++ if (register_netdev(dev)) {
++ printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name);
++ return -ENXIO;
++ }
++ }
++
++ yam_timer.function = yam_dotimer;
++ yam_timer.expires = jiffies + HZ/100;
++ add_timer(&yam_timer);
++
++ yam_net_procfs_init();
++
++ /* do not keep this device */
++ return 1;
++}
++
++/* --------------------------------------------------------------------- */
++
++#ifdef MODULE
++
++/*
++ * command line settable parameters
++ */
++
++#if LINUX_VERSION_CODE >= 0x20115
++
++MODULE_AUTHOR("Frederic Rible F1OAT frible@teaser.fr");
++MODULE_DESCRIPTION("Yam amateur radio modem driver");
++
++#endif
++
++__initfunc(int init_module(void))
++{
++ int ret = yam_init(NULL);
++
++ return (ret == 1) ? 0 : ret;
++}
++
++/* --------------------------------------------------------------------- */
++
++void cleanup_module(void)
++{
++ int i;
++
++ del_timer(&yam_timer);
++ for(i = 0; i < NR_PORTS; i++) {
++ struct device *dev = &yam_ports[i].dev;
++ if (!dev->priv) continue;
++ if (dev->start) yam_close(dev);
++ unregister_netdev(dev);
++ }
++ free_mcs();
++ yam_net_procfs_remove();
++}
++
++#endif /* MODULE */
++/* --------------------------------------------------------------------- */
diff --git a/yamdrv/yamcfg.c b/yamdrv/yamcfg.c
new file mode 100644
index 0000000..59e2273
--- /dev/null
+++ b/yamdrv/yamcfg.c
@@ -0,0 +1,351 @@
+/*****************************************************************************/
+
+/*
+ * yaminit.c -- YAM radio modem driver setup utility.
+ *
+ * Copyright (C) 1998 Jean-Paul ROUBELAT (jpr@f6fbb.org)
+ * Adapted from sethdlc.c written by Thomas Sailer (sailer@ife.ee.ethz.ch)
+ *
+ * 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 2 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, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ *
+ * History:
+ * 0.0 29.07.98 First draft
+ */
+
+/*****************************************************************************/
+
+/* ---------------------------------------------------------------------- */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <net/if.h>
+#include <netinet/if_ether.h>
+#include <asm/byteorder.h>
+
+#include "yam.h"
+
+static unsigned char bitswap (unsigned char c)
+{
+ unsigned char r = 0;
+ int i;
+
+ for (i = 0; i < 8; i++)
+ {
+ r <<= 1;
+ if (c & 1)
+ r |= 1;
+ c >>= 1;
+ }
+ return r;
+}
+
+static int in2hex (char *ptr)
+{
+ char str[3];
+ int val;
+
+ memcpy (str, ptr, 2);
+ str[2] = '\0';
+
+ sscanf (str, "%x", &val);
+
+ return val;
+}
+
+static int set_mcs (char *name, struct ifreq *ifr, int sock, int bitrate, char *filename)
+{
+ struct yamdrv_ioctl_mcs yammcs;
+ FILE *fptr;
+ int nb, i, type, pos;
+ char buf[256];
+
+ yammcs.bitrate = bitrate;
+
+ fptr = fopen (filename, "r");
+ if (fptr == NULL)
+ {
+ fprintf (stderr, "%s: file %s not found\n", name, filename);
+ return -1;
+ }
+
+ pos = 0;
+
+ while (fgets (buf, sizeof (buf), fptr))
+ {
+ nb = in2hex (buf + 1);
+ type = in2hex (buf + 7);
+
+ if (type != 0)
+ continue;
+
+ for (i = 0; i < nb; i++)
+ {
+ if (pos == YAM_FPGA_SIZE)
+ {
+ fclose (fptr);
+ printf ("fpga bytes are more than %d in %s mcs file\n", YAM_FPGA_SIZE, filename);
+ return -1;
+ }
+ yammcs.bits[pos++] = bitswap (in2hex (buf + 9 + i * 2));
+ }
+ }
+
+ fclose (fptr);
+
+ if (pos != YAM_FPGA_SIZE)
+ {
+ printf ("fpga bytes are not %d in %s mcs file\n", YAM_FPGA_SIZE, filename);
+ return -1;
+ }
+
+ ifr->ifr_data = (caddr_t) & yammcs;
+ yammcs.cmd = SIOCYAMSMCS;
+
+ if (ioctl (sock, SIOCDEVPRIVATE, ifr) == -1)
+ {
+ fprintf (stderr, "%s: Error %s (%i), cannot ioctl SIOCYAMSMCS on %s\n",
+ name, strerror (errno), errno, ifr->ifr_name);
+ return -1;
+ }
+
+ printf ("mcs file %s loaded for bitrate %d\n\n", filename, yammcs.bitrate);
+
+ return 0;
+}
+
+static int set_params (char *name, struct ifreq *ifr, int sock, int ac, char **av, unsigned *pmask)
+{
+ int len;
+ int bitrate = 0;
+ char *filename = NULL;
+ struct yamdrv_ioctl_cfg yamctl;
+
+ printf ("\n");
+
+ yamctl.cfg.mask = 0;
+
+ while (ac >= 2)
+ {
+ len = strlen (av[0]);
+ if (!strncasecmp (av[0], "iobase", len))
+ {
+ yamctl.cfg.iobase = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_IOBASE;
+ }
+ else if (!strncasecmp (av[0], "irq", len))
+ {
+ yamctl.cfg.irq = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_IRQ;
+ }
+ else if (!strncasecmp (av[0], "bitrate", len))
+ {
+ yamctl.cfg.bitrate = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_BITRATE;
+ }
+ else if (!strncasecmp (av[0], "baudrate", len))
+ {
+ yamctl.cfg.baudrate = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_BAUDRATE;
+ }
+ else if (!strncasecmp (av[0], "duplex", len))
+ {
+ yamctl.cfg.mode = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_MODE;
+ }
+ else if (!strncasecmp (av[0], "hold", len))
+ {
+ yamctl.cfg.holddly = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_HOLDDLY;
+ }
+ else if (!strncasecmp (av[0], "txdelay", len))
+ {
+ yamctl.cfg.txdelay = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_TXDELAY;
+ }
+ else if (!strncasecmp (av[0], "txtail", len))
+ {
+ yamctl.cfg.txtail = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_TXTAIL;
+ }
+ else if (!strncasecmp (av[0], "slottime", len))
+ {
+ yamctl.cfg.slottime = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_SLOTTIME;
+ }
+ else if (!strncasecmp (av[0], "persist", len))
+ {
+ yamctl.cfg.persist = strtoul (av[1], NULL, 0);
+ yamctl.cfg.mask |= YAM_PERSIST;
+ }
+ else if (!strncasecmp (av[0], "load", len))
+ {
+ if (ac < 3)
+ break;
+ bitrate = strtoul (av[1], NULL, 0);
+ filename = av[2];
+ av += 1;
+ ac -= 1;
+ }
+ else
+ {
+ fprintf (stderr, "%s: invalid parameter type '%s'\n",
+ name, av[0]);
+ }
+ av += 2;
+ ac -= 2;
+ }
+ if (ac > 0)
+ fprintf (stderr, "%s: orphaned parameter type '%s', no data\n",
+ name, av[0]);
+
+ if (yamctl.cfg.mask)
+ {
+ ifr->ifr_data = (caddr_t) & yamctl;
+ yamctl.cmd = SIOCYAMSCFG;
+ *pmask = yamctl.cfg.mask;
+
+ if (ioctl (sock, SIOCDEVPRIVATE, ifr) == -1)
+ {
+ fprintf (stderr, "%s: Error %s (%i), cannot ioctl SIOCYAMSCFG on %s\n",
+ name, strerror (errno), errno, ifr->ifr_name);
+ return -1;
+ }
+ }
+
+ if (filename)
+ return set_mcs (name, ifr, sock, bitrate, filename);
+
+ return 0;
+}
+
+#define is_mask(m, n) (m & n) ? '*' : ' '
+static void get_params (char *name, struct ifreq *ifr, int sock, unsigned mask)
+{
+ char *dup;
+ struct yamdrv_ioctl_cfg yamctl;
+
+ ifr->ifr_data = (caddr_t) & yamctl;
+ yamctl.cmd = SIOCYAMGCFG;
+
+ if (ioctl (sock, SIOCDEVPRIVATE, ifr) == -1)
+ {
+ fprintf (stderr, "%s: Error %s (%i), cannot ioctl SIOCYAMGCFG on %s\n",
+ name, strerror (errno), errno, ifr->ifr_name);
+ return;
+ }
+
+ switch (yamctl.cfg.mode)
+ {
+ case 0:
+ dup = "off";
+ break;
+ case 1:
+ dup = "on";
+ break;
+ case 2:
+ dup = "on+delay";
+ break;
+ default:
+ dup = "";
+ break;
+ }
+
+ printf ("Device : %s\n", ifr->ifr_name);
+ printf ("iobase :%c%04x\n", is_mask (mask, YAM_IOBASE), yamctl.cfg.iobase);
+ printf ("bitrate :%c%u (bps)\n", is_mask (mask, YAM_BITRATE), yamctl.cfg.bitrate);
+ printf ("irq :%c%u\n", is_mask (mask, YAM_IRQ), yamctl.cfg.irq);
+ printf ("baudrate :%c%u (bps)\n", is_mask (mask, YAM_BAUDRATE), yamctl.cfg.baudrate);
+ printf ("fulldup :%c%s\n", is_mask (mask, YAM_MODE), dup);
+ if (yamctl.cfg.mode == 2)
+ printf ("holddelay :%c%-3u (sec)\n", is_mask (mask, YAM_HOLDDLY), yamctl.cfg.holddly);
+ printf ("txdelay :%c%-3u (ms)\n", is_mask (mask, YAM_TXDELAY), yamctl.cfg.txdelay);
+ printf ("txtail :%c%-3u (ms)\n", is_mask (mask, YAM_TXTAIL), yamctl.cfg.txtail);
+ printf ("slottime :%c%-3u (ms)\n", is_mask (mask, YAM_SLOTTIME), yamctl.cfg.slottime);
+ printf ("persist :%c%u\n", is_mask (mask, YAM_PERSIST), yamctl.cfg.persist);
+ printf ("\n");
+}
+
+static const char *usage_str =
+"[-h] yamif\n"
+" [iobase <iobase>] [irq <irq>] [bitrate <bitrate>] [baudrate <baudrate>]\n"
+" [duplex <mode>] [hold <delay>] [txdelay <txdelay>]\n"
+" [txtail <txtail>] [slottime <slottime>] [persist <persistence>]\n"
+" [load <bitrate> <filename.mcs>]\n"
+" yamif: the name of the yam kernel driver interface (yam0)\n"
+" -h: this help\n\n";
+
+int main (int argc, char *argv[])
+{
+ char name[256] = "yam0";
+ struct ifreq ifr;
+ int sock;
+ unsigned int mask;
+
+ printf ("\n%s: Version 0.1 (C) 1998 by Jean-Paul ROUBELAT - F6FBB\n", *argv);
+
+ if ((argc < 2) || (strcasecmp (argv[1], "-h") == 0))
+ {
+ printf ("usage: %s %s", *argv, usage_str);
+ return 1;
+ }
+
+ strcpy (name, argv[1]);
+
+ if ((sock = socket (PF_INET, SOCK_PACKET, htons (ETH_P_AX25))) < 0)
+ {
+ fprintf (stderr, "%s: Error %s (%i), cannot open %s\n",
+ argv[0], strerror (errno), errno, name);
+ return 2;
+ }
+
+ strcpy (ifr.ifr_name, name);
+ if (ioctl (sock, SIOCGIFFLAGS, &ifr) < 0)
+ {
+ fprintf (stderr, "%s: Error %s (%i), cannot ioctl %s\n",
+ argv[0], strerror (errno), errno, name);
+ close (sock);
+ return 3;
+ }
+
+ mask = 0;
+
+ if (set_params (argv[0], &ifr, sock, argc - 2, argv + 2, &mask) == -1)
+ {
+ close (sock);
+ return 4;
+ }
+
+ get_params (argv[0], &ifr, sock, mask);
+
+ close (sock);
+
+ return 0;
+}