OSDN Git Service

Initial revision
authorMax Krasnyansky <maxk@qualcomm.com>
Fri, 8 Mar 2002 21:12:35 +0000 (21:12 +0000)
committerMax Krasnyansky <maxk@qualcomm.com>
Fri, 8 Mar 2002 21:12:35 +0000 (21:12 +0000)
48 files changed:
AUTHORS [new file with mode: 0644]
COPYING [new file with mode: 0644]
ChangeLog [new file with mode: 0644]
INSTALL [new file with mode: 0644]
Makefile.am [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
NEWS [new file with mode: 0644]
README [new file with mode: 0644]
acinclude.m4 [new file with mode: 0644]
aclocal.m4 [new file with mode: 0644]
config.guess [new file with mode: 0755]
config.sub [new file with mode: 0755]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
hcid/Makefile.am [new file with mode: 0644]
hcid/Makefile.in [new file with mode: 0644]
hcid/hcid.conf [new file with mode: 0644]
hcid/hcid.h [new file with mode: 0644]
hcid/kword.c [new file with mode: 0644]
hcid/kword.h [new file with mode: 0644]
hcid/lexer.l [new file with mode: 0644]
hcid/lib.c [new file with mode: 0644]
hcid/lib.h [new file with mode: 0644]
hcid/main.c [new file with mode: 0644]
hcid/parser.y [new file with mode: 0644]
hcid/security.c [new file with mode: 0644]
install-sh [new file with mode: 0755]
missing [new file with mode: 0755]
mkinstalldirs [new file with mode: 0755]
pcmcia/Makefile.am [new file with mode: 0644]
pcmcia/Makefile.in [new file with mode: 0644]
pcmcia/bluetooth [new file with mode: 0755]
pcmcia/bluetooth.conf [new file with mode: 0644]
scripts/Makefile.am [new file with mode: 0644]
scripts/Makefile.in [new file with mode: 0644]
scripts/bluepin [new file with mode: 0755]
scripts/bluetooth.rc.rh [new file with mode: 0755]
tools/Makefile.am [new file with mode: 0644]
tools/Makefile.in [new file with mode: 0644]
tools/hciattach.8 [new file with mode: 0644]
tools/hciattach.c [new file with mode: 0644]
tools/hciconfig.c [new file with mode: 0644]
tools/hcisecfilter.c [new file with mode: 0644]
tools/hcitool.c [new file with mode: 0644]
tools/l2ping.8 [new file with mode: 0644]
tools/l2ping.c [new file with mode: 0644]
tools/l2test.c [new file with mode: 0644]
tools/scotest.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
new file mode 100644 (file)
index 0000000..08f1216
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,22 @@
+Maxim Krasnyansky <maxk@qualcomm.com>
+       Original author.
+       Primary maintainer.
+
+Ilguiz Latypov <ilatypov@superbt.com>
+       Patches. Suggestions.
+
+Jan Beutel <j.beutel@ieee.org>
+       Documentation maintainer.
+       BlueZ HowTo.
+
+Jean Tourrilhes <jt@hpl.hp.com>
+       CSR and BrainBoxes specific UART initialization.
+
+Thomas Moser <Thomas.Moser@tmoser.ch>
+       Silicon Wave UART initialization.
+
+Marcel Holtmann <marcel@rvs.uni-bielefeld.de>
+       Various patches, fixes and other contributions.
+
+Nils Faerber <nils@kernelconcepts.de>
+       Man pages.
diff --git a/COPYING b/COPYING
new file mode 100644 (file)
index 0000000..357e746
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,304 @@
+ BlueZ - Bluetooth protocol stack for Linux
+ Copyright (C) 2000-2001 Qualcomm Incorporated
+
+ Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2 as
+ published by the Free Software Foundation;
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+ IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+ OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+ RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+ USE OR PERFORMANCE OF THIS SOFTWARE.
+
+ ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+ TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+
+ -------------------------------------------------------------------------
+
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..7149ba9
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,20 @@
+ver 2.0-pre7:
+       Bluetooth utilities is now a separate package.
+
+ver 2.0-pre6:
+       Improved hcitool.
+       l2test minor output fixes.
+       hciattach opt to display list of supported devices.
+
+ver 2.0-pre2:
+       Additional HCI library functions.
+       Improved CSR baud rate initialization.
+       PCMCIA scripts fixes and enhancements.
+       Documentation update.
+       
+ver 2.0-pre1:
+       New UART initialization utility.
+       Hot plugging support for UART based PCMCIA devices.
+       SCO testing utility.
+       New authentication utility (bluepin).
+       Minor fixes and improvements.
diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/Makefile.am b/Makefile.am
new file mode 100644 (file)
index 0000000..17255ef
--- /dev/null
@@ -0,0 +1,7 @@
+#
+#  $Id$
+#
+
+EXTRA_DIST = ChangeLog README CREDITS
+
+SUBDIRS = hcid tools scripts pcmcia
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..03dcae4
--- /dev/null
@@ -0,0 +1,342 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 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.
+
+#
+#  $Id$
+#
+
+
+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 = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AWK = @AWK@
+CC = @CC@
+DISTRO = @DISTRO@
+GLIB = @GLIB@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LDFLAGS = @GLIB_LDFLAGS@
+LD = @LD@
+LEX = @LEX@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PCMCIA = @PCMCIA@
+VERSION = @VERSION@
+YACC = @YACC@
+
+EXTRA_DIST = ChangeLog README CREDITS
+
+SUBDIRS = hcid tools scripts pcmcia
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
+Makefile.in NEWS acinclude.m4 aclocal.m4 config.guess config.sub \
+configure configure.in install-sh missing mkinstalldirs
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4):  configure.in  acinclude.m4
+       cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+       $(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+       cd $(srcdir) && $(AUTOCONF)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+#     (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+@SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive  \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       target=`echo $@ | sed s/-recursive//`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           dot_seen=yes; \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done; \
+       if test "$$dot_seen" = "no"; then \
+         $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+       fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+       @set fnord $(MAKEFLAGS); amf=$$2; \
+       dot_seen=no; \
+       rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+         rev="$$subdir $$rev"; \
+         test "$$subdir" != "." || dot_seen=yes; \
+       done; \
+       test "$$dot_seen" = "no" && rev=". $$rev"; \
+       target=`echo $@ | sed s/-recursive//`; \
+       for subdir in $$rev; do \
+         echo "Making $$target in $$subdir"; \
+         if test "$$subdir" = "."; then \
+           local_target="$$target-am"; \
+         else \
+           local_target="$$target"; \
+         fi; \
+         (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+          || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+       done && test -z "$$fail"
+tags-recursive:
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+         test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+       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: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) $(LISP)
+       tags=; \
+       here=`pwd`; \
+       list='$(SUBDIRS)'; for subdir in $$list; do \
+   if test "$$subdir" = .; then :; else \
+           test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+   fi; \
+       done; \
+       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 = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration.  Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+       -rm -rf $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+       mkdir $(distdir)/=build
+       mkdir $(distdir)/=inst
+       dc_install_base=`cd $(distdir)/=inst && pwd`; \
+       cd $(distdir)/=build \
+         && ../configure --srcdir=.. --prefix=$$dc_install_base \
+         && $(MAKE) $(AM_MAKEFLAGS) \
+         && $(MAKE) $(AM_MAKEFLAGS) dvi \
+         && $(MAKE) $(AM_MAKEFLAGS) check \
+         && $(MAKE) $(AM_MAKEFLAGS) install \
+         && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+         && $(MAKE) $(AM_MAKEFLAGS) dist
+       -rm -rf $(distdir)
+       @banner="$(distdir).tar.gz is ready for distribution"; \
+       dashes=`echo "$$banner" | sed s/./=/g`; \
+       echo "$$dashes"; \
+       echo "$$banner"; \
+       echo "$$dashes"
+dist: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+dist-all: distdir
+       -chmod -R a+r $(distdir)
+       GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+       -rm -rf $(distdir)
+distdir: $(DISTFILES)
+       -rm -rf $(distdir)
+       mkdir $(distdir)
+       -chmod 777 $(distdir)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+       for subdir in $(SUBDIRS); do \
+         if test "$$subdir" = .; then :; else \
+           test -d $(distdir)/$$subdir \
+           || mkdir $(distdir)/$$subdir \
+           || exit 1; \
+           chmod 777 $(distdir)/$$subdir; \
+           (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
+             || exit 1; \
+         fi; \
+       done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+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-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am:  clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am:  distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+       -rm -f config.status
+
+maintainer-clean-am:  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-recursive
+       -rm -f config.status
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive 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-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# 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/NEWS b/NEWS
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..69bc314
--- /dev/null
+++ b/README
@@ -0,0 +1,35 @@
+BlueZ - Bluetooth protocol stack for Linux
+Copyright (C) 2000-2001 Qualcomm Incorporated
+
+Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+Bluetooth utilities
+
+1. Compilation and Installation.
+
+In order to compile Bluetooth utilies you need following software packages:
+  - Linux kernel 2.4.X source code 
+  - GCC compiler
+  - Lexical Analyzer (flex, lex)
+  - YACC (yacc, bison, byacc)
+
+To configure run:
+  ./configure
+Configure automatically searches for all required components and packages. 
+
+To compile and install run:
+  make install
+
+2.0 Information
+
+Mailing lists:
+       bluez-announce@lists.sourceforge.net - BlueZ announcements
+       bluez-users@lists.sourceforge.net    - BlueZ general questions and discussions
+       bluez-devel@lists.sourceforge.net    - BlueZ development 
+       bluez-commit@lists.sourceforge.net   - BlueZ commits to the CVS repository
+
+For additional information about the project visit BlueZ web site:
+       http://bluez.sf.net 
+Maxim Krasnyansky <maxk@qualcomm.com> 
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644 (file)
index 0000000..1dc3047
--- /dev/null
@@ -0,0 +1,99 @@
+dnl Add directory level
+AC_DEFUN( AC_ADD_DIRLEVEL,
+[
+    for i in $1; do
+       eval o=\$$i
+       o=`echo $o | sed 's#.\.\./#&../#g'`
+       eval $i=\$o     
+    done
+])
+
+dnl Test file
+AC_DEFUN( AC_TEST_FILE,
+[
+    if test -f $1; then
+       ifelse([$2], , :,[$2])
+    else
+       ifelse([$3], , :,[$3])
+    fi
+])
+
+dnl Test dir
+AC_DEFUN( AC_TEST_DIR,
+[
+    if test -d $1; then
+       ifelse([$2], , :,[$2])
+    else
+       ifelse([$3], , :,[$3])
+    fi
+])
+
+dnl Test files
+AC_DEFUN( AC_TEST_FILES,
+[
+    ac_file_found=yes
+    for f in $1; do
+       if test ! -f $2/$f; then
+          ac_file_found=no
+          break;
+       fi
+    done
+
+    if test "$ac_file_found" = "yes" ; then
+       ifelse([$3], , :,[$3])
+    else
+       ifelse([$4], , :,[$4])
+    fi
+])
+
+dnl Search for headers, add path to CPPFLAGS if found 
+AC_DEFUN( AC_SEARCH_HEADERS, 
+[
+    AC_MSG_CHECKING("for $1") 
+    ac_hdr_found=no
+    for p in $2; do
+       AC_TEST_FILES($1, $p, 
+           [ 
+              ac_hdr_found=yes
+              break
+           ]
+       )
+    done 
+    if test "$ac_hdr_found" = "yes" ; then
+       CPPFLAGS="$CPPFLAGS -I$p"
+        AC_MSG_RESULT( [($p) yes] ) 
+       ifelse([$3], , :,[$3])
+    else
+        AC_MSG_RESULT("no") 
+       ifelse([$4], , :,[$4])
+    fi
+])
+
+dnl Search for library, add path to LIBS if found 
+AC_DEFUN( AC_SEARCH_LIB, 
+[
+    AC_MSG_CHECKING("for lib$1")
+
+    ac_save_LDFLAGS=$LDFLAGS
+
+    ac_lib_found=no
+    for p in $3; do
+       LDFLAGS="-L$p -l$1"
+       AC_TRY_LINK_FUNC($2,
+           [ 
+              LIBS="$LIBS -L$p -l$1"
+              ac_lib_found=yes
+              break
+           ]
+       )
+    done 
+    if test "$ac_lib_found" = "yes" ; then
+        AC_MSG_RESULT( [($p) yes] ) 
+       ifelse([$4], , :,[$4])
+    else
+        AC_MSG_RESULT("no") 
+       ifelse([$5], , :,[$5])
+    fi
+
+    LDFLAGS=$ac_save_LDFLAGS
+])
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644 (file)
index 0000000..7b89b4b
--- /dev/null
@@ -0,0 +1,213 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4-p5
+
+dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+dnl Add directory level
+AC_DEFUN( AC_ADD_DIRLEVEL,
+[
+    for i in $1; do
+       eval o=\$$i
+       o=`echo $o | sed 's#.\.\./#&../#g'`
+       eval $i=\$o     
+    done
+])
+
+dnl Test file
+AC_DEFUN( AC_TEST_FILE,
+[
+    if test -f $1; then
+       ifelse([$2], , :,[$2])
+    else
+       ifelse([$3], , :,[$3])
+    fi
+])
+
+dnl Test dir
+AC_DEFUN( AC_TEST_DIR,
+[
+    if test -d $1; then
+       ifelse([$2], , :,[$2])
+    else
+       ifelse([$3], , :,[$3])
+    fi
+])
+
+dnl Test files
+AC_DEFUN( AC_TEST_FILES,
+[
+    ac_file_found=yes
+    for f in $1; do
+       if test ! -f $2/$f; then
+          ac_file_found=no
+          break;
+       fi
+    done
+
+    if test "$ac_file_found" = "yes" ; then
+       ifelse([$3], , :,[$3])
+    else
+       ifelse([$4], , :,[$4])
+    fi
+])
+
+dnl Search for headers, add path to CPPFLAGS if found 
+AC_DEFUN( AC_SEARCH_HEADERS, 
+[
+    AC_MSG_CHECKING("for $1") 
+    ac_hdr_found=no
+    for p in $2; do
+       AC_TEST_FILES($1, $p, 
+           [ 
+              ac_hdr_found=yes
+              break
+           ]
+       )
+    done 
+    if test "$ac_hdr_found" = "yes" ; then
+       CPPFLAGS="$CPPFLAGS -I$p"
+        AC_MSG_RESULT( [($p) yes] ) 
+       ifelse([$3], , :,[$3])
+    else
+        AC_MSG_RESULT("no") 
+       ifelse([$4], , :,[$4])
+    fi
+])
+
+dnl Search for library, add path to LIBS if found 
+AC_DEFUN( AC_SEARCH_LIB, 
+[
+    AC_MSG_CHECKING("for lib$1")
+
+    ac_save_LDFLAGS=$LDFLAGS
+
+    ac_lib_found=no
+    for p in $3; do
+       LDFLAGS="-L$p -l$1"
+       AC_TRY_LINK_FUNC($2,
+           [ 
+              LIBS="$LIBS -L$p -l$1"
+              ac_lib_found=yes
+              break
+           ]
+       )
+    done 
+    if test "$ac_lib_found" = "yes" ; then
+        AC_MSG_RESULT( [($p) yes] ) 
+       ifelse([$4], , :,[$4])
+    else
+        AC_MSG_RESULT("no") 
+       ifelse([$5], , :,[$5])
+    fi
+
+    LDFLAGS=$ac_save_LDFLAGS
+])
+
+# Do all the work for Automake.  This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "[$]*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "[$]*" != "X $srcdir/configure conftestfile" \
+      && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "[$]2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN([AM_MISSING_PROG],
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+   $1=$2
+   AC_MSG_RESULT(found)
+else
+   $1="$3/missing $2"
+   AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+
+dnl AM_PROG_LEX
+dnl Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT
+AC_DEFUN([AM_PROG_LEX],
+[missing_dir=ifelse([$1],,`cd $ac_aux_dir && pwd`,$1)
+AC_CHECK_PROGS(LEX, flex lex, "$missing_dir/missing flex")
+AC_PROG_LEX
+AC_DECL_YYTEXT])
+
diff --git a/config.guess b/config.guess
new file mode 100755 (executable)
index 0000000..2960d6e
--- /dev/null
@@ -0,0 +1,951 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
+#
+# This file 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       cat <<EOF >dummy.s
+       .globl main
+       .ent main
+main:
+       .frame \$30,0,\$26,0
+       .prologue 0
+       .long 0x47e03d80 # implver $0
+       lda \$2,259
+       .long 0x47e20c21 # amask $2,$1
+       srl \$1,8,\$2
+       sll \$2,2,\$2
+       sll \$0,3,\$0
+       addl \$1,\$0,\$0
+       addl \$2,\$0,\$0
+       ret \$31,(\$26),1
+       .end main
+EOF
+       ${CC-cc} dummy.s -o dummy 2>/dev/null
+       if test "$?" = 0 ; then
+               ./dummy
+               case "$?" in
+                       7)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       15)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       14)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       10)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       16)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+               esac
+       fi
+       rm -f dummy.s dummy
+       echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-cbm-sysv4
+       exit 0;;
+    amiga:NetBSD:*:*)
+      echo m68k-cbm-netbsd${UNAME_RELEASE}
+      exit 0 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    arc64:OpenBSD:*:*)
+       echo mips64el-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hkmips:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mips-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    arm32:NetBSD:*:*)
+       echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    SR2?01:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    Pyramid*:OSx*:*:*|MIS*:OSx*:*:*|MIS*:SMP_DC-OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    sun*:*:4.2BSD:*)
+       UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+       test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+       case "`/bin/arch`" in
+           sun3)
+               echo m68k-sun-sunos${UNAME_RELEASE}
+               ;;
+           sun4)
+               echo sparc-sun-sunos${UNAME_RELEASE}
+               ;;
+       esac
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:NetBSD:*:*)
+       echo m68k-atari-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:NetBSD:*:*)
+       echo m68k-sun-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:NetBSD:*:*)
+       echo m68k-apple-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    macppc:NetBSD:*:*)
+        echo powerpc-apple-netbsd${UNAME_RELEASE}
+        exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       sed 's/^        //' << EOF >dummy.c
+       int main (argc, argv) int argc; char **argv; {
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       ${CC-cc} dummy.c -o dummy \
+         && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm dummy.c dummy && exit 0
+       rm -f dummy.c dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+        if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+       if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+            -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+       else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+       fi
+        else echo i586-dg-dgux${UNAME_RELEASE}
+        fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               sed 's/^                //' << EOF >dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+               rm -f dummy.c dummy
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:4)
+       IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+       if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=4.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[34678]??:HP-UX:*:*)
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/6?? | 9000/7?? | 9000/80[24] | 9000/8?[13679] | 9000/892 )
+              sed 's/^              //' << EOF >dummy.c
+              #include <stdlib.h>
+              #include <unistd.h>
+              
+              int main ()
+              {
+              #if defined(_SC_KERNEL_BITS)
+                  long bits = sysconf(_SC_KERNEL_BITS);
+              #endif 
+                  long cpu  = sysconf (_SC_CPU_VERSION);
+              
+                  switch (cpu) 
+               {
+               case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+               case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+               case CPU_PA_RISC2_0: 
+              #if defined(_SC_KERNEL_BITS)
+                   switch (bits) 
+                       {
+                       case 64: puts ("hppa2.0w"); break;
+                       case 32: puts ("hppa2.0n"); break;
+                       default: puts ("hppa2.0"); break;
+                       } break;
+              #else  /* !defined(_SC_KERNEL_BITS) */
+                   puts ("hppa2.0"); break;
+              #endif 
+               default: puts ("hppa1.0"); break;
+               }
+                  exit (0);
+              }
+EOF
+       (${CC-cc} dummy.c -o dummy 2>/dev/null ) && HP_ARCH=`./dummy`
+       rm -f dummy.c dummy
+       esac
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       sed 's/^        //' << EOF >dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+       rm -f dummy.c dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i?86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY-2:*:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    F300:UNIX_System_V:*:*)
+        FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    F301:UNIX_System_V:*:*)
+       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+       exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+       echo m68k-hp-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    i?86:BSD/386:*:* | *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    *:NetBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    *:Linux:*:*)
+       # uname on the ARM produces all sorts of strangeness, and we need to
+       # filter it out.
+       case "$UNAME_MACHINE" in
+         arm* | sa110*)              UNAME_MACHINE="arm" ;;
+       esac
+
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us.
+       ld_help_string=`ld --help 2>&1`
+       ld_supported_emulations=`echo $ld_help_string \
+                        | sed -ne '/supported emulations:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported emulations: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_emulations" in
+         i?86linux)  echo "${UNAME_MACHINE}-pc-linux-gnuaout"      ; exit 0 ;;
+         i?86coff)   echo "${UNAME_MACHINE}-pc-linux-gnucoff"      ; exit 0 ;;
+         sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         armlinux)   echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         m68klinux)  echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+         elf32ppc)   echo "powerpc-unknown-linux-gnu"              ; exit 0 ;;
+       esac
+
+       if test "${UNAME_MACHINE}" = "alpha" ; then
+               sed 's/^        //'  <<EOF >dummy.s
+               .globl main
+               .ent main
+       main:
+               .frame \$30,0,\$26,0
+               .prologue 0
+               .long 0x47e03d80 # implver $0
+               lda \$2,259
+               .long 0x47e20c21 # amask $2,$1
+               srl \$1,8,\$2
+               sll \$2,2,\$2
+               sll \$0,3,\$0
+               addl \$1,\$0,\$0
+               addl \$2,\$0,\$0
+               ret \$31,(\$26),1
+               .end main
+EOF
+               LIBC=""
+               ${CC-cc} dummy.s -o dummy 2>/dev/null
+               if test "$?" = 0 ; then
+                       ./dummy
+                       case "$?" in
+                       7)
+                               UNAME_MACHINE="alpha"
+                               ;;
+                       15)
+                               UNAME_MACHINE="alphaev5"
+                               ;;
+                       14)
+                               UNAME_MACHINE="alphaev56"
+                               ;;
+                       10)
+                               UNAME_MACHINE="alphapca56"
+                               ;;
+                       16)
+                               UNAME_MACHINE="alphaev6"
+                               ;;
+                       esac    
+
+                       objdump --private-headers dummy | \
+                         grep ld.so.1 > /dev/null
+                       if test "$?" = 0 ; then
+                               LIBC="libc1"
+                       fi
+               fi      
+               rm -f dummy.s dummy
+               echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+       elif test "${UNAME_MACHINE}" = "mips" ; then
+         cat >dummy.c <<EOF
+main(argc, argv)
+     int argc;
+     char *argv[];
+{
+#ifdef __MIPSEB__
+  printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+  printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+         rm -f dummy.c dummy
+       else
+         # Either a pre-BFD a.out linker (linux-gnuoldld)
+         # or one that does not give us useful --help.
+         # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+         # If ld does not provide *any* "supported emulations:"
+         # that means it is gnuoldld.
+         echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+         test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+         case "${UNAME_MACHINE}" in
+         i?86)
+           VENDOR=pc;
+           ;;
+         *)
+           VENDOR=unknown;
+           ;;
+         esac
+         # Determine whether the default compiler is a.out or elf
+         cat >dummy.c <<EOF
+#include <features.h>
+main(argc, argv)
+     int argc;
+     char *argv[];
+{
+#ifdef __ELF__
+# ifdef __GLIBC__
+#  if __GLIBC__ >= 2
+    printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+         rm -f dummy.c dummy
+       fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i?86:DYNIX/ptx:4*:*)
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i?86:UNIX_SV:4.2MP:2.*)
+        # Unixware is an offshoot of SVR4, but it has its own version
+        # number series starting with 2...
+        # I am not positive that other SVR4 systems won't match this,
+       # I just have to hope.  -- rms.
+        # Use sysv4.2uw... so that sysv4* matches it.
+       echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+       exit 0 ;;
+    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    i?86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    i?86:UnixWare:*:*)
+       if /bin/uname -X 2>/dev/null >/dev/null ; then
+         (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+           && UNAME_MACHINE=i586
+       fi
+       echo ${UNAME_MACHINE}-unixware-${UNAME_RELEASE}-${UNAME_VERSION}
+       exit 0 ;;
+    pc:*:*:*)
+        # uname -m prints for DJGPP always 'pc', but it prints nothing about
+        # the processor, so we play safe by assuming i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i?86:LynxOS:2.*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:*:6*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.sub b/config.sub
new file mode 100755 (executable)
index 0000000..00bea6e
--- /dev/null
@@ -0,0 +1,955 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file 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., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+       echo Configuration name missing. 1>&2
+       echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+       echo "or     $0 ALIAS" 1>&2
+       echo where ALIAS is a recognized configuration type. 1>&2
+       exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+       *local*)
+               echo $1
+               exit 0
+               ;;
+       *)
+       ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  linux-gnu*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple)
+               os=
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+               | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+               | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 | hppa2.0 \
+               | alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
+               | i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
+               | mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+               | mipstx39 | mipstx39el \
+               | sparc | sparclet | sparclite | sparc64 | v850)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i[34567]86)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+             | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+             | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
+             | xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* \
+             | alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
+             | ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
+             | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+             | sparc64-* | mips64-* | mipsel-* \
+             | mips64el-* | mips64orion-* | mips64orionel-*  \
+             | mipstx39-* | mipstx39el-* \
+             | f301-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-cbm
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-cbm
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-cbm
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       cray2)
+               basic_machine=cray2-cray
+               os=-unicos
+               ;;
+       [ctj]90-cray)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i[34567]86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i[34567]86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i[34567]86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i[34567]86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       mipsel*-linux*)
+               basic_machine=mipsel-unknown
+               os=-linux-gnu
+               ;;
+       mips*-linux*)
+               basic_machine=mips-unknown
+               os=-linux-gnu
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+        pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | nexen)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | k6 | 6x86)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i786-pc
+               ;;
+       pentium-* | p5-* | k5-* | nexen-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | k6-* | 6x86-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=rs6000-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       xmp)
+               basic_machine=xmp-cray
+               os=-unicos
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       mips)
+               if [ x$os = x-linux-gnu ]; then
+                       basic_machine=mips-unknown
+               else
+                       basic_machine=mips-mips
+               fi
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sparc)
+               basic_machine=sparc-sun
+               ;;
+        cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+        pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigaos
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+        *-gould)
+               os=-sysv
+               ;;
+        *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+        *-sgi)
+               os=-irix
+               ;;
+        *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f301-fujitsu)
+               os=-uxpv
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..8b56bff
--- /dev/null
+++ b/configure
@@ -0,0 +1,2217 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_default_prefix=
+ac_help="$ac_help
+--with-bluez-libs=DIR  BlueZ libraries and header files"
+ac_help="$ac_help
+--with-glib=DIR  GLib libraries and header files"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='       '
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+
+
+
+
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+#    configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+#    same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+#    as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:586: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+  case $nonopt in
+  NONE)
+    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+    fi ;;
+  *) host_alias=$nonopt ;;
+  esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:607: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+  case $nonopt in
+  NONE) target_alias=$host_alias ;;
+  *) target_alias=$nonopt ;;
+  esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:625: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+  case $nonopt in
+  NONE) build_alias=$host_alias ;;
+  *) build_alias=$nonopt ;;
+  esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+  test "$program_prefix$program_suffix$program_transform_name" = \
+    NONENONEs,x,x, &&
+  program_prefix=${target_alias}-
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:654: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+  case $nonopt in
+  NONE)
+    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+    fi ;;
+  *) host_alias=$nonopt ;;
+  esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:687: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:740: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t $srcdir/configure conftestfile`
+   fi
+   if test "$*" != "X $srcdir/configure conftestfile" \
+      && test "$*" != "X conftestfile $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      { echo "configure: error: ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+   fi
+
+   test "$2" = conftestfile
+   )
+then
+   # Ok.
+   :
+else
+   { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+  program_transform_name=
+else
+  # Double any \ or $.  echo might interpret backslashes.
+  cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+  program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+  rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+  program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:797: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+       @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=bluez-utils
+
+VERSION=1.0
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+  { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:843: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+   ACLOCAL=aclocal
+   echo "$ac_t""found" 1>&6
+else
+   ACLOCAL="$missing_dir/missing aclocal"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:856: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+   AUTOCONF=autoconf
+   echo "$ac_t""found" 1>&6
+else
+   AUTOCONF="$missing_dir/missing autoconf"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:869: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+   AUTOMAKE=automake
+   echo "$ac_t""found" 1>&6
+else
+   AUTOMAKE="$missing_dir/missing automake"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:882: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+   AUTOHEADER=autoheader
+   echo "$ac_t""found" 1>&6
+else
+   AUTOHEADER="$missing_dir/missing autoheader"
+   echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:895: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf.  Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+   MAKEINFO=makeinfo
+   echo "$ac_t""found" 1>&6
+else
+   MAKEINFO="$missing_dir/missing makeinfo"
+   echo "$ac_t""missing" 1>&6
+fi
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:912: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:942: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+       continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:993: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1025: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1036 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1041: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1067: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1072: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1081: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1100: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+for ac_prog in gawk mawk nawk awk
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1136: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_AWK="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+AWK="$ac_cv_prog_AWK"
+if test -n "$AWK"; then
+  echo "$ac_t""$AWK" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$AWK" && break
+done
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1177: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+if test $host != $build; then
+  ac_tool_prefix=${host_alias}-
+else
+  ac_tool_prefix=
+fi
+
+# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1238: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$LD"; then
+  ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_LD="${ac_tool_prefix}ld"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+  echo "$ac_t""$LD" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_LD"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "ld", so it can be a program name with args.
+set dummy ld; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1270: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$LD"; then
+  ac_cv_prog_LD="$LD" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_LD="ld"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_LD" && ac_cv_prog_LD="ld"
+fi
+fi
+LD="$ac_cv_prog_LD"
+if test -n "$LD"; then
+  echo "$ac_t""$LD" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+  LD="ld"
+fi
+fi
+
+# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1305: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_AR="${ac_tool_prefix}ar"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+  echo "$ac_t""$AR" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+if test -z "$ac_cv_prog_AR"; then
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1337: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_AR="ar"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+  echo "$ac_t""$AR" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+  AR="ar"
+fi
+fi
+
+
+for ac_prog in 'bison -y' byacc
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1375: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_YACC="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+YACC="$ac_cv_prog_YACC"
+if test -n "$YACC"; then
+  echo "$ac_t""$YACC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1406: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1421 "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:1427: \"$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
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1438 "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:1444: \"$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
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1455 "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:1461: \"$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
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+missing_dir=`cd $ac_aux_dir && pwd`
+for ac_prog in flex lex
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1491: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$LEX"; then
+  ac_cv_prog_LEX="$LEX" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_LEX="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+LEX="$ac_cv_prog_LEX"
+if test -n "$LEX"; then
+  echo "$ac_t""$LEX" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$LEX" && break
+done
+test -n "$LEX" || LEX=""$missing_dir/missing flex""
+
+# Extract the first word of "flex", so it can be a program name with args.
+set dummy flex; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1524: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$LEX"; then
+  ac_cv_prog_LEX="$LEX" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_LEX="flex"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_LEX" && ac_cv_prog_LEX="lex"
+fi
+fi
+LEX="$ac_cv_prog_LEX"
+if test -n "$LEX"; then
+  echo "$ac_t""$LEX" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$LEXLIB"
+then
+  case "$LEX" in
+  flex*) ac_lib=fl ;;
+  *) ac_lib=l ;;
+  esac
+  echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
+echo "configure:1558: checking for yywrap in -l$ac_lib" >&5
+ac_lib_var=`echo $ac_lib'_'yywrap | 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="-l$ac_lib  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1566 "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 yywrap();
+
+int main() {
+yywrap()
+; return 0; }
+EOF
+if { (eval echo configure:1577: \"$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
+  LEXLIB="-l$ac_lib"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+echo $ac_n "checking lex output file root""... $ac_c" 1>&6
+echo "configure:1600: checking lex output file root" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  # The minimal lex program is just a single line: %%.  But some broken lexes
+# (Solaris, I think it was) want two %% lines, so accommodate them.
+echo '%%
+%%' | $LEX
+if test -f lex.yy.c; then
+  ac_cv_prog_lex_root=lex.yy
+elif test -f lexyy.c; then
+  ac_cv_prog_lex_root=lexyy
+else
+  { echo "configure: error: cannot find output from $LEX; giving up" 1>&2; exit 1; }
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_lex_root" 1>&6
+LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
+
+echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6
+echo "configure:1621: checking whether yytext is a pointer" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  # POSIX says lex can declare yytext either as a pointer or an array; the
+# default is implementation-dependent. Figure out which it is, since
+# not all implementations provide the %pointer and %array declarations.
+ac_cv_prog_lex_yytext_pointer=no
+echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $LEXLIB"
+cat > conftest.$ac_ext <<EOF
+#line 1633 "configure"
+#include "confdefs.h"
+`cat $LEX_OUTPUT_ROOT.c`
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1640: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_prog_lex_yytext_pointer=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+rm -f "${LEX_OUTPUT_ROOT}.c"
+
+fi
+
+echo "$ac_t""$ac_cv_prog_lex_yytext_pointer" 1>&6
+if test $ac_cv_prog_lex_yytext_pointer = yes; then
+  cat >> confdefs.h <<\EOF
+#define YYTEXT_POINTER 1
+EOF
+
+fi
+
+
+# Check whether --with-bluez-libs or --without-bluez-libs was given.
+if test "${with_bluez_libs+set}" = set; then
+  withval="$with_bluez_libs"
+  
+           BLUEZ_INCDIR="$withval"/include
+           BLUEZ_LIBDIR="$withval"/src/.libs
+       
+else
+  
+           BLUEZ_INCDIR='../libs/include ../bluez-libs*/include /usr/include/bluetooth'
+           BLUEZ_LIBDIR='../libs/src/.libs ../bluez-libs*/src/.libs /usr/lib'
+       
+
+fi
+
+
+
+    echo $ac_n "checking "for bluetooth.h"""... $ac_c" 1>&6
+echo "configure:1680: checking "for bluetooth.h"" >&5 
+    ac_hdr_found=no
+    for p in $BLUEZ_INCDIR; do
+       
+    ac_file_found=yes
+    for f in bluetooth.h; do
+       if test ! -f $p/$f; then
+          ac_file_found=no
+          break;
+       fi
+    done
+
+    if test "$ac_file_found" = "yes" ; then
+        
+              ac_hdr_found=yes
+              break
+           
+       
+    else
+       :
+    fi
+
+    done 
+    if test "$ac_hdr_found" = "yes" ; then
+       CPPFLAGS="$CPPFLAGS -I$p"
+        echo "$ac_t""($p) yes " 1>&6 
+       :
+    else
+        echo "$ac_t"""no"" 1>&6 
+       { echo "configure: error: Bluetooth headers not found.
+               Please install bluez-libs package." 1>&2; exit 1; }
+
+    fi
+
+
+
+    echo $ac_n "checking "for libbluetooth"""... $ac_c" 1>&6
+echo "configure:1717: checking "for libbluetooth"" >&5
+
+    ac_save_LDFLAGS=$LDFLAGS
+
+    ac_lib_found=no
+    for p in $BLUEZ_LIBDIR; do
+       LDFLAGS="-L$p -lbluetooth"
+       cat > conftest.$ac_ext <<EOF
+#line 1725 "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 hci_open_dev();
+
+int main() {
+hci_open_dev()
+; return 0; }
+EOF
+if { (eval echo configure:1736: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  LIBS="$LIBS -L$p -lbluetooth"
+              ac_lib_found=yes
+              break
+           
+       
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+    done 
+    if test "$ac_lib_found" = "yes" ; then
+        echo "$ac_t""($p) yes " 1>&6 
+       :
+    else
+        echo "$ac_t"""no"" 1>&6 
+       { echo "configure: error: Bluetooth library not found.
+               Please compile and install bluez-libs package." 1>&2; exit 1; }
+
+    fi
+
+    LDFLAGS=$ac_save_LDFLAGS
+
+
+# Check whether --with-glib or --without-glib was given.
+if test "${with_glib+set}" = set; then
+  withval="$with_glib"
+  
+           GLIB_CFLAGS="-I$withval"
+           GLIB_LDFLAGS="-L$withval/.libs -lglib"
+       
+else
+  
+           echo "$ac_t"""checking for GLib ..."" 1>&6
+            # Extract the first word of "glib-config", so it can be a program name with args.
+set dummy glib-config; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1775: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_GLIB'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$GLIB"; then
+  ac_cv_prog_GLIB="$GLIB" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_GLIB="yes"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  test -z "$ac_cv_prog_GLIB" && ac_cv_prog_GLIB="not found"
+fi
+fi
+GLIB="$ac_cv_prog_GLIB"
+if test -n "$GLIB"; then
+  echo "$ac_t""$GLIB" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+            if test "$GLIB" = "yes"; then
+               GLIB_CFLAGS="`glib-config --cflags`"
+               GLIB_LDFLAGS="`glib-config --libs`"
+           else
+               { echo "configure: error: GLib not found" 1>&2; exit 1; }
+           fi
+       
+
+fi
+
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1825: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+DISTRO=unknown
+
+if test "$cross_compiling" != yes; then
+   
+    if test -f /etc/redhat-release; then
+       DISTRO=redhat
+    else
+       :
+    fi
+
+   
+    if test -f /etc/mandrake-release; then
+       DISTRO=redhat
+    else
+       :
+    fi
+
+   
+    if test -f /etc/debian_version; then
+       DISTRO=debian
+    else
+       :
+    fi
+
+fi
+
+if test "$cross_compiling" != yes; then
+   
+    if test -d /etc/pcmcia; then
+       PCMCIA=pcmcia
+    else
+       PCMCIA=
+    fi
+
+fi
+
+
+    for i in CFLAGS CPPFLAGS LDFLAGS LIBS; do
+       eval o=\$$i
+       o=`echo $o | sed 's#.\.\./#&../#g'`
+       eval $i=\$o     
+    done
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[    `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile hcid/Makefile tools/Makefile scripts/Makefile pcmcia/Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@DISTRO@%$DISTRO%g
+s%@PCMCIA@%$PCMCIA%g
+s%@GLIB_CFLAGS@%$GLIB_CFLAGS%g
+s%@GLIB_LDFLAGS@%$GLIB_LDFLAGS%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@AWK@%$AWK%g
+s%@LD@%$LD%g
+s%@AR@%$AR%g
+s%@YACC@%$YACC%g
+s%@LEX@%$LEX%g
+s%@LEXLIB@%$LEXLIB%g
+s%@CPP@%$CPP%g
+s%@LEX_OUTPUT_ROOT@%$LEX_OUTPUT_ROOT%g
+s%@GLIB@%$GLIB%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile hcid/Makefile tools/Makefile scripts/Makefile pcmcia/Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..7bcfab7
--- /dev/null
@@ -0,0 +1,89 @@
+dnl
+dnl  $Id$
+dnl
+dnl Process this file with autoconf to produce a configure script.
+dnl
+AC_INIT()
+
+AC_SUBST(DISTRO)
+AC_SUBST(PCMCIA)
+
+AC_SUBST(GLIB_CFLAGS)
+AC_SUBST(GLIB_LDFLAGS)
+
+AC_PREFIX_DEFAULT()
+
+dnl Guess host type.
+AC_CANONICAL_SYSTEM
+AC_CANONICAL_HOST
+
+AM_INIT_AUTOMAKE(bluez-utils, 1.0)
+
+dnl Check for programs.
+AC_PROG_CC
+AC_PROG_AWK
+AC_PROG_INSTALL
+AC_CHECK_TOOL(LD, ld, ld)
+AC_CHECK_TOOL(AR, ar, ar)
+
+AC_PROG_YACC
+AM_PROG_LEX
+
+AC_ARG_WITH(bluez-libs,
+       --with-bluez-libs=DIR  BlueZ libraries and header files,
+       [
+           BLUEZ_INCDIR="$withval"/include
+           BLUEZ_LIBDIR="$withval"/src/.libs
+       ],[
+           BLUEZ_INCDIR='../libs/include ../bluez-libs*/include /usr/include/bluetooth'
+           BLUEZ_LIBDIR='../libs/src/.libs ../bluez-libs*/src/.libs /usr/lib'
+       ]
+)
+
+AC_SEARCH_HEADERS(bluetooth.h, $BLUEZ_INCDIR,,
+       AC_MSG_ERROR(Bluetooth headers not found.
+               Please install bluez-libs package.)
+)
+
+AC_SEARCH_LIB(bluetooth, hci_open_dev, $BLUEZ_LIBDIR,,
+        AC_MSG_ERROR(Bluetooth library not found.
+               Please compile and install bluez-libs package.)
+)
+
+AC_ARG_WITH(glib,
+       --with-glib=DIR  GLib libraries and header files,
+       [
+           GLIB_CFLAGS="-I$withval"
+           GLIB_LDFLAGS="-L$withval/.libs -lglib"
+       ],[
+           AC_MSG_RESULT("checking for GLib ...")
+            AC_CHECK_PROG(GLIB, glib-config, yes, [not found])
+            if test "$GLIB" = "yes"; then
+               GLIB_CFLAGS="`glib-config --cflags`"
+               GLIB_LDFLAGS="`glib-config --libs`"
+           else
+               AC_MSG_ERROR(GLib not found)
+           fi
+       ]
+)
+
+dnl Check for programs.
+AC_PROG_INSTALL
+
+dnl Check for distro type.
+DISTRO=unknown
+
+if test "$cross_compiling" != yes; then
+   AC_TEST_FILE(/etc/redhat-release,   DISTRO=redhat)
+   AC_TEST_FILE(/etc/mandrake-release, DISTRO=redhat)
+   AC_TEST_FILE(/etc/debian_version,   DISTRO=debian)
+fi
+
+dnl Check for PCMCIA 
+if test "$cross_compiling" != yes; then
+   AC_TEST_DIR(/etc/pcmcia, PCMCIA=pcmcia, PCMCIA=)
+fi
+
+AC_ADD_DIRLEVEL(CFLAGS CPPFLAGS LDFLAGS LIBS)
+
+AC_OUTPUT(Makefile hcid/Makefile tools/Makefile scripts/Makefile pcmcia/Makefile)
diff --git a/hcid/Makefile.am b/hcid/Makefile.am
new file mode 100644 (file)
index 0000000..edc4f65
--- /dev/null
@@ -0,0 +1,28 @@
+#
+#  $Id$
+#
+
+sbin_PROGRAMS = hcid
+
+hcid_SOURCES = main.c security.c hcid.h lib.c lib.h parser.y lexer.l kword.c
+hcid_LDADD   = @GLIB_LDFLAGS@
+
+CFLAGS += @GLIB_CFLAGS@
+YFLAGS += -d
+
+CLEANFILES = lexer.c parser.c parser.h
+
+confdir   = $(prefix)/etc/bluetooth
+conf_FILE = $(confdir)/hcid.conf
+pin_FILE  = $(confdir)/pin
+
+#
+# Install configuration files
+# 
+install-data-local:
+       $(mkinstalldirs) $(DESTDIR)$(confdir)
+       [ -f $(DESTDIR)$(conf_FILE) ] || \
+               $(INSTALL_DATA) $(srcdir)/hcid.conf $(DESTDIR)$(conf_FILE)
+       [ -f $(DESTDIR)$(pin_FILE) ]  || \
+               echo "BlueZ" > $(DESTDIR)$(pin_FILE); \
+               chmod 600 $(DESTDIR)$(pin_FILE)
diff --git a/hcid/Makefile.in b/hcid/Makefile.in
new file mode 100644 (file)
index 0000000..037379a
--- /dev/null
@@ -0,0 +1,362 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 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.
+
+#
+#  $Id$
+#
+
+
+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 = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AWK = @AWK@
+CC = @CC@
+DISTRO = @DISTRO@
+GLIB = @GLIB@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LDFLAGS = @GLIB_LDFLAGS@
+LD = @LD@
+LEX = @LEX@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PCMCIA = @PCMCIA@
+VERSION = @VERSION@
+YACC = @YACC@
+
+sbin_PROGRAMS = hcid
+
+hcid_SOURCES = main.c security.c hcid.h lib.c lib.h parser.y lexer.l kword.c
+hcid_LDADD = @GLIB_LDFLAGS@
+
+CFLAGS =  @GLIB_CFLAGS@
+YFLAGS =  -d
+
+CLEANFILES = lexer.c parser.c parser.h
+
+confdir = $(prefix)/etc/bluetooth
+conf_FILE = $(confdir)/hcid.conf
+pin_FILE = $(confdir)/pin
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+PROGRAMS =  $(sbin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+hcid_OBJECTS =  main.o security.o lib.o parser.o lexer.o kword.o
+hcid_DEPENDENCIES = 
+hcid_LDFLAGS = 
+LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
+LEXLIB = @LEXLIB@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  Makefile.am Makefile.in lexer.c parser.c
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+DEP_FILES =  .deps/kword.P .deps/lexer.P .deps/lib.P .deps/main.P \
+.deps/parser.P .deps/security.P
+SOURCES = $(hcid_SOURCES)
+OBJECTS = $(hcid_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .l .o .s .y
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu hcid/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       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
+
+.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:
+
+hcid: $(hcid_OBJECTS) $(hcid_DEPENDENCIES)
+       @rm -f hcid
+       $(LINK) $(hcid_LDFLAGS) $(hcid_OBJECTS) $(hcid_LDADD) $(LIBS)
+.l.c:
+       $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@
+.y.c:
+       $(YACC) $(AM_YFLAGS) $(YFLAGS) $< && mv y.tab.c $*.c
+       if test -f y.tab.h; then \
+       if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \
+       else :; fi
+parser.h: parser.c
+
+
+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 = hcid
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu hcid/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+       -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+       @echo '$(COMPILE) -c $<'; \
+       $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.c
+       @echo '$(LTCOMPILE) -c $<'; \
+       $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+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-data-local
+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: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(sbindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+       -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+       -rm -f Makefile $(CONFIG_CLEAN_FILES)
+       -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+       -test -z "lexerlparserhparserc" || rm -f lexerl parserh parserc
+mostlyclean-am:  mostlyclean-sbinPROGRAMS mostlyclean-compile \
+               mostlyclean-tags mostlyclean-depend mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-sbinPROGRAMS clean-compile clean-tags clean-depend \
+               clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-sbinPROGRAMS distclean-compile distclean-tags \
+               distclean-depend distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-sbinPROGRAMS \
+               maintainer-clean-compile maintainer-clean-tags \
+               maintainer-clean-depend 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 tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir \
+mostlyclean-depend distclean-depend clean-depend \
+maintainer-clean-depend info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local 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 configuration files
+# 
+install-data-local:
+       $(mkinstalldirs) $(DESTDIR)$(confdir)
+       [ -f $(DESTDIR)$(conf_FILE) ] || \
+               $(INSTALL_DATA) $(srcdir)/hcid.conf $(DESTDIR)$(conf_FILE)
+       [ -f $(DESTDIR)$(pin_FILE) ]  || \
+               echo "BlueZ" > $(DESTDIR)$(pin_FILE); \
+               chmod 600 $(DESTDIR)$(pin_FILE)
+
+# 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/hcid/hcid.conf b/hcid/hcid.conf
new file mode 100644 (file)
index 0000000..cfd06e5
--- /dev/null
@@ -0,0 +1,63 @@
+#
+# HCI daemon configuration file.
+#
+# $Id$
+#
+
+# HCId options
+options {
+       # Automaticaly initialize new devices
+       autoinit yes;
+
+       # Security Manager mode
+       #   none - Security manager disabled
+       #   auto - Use local PIN for incomming connections
+       #   user - Always ask user for a PIN
+       #
+       security auto;
+
+       # PIN helper
+       pin_helper /bin/bluepin;
+}
+
+# Default settings for HCI devices
+device {
+       # Local device name
+       #   %d - device id
+       #   %h - host name
+       name "BlueZ (%d)";
+
+       # Local device class
+       class 0x100;
+
+       # Default packet type
+       pkt_type DH1,DM1,HV1;
+
+       # Inquiry and Page scan
+       iscan enable; pscan enable;
+
+       # Default link mode
+       #   none   - no specific policy 
+       #   accept - always accept incomming connections
+       #   master - become master on incomming connections,
+       #            deny role switch on outgoint connections
+       #
+       #lm accept,master;
+       #
+       lm accept;
+
+       # Default link policy
+       #   none    - no specific policy
+       #   rswitch - allow role switch
+       #   hold    - allow hold mode
+       #   sniff   - allow sniff mode
+       #   park    - allow park mode
+       #
+       #lp hold,sniff;
+       #
+       lp hold,sniff,park;
+
+       # Authentication and Encryption
+       #auth enable;
+       #encrypt enable;
+}
diff --git a/hcid/hcid.h b/hcid/hcid.h
new file mode 100644 (file)
index 0000000..677a02d
--- /dev/null
@@ -0,0 +1,92 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+/*
+ * $Id$
+ */
+
+#include <sys/types.h>
+
+#include <glib.h>
+
+#include <bluetooth.h>
+
+#define HCID_CONFIG_FILE "/etc/bluetooth/hcid.conf"
+#define HCID_PIN_FILE    "/etc/bluetooth/pin"
+#define HCID_KEY_FILE    "/etc/bluetooth/link_key"
+#define HCID_PIN_HELPER  "/bin/bluepin"
+#define HCID_KEY_NUM     20
+#define HCID_KEY_TTL     172800 /* 2 days */
+
+struct device_opts {
+       char  *name;
+       uint32_t class;
+       uint16_t pkt_type;
+       uint16_t scan;
+       uint16_t link_mode;
+       uint16_t link_policy;
+       uint16_t auth;
+       uint16_t encrypt;
+};   
+extern struct device_opts devi;
+
+struct link_key {
+       bdaddr_t sba;
+       bdaddr_t dba;
+       uint8_t  key[16];
+       uint8_t  type;
+       time_t   time;
+};
+
+struct hcid_opts {
+       char  *host_name;
+       int    auto_init;
+       int    security;
+
+       char  *config_file;
+
+       uint8_t   pin_code[16];
+       int    pin_len;
+       char  *pin_helper;
+       char  *pin_file;
+
+       struct link_key **link_key;
+       int    key_num;
+       char  *key_file;
+
+       int    sock;
+};
+extern struct hcid_opts hcid;
+
+#define HCID_SEC_NONE  0
+#define HCID_SEC_AUTO  1
+#define HCID_SEC_USER  2
+
+int read_config(char *file);
+
+gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, gpointer data);
+gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer data);
+
+void start_security_manager(int hdev);
+void stop_security_manager(int hdev);
+void save_link_keys(void);
+void flush_link_keys(void);
diff --git a/hcid/kword.c b/hcid/kword.c
new file mode 100644 (file)
index 0000000..a496591
--- /dev/null
@@ -0,0 +1,75 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+/*
+ * $Id$
+ */ 
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "hcid.h"
+#include "kword.h"
+#include "parser.h"
+
+struct kword cfg_keyword[] = {
+   { "options",  K_OPTIONS     }, 
+   { "default",  K_DEVICE      }, 
+   { "device",   K_DEVICE      }, 
+   { "autoinit", K_AUTOINIT    }, 
+   { "security", K_SECURITY    }, 
+   { "pkt_type", K_PTYPE       }, 
+   { "lm",      K_LM           }, 
+   { "lp",      K_LP           }, 
+   { "iscan",   K_ISCAN        }, 
+   { "pscan",   K_PSCAN        }, 
+   { "name",     K_NAME                }, 
+   { "class",    K_CLASS       }, 
+   { "auth",    K_AUTH         },
+   { "encrypt",  K_ENCRYPT     },
+   { "pin_helper",  K_PINHELP  },
+
+   { "yes",      K_YES         },
+   { "no",       K_NO          },
+   { "enable",  K_YES          },
+   { "disable",         K_NO           },
+   { NULL , 0 }
+};
+
+struct kword sec_param[] = {
+   { "none",    HCID_SEC_NONE  },
+   { "auto",    HCID_SEC_AUTO  },
+   { "user",    HCID_SEC_USER  },
+   { NULL , 0 }
+};
+
+int lineno;
+
+int find_keyword(struct kword *kw, char *str)
+{
+    while( kw->str ){
+       if( !strcmp(str,kw->str) )
+          return kw->type;
+       kw++;
+    }
+    return -1;
+}
diff --git a/hcid/kword.h b/hcid/kword.h
new file mode 100644 (file)
index 0000000..854c91d
--- /dev/null
@@ -0,0 +1,36 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+/*
+ * $Id$
+ */ 
+
+struct kword {
+   char *str;
+   int  type;
+};
+extern int lineno;
+
+extern struct kword cfg_keyword[]; 
+extern struct kword sec_param[];
+
+int find_keyword(struct kword *kw, char *str);
diff --git a/hcid/lexer.l b/hcid/lexer.l
new file mode 100644 (file)
index 0000000..a7af9c6
--- /dev/null
@@ -0,0 +1,129 @@
+%{
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id$
+ */ 
+
+#include <string.h>
+
+#include "hcid.h"
+#include "kword.h"
+#include "parser.h"
+
+static char str_buf[255];
+
+#define ECHO {;}
+#define YY_DECL int yylex(void)
+
+int cfg_error(const char *ftm, ...);
+int yyerror(char *str);
+
+%}
+
+hex            0x[0-9a-zA-Z]+
+num            [0-9]+
+kword          [A-Za-z0-9\_\-]+        
+word           [A-Za-z0-9\-\_+=\!\$\#\%\&\*\^\@@\\\~\.]+
+wordnm         {word}:{num}
+list           ({word}\,*)+
+comment                \#.*\n
+fname          [A-Za-z0-9\_\.\-]+      
+path           (\/{fname})+
+string         \".*\"
+
+%x OPTION PARAM  
+
+%%
+[ \t] {
+       /* Skip spaces and tabs */
+       ;
+}
+
+{comment} {
+       /* Skip comments */
+       lineno++; 
+}
+
+\n {
+       lineno++;
+}
+
+{hex} {
+       yylval.num = strtol(yytext, NULL, 16);
+       return NUM;
+}
+
+{num} {
+       yylval.num = atoi(yytext);
+       return NUM;
+}
+
+{kword}        {
+       int kw = find_keyword(cfg_keyword, yytext);
+       if( kw != -1 )  
+               return kw;
+
+       yylval.str = yytext;
+       return WORD;
+}
+
+{word} {
+       yylval.str = yytext;
+       return WORD;
+}
+
+{string} {
+       if(yyleng > sizeof(str_buf)-1){
+               yyerror("string too long");
+               return 0;
+       }
+
+       strncpy(str_buf, yytext+1, yyleng-2);
+       str_buf[yyleng-2] = '\0';
+
+       yylval.str = str_buf;
+       return STRING;
+}
+
+{list} {
+       yylval.str = yytext;
+       return LIST;
+}
+
+{path} {
+       yylval.str = yytext;
+       return PATH;
+}
+
+. {
+       return *yytext;
+}
+
+%%
+
+int yywrap(void) 
+{
+       return 1;
+}
diff --git a/hcid/lib.c b/hcid/lib.c
new file mode 100644 (file)
index 0000000..ac47603
--- /dev/null
@@ -0,0 +1,171 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+/*
+ * $Id$
+ */ 
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <signal.h>
+
+#include "hcid.h"
+#include "lib.h"
+
+volatile sig_atomic_t __io_canceled;
+
+/* 
+ * Device name expansion 
+ *     %d - device id
+ */
+char * expand_name(char *dst, char *str, int dev_id)
+{
+       register int sp, np, olen;
+       char *opt, buf[10];
+
+       if (!str && !dst)
+               return NULL;
+
+       sp = np = 0;
+       while (str[sp]) {
+               switch (str[sp]) {
+               case '%':
+                       opt = NULL;
+
+                       switch (str[sp+1]) {
+                       case 'd':
+                               sprintf(buf, "%d", dev_id);
+                               opt = buf;
+                               break;
+
+                       case 'h':
+                               opt = hcid.host_name;
+                               break;
+                       
+                       case '%':
+                               dst[np++] = str[sp++];
+                               /* fall through */
+                       default:
+                               sp++;
+                               continue;
+                       }
+
+                       if (opt) {
+                               /* substitute */
+                               olen = strlen(opt);
+                               memcpy(dst + np, opt, olen);
+                               np += olen;
+                       }
+                       sp += 2;
+                       continue;
+
+               case '\\':
+                       sp++;
+                       /* fall through */
+               default:
+                       dst[np++] = str[sp++];
+                       break;
+               }
+    }
+    dst[np] = '\0';
+    return dst;
+}
+
+/* Returns current host name */
+char * get_host_name(void)
+{
+       char name[40];
+
+       if (!gethostname(name, sizeof(name)-1)) {
+               name[sizeof(name)-1] = 0;
+               return strdup(name);
+       } 
+       return strdup("noname");
+}
+
+/* Functions to manipulate program title */
+extern char **environ;
+char   *title_start;   /* start of the proc title space */
+char   *title_end;     /* end of the proc title space */
+int    title_size;
+
+void init_title(int argc, char *argv[], char *envp[], const char *name)
+{
+       int i;
+
+       /*
+        *  Move the environment so settitle can use the space at
+        *  the top of memory.
+        */
+
+       for (i = 0; envp[i]; i++);
+
+       environ = (char **) malloc(sizeof (char *) * (i + 1));
+
+       for (i = 0; envp[i]; i++)
+               environ[i] = strdup(envp[i]);
+       environ[i] = NULL;
+
+       /*
+        *  Save start and extent of argv for set_title.
+        */
+
+       title_start = argv[0];
+
+       /*
+        *  Determine how much space we can use for set_title.  
+        *  Use all contiguous argv and envp pointers starting at argv[0]
+                */
+       for (i=0; i<argc; i++)
+               if (!i || title_end == argv[i])
+                       title_end = argv[i] + strlen(argv[i]) + 1;
+
+       for (i=0; envp[i]; i++)
+               if (title_end == envp[i])
+                       title_end = envp[i] + strlen(envp[i]) + 1;
+
+       strcpy(title_start, name);
+       title_start += strlen(name);
+       title_size = title_end - title_start;
+}
+
+void set_title(const char *fmt, ...)
+{
+       char buf[255];
+       va_list ap;
+
+       memset(title_start,0,title_size);
+
+       /* print the argument string */
+       va_start(ap, fmt);
+       vsprintf(buf, fmt, ap);
+       va_end(ap);
+
+       if (strlen(buf) > title_size - 1)
+               buf[title_size - 1] = '\0';
+
+       strcat(title_start, buf);
+}
diff --git a/hcid/lib.h b/hcid/lib.h
new file mode 100644 (file)
index 0000000..4683c0f
--- /dev/null
@@ -0,0 +1,85 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+/*
+ * $Id$
+ */
+
+#include <errno.h>
+
+char * expand_name(char *dst, char *str, int dev_id);
+
+char * get_host_name(void);
+
+void init_title(int argc, char *argv[], char *env[], const char *name);
+void set_title(const char *ftm, ...);
+
+/* IO cancelation */
+extern volatile sig_atomic_t __io_canceled;
+
+static inline void io_init(void)
+{
+       __io_canceled = 0;
+}
+
+static inline void io_cancel(void)
+{
+       __io_canceled = 1;
+}
+
+/* Read exactly len bytes (Signal safe)*/
+static inline int read_n(int fd, void *buf, int len)
+{
+       register int t=0, w;
+
+       while (!__io_canceled && len > 0) {
+         if( (w = read(fd, buf, len)) < 0 ){
+            if( errno == EINTR || errno == EAGAIN )
+               continue;
+            return -1;
+         }
+         if( !w )
+            return 0;
+         len -= w; buf += w; t += w;
+       }
+
+       return t;
+}   
+
+/* Write exactly len bytes (Signal safe)*/
+static inline int write_n(int fd, void *buf, int len)
+{
+       register int t=0, w;
+
+       while (!__io_canceled && len > 0) {
+         if( (w = write(fd, buf, len)) < 0 ){
+            if( errno == EINTR || errno == EAGAIN )
+                continue;
+            return -1;
+         }
+         if( !w )
+            return 0;
+         len -= w; buf += w; t += w;
+       }
+
+       return t;
+}
diff --git a/hcid/main.c b/hcid/main.c
new file mode 100644 (file)
index 0000000..5b3c3d3
--- /dev/null
@@ -0,0 +1,430 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <syslog.h>
+#include <errno.h>
+#include <time.h>
+#include <fcntl.h>
+
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <asm/types.h>
+
+#include <bluetooth.h>
+#include <hci.h>
+#include <hci_lib.h>
+
+#include <glib.h>
+
+#include "hcid.h"
+#include "lib.h"
+
+#define VERSION "1.1"
+
+struct hcid_opts hcid;
+struct device_opts devi;
+
+static GMainLoop *event_loop;
+
+gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, gpointer data);
+gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer data);
+
+static void usage(void)
+{
+       printf("hcid - HCI daemon ver %s\n", VERSION);
+       printf("Usage: \n");
+       printf("\thcid [-n not_daemon] [-f config file]\n");
+}
+
+static void init_device(int hdev)
+{
+       struct hci_dev_req dr;
+       int s;
+
+       /* Do initialization in the separate process */
+       switch (fork()) {
+               case 0:
+                       break;
+               case -1:
+                       syslog(LOG_ERR, "Fork failed. Can't init device hci%d. %s(%d)\n", 
+                                       hdev, strerror(errno), errno);
+               default:
+                       return;
+       }
+
+       set_title("hci%d init", hdev);
+
+       if ((s = hci_open_dev(hdev)) < 0) {
+               syslog(LOG_ERR, "Can't open device hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+
+       /* Start HCI device */
+       if (ioctl(s, HCIDEVUP, hdev) < 0 && errno != EALREADY) {
+               syslog(LOG_ERR, "Can't init device hci%d. %s(%d)\n", hdev, 
+                               strerror(errno), errno);
+               exit(1);
+       }
+
+       dr.dev_id  = hdev;
+
+       /* Set packet type */
+       if (devi.pkt_type) {
+               dr.dev_opt = devi.pkt_type;
+               if (ioctl(s, HCISETPTYPE, (unsigned long)&dr) < 0) {
+                       syslog(LOG_ERR, "Can't set packet type on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+               }
+       }
+
+       /* Set link mode */
+       if (devi.link_mode) {
+               dr.dev_opt = devi.link_mode;
+               if (ioctl(s, HCISETLINKMODE, (unsigned long)&dr) < 0) {
+                       syslog(LOG_ERR, "Can't set link mode on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+               }
+       }
+
+       /* Set link policy */
+       if (devi.link_policy) {
+               dr.dev_opt = devi.link_policy;
+               if (ioctl(s, HCISETLINKPOL, (unsigned long)&dr) < 0) {
+                       syslog(LOG_ERR, "Can't set link policy on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+               }
+       }
+
+       /* Set scan mode */
+       dr.dev_opt = devi.scan;
+       if (ioctl(s, HCISETSCAN, (unsigned long)&dr) < 0) {
+               syslog(LOG_ERR, "Can't set scan mode on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+       }
+
+       /* Set authentication */
+       if (devi.auth)
+               dr.dev_opt = AUTH_ENABLED;
+       else
+               dr.dev_opt = AUTH_DISABLED;
+
+       if (ioctl(s, HCISETAUTH, (unsigned long)&dr) < 0) {
+               syslog(LOG_ERR, "Can't set auth on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+       }
+
+       /* Set encryption */
+       if (devi.encrypt)
+               dr.dev_opt = ENCRYPT_P2P;
+       else
+               dr.dev_opt = ENCRYPT_DISABLED;
+
+       if (ioctl(s, HCISETENCRYPT, (unsigned long)&dr) < 0) {
+               syslog(LOG_ERR, "Can't set encrypt on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+       }
+
+        /* Set device class */
+       if (devi.class) {
+               uint32_t class = htobl(devi.class);
+               write_class_of_dev_cp cp;
+                
+               memcpy(cp.dev_class, &class, 3);
+               hci_send_cmd(s, OGF_HOST_CTL, OCF_WRITE_CLASS_OF_DEV,
+                       WRITE_CLASS_OF_DEV_CP_SIZE, (void *) &cp);
+       }
+
+       /* Set device name */
+       if (devi.name) {
+               change_local_name_cp cp;
+               expand_name(cp.name, devi.name, hdev);
+
+               hci_send_cmd(s, OGF_HOST_CTL, OCF_CHANGE_LOCAL_NAME,
+                       CHANGE_LOCAL_NAME_CP_SIZE, (void *) &cp);
+       }
+
+       exit(0);
+}
+
+static void init_all_devices(int ctl)
+{
+       struct hci_dev_list_req *dl;
+       struct hci_dev_req *dr;
+       int i;
+
+       if (!(dl = malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t)))) {
+               syslog(LOG_INFO, "Can't allocate devlist buffer. %s(%d)", 
+                       strerror(errno), errno);
+               exit(1);
+       }
+       dl->dev_num = HCI_MAX_DEV;
+       dr = dl->dev_req;
+
+       if (ioctl(ctl, HCIGETDEVLIST, (void*)dl)) {
+               syslog(LOG_INFO, "Can't get device list. %s(%d)", 
+                       strerror(errno), errno);
+               exit(1);
+       }
+
+       for (i=0; i < dl->dev_num; i++, dr++) {
+               if (hcid.auto_init)
+                       init_device(dr->dev_id);
+
+               if (hcid.security && (dr->dev_opt & (1<<HCI_UP)))
+                       start_security_manager(dr->dev_id);
+       }
+       
+       free(dl);
+}
+
+static void init_defaults(void)
+{
+       hcid.auto_init = 0;
+       hcid.security  = 0;
+
+       devi.pkt_type = 0;
+       devi.scan = SCAN_PAGE | SCAN_INQUIRY;
+       devi.auth = 0;
+       devi.encrypt = 0;
+}
+
+static void sig_usr1(int sig)
+{
+       syslog(LOG_INFO, "Flushing link keys");
+       flush_link_keys();
+}
+
+static void sig_term(int sig)
+{
+       syslog(LOG_INFO, "Terminating");
+       g_main_quit(event_loop);
+       save_link_keys();
+}
+
+static void sig_hup(int sig)
+{
+       syslog(LOG_INFO, "Reloading config file");
+       init_defaults();
+       if (read_config(hcid.config_file) < 0)
+               syslog(LOG_ERR, "Config reload failed");
+
+       init_all_devices(hcid.sock);
+}
+
+static inline void device_event(GIOChannel *chan, evt_stack_internal *si)
+{
+       evt_si_device *sd = (void *) &si->data;
+
+       switch (sd->event) {
+       case HCI_DEV_REG:
+               syslog(LOG_INFO, "HCI dev %d registered", sd->dev_id);
+               if (hcid.auto_init)
+                       init_device(sd->dev_id);
+               break;
+
+       case HCI_DEV_UNREG:
+               syslog(LOG_INFO, "HCI dev %d unregistered", sd->dev_id);
+               break;
+
+       case HCI_DEV_UP:
+               syslog(LOG_INFO, "HCI dev %d up", sd->dev_id);
+               if (hcid.security)
+                       start_security_manager(sd->dev_id);
+               break;
+
+       case HCI_DEV_DOWN:
+               syslog(LOG_INFO, "HCI dev %d down", sd->dev_id);
+               if (hcid.security)
+                       stop_security_manager(sd->dev_id);
+               break;
+       }
+}
+
+gboolean io_stack_event(GIOChannel *chan, GIOCondition cond, gpointer data)
+{
+       char buf[HCI_MAX_FRAME_SIZE], *ptr;
+       evt_stack_internal *si;
+       hci_event_hdr *eh;
+       int  len, type;
+       GIOError err;
+
+       ptr = buf;
+
+       if ((err = g_io_channel_read(chan, buf, sizeof(buf), &len))) {
+               if (err == G_IO_ERROR_AGAIN)
+                       return TRUE;
+
+               syslog(LOG_ERR, "Read from control socket failed. %s(%d)", 
+                               strerror(errno), errno);
+               g_main_quit(event_loop);
+               return FALSE;
+       }
+
+       type = *ptr++;
+
+       if (type != HCI_EVENT_PKT)
+               return TRUE;
+
+       eh = (hci_event_hdr *) ptr;
+       if (eh->evt != EVT_STACK_INTERNAL)
+               return TRUE;
+
+       ptr += HCI_EVENT_HDR_SIZE;
+
+       si = (evt_stack_internal *) ptr;
+       switch (si->type) {
+       case EVT_SI_DEVICE:
+               device_event(chan, si);
+               break;
+       }
+
+       return TRUE;
+}
+
+extern int optind,opterr,optopt;
+extern char *optarg;
+
+int main(int argc, char *argv[], char *env[])
+{
+       int daemon, dofork, opt, fd;
+       struct sockaddr_hci addr;
+       struct hci_filter flt;
+       struct sigaction sa;
+       GIOChannel *ctl_io;
+
+       daemon = 1; dofork = 1;
+
+       /* Default HCId settings */
+       hcid.config_file = HCID_CONFIG_FILE;
+       hcid.host_name = get_host_name();
+
+       hcid.pin_file   = strdup(HCID_PIN_FILE);
+       hcid.pin_helper = strdup(HCID_PIN_HELPER);
+       hcid.key_file   = strdup(HCID_KEY_FILE);
+       hcid.key_num    = HCID_KEY_NUM;
+
+       init_defaults();
+       
+       while ((opt=getopt(argc,argv,"f:n")) != EOF) {
+               switch(opt) {
+                       case 'n':
+                               daemon = 0;
+                               break;
+
+                       case 'f':
+                               hcid.config_file = strdup(optarg);
+                               break;
+
+                       default:
+                               usage();
+                               exit(1);
+               }
+       }
+
+       if (daemon) {
+               if (dofork && fork())
+                       exit(0);
+
+               /* Direct stdin,stdout,stderr to '/dev/null' */
+               fd = open("/dev/null", O_RDWR);
+               dup2(fd, 0); dup2(fd, 1); dup2(fd, 2);
+               close(fd);
+
+               setsid();
+
+               chdir("/");
+       }
+
+        init_title(argc, argv, env, "hcid: ");
+       set_title("initializing");
+
+       /* Start logging to syslog and stderr */
+       openlog("hcid", LOG_PID | LOG_NDELAY | LOG_PERROR, LOG_DAEMON);
+       syslog(LOG_INFO, "HCI daemon ver %s started", VERSION);
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_flags = SA_NOCLDSTOP;
+       sa.sa_handler = sig_term;
+       sigaction(SIGTERM, &sa, NULL);
+       sigaction(SIGINT,  &sa, NULL);
+       sa.sa_handler = sig_hup;
+       sigaction(SIGHUP, &sa, NULL);
+       sa.sa_handler = sig_usr1;
+       sigaction(SIGUSR1, &sa, NULL);
+
+       sa.sa_handler = SIG_IGN;
+       sigaction(SIGCHLD, &sa, NULL);
+       sigaction(SIGPIPE, &sa, NULL);
+
+       /* Create and bind HCI socket */
+       if ((hcid.sock = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) {
+               syslog(LOG_ERR, "Can't open HCI socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       /* Set filter */
+       hci_filter_clear(&flt);
+       hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
+       hci_filter_set_event(EVT_STACK_INTERNAL, &flt);
+       if (setsockopt(hcid.sock, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
+               syslog(LOG_ERR, "Can't set filter. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       addr.hci_family = AF_BLUETOOTH;
+       addr.hci_dev = HCI_DEV_NONE;
+       if (bind(hcid.sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+               syslog(LOG_ERR, "Can't bind HCI socket. %s(%d)\n", strerror(errno), errno);
+               exit(1);
+       }
+
+       if (read_config(hcid.config_file) < 0)
+               syslog(LOG_ERR, "Config load failed");
+
+       /* Create event loop */
+       event_loop = g_main_new(FALSE);
+
+       /* Initialize already connected devices */
+       init_all_devices(hcid.sock);
+
+       set_title("processing events");
+
+       ctl_io = g_io_channel_unix_new(hcid.sock);
+       g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL);
+
+       /* Start event processor */
+       g_main_run(event_loop);
+
+       syslog(LOG_INFO, "Exit.");
+       return 0;
+}
diff --git a/hcid/parser.y b/hcid/parser.y
new file mode 100644 (file)
index 0000000..e8be6c9
--- /dev/null
@@ -0,0 +1,272 @@
+%{
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id$
+ */ 
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
+#include <stdarg.h>
+
+#include <sys/socket.h>
+#include <asm/types.h>
+
+#include <bluetooth.h>
+#include <hci.h>
+#include <hci_lib.h>
+
+#include "hcid.h"
+#include "kword.h"
+
+int cfg_error(const char *fmt, ...);
+
+int yyparse(void);
+int yylex(void);       
+int yyerror(char *s); 
+
+%}
+
+%union {
+       char *str;
+       long  num;
+}
+
+%token K_OPTIONS K_DEVICE
+%token K_AUTOINIT K_SECURITY
+%token K_PTYPE K_NAME K_CLASS K_LM K_LP K_AUTH K_ENCRYPT K_ISCAN K_PSCAN
+%token K_PINHELP
+%token K_YES K_NO
+
+%token <str> WORD PATH STRING LIST
+%token <num> NUM
+
+%type  <num> bool pkt_type link_mode link_policy sec_mode
+%type  <str> dev_name
+
+%%
+config: statement | config statement;
+statement: 
+  K_OPTIONS hcid_options
+  | K_DEVICE device_options
+
+  | WORD       {
+                       cfg_error("Invalid statement '%s'", $1);
+               }
+  | error      {
+                       yyclearin; yyerrok;
+               }
+  ;
+
+hcid_options: '{' hcid_opts '}'
+hcid_opts: | hcid_opt ';' | error ';' | hcid_opts hcid_opt ';';
+hcid_opt: 
+  K_AUTOINIT bool      {
+                               hcid.auto_init = $2;
+                       }
+
+  | K_SECURITY sec_mode        {
+                               hcid.security = $2;
+                       }
+
+  | K_PINHELP  PATH    {
+                               if (hcid.pin_helper)
+                                       free(hcid.pin_helper);
+                               hcid.pin_helper = strdup($2);
+                       }
+
+  | WORD               {
+                               cfg_error("Unknown option '%s'", $1);
+                       }
+  ;
+
+sec_mode:
+   WORD                {       
+                       int opt = find_keyword(sec_param, $1);
+                       if (opt < 0) {
+                               cfg_error("Unknown security mode '%s'", $1);
+                               $$ = 0;
+                       } else
+                               $$ = opt;
+               }
+
+  | K_NO       {       $$ = HCID_SEC_NONE;     }
+  ;
+
+device_options: '{' device_opts '}'
+device_opts: | device_opt ';' | error ';' | device_opts device_opt ';';
+device_opt:
+  K_PTYPE pkt_type     {
+                               devi.pkt_type = $2;
+                       }
+
+  | K_LM link_mode     {
+                               devi.link_mode = $2;
+                       }
+
+  | K_LP link_policy   {
+                               devi.link_policy = $2;
+                       }
+
+  | K_NAME dev_name    {  
+                               if (devi.name)
+                                       free(devi.name);
+                               devi.name = $2;
+                       }
+
+  | K_CLASS NUM                {
+                               devi.class = $2;
+                       }
+
+  | K_AUTH bool                {
+                               devi.auth = $2;
+                       }
+
+  | K_ENCRYPT bool     {
+                               devi.encrypt = $2;
+                       }
+
+  | K_ISCAN bool       {
+                               if ($2)
+                                       devi.scan |=  SCAN_INQUIRY;
+                               else
+                                       devi.scan &= ~SCAN_INQUIRY;
+                       }
+
+  | K_PSCAN bool       {
+                               if ($2)
+                                       devi.scan |=  SCAN_PAGE;
+                               else
+                                       devi.scan &= ~SCAN_PAGE;
+                       }
+
+  | WORD               {
+                               cfg_error("Unknown option '%s'",$1);
+                               YYABORT;
+                       }
+  ;
+
+dev_name:
+  WORD         {  
+                       $$ = strdup($1);
+               }
+
+  |  STRING    {
+                       $$ = strdup($1);
+               }
+  ;
+
+pkt_type:
+  WORD                 {
+                       int opt;
+                       if (!hci_strtoptype($1, &opt))
+                               cfg_error("Unknown packet type '%s'", $1);
+                       $$ = opt;
+               }
+
+  | LIST       {
+                       int opt;
+                       if (!hci_strtoptype($1, &opt))
+                               cfg_error("Unknown packet type '%s'", $1);
+                       $$ = opt;
+               }
+  ;
+
+link_mode:
+  WORD                 {
+                       int opt;
+                       if (!hci_strtolm($1, &opt))
+                               cfg_error("Unknown link mode '%s'", $1);
+                       $$ = opt;
+               }
+
+  | LIST       {
+                       int opt;
+                       if (!hci_strtolm($1, &opt))
+                               cfg_error("Unknown link mode '%s'", $1);
+                       $$ = opt;
+               }
+  ;
+
+link_policy:
+  WORD                 {
+                       int opt;
+                       if (!hci_strtolp($1, &opt))
+                               cfg_error("Unknown link policy '%s'", $1);
+                       $$ = opt;
+               }
+
+  | LIST       {
+                       int opt;
+                       if (!hci_strtolp($1, &opt))
+                               cfg_error("Unknown link policy '%s'", $1);
+                       $$ = opt;
+               }
+  ;
+
+bool: K_YES { $$ = 1; } | K_NO  { $$ = 0; };
+
+%%
+
+int yyerror(char *s) 
+{
+       syslog(LOG_ERR, "%s line %d\n", s, lineno);
+       return 0;
+}
+
+int cfg_error(const char *fmt, ...)
+{
+       char buf[255];
+       va_list ap;
+
+       va_start(ap, fmt);
+       vsnprintf(buf,sizeof(buf),fmt,ap);
+       va_end(ap);
+
+       yyerror(buf);
+       return 0;
+}
+
+/* 
+ * Read config file. 
+ */ 
+int read_config(char *file) 
+{
+       extern FILE *yyin;
+
+       if( !(yyin = fopen(file,"r")) ){
+               syslog(LOG_ERR,"Can not open %s", file);
+               return -1;      
+       }
+
+       lineno = 1;
+       yyparse();
+
+       fclose(yyin);
+  
+       return 0;     
+}
diff --git a/hcid/security.c b/hcid/security.c
new file mode 100644 (file)
index 0000000..bca2780
--- /dev/null
@@ -0,0 +1,477 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <syslog.h>
+#include <errno.h>
+#include <time.h>
+#include <fcntl.h>
+#include <time.h>
+
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <asm/types.h>
+
+#include <bluetooth.h>
+#include <hci.h>
+#include <hci_lib.h>
+
+#include <glib.h>
+
+#include "hcid.h"
+#include "lib.h"
+
+static GIOChannel *io_chan[HCI_MAX_DEV];
+
+void save_link_keys(void)
+{
+       int n, f;
+
+       umask(0077);
+       if (!(f = open(hcid.key_file, O_WRONLY | O_CREAT | O_TRUNC, 0))) {
+               syslog(LOG_ERR, "Can't save key database %s. %s(%d)",
+                               hcid.key_file, strerror(errno), errno);
+               return;
+       }
+
+       for (n = 0; n < hcid.key_num; n++) {
+               if (!hcid.link_key[n])
+                       continue;
+
+               if (write_n(f, hcid.link_key[n], sizeof(struct link_key)) < 0)
+                       break;
+       }
+       
+       close(f);
+}
+
+void flush_link_keys(void)
+{
+       int n;
+       for (n=0; n < hcid.key_num; n++) {
+               if (hcid.link_key[n]) {
+                       free(hcid.link_key[n]);
+                       hcid.link_key[n] = NULL;
+               }
+       }
+}
+
+int read_link_keys(void)
+{
+       int f, n = 0;
+
+       if (!(f = open(hcid.key_file, O_RDONLY))) {
+               syslog(LOG_ERR, "Can't open key database %s. %s(%d)",
+                               hcid.key_file, strerror(errno), errno);
+               return -1;
+       }
+
+       while (n < hcid.key_num) {
+               struct link_key *key;
+               int r;
+
+               key = malloc(sizeof(*key));
+               if (!key)
+                       continue;
+
+               r = read_n(f, key, sizeof(*key));
+               if (r <= 0) {
+                       free(key);
+                       break;
+               }
+
+               hcid.link_key[n++] = key;
+       }
+       
+       close(f);
+       return n;
+}
+
+int read_pin_code(void)
+{
+       char buf[17];
+       FILE *f; 
+       int len;
+
+       if (!(f = fopen(hcid.pin_file, "r"))) {
+               syslog(LOG_ERR, "Can't open PIN file %s. %s(%d)",
+                               hcid.pin_file, strerror(errno), errno);
+               return -1;
+       }
+
+       if (fgets(buf, sizeof(buf), f)) {
+               strtok(buf, "\n\r");
+               len = strlen(buf); 
+               memcpy(hcid.pin_code, buf, len);
+               hcid.pin_len = len;
+       } else {
+               syslog(LOG_ERR, "Can't read PIN file %s. %s(%d)",
+                               hcid.pin_file, strerror(errno), errno);
+               len = -1;
+       }
+       fclose(f);
+       return len;
+}
+
+/*
+  PIN helper is an external app that asks user for a PIN. It can 
+  implement its own PIN  code generation policy and methods like
+  PIN look up in some database, etc. 
+  HCId expects following output from PIN helper:
+       PIN:12345678    -       PIN code
+       ERR             -       No PIN available
+*/
+
+static void call_pin_helper(int dev, struct hci_conn_info *ci)
+{
+       pin_code_reply_cp pr;
+       char str[255], *pin, name[20];
+       bdaddr_t ba;
+       FILE *pipe;
+       int len;
+       
+       /* Run PIN helper in the separate process */
+       switch (fork()) {
+               case 0:
+                       break;
+               case -1:
+                       syslog(LOG_ERR, "Can't fork PIN helper. %s(%d)", 
+                                       strerror(errno), errno);
+               default:
+                       return;
+       }
+
+       if (access(hcid.pin_helper, R_OK | X_OK)) {
+               syslog(LOG_ERR, "Can't exec PIN helper %s. %s(%d)",
+                               hcid.pin_helper, strerror(errno), errno);
+               goto reject;
+       }
+
+       name[0] = 0;
+       //hci_remote_name(dev, &ci->bdaddr, sizeof(name), name, 0);
+
+       baswap(&ba, &ci->bdaddr);
+       sprintf(str, "%s %s %s \'%s\'", hcid.pin_helper, 
+                       ci->out ? "out" : "in", 
+                       batostr(&ba), name);
+
+       setenv("PATH", "/bin:/usr/bin:/usr/local/bin", 1);
+
+       pipe = popen(str, "r");
+       if (!pipe) {
+               syslog(LOG_ERR, "Can't exec PIN helper. %s(%d)", strerror(errno), errno);
+               goto reject;
+       }       
+
+       pin = fgets(str, sizeof(str), pipe);
+       pclose(pipe);
+
+       if (!pin || strlen(pin) < 5)
+               goto reject;
+
+       strtok(pin, "\n\r");
+
+       if (strncmp("PIN:", pin, 4))
+               goto reject;
+
+       pin += 4;
+       len  = strlen(pin);
+       
+       memset(&pr, 0, sizeof(pr));
+       bacpy(&pr.bdaddr, &ci->bdaddr);
+       memcpy(pr.pin_code, pin, len);
+       pr.pin_len = len;
+       hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_REPLY,
+                       PIN_CODE_REPLY_CP_SIZE, &pr);
+       exit(0);
+
+reject:
+       hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, &ci->bdaddr);
+       exit(0);
+}
+
+static void link_key_request(int dev, bdaddr_t *sba, bdaddr_t *dba)
+{
+       struct link_key *key = NULL;
+       int n;
+
+       /* Find the key */
+       for (n=0; n < hcid.key_num; n++) {
+               if (!hcid.link_key[n])
+                       continue;
+               if (!bacmp(&hcid.link_key[n]->sba, sba) && 
+                               !bacmp(&hcid.link_key[n]->dba, dba)) {
+                       key = hcid.link_key[n];
+                       break;
+               }
+       }
+
+       if (key) {
+               /* Link key found */
+               link_key_reply_cp lr;
+               memcpy(lr.link_key, key->key, 16);
+               bacpy(&lr.bdaddr, dba);
+               hci_send_cmd(dev, OGF_LINK_CTL, OCF_LINK_KEY_REPLY,
+                               LINK_KEY_REPLY_CP_SIZE, &lr);
+               key->time = time(0);
+       } else {
+               /* Link key not found */
+               hci_send_cmd(dev, OGF_LINK_CTL, OCF_LINK_KEY_NEG_REPLY, 6, dba);
+       }
+}
+
+static void pin_code_request(int dev, bdaddr_t *ba)
+{
+       struct hci_conn_info_req *cr;
+       struct hci_conn_info *ci;
+       
+       cr = malloc(sizeof(*cr) + sizeof(*ci));
+       if (!cr)
+               return;
+
+       bacpy(&cr->bdaddr, ba);
+       cr->type = ACL_LINK;
+       if (ioctl(dev, HCIGETCONNINFO, (unsigned long) cr) < 0) {
+               syslog(LOG_ERR, "Can't get conn info %s(%d)",
+                                       strerror(errno), errno);
+               /* Reject PIN */
+               hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, 6, ba);
+
+               free(cr);
+               return;
+       }
+       ci = cr->conn_info;
+
+       if (hcid.security == HCID_SEC_AUTO) {
+               if (!ci->out) {
+                       /* Incomming connection */
+                       pin_code_reply_cp pr;
+                       memset(&pr, 0, sizeof(pr));
+                       bacpy(&pr.bdaddr, ba);
+                       memcpy(pr.pin_code, hcid.pin_code, hcid.pin_len);
+                       pr.pin_len = hcid.pin_len;
+                       hci_send_cmd(dev, OGF_LINK_CTL, OCF_PIN_CODE_REPLY,
+                               PIN_CODE_REPLY_CP_SIZE, &pr);
+               } else {
+                       /* Outgoing connection */
+               
+                       /* Let PIN helper handle that */ 
+                       call_pin_helper(dev, ci);
+               }
+       } else {
+               /* Let PIN helper handle that */ 
+               call_pin_helper(dev, ci);
+       }       
+       free(cr);
+}
+
+static void link_key_notify(int dev, bdaddr_t *sba, void *ptr)
+{
+       evt_link_key_notify *evt = ptr;
+       bdaddr_t *dba = &evt->bdaddr;
+       struct link_key *key;
+       time_t tm = time(0);
+       int n, k = -1;
+
+       /* Find a slot */
+       for (n=0; n < hcid.key_num; n++) {
+               key = hcid.link_key[n];
+               if (!key || (!bacmp(&key->sba, sba) && !bacmp(&key->dba, dba)) ||
+                               (tm - key->time) > HCID_KEY_TTL) {
+                       k = n;
+                       break;
+               }
+       }
+
+       if (k != -1) {
+               /* Update link key */
+               key = hcid.link_key[k];
+               if (!key && !(key = malloc(sizeof(*key))))
+                       return;
+
+               bacpy(&key->sba, sba);
+               bacpy(&key->dba, dba);
+               memcpy(key->key, evt->link_key, 16);
+               key->type = evt->key_type;
+               key->time = tm;
+
+               hcid.link_key[k] = key;
+       }
+}
+
+gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer data)
+{
+       char buf[HCI_MAX_EVENT_SIZE], *ptr = buf;
+       struct hci_dev_info *di = (void *) data;
+       int len, type, dev;
+       hci_event_hdr *eh;
+       GIOError err;
+
+       if (cond & G_IO_NVAL) {
+               free(data);
+               return FALSE;
+       }
+
+       if (cond & (G_IO_HUP | G_IO_ERR)) {
+               g_io_channel_close(chan);
+               free(data);
+               return FALSE;
+       }
+       
+       if ((err = g_io_channel_read(chan, buf, sizeof(buf), &len))) {
+               if (err == G_IO_ERROR_AGAIN)
+                       return TRUE;
+               g_io_channel_close(chan);
+               return FALSE;
+       }
+
+       type = *ptr++;
+
+       if (type != HCI_EVENT_PKT)
+               return TRUE;
+
+       eh = (hci_event_hdr *) ptr;
+       ptr += HCI_EVENT_HDR_SIZE;
+
+       dev = g_io_channel_unix_get_fd(chan);
+
+       switch (eh->evt) {
+       case EVT_PIN_CODE_REQ:
+               pin_code_request(dev, (bdaddr_t *) ptr);
+               break;
+
+       case EVT_LINK_KEY_REQ:
+               link_key_request(dev, &di->bdaddr, (bdaddr_t *) ptr);
+               break;
+
+       case EVT_LINK_KEY_NOTIFY:
+               link_key_notify(dev, &di->bdaddr, ptr);
+               break;
+       }
+               
+       return TRUE;
+}
+
+int init_security_data(void)
+{
+       void *buf;
+
+       buf = calloc(hcid.key_num, sizeof(void*));
+       if (!buf) {
+               syslog(LOG_ERR, "Can't allocate link key database. %s(%d)",
+                               strerror(errno), errno);
+               return -1;
+       }
+       hcid.link_key = buf;
+       read_link_keys();
+
+       /* Set local PIN code */
+       if (hcid.security == HCID_SEC_AUTO) {
+               if (read_pin_code() < 0) {
+                       strcpy(hcid.pin_code, "bluez");
+                       hcid.pin_len = 5;
+               }
+       }
+       
+       return 0;
+}
+
+void start_security_manager(int hdev)
+{
+       GIOChannel *chan = io_chan[hdev];
+       struct hci_dev_info *di;
+       struct hci_filter flt;
+       int dev;
+
+       if (chan)
+               return;
+       
+       syslog(LOG_INFO, "Starting security manager %d", hdev);
+
+       if (!hcid.link_key && init_security_data())
+               return;
+
+       if ((dev = hci_open_dev(hdev)) < 0) {
+               syslog(LOG_ERR, "Can't open device hci%d. %s(%d)",
+                               hdev, strerror(errno), errno);
+               return;
+       }
+
+       /* Set filter */
+       hci_filter_clear(&flt);
+       hci_filter_set_ptype(HCI_EVENT_PKT, &flt);
+       hci_filter_set_event(EVT_PIN_CODE_REQ, &flt);
+       hci_filter_set_event(EVT_LINK_KEY_REQ, &flt);
+       hci_filter_set_event(EVT_LINK_KEY_NOTIFY, &flt);
+       if (setsockopt(dev, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
+               syslog(LOG_ERR, "Can't set filter on hci%d. %s(%d)", 
+                               hdev, strerror(errno), errno);
+               close(dev);
+               return;
+       }
+
+       di = malloc(sizeof(*di));
+       if (!di) {
+               syslog(LOG_ERR, "Can't allocate device info buffer. %s(%d)", 
+                               strerror(errno), errno);
+               close(dev);
+               return;
+       }
+       
+       di->dev_id = hdev;
+       if (ioctl(dev, HCIGETDEVINFO, (void *)di)) {
+               syslog(LOG_ERR, "Can't get device info. %s(%d)", 
+                               strerror(errno), errno);
+               close(dev);
+               return;
+       }
+       
+       chan = g_io_channel_unix_new(dev);
+       g_io_add_watch(chan, G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
+                       io_security_event, (void *) di);
+
+       io_chan[hdev] = chan;
+}
+
+void stop_security_manager(int hdev)
+{
+       GIOChannel *chan = io_chan[hdev];
+
+       if (!chan)
+               return;
+
+       syslog(LOG_INFO, "Stoping security manager %d", hdev);
+
+       close(g_io_channel_unix_get_fd(chan));
+       io_chan[hdev] = NULL;
+}
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..e9de238
--- /dev/null
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission.  M.I.T. makes no representations about the
+# suitability of this software for any purpose.  It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+               chmodcmd=""
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/missing b/missing
new file mode 100755 (executable)
index 0000000..d46f79f
--- /dev/null
+++ b/missing
@@ -0,0 +1,198 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# 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, 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., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.in; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+case "$1" in
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]"
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing - GNU libit 0.0"
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+  aclocal)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acinclude.m4' or \`$configure_ac'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`$configure_ac'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`acconfig.h' or \`$configure_ac'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' $configure_ac`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+                                      sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`$configure_ac'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+          sed 's/\.am$/.in/' |
+          while read f; do touch "$f"; done
+    ;;
+
+  bison|yacc)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.y)
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.c
+           fi
+           SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" y.tab.h
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f y.tab.h ]; then
+       echo >y.tab.h
+    fi
+    if [ ! -f y.tab.c ]; then
+       echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex|flex)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if [ $# -ne 1 ]; then
+        eval LASTARG="\${$#}"
+       case "$LASTARG" in
+       *.l)
+           SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+           if [ -f "$SRCFILE" ]; then
+                cp "$SRCFILE" lex.yy.c
+           fi
+         ;;
+       esac
+    fi
+    if [ ! -f lex.yy.c ]; then
+       echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  makeinfo)
+    echo 1>&2 "\
+WARNING: \`$1' is missing on your system.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+    if test -z "$file"; then
+      file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+    fi
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+         system.  You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequirements for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755 (executable)
index 0000000..6b3b5fc
--- /dev/null
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id$
+
+errstatus=0
+
+for file
+do
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d
+   do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+         errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/pcmcia/Makefile.am b/pcmcia/Makefile.am
new file mode 100644 (file)
index 0000000..3664b3e
--- /dev/null
@@ -0,0 +1,12 @@
+# 
+#  $Id$
+#
+
+pcmciadir = /etc/pcmcia
+
+install-data-local: @PCMCIA@
+
+pcmcia:
+       $(mkinstalldirs) $(DESTDIR)$(pcmciadir)
+       $(INSTALL) -m 755 $(srcdir)/bluetooth $(DESTDIR)$(pcmciadir)
+       $(INSTALL) -m 644 $(srcdir)/bluetooth.conf $(DESTDIR)$(pcmciadir)
diff --git a/pcmcia/Makefile.in b/pcmcia/Makefile.in
new file mode 100644 (file)
index 0000000..ed12081
--- /dev/null
@@ -0,0 +1,198 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 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.
+
+# 
+#  $Id$
+#
+
+
+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 = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AWK = @AWK@
+CC = @CC@
+DISTRO = @DISTRO@
+GLIB = @GLIB@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LDFLAGS = @GLIB_LDFLAGS@
+LD = @LD@
+LEX = @LEX@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PCMCIA = @PCMCIA@
+VERSION = @VERSION@
+YACC = @YACC@
+
+pcmciadir = /etc/pcmcia
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu pcmcia/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = pcmcia
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu pcmcia/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$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-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+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-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  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: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-local 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-data-local: @PCMCIA@
+
+pcmcia:
+       $(mkinstalldirs) $(DESTDIR)$(pcmciadir)
+       $(INSTALL) -m 755 $(srcdir)/bluetooth $(DESTDIR)$(pcmciadir)
+       $(INSTALL) -m 644 $(srcdir)/bluetooth.conf $(DESTDIR)$(pcmciadir)
+
+# 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/pcmcia/bluetooth b/pcmcia/bluetooth
new file mode 100755 (executable)
index 0000000..ea22ce4
--- /dev/null
@@ -0,0 +1,34 @@
+#!/bin/sh
+#
+# bluetooth
+#
+# Initialize a PCMCIA Bluetooth device
+# Written by Maxim Krasnyanskiy <maxk@qualcomm.com>
+#
+# $1 - socket
+# $2 - device
+# 
+
+LOG="/usr/bin/logger -i -t bluetooth -p daemon.notice"
+
+IDENT="/sbin/cardctl ident $1"
+
+# Check if card is really a Bluetooth card
+if ! $IDENT | grep -i 'bluetooth' > /dev/null 2>&1; then
+       $LOG "$2 is not a Bluetooth device"
+       exit
+fi
+
+ID=`$IDENT | awk '/.*id/{print $2 $3}'`
+TYPE=`$IDENT | awk '/.*func/{print $2}'`
+
+$LOG "Bluetooth device id $ID type $TYPE $2"
+
+case "$TYPE" in
+       # Serial device
+       2)
+               /sbin/hciattach $DEVICE $ID
+               ;;
+esac
+
+unset LOG IDENT ID TYPE
diff --git a/pcmcia/bluetooth.conf b/pcmcia/bluetooth.conf
new file mode 100644 (file)
index 0000000..ca48419
--- /dev/null
@@ -0,0 +1,26 @@
+card "Brain Boxes BL-620 Bluetooth Adapter"
+  version "Brain Boxes", "Bluetooth PC Card"
+  bind "serial_cs"
+
+card "Xircom CreditCard CBT Bluetooth Adapter"
+  version "Xircom", "*", "CBT"
+  bind "serial_cs"
+
+card "3Com Bluetooth PC Card"
+  version "3COM", "*", "Bluetooth PC Card"
+  bind "serial_cs"
+
+card "COM One Platinium Bluetooth PC Card"
+  version "COM1 SA", "MC310 CARD"
+  bind "serial_cs"
+
+card "Sphinx PICO Bluetooth Card"
+  version "SPHINX", "BT-CARD"
+  bind "serial_cs"
+
+device "dtl1_cs"
+  module "dtl1_cs"
+
+card "Nokia Bluetooth Card DTL-1"
+  version "Nokia Mobile Phones", "DTL-1"
+  bind "dtl1_cs"
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
new file mode 100644 (file)
index 0000000..12f32c7
--- /dev/null
@@ -0,0 +1,18 @@
+# 
+#  $Id$
+#
+
+bin_SCRIPTS = bluepin
+
+install-data-local: @DISTRO@
+
+unknown:
+       -echo Unknown distribution 
+
+redhat:
+       $(mkinstalldirs) $(DESTDIR)/etc/rc.d/init.d
+       $(INSTALL) -m 755 $(srcdir)/bluetooth.rc.rh $(DESTDIR)/etc/rc.d/init.d/bluetooth
+
+debian:
+       $(mkinstalldirs) $(DESTDIR)/etc/init.d
+       $(INSTALL) -m 755 $(srcdir)/bluetooth.rc.rh $(DESTDIR)/etc/init.d/bluetooth
diff --git a/scripts/Makefile.in b/scripts/Makefile.in
new file mode 100644 (file)
index 0000000..d750a69
--- /dev/null
@@ -0,0 +1,227 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 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.
+
+# 
+#  $Id$
+#
+
+
+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 = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AWK = @AWK@
+CC = @CC@
+DISTRO = @DISTRO@
+GLIB = @GLIB@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LDFLAGS = @GLIB_LDFLAGS@
+LD = @LD@
+LEX = @LEX@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PCMCIA = @PCMCIA@
+VERSION = @VERSION@
+YACC = @YACC@
+
+bin_SCRIPTS = bluepin
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+SCRIPTS =  $(bin_SCRIPTS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+       cd $(top_srcdir) && $(AUTOMAKE) --gnu scripts/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-binSCRIPTS: $(bin_SCRIPTS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_SCRIPTS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+         else if test -f $(srcdir)/$$p; then \
+           echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+           $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+         else :; fi; fi; \
+       done
+
+uninstall-binSCRIPTS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_SCRIPTS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+       done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = scripts
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu scripts/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$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-binSCRIPTS
+install-exec: install-exec-am
+
+install-data-am: install-data-local
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binSCRIPTS
+uninstall: uninstall-am
+all-am: Makefile $(SCRIPTS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(bindir)
+
+
+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-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  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: uninstall-binSCRIPTS install-binSCRIPTS tags distdir info-am \
+info dvi-am dvi check check-am installcheck-am installcheck \
+install-exec-am install-exec install-data-local 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-data-local: @DISTRO@
+
+unknown:
+       -echo Unknown distribution 
+
+redhat:
+       $(mkinstalldirs) $(DESTDIR)/etc/rc.d/init.d
+       $(INSTALL) -m 755 $(srcdir)/bluetooth.rc.rh $(DESTDIR)/etc/rc.d/init.d/bluetooth
+
+debian:
+       $(mkinstalldirs) $(DESTDIR)/etc/init.d
+       $(INSTALL) -m 755 $(srcdir)/bluetooth.rc.rh $(DESTDIR)/etc/init.d/bluetooth
+
+# 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/scripts/bluepin b/scripts/bluepin
new file mode 100755 (executable)
index 0000000..db1f819
--- /dev/null
@@ -0,0 +1,148 @@
+#!/usr/bin/python
+#
+# Bluetooth PIN helper
+# Written by Maxim Krasnyansky <maxk@qualcomm.com>
+#
+
+import sys, os, string
+
+#
+# FIXME:
+#
+# We have to find actual user and proper X display here. And if 
+# it's not available (no one's logged in) we should lookup some
+# file for predefined PINs.
+#
+# For now we just assume that we have access to local X display
+# and whoever is logged in there will get a window pop.
+#
+
+os.environ['DISPLAY'] = ':0'
+
+# For X Window display access blueping has to find a user and use 
+# his(her) .Xauthority file. 
+# os.environ['XAUTHORITY'] = '/home/maxk/.Xauthority'
+
+from gtk import *
+#import GdkImlib, GtkExtra
+
+# Dialog Class
+DLG_OK = 1
+DLG_CANCEL = 2
+class Dialog(GtkDialog):
+       result = DLG_CANCEL 
+       args = {}
+       def __init__(self, modal=FALSE, mesg=None, args = {}):
+               GtkDialog.__init__(self)
+               self.args = args
+               self.set_modal(modal)
+               self.set_usize(400, 0)
+               self.set_uposition(300,300)
+               
+               self.connect("destroy", self.quit)
+               self.connect("delete_event", self.quit)
+
+               self.action_area.set_border_width(2)
+
+               ok = GtkButton("Accept")
+               ok.connect("clicked", self.ok)
+               self.action_area.pack_start(ok, padding = 20)
+               ok.show()
+
+               cl = GtkButton("Reject")
+               cl.connect("clicked", self.cancel)
+               self.action_area.pack_start(cl, padding = 20)
+               cl.show()
+
+               if mesg:
+                       msg = GtkLabel()
+                       msg.set_text(mesg)
+                       self.vbox.pack_start(msg, padding = 10)
+                       msg.show()
+
+               self.ents = []
+               for k in self.args.keys():
+                       hbox = GtkHBox()
+                       hbox.set_border_width(5)
+                       self.vbox.pack_start(hbox)
+                       hbox.show()
+
+                       l = GtkLabel()
+                       e = GtkEntry()
+                       l.set_text( k )
+                       e.set_text( self.args[k] )
+                       e.connect("key_press_event", self.key_press)
+                       hbox.pack_start(l, padding = 10, expand = FALSE)
+                       hbox.pack_start(e)
+                       l.show()
+                       e.show()
+
+                       self.ents.append( (k, e) )
+
+               self.ents[0][1].grab_focus()
+
+       def key_press(self, entry, event):
+               if event.keyval == GDK.Return:
+                       entry.emit_stop_by_name("key_press_event")
+                       self.ok()
+               elif event.keyval == GDK.Escape:
+                       entry.emit_stop_by_name("key_press_event")
+                       self.cancel()
+
+       def ok(self, *args):
+               self.result = DLG_OK 
+               for e in self.ents:
+                       k = e[0]
+                       self.args[k] = e[1].get_text() 
+               self.quit()
+
+       def cancel(self, *args):
+               self.result = DLG_CANCEL 
+               self.quit()
+
+       def quit(self, *args):
+               self.hide()
+               self.destroy()
+               mainquit()
+
+def dialog(title, mesg, args, modal = FALSE):
+       dlg = Dialog(args = args, mesg = mesg, modal = modal)
+       dlg.set_title(title)
+       dlg.show()
+       mainloop()
+       return dlg.result
+
+def main(*args):
+       dir    = sys.argv[1]
+       bdaddr = sys.argv[2]
+
+       if len(sys.argv) > 3:
+               name = sys.argv[3]
+       else:
+               name = ""
+
+       title = "Bluetooth PIN Code"
+
+       # Bluetooth spec recommends automatic strong random PIN generation.
+       # So eventually we should implement that. 
+       pin = { "PIN": "" }
+
+       if dir == "out":
+               mesg = "Outgoing connection to "
+       else:
+               mesg = "Incomming connection from "
+       
+       mesg = mesg + name + "[" + bdaddr + "]"
+
+       if dialog(title, mesg, pin) == DLG_OK:
+               pin["PIN"] = string.strip(pin["PIN"])
+
+               if len(pin["PIN"]) >= 4 and len(pin["PIN"]) <=16:
+                       print "PIN:" + pin["PIN"]
+               else:
+                       print "ERR"
+       else:
+               print "ERR"
+
+#
+main()
diff --git a/scripts/bluetooth.rc.rh b/scripts/bluetooth.rc.rh
new file mode 100755 (executable)
index 0000000..f058678
--- /dev/null
@@ -0,0 +1,72 @@
+#!/bin/sh
+#
+# bluetooth    Bluetooth subsystem starting and stopping
+#
+# chkconfig: 345 25 90
+# description: Bluetooth subsystem
+#
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+# Source Bluetooth configuration.
+#. /etc/sysconfig/bluetooth
+
+prog="Bluetooth"
+
+UART_CONF="/etc/bluetooth/uart"
+
+start_uarts() 
+{
+       [ -f /sbin/hciattach -a -f $UART_CONF ] || return
+       grep -v '^#' $UART_CONF | while read i; do
+               /sbin/hciattach $i
+       done
+}
+
+stop_uarts()
+{
+       killproc hciattach > /dev/null 2>&1
+}
+
+start() 
+{
+        echo -n $"Starting $prog: "
+        daemon /sbin/hcid
+       start_uarts
+       touch  /var/lock/subsys/bluetooth
+        echo
+}
+
+stop() 
+{
+        echo -n $"Shutting down $prog: "
+       stop_uarts
+       killproc hcid
+       rm -f  /var/lock/subsys/bluetooth
+        echo
+}
+
+[ -f /sbin/hcid ] || exit 0
+
+# See how we were called.
+case "$1" in
+  start)
+       start
+        ;;
+  stop)
+       stop
+        ;;
+  restart|reload)
+       stop
+       start
+       ;;
+  condrestart)
+       [ -e /var/lock/subsys/bluetooth ] && (stop; start)
+       ;;
+  *)
+        echo $"Usage: $0 {start|stop|restart|reload|condrestart}"
+        exit 1
+esac
+
+exit 0
diff --git a/tools/Makefile.am b/tools/Makefile.am
new file mode 100644 (file)
index 0000000..d3133e5
--- /dev/null
@@ -0,0 +1,10 @@
+#
+#  $Id$
+#
+
+mandir = $(prefix)/usr/share/man
+
+sbin_PROGRAMS = hciattach hciconfig
+bin_PROGRAMS  = hcitool l2ping
+
+man_MANS      = hciattach.8 l2ping.8
diff --git a/tools/Makefile.in b/tools/Makefile.in
new file mode 100644 (file)
index 0000000..fe838a4
--- /dev/null
@@ -0,0 +1,433 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 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.
+
+#
+#  $Id$
+#
+
+
+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@
+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 = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AWK = @AWK@
+CC = @CC@
+DISTRO = @DISTRO@
+GLIB = @GLIB@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_LDFLAGS = @GLIB_LDFLAGS@
+LD = @LD@
+LEX = @LEX@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+PCMCIA = @PCMCIA@
+VERSION = @VERSION@
+YACC = @YACC@
+
+mandir = $(prefix)/usr/share/man
+
+sbin_PROGRAMS = hciattach hciconfig
+bin_PROGRAMS = hcitool l2ping
+
+man_MANS = hciattach.8 l2ping.8
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+PROGRAMS =  $(bin_PROGRAMS) $(sbin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+hcitool_SOURCES = hcitool.c
+hcitool_OBJECTS =  hcitool.o
+hcitool_LDADD = $(LDADD)
+hcitool_DEPENDENCIES = 
+hcitool_LDFLAGS = 
+l2ping_SOURCES = l2ping.c
+l2ping_OBJECTS =  l2ping.o
+l2ping_LDADD = $(LDADD)
+l2ping_DEPENDENCIES = 
+l2ping_LDFLAGS = 
+hciattach_SOURCES = hciattach.c
+hciattach_OBJECTS =  hciattach.o
+hciattach_LDADD = $(LDADD)
+hciattach_DEPENDENCIES = 
+hciattach_LDFLAGS = 
+hciconfig_SOURCES = hciconfig.c
+hciconfig_OBJECTS =  hciconfig.o
+hciconfig_LDADD = $(LDADD)
+hciconfig_DEPENDENCIES = 
+hciconfig_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+man8dir = $(mandir)/man8
+MANS = $(man_MANS)
+
+NROFF = nroff
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+DEP_FILES =  .deps/hciattach.P .deps/hciconfig.P .deps/hcitool.P \
+.deps/l2ping.P
+SOURCES = hcitool.c l2ping.c hciattach.c hciconfig.c
+OBJECTS = hcitool.o l2ping.o hciattach.o hciconfig.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 tools/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status $(BUILT_SOURCES)
+       cd $(top_builddir) \
+         && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+       -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+       @$(NORMAL_INSTALL)
+       $(mkinstalldirs) $(DESTDIR)$(bindir)
+       @list='$(bin_PROGRAMS)'; for p in $$list; do \
+         if test -f $$p; then \
+           echo "  $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+            $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+         else :; fi; \
+       done
+
+uninstall-binPROGRAMS:
+       @$(NORMAL_UNINSTALL)
+       list='$(bin_PROGRAMS)'; for p in $$list; do \
+         rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+       done
+
+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
+
+.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:
+
+hcitool: $(hcitool_OBJECTS) $(hcitool_DEPENDENCIES)
+       @rm -f hcitool
+       $(LINK) $(hcitool_LDFLAGS) $(hcitool_OBJECTS) $(hcitool_LDADD) $(LIBS)
+
+l2ping: $(l2ping_OBJECTS) $(l2ping_DEPENDENCIES)
+       @rm -f l2ping
+       $(LINK) $(l2ping_LDFLAGS) $(l2ping_OBJECTS) $(l2ping_LDADD) $(LIBS)
+
+hciattach: $(hciattach_OBJECTS) $(hciattach_DEPENDENCIES)
+       @rm -f hciattach
+       $(LINK) $(hciattach_LDFLAGS) $(hciattach_OBJECTS) $(hciattach_LDADD) $(LIBS)
+
+hciconfig: $(hciconfig_OBJECTS) $(hciconfig_DEPENDENCIES)
+       @rm -f hciconfig
+       $(LINK) $(hciconfig_LDFLAGS) $(hciconfig_OBJECTS) $(hciconfig_LDADD) $(LIBS)
+
+install-man8:
+       $(mkinstalldirs) $(DESTDIR)$(man8dir)
+       @list='$(man8_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.8*) 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)$(man8dir)/$$inst"; \
+         $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
+       done
+
+uninstall-man8:
+       @list='$(man8_MANS)'; \
+       l2='$(man_MANS)'; for i in $$l2; do \
+         case "$$i" in \
+           *.8*) 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)$(man8dir)/$$inst"; \
+         rm -f $(DESTDIR)$(man8dir)/$$inst; \
+       done
+install-man: $(MANS)
+       @$(NORMAL_INSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) install-man8
+uninstall-man:
+       @$(NORMAL_UNINSTALL)
+       $(MAKE) $(AM_MAKEFLAGS) uninstall-man8
+
+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 = tools
+
+distdir: $(DISTFILES)
+       here=`cd $(top_builddir) && pwd`; \
+       top_distdir=`cd $(top_distdir) && pwd`; \
+       distdir=`cd $(distdir) && pwd`; \
+       cd $(top_srcdir) \
+         && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --gnu tools/Makefile
+       @for file in $(DISTFILES); do \
+         d=$(srcdir); \
+         if test -d $$d/$$file; then \
+           cp -pr $$d/$$file $(distdir)/$$file; \
+         else \
+           test -f $(distdir)/$$file \
+           || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+           || cp -p $$d/$$file $(distdir)/$$file || :; \
+         fi; \
+       done
+
+DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :)
+
+-include $(DEP_FILES)
+
+mostlyclean-depend:
+
+clean-depend:
+
+distclean-depend:
+       -rm -rf .deps
+
+maintainer-clean-depend:
+
+%.o: %.c
+       @echo '$(COMPILE) -c $<'; \
+       $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-cp .deps/$(*F).pp .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm .deps/$(*F).pp
+
+%.lo: %.c
+       @echo '$(LTCOMPILE) -c $<'; \
+       $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $<
+       @-sed -e 's/^\([^:]*\)\.o[      ]*:/\1.lo \1.o :/' \
+         < .deps/$(*F).pp > .deps/$(*F).P; \
+       tr ' ' '\012' < .deps/$(*F).pp \
+         | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
+           >> .deps/$(*F).P; \
+       rm -f .deps/$(*F).pp
+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-binPROGRAMS install-sbinPROGRAMS
+install-exec: install-exec-am
+
+install-data-am: install-man
+install-data: install-data-am
+
+install-am: all-am
+       @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS uninstall-sbinPROGRAMS uninstall-man
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(MANS)
+all-redirect: all-am
+install-strip:
+       $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+       $(mkinstalldirs)  $(DESTDIR)$(bindir) $(DESTDIR)$(sbindir) \
+               $(DESTDIR)$(mandir)/man8
+
+
+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-binPROGRAMS mostlyclean-sbinPROGRAMS \
+               mostlyclean-compile mostlyclean-tags mostlyclean-depend \
+               mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-binPROGRAMS clean-sbinPROGRAMS clean-compile clean-tags \
+               clean-depend clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-binPROGRAMS distclean-sbinPROGRAMS \
+               distclean-compile distclean-tags distclean-depend \
+               distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-binPROGRAMS \
+               maintainer-clean-sbinPROGRAMS maintainer-clean-compile \
+               maintainer-clean-tags maintainer-clean-depend \
+               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-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-sbinPROGRAMS distclean-sbinPROGRAMS 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 mostlyclean-depend \
+distclean-depend clean-depend maintainer-clean-depend 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
+
+
+# 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/tools/hciattach.8 b/tools/hciattach.8
new file mode 100644 (file)
index 0000000..b327336
--- /dev/null
@@ -0,0 +1,102 @@
+.TH HCIATTACH 8 "Jan 22 2002" BlueZ "Linux System Administration"
+.SH NAME
+hciattach \- attach serial devices via UART HCI to BlueZ stack
+.SH SYNOPSIS
+.B hciattach
+<
+.I tty
+> <
+.I type
+|
+.I id
+> [
+.I speed
+] [
+.I flow
+]
+.SH DESCRIPTION
+.LP
+Hciattach is used to attach a serial UART to the Bluetooth stack as HCI
+transport interface.
+.SH OPTIONS
+.TP
+.I <tty>
+This specifies the serial device to attach. A leading
+.B /dev
+can be omitted. Examples:
+.B /dev/ttyS1
+.B ttyS2
+.TP
+.I <type | id>
+The
+.B type
+or
+.B id
+of the Bluetooth device that is to be attached, i.e. vendor or other device
+specific identifier. Currently supported types are
+.RS
+.TP
+.B type
+.B description
+.TP
+any
+Unspecified HCI_UART interface, no vendor specific options
+.TP
+ericsson
+Ericsson based modules
+.TP
+digi
+Digianswer based cards
+.TP
+xircom
+Xircom PCMCIA cards: Credit Card Adapter and Real Port Adapter
+.TP
+csr
+CSR Casira serial adapter or BrainBoxes serial dongle (BL642)
+.TP
+bboxes
+BrainBoxes PCMCIA card (BL620)
+.TP
+swave
+Silicon Wave kits
+.RE
+
+Supported IDs are (manufacturer id, product id)
+.RS
+.TP
+0x0105, 0x080a
+Xircom PCMCIA cards: Credit Card Adapter and Real Port Adapter
+.TP
+0x0160, 0x0002
+BrainBoxes PCMCIA card (BL620)
+.RE
+
+.TP
+.I <speed>
+The
+.B speed
+specifies the UART speed to use. Baudrates higher than 115.200bps require
+vendor specific initializations that are not implemented for all types of
+devices. In general the following speeds are supported:
+
+.B 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600
+
+Supported vendor devices are automatically initialised to their respective
+best settings.
+.TP
+.I <flow>
+If the keyword
+.B flow
+is appended to the list of options then hardware flow control is forced on
+the serial link (
+.B CRTSCTS
+). All above mentioned device types have
+.B flow
+set by default. To force no flow control use
+.B noflow
+instead.
+
+.SH AUTHORS
+Written by Maxim Krasnyansky <maxk@qualcomm.com>
+.PP
+man page by Nils Faerber <nils@kernelconcepts.de>
diff --git a/tools/hciattach.c b/tools/hciattach.c
new file mode 100644 (file)
index 0000000..a448901
--- /dev/null
@@ -0,0 +1,751 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <syslog.h>
+#include <errno.h>
+#include <time.h>
+#include <termios.h>
+#include <fcntl.h>
+
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <asm/types.h>
+
+#include <bluetooth.h>
+#include <hci.h>
+#include <hci_uart.h>
+#include <hci_lib.h>
+
+struct uart_t {
+       char *type;
+       int  m_id;
+       int  p_id;
+       int  proto;
+       int  speed;
+       int  flags;
+       int  (*init) (int fd, struct uart_t *u, struct termios *ti);
+};
+
+#define FLOW_CTL       0x0001
+
+static int uart_speed(int s)
+{
+       switch (s) {
+       case 9600:
+               return B9600;
+       case 19200:
+               return B19200;
+       case 38400:
+               return B38400;
+       case 57600:
+               return B57600;
+       case 115200:
+               return B115200;
+       case 230400:
+               return B230400;
+       case 460800:
+               return B460800;
+       case 921600:
+               return B921600;
+       default:
+               return B57600;
+       }
+}
+
+static int set_speed(int fd, struct termios *ti, int speed)
+{
+       cfsetospeed(ti, uart_speed(speed));
+       return tcsetattr(fd, TCSANOW, ti);
+}
+
+static void sig_alarm(int sig)
+{
+       fprintf(stderr, "Initialization timed out.\n");
+       exit(1);
+}
+
+/* 
+ * Read an HCI event from the given file descriptor.
+ */
+static int read_hci_event(int fd, unsigned char* buf, int size) 
+{
+       int remain, r;
+       int count = 0;
+
+       if (size <= 0)
+               return -1;
+
+       /* The first byte identifies the packet type. For HCI event packets, it
+        * should be 0x04, so we read until we get to the 0x04. */
+       while (1) {
+               r = read(fd, buf, 1);
+               if (r <= 0)
+                       return -1;
+               if (buf[0] == 0x04)
+                       break;
+       }
+       count++;
+
+       /* The next two bytes are the event code and parameter total length. */
+       while (count < 3) {
+               r = read(fd, buf + count, 3 - count);
+               if (r <= 0)
+                       return -1;
+               count += r;
+       }
+
+       /* Now we read the parameters. */
+       if (buf[2] < (size - 3)) 
+               remain = buf[2];
+       else 
+               remain = size - 3;
+
+       while ((count - 3) < remain) {
+               r = read(fd, buf + count, remain - (count - 3));
+               if (r <= 0)
+                       return -1;
+               count += r;
+       }
+       return count;
+}
+
+/* 
+ * Ericsson specific initialization 
+ */
+static int ericsson(int fd, struct uart_t *u, struct termios *ti)
+{
+       struct timespec tm = {0, 50000};
+       char cmd[10];
+
+       /* Switch to default Ericsson baudrate*/
+       if (set_speed(fd, ti, 57600) < 0) {
+               perror("Can't set default baud rate");
+               return -1;
+       }
+
+       cmd[0] = HCI_COMMAND_PKT;
+       cmd[1] = 0x09;
+       cmd[2] = 0xfc;
+       cmd[3] = 0x01;
+
+       switch (u->speed) {
+       case 57600:
+               cmd[4] = 0x03;
+               break;
+       case 115200:
+               cmd[4] = 0x02;
+               break;
+       case 230400:
+               cmd[4] = 0x01;
+               break;
+       case 460800:
+               cmd[4] = 0x00;
+               break;
+       default:
+               cmd[4] = 0x03;
+               u->speed = 57600;
+               break;
+       }
+
+       /* Send initialization command */
+       if (write(fd, cmd, 5) != 5) {
+               perror("Failed to write init command");
+               return -1;
+       }
+       nanosleep(&tm, NULL);
+       return 0;
+}
+
+/* 
+ * Digianswer specific initialization 
+ */
+static int digi(int fd, struct uart_t *u, struct termios *ti)
+{
+       struct timespec tm = {0, 50000};
+       char cmd[10];
+
+       /* Switch to default Digi baudrate*/
+       if (set_speed(fd, ti, 9600) < 0) {
+               perror("Can't set default baud rate");
+               return -1;
+       }
+
+       /* DigiAnswer set baud rate command */
+       cmd[0] = HCI_COMMAND_PKT;
+       cmd[1] = 0x07;
+       cmd[2] = 0xfc;
+       cmd[3] = 0x01;
+
+       switch (u->speed) {
+       case 57600:
+               cmd[4] = 0x08;
+               break;
+       case 115200:
+               cmd[4] = 0x09;
+               break;
+       default:
+               cmd[4] = 0x09;
+               u->speed = 115200;
+               break;
+       }
+
+       /* Send initialization command */
+       if (write(fd, cmd, 5) != 5) {
+               perror("Failed to write init command");
+               return -1;
+       }
+       nanosleep(&tm, NULL);
+       return 0;
+}
+
+/* 
+ * CSR specific initialization 
+ * Inspired strongly by code in OpenBT and experimentations with Brainboxes
+ * Pcmcia card.
+ * Jean Tourrilhes <jt@hpl.hp.com> - 14.11.01
+ */
+static int csr(int fd, struct uart_t *u, struct termios *ti)
+{
+       struct timespec tm = {0, 10000000};     /* 10ms - be generous */
+       unsigned char cmd[30];          /* Command */
+       unsigned char resp[30];         /* Response */
+       int  clen = 0;          /* Command len */
+       static int csr_seq = 0; /* Sequence number of command */
+       int  divisor;
+
+       /* Switch to default CSR baudrate */
+       if (set_speed(fd, ti, 115200) < 0) {
+               perror("Can't set default baud rate");
+               return -1;
+       }
+
+       /* It seems that if we set the CSR UART speed straight away, it
+        * won't work, the CSR UART gets into a state where we can't talk
+        * to it anymore.
+        * On the other hand, doing a read before setting the CSR speed
+        * seems to be ok.
+        * Therefore, the strategy is to read the build ID (useful for
+        * debugging) and only then set the CSR UART speed. Doing like
+        * this is more complex but at least it works ;-)
+        * The CSR UART control may be slow to wake up or something because
+        * every time I read its speed, its bogus...
+        * Jean II */
+
+       /* Try to read the build ID of the CSR chip */
+       clen = 5 + (5 + 6) * 2;
+       /* HCI header */
+       cmd[0] = HCI_COMMAND_PKT;
+       cmd[1] = 0x00;          /* CSR command */
+       cmd[2] = 0xfc;          /* MANUFACTURER_SPEC */
+       cmd[3] = 1 + (5 + 6) * 2;       /* len */
+       /* CSR MSG header */
+       cmd[4] = 0xC2;          /* first+last+channel=BCC */
+       /* CSR BCC header */
+       cmd[5] = 0x00;          /* type = GET-REQ */
+       cmd[6] = 0x00;          /* - msB */
+       cmd[7] = 5 + 4;         /* len */
+       cmd[8] = 0x00;          /* - msB */
+       cmd[9] = csr_seq & 0xFF;/* seq num */
+       cmd[10] = (csr_seq >> 8) & 0xFF;        /* - msB */
+       csr_seq++;
+       cmd[11] = 0x19;         /* var_id = CSR_CMD_BUILD_ID */
+       cmd[12] = 0x28;         /* - msB */
+       cmd[13] = 0x00;         /* status = STATUS_OK */
+       cmd[14] = 0x00;         /* - msB */
+       /* CSR BCC payload */
+       memset(cmd + 15, 0, 6 * 2);
+
+       /* Send command */
+       do {
+               if (write(fd, cmd, clen) != clen) {
+                       perror("Failed to write init command (GET_BUILD_ID)");
+                       return -1;
+               }
+
+               /* Read reply. */
+               if (read_hci_event(fd, resp, 100) < 0) {
+                       perror("Failed to read init response (GET_BUILD_ID)");
+                       return -1;
+               }
+
+       /* Event code 0xFF is for vendor-specific events, which is 
+        * what we're looking for. */
+       } while (resp[1] != 0xFF);
+
+#ifdef CSR_DEBUG
+       {
+       char temp[512];
+       int i;
+       for (i=0; i < rlen; i++)
+               sprintf(temp + (i*3), "-%02X", resp[i]);
+       fprintf(stderr, "Reading CSR build ID %d [%s]\n", rlen, temp + 1);
+       // In theory, it should look like :
+       // 04-FF-13-FF-01-00-09-00-00-00-19-28-00-00-73-00-00-00-00-00-00-00
+       }
+#endif
+       /* Display that to user */
+       fprintf(stderr, "CSR build ID 0x%02X-0x%02X\n", 
+               resp[15] & 0xFF, resp[14] & 0xFF);
+       
+       /* Try to read the current speed of the CSR chip */
+       clen = 5 + (5 + 4)*2;
+       /* -- HCI header */
+       cmd[3] = 1 + (5 + 4)*2; /* len */
+       /* -- CSR BCC header -- */
+       cmd[9] = csr_seq & 0xFF;        /* seq num */
+       cmd[10] = (csr_seq >> 8) & 0xFF;        /* - msB */
+       csr_seq++;
+       cmd[11] = 0x02;         /* var_id = CONFIG_UART */
+       cmd[12] = 0x68;         /* - msB */
+
+#ifdef CSR_DEBUG
+       /* Send command */
+       do {
+               if (write(fd, cmd, clen) != clen) {
+                       perror("Failed to write init command (GET_BUILD_ID)");
+                       return -1;
+               }
+
+               /* Read reply. */
+               if (read_hci_event(fd, resp, 100) < 0) {
+                       perror("Failed to read init response (GET_BUILD_ID)");
+                       return -1;
+               }
+
+       /* Event code 0xFF is for vendor-specific events, which is 
+        * what we're looking for. */
+       } while (resp[1] != 0xFF);
+
+       {
+       char temp[512];
+       int i;
+       for (i=0; i < rlen; i++)
+               sprintf(temp + (i*3), "-%02X", resp[i]);
+       fprintf(stderr, "Reading CSR UART speed %d [%s]\n", rlen, temp+1);
+       }
+#endif
+
+       /* Now, create the command that will set the UART speed */
+       /* CSR BCC header */
+       cmd[5] = 0x02;                  /* type = SET-REQ */
+       cmd[6] = 0x00;                  /* - msB */
+       cmd[9] = csr_seq & 0xFF;        /* seq num */
+       cmd[10] = (csr_seq >> 8) & 0xFF;/* - msB */
+       csr_seq++;
+
+       switch (u->speed) {
+       case 9600:
+               divisor = 0x0027;
+               break;
+       /* Various speeds ommited */ 
+       case 57600:
+               divisor = 0x00EC;
+               break;
+       case 115200:
+               divisor = 0x01D8;
+               break;
+       /* For Brainbox Pcmcia cards */
+       case 460800:
+               divisor = 0x075F;
+               break;
+       case 921600:
+               divisor = 0x0EBF;
+               break;
+       default:
+               /* Safe default */
+               divisor = 0x01D8;
+               u->speed = 115200;
+               break;
+       }
+       /* No parity, one stop bit -> divisor |= 0x0000; */
+       cmd[15] = (divisor) & 0xFF;             /* divider */
+       cmd[16] = (divisor >> 8) & 0xFF;        /* - msB */
+       /* The rest of the payload will be 0x00 */
+
+#ifdef CSR_DEBUG
+       {
+       char temp[512];
+       int i;
+       for(i = 0; i < clen; i++)
+               sprintf(temp + (i*3), "-%02X", cmd[i]);
+       fprintf(stderr, "Writing CSR UART speed %d [%s]\n", clen, temp + 1);
+       // In theory, it should look like :
+       // 01-00-FC-13-C2-02-00-09-00-03-00-02-68-00-00-BF-0E-00-00-00-00-00-00
+       // 01-00-FC-13-C2-02-00-09-00-01-00-02-68-00-00-D8-01-00-00-00-00-00-00
+       }
+#endif
+
+       /* Send the command to set the CSR UART speed */
+       if (write(fd, cmd, clen) != clen) {
+               perror("Failed to write init command (SET_UART_SPEED)");
+               return -1;
+       }
+       nanosleep(&tm, NULL);
+       return 0;
+}
+
+/* 
+ * Silicon Wave specific initialization 
+ * Thomas Moser <Thomas.Moser@tmoser.ch>
+ */
+static int swave(int fd, struct uart_t *u, struct termios *ti)
+{
+       struct timespec tm = {0, 500000};
+       char cmd[10], rsp[100];
+       int r;
+
+       /* Switch to default Silicon Wave baudrate*/
+       if (set_speed(fd, ti, 115200) < 0) {
+               perror("Can't set default baud rate");
+               return -1;
+       }
+
+       // Silicon Wave set baud rate command
+       // see HCI Vendor Specific Interface from Silicon Wave
+       // first send a "param access set" command to set the
+       // appropriate data fields in RAM. Then send a "HCI Reset
+       // Subcommand", e.g. "soft reset" to make the changes effective.
+
+       cmd[0] = HCI_COMMAND_PKT;       // it's a command packet
+       cmd[1] = 0x0B;                  // OCF 0x0B     = param access set      
+       cmd[2] = 0xfc;                  // OGF bx111111 = vendor specific
+       cmd[3] = 0x06;                  // 6 bytes of data following
+       cmd[4] = 0x01;                  // param sub command
+       cmd[5] = 0x11;                  // tag 17 = 0x11 = HCI Transport Params
+       cmd[6] = 0x03;                  // length of the parameter following
+       cmd[7] = 0x01;                  // HCI Transport flow control enable
+       cmd[8] = 0x01;                  // HCI Transport Type = UART
+
+       switch (u->speed) {
+       case 19200:
+               cmd[9] = 0x03;
+               break;
+       case 38400:
+               cmd[9] = 0x02;
+               break;
+       case 57600:
+               cmd[9] = 0x01;
+               break;
+       case 115200:
+               cmd[9] = 0x00;
+               break;
+       default:
+               u->speed = 115200;
+               cmd[9] = 0x00;
+               break;
+       }
+
+       /* Send initialization command */
+       if (write(fd, cmd, 10) != 5) {
+               perror("Failed to write init command");
+               return -1;
+       }
+
+       // We should wait for a "GET Event" to confirm the success of 
+       // the baud rate setting. Wait some time before reading. Better:  
+       // read with timeout, parse data 
+       // until correct answer, else error handling ... todo ...
+
+       nanosleep(&tm, NULL);
+
+       r = read(fd, rsp, sizeof(rsp));
+       if (r > 0) {
+               // guess it's okay, but we should parse the reply. But since
+               // I don't react on an error anyway ... todo
+               // Response packet format:
+               //  04  Event
+               //  FF  Vendor specific
+               //  07  Parameter length
+               //  0B  Subcommand
+               //  01  Setevent
+               //  11  Tag specifying HCI Transport Layer Parameter
+               //  03  length
+               //  01  flow on
+               //  01  Hci Transport type = Uart
+               //  xx  Baud rate set (see above)
+       } else {        
+               // ups, got error.
+               return -1;
+       }
+
+       // we probably got the reply. Now we must send the "soft reset":
+       cmd[0] = HCI_COMMAND_PKT;       // it's a command packet
+       cmd[1] = 0x0B;                  // OCF 0x0B     = param access set      
+       cmd[2] = 0xfc;                  // OGF bx111111 = vendor specific
+       cmd[3] = 0x01;                  // 1 byte of data following 
+       cmd[4] = 0x03;                  // HCI Reset Subcommand
+                       
+       // Send initialization command
+       if (write(fd, cmd, 5) != 5) {
+               perror("Can't write Silicon Wave reset cmd.");
+               return -1;
+       }
+
+       nanosleep(&tm, NULL);
+                       
+       // now the uart baud rate on the silicon wave module is set and effective.
+       // change our own baud rate as well. Then there is a reset event comming in
+       // on the *new* baud rate. This is *undocumented*! The packet looks like this:
+       // 04 FF 01 0B (which would make that a confirmation of 0x0B = "Param 
+       // subcommand class". So: change to new baud rate, read with timeout, parse
+       // data, error handling. BTW: all param access in Silicon Wave is done this way.
+       // Maybe this code would belong in a seperate file, or at least code reuse...
+
+       return 0;
+}
+
+struct uart_t uart[] = {
+       { "any",      0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, NULL },
+       { "ericsson", 0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, ericsson },
+       { "digi",     0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, digi },
+
+       /* Xircom PCMCIA cards: Credit Card Adapter and Real Port Adapter */
+       { "xircom",   0x0105, 0x080a, HCI_UART_H4, 115200, FLOW_CTL, NULL },
+
+       /* CSR Casira serial adapter or BrainBoxes serial dongle (BL642) */
+       { "csr",      0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, csr },
+
+       /* BrainBoxes PCMCIA card (BL620) */
+       { "bboxes",   0x0160, 0x0002, HCI_UART_H4, 460800, FLOW_CTL, csr },
+
+       /* Silicon Wave kits */
+       { "swave",    0x0000, 0x0000, HCI_UART_H4, 115200, FLOW_CTL, swave },
+
+       /* Sphinx Electronics PICO Card */
+       { "picocard", 0x025e, 0x1000, HCI_UART_H4, 115200, FLOW_CTL, NULL },
+
+        { NULL, 0 }
+};
+
+struct uart_t * get_by_id(int m_id, int p_id)
+{
+       int i;
+       for (i = 0; uart[i].type; i++) {
+               if (uart[i].m_id == m_id && uart[i].p_id == p_id)
+                       return &uart[i];
+       }
+       return NULL;
+}
+
+struct uart_t * get_by_type(char *type)
+{
+       int i;
+       for (i = 0; uart[i].type; i++) {
+               if (!strcmp(uart[i].type, type))
+                       return &uart[i];
+       }
+       return NULL;
+}
+
+/* Initialize UART driver */
+int init_uart(char *dev, struct uart_t *u)
+{
+       struct termios ti;
+       int  fd, i;
+
+       fd = open(dev, O_RDWR | O_NOCTTY);
+       if (fd < 0) {
+               perror("Can't open serial port");
+               return -1;
+       }
+
+       tcflush(fd, TCIOFLUSH);
+
+       if (tcgetattr(fd, &ti) < 0) {
+               perror("Can't get port settings");
+               return -1;
+       }
+
+       cfmakeraw(&ti);
+
+       ti.c_cflag |= CLOCAL;
+       if (u->flags & FLOW_CTL)
+               ti.c_cflag |= CRTSCTS;
+       else
+               ti.c_cflag &= ~CRTSCTS;
+
+       if (tcsetattr(fd, TCSANOW, &ti) < 0) {
+               perror("Can't set port settings");
+               return -1;
+       }
+
+       tcflush(fd, TCIOFLUSH);
+
+       if (u->init && u->init(fd, u, &ti) < 0)
+               return -1;
+
+       tcflush(fd, TCIOFLUSH);
+
+       /* Set actual baudrate */
+       if (set_speed(fd, &ti, u->speed) < 0) {
+               perror("Can't set baud rate");
+               return -1;
+       }
+
+       /* Set TTY to N_HCI line discpline */
+       i = N_HCI;
+       if (ioctl(fd, TIOCSETD, &i) < 0) {
+               perror("Can't set line disc");
+               return -1;
+       }
+
+       if (ioctl(fd, HCIUARTSETPROTO, u->proto) < 0) {
+               perror("Can't set device");
+               return -1;
+       }
+
+       return fd;
+}
+
+static void usage(void)
+{
+       printf("hciattach - HCI UART driver initialization utility\n");
+       printf("Usage:\n");
+       printf("\thciattach <tty> <type | id> [speed] [flow]\n");
+       printf("\thciattach -l\n");
+}
+
+extern int optind, opterr, optopt;
+extern char *optarg;
+
+int main(int argc, char *argv[])
+{
+       struct uart_t *u = NULL;
+       int detach, opt, i, n;
+       int to = 5; 
+       struct sigaction sa;
+       char dev[20];
+
+       detach = 1;
+       
+       while ((opt=getopt(argc, argv, "nt:l")) != EOF) {
+               switch(opt) {
+               case 'n':
+                       detach = 0;
+                       break;
+               
+               case 't':
+                       to = atoi(optarg);
+                       break;
+               
+               case 'l':
+                       for (i = 0; uart[i].type; i++) {
+                               printf("%-10s0x%04x,0x%04x\n", uart[i].type,
+                                                       uart[i].m_id, uart[i].p_id);
+                       }
+                       exit(0);
+       
+               default:
+                       usage();
+                       exit(1);
+               }
+       }
+
+       n = argc - optind;
+       if (n < 2) {
+               usage();
+               exit(1);
+       }
+
+       for (n = 0; optind < argc; n++, optind++) {
+               char *opt;
+       
+               opt = argv[optind];
+               
+               switch(n) {
+               case 0:
+                       dev[0] = 0;
+                       if (!strchr(opt, '/'))
+                               strcpy(dev, "/dev/");
+                       strcat(dev, opt);
+                       break;
+
+               case 1:
+                       if (strchr(argv[optind], ',')) {
+                               int m_id, p_id;
+                               sscanf(argv[optind], "%x,%x", &m_id, &p_id);
+                               u = get_by_id(m_id, p_id);
+                       } else {
+                               u = get_by_type(opt);
+                       }
+
+                       if (!u) {
+                               fprintf(stderr, "Unknow device type or id\n");
+                               exit(1);
+                       }
+                       
+                       break;
+
+               case 2:
+                       u->speed = atoi(argv[optind]);
+                       break;
+
+               case 3:
+                       if (!strcmp("flow", argv[optind]))
+                               u->flags |=  FLOW_CTL;
+                       else
+                               u->flags &= ~FLOW_CTL;
+                       break;
+               }
+       }
+
+       if (!u) {
+               fprintf(stderr, "Unknow device type or id\n");
+               exit(1);
+       }
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_flags = SA_NOCLDSTOP;
+       sa.sa_handler = sig_alarm;
+       sigaction(SIGALRM, &sa, NULL);
+
+       /* 5 seconds should be enought for intialization */
+       alarm(to);
+       
+       n = init_uart(dev, u);
+       if (n < 0) {
+               perror("Can't init device"); 
+               exit(1);
+       }
+
+       alarm(0);
+
+       if (detach) {
+               if (fork()) return 0;
+               for (i=0; i<20; i++)
+                       if (i != n) close(i);
+       }
+
+       while (1) sleep(999999999);
+       return 0;
+}
diff --git a/tools/hciconfig.c b/tools/hciconfig.c
new file mode 100644 (file)
index 0000000..3cbec92
--- /dev/null
@@ -0,0 +1,524 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <termios.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <asm/types.h>
+
+#include <bluetooth.h>
+#include <hci.h>
+#include <hci_lib.h>
+
+extern int optind,opterr,optopt;
+extern char *optarg;
+
+static struct hci_dev_info di;
+static int all;
+
+void print_dev_hdr(struct hci_dev_info *di);
+void print_dev_info(int ctl, struct hci_dev_info *di);
+
+void print_dev_list(int ctl, int flags)
+{
+       struct hci_dev_list_req *dl;
+       struct hci_dev_req *dr;
+       int i;
+
+       if( !(dl = malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t))) ) {
+               perror("Can't allocate memory");
+               exit(1);
+       }
+       dl->dev_num = HCI_MAX_DEV;
+       dr = dl->dev_req;
+
+       if( ioctl(ctl, HCIGETDEVLIST, (void*)dl) ) {
+               perror("Can't get device list");
+               exit(1);
+       }
+       for(i=0; i< dl->dev_num; i++) {
+               di.dev_id = (dr+i)->dev_id;
+               if( ioctl(ctl, HCIGETDEVINFO, (void*)&di) )
+                       continue;
+               print_dev_info(ctl, &di);
+       }
+}
+
+void print_pkt_type(struct hci_dev_info *di)
+{
+       printf("\tPacket type: %s\n", hci_ptypetostr(di->pkt_type));
+}
+
+void print_link_policy(struct hci_dev_info *di)
+{
+       printf("\tLink policy: %s\n", hci_lptostr(di->link_policy));
+}
+
+void print_link_mode(struct hci_dev_info *di)
+{
+       printf("\tLink mode: %s\n", hci_lmtostr(di->link_mode));
+}
+
+void print_dev_features(struct hci_dev_info *di)
+{
+       printf("\tFeatures: 0x%2.2x 0x%2.2x 0x%2.2x 0x%2.2x\n", 
+                       di->features[0], di->features[1],
+                       di->features[2], di->features[3] );
+}
+
+void cmd_rstat(int ctl, int hdev, char *opt)
+{
+       /* Reset HCI device stat counters */
+       if( ioctl(ctl, HCIDEVRESTAT, hdev) < 0 ) {
+               printf("Can't reset stats counters hci%d. %s(%d)\n", hdev, 
+                               strerror(errno), errno);
+               exit(1);
+       }
+}
+
+void cmd_scan(int ctl, int hdev, char *opt)
+{
+       struct hci_dev_req dr;
+
+       dr.dev_id  = hdev;
+       dr.dev_opt = SCAN_DISABLED;
+       if( !strcmp(opt, "iscan") )
+               dr.dev_opt = SCAN_INQUIRY;
+       else if( !strcmp(opt, "pscan") )
+               dr.dev_opt = SCAN_PAGE;
+       else if( !strcmp(opt, "piscan") )
+               dr.dev_opt = SCAN_PAGE | SCAN_INQUIRY;
+
+       if( ioctl(ctl, HCISETSCAN, (unsigned long)&dr) < 0 ) {
+               printf("Can't set scan mode on hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+}
+
+void cmd_auth(int ctl, int hdev, char *opt)
+{
+       struct hci_dev_req dr;
+
+       dr.dev_id = hdev;
+       if( !strcmp(opt, "auth") )
+               dr.dev_opt = AUTH_ENABLED;
+       else
+               dr.dev_opt = AUTH_DISABLED;
+
+       if( ioctl(ctl, HCISETAUTH, (unsigned long)&dr) < 0 ) {
+               printf("Can't set auth on hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+}
+
+void cmd_encrypt(int ctl, int hdev, char *opt)
+{
+       struct hci_dev_req dr;
+
+       dr.dev_id = hdev;
+       if( !strcmp(opt, "encrypt") )
+               dr.dev_opt = ENCRYPT_P2P;
+       else
+               dr.dev_opt = ENCRYPT_DISABLED;
+
+       if( ioctl(ctl, HCISETENCRYPT, (unsigned long)&dr) < 0 ) {
+               printf("Can't set encrypt on hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+}
+
+void cmd_up(int ctl, int hdev, char *opt)
+{
+       int ret;
+
+       /* Start HCI device */
+       if( (ret = ioctl(ctl, HCIDEVUP, hdev)) < 0 ) {
+               if( errno == EALREADY )
+                       return;
+               printf("Can't init device hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+       cmd_scan(ctl,  hdev, "piscan");
+}
+
+void cmd_down(int ctl, int hdev, char *opt)
+{
+       /* Stop HCI device */
+       if (ioctl(ctl, HCIDEVDOWN, hdev) < 0) {
+               printf("Can't down device hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+}
+
+void cmd_reset(int ctl, int hdev, char *opt)
+{
+       /* Reset HCI device
+       if( ioctl(ctl, HCIDEVRESET, hdev) < 0 ){
+          printf("Reset failed hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+          exit(1);
+       }
+       */
+       cmd_down(ctl, hdev, "down");
+       cmd_up(ctl, hdev, "up");
+}
+
+void cmd_ptype(int ctl, int hdev, char *opt)
+{
+       struct hci_dev_req dr;
+
+       dr.dev_id = hdev;
+
+       if (hci_strtoptype(opt, &dr.dev_opt)) {
+               if (ioctl(ctl, HCISETPTYPE, (unsigned long)&dr) < 0) {
+                       printf("Can't set pkttype on hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+                       exit(1);
+               }
+       } else {
+               print_dev_hdr(&di);
+               print_pkt_type(&di);
+       }
+}
+
+void cmd_lp(int ctl, int hdev, char *opt)
+{
+       struct hci_dev_req dr;
+
+       dr.dev_id = hdev;
+
+       if (hci_strtolp(opt, &dr.dev_opt)) {
+               if (ioctl(ctl, HCISETLINKPOL, (unsigned long)&dr) < 0) {
+                       printf("Can't set link policy on hci%d. %s(%d)\n", 
+                                       hdev, strerror(errno), errno);
+                       exit(1);
+               }
+       } else {
+               print_dev_hdr(&di);
+               print_link_policy(&di);
+       }
+}
+
+void cmd_lm(int ctl, int hdev, char *opt)
+{
+       struct hci_dev_req dr;
+
+       dr.dev_id = hdev;
+
+       if (hci_strtolm(opt, &dr.dev_opt)) {
+               if (ioctl(ctl, HCISETLINKMODE, (unsigned long)&dr) < 0) {
+                       printf("Can't set default link mode on hci%d. %s(%d)\n", 
+                                       hdev, strerror(errno), errno);
+                       exit(1);
+               }
+       } else {
+               print_dev_hdr(&di);
+               print_link_mode(&di);
+       }
+}
+
+void cmd_features(int ctl, int hdev, char *opt)
+{
+       print_dev_hdr(&di);
+       print_dev_features(&di);
+}
+
+void cmd_name(int ctl, int hdev, char *opt)
+{
+       struct hci_request rq;
+       int s;
+       if ((s = hci_open_dev(hdev)) < 0) {
+               printf("Can't open device hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+
+       memset(&rq, 0, sizeof(rq));
+
+       if (opt) {
+               change_local_name_cp cp;
+               strcpy(cp.name, opt);
+
+               rq.ogf = OGF_HOST_CTL;
+               rq.ocf = OCF_CHANGE_LOCAL_NAME;
+               rq.cparam = &cp;
+               rq.clen = CHANGE_LOCAL_NAME_CP_SIZE;
+       
+               if (hci_send_req(s, &rq, 1000) < 0) {
+                       printf("Can't change local name on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+                       exit(1);
+               }
+       } else {
+               read_local_name_rp rp;
+
+               rq.ogf = OGF_HOST_CTL;
+               rq.ocf = OCF_READ_LOCAL_NAME;
+               rq.rparam = &rp;
+               rq.rlen = READ_LOCAL_NAME_RP_SIZE;
+               
+               if (hci_send_req(s, &rq, 1000) < 0) {
+                       printf("Can't read local name on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+                       exit(1);
+               }
+               if (rp.status) {
+                       printf("Read local name on hci%d returned status %d\n", hdev, rp.status);
+                       exit(1);
+               }
+               print_dev_hdr(&di);
+               printf("\tName: '%s'\n", rp.name);
+       }
+}
+
+void cmd_class(int ctl, int hdev, char *opt)
+{
+       struct hci_request rq;
+       int s;
+
+       if ((s = hci_open_dev(hdev)) < 0) {
+               printf("Can't open device hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+
+       memset(&rq, 0, sizeof(rq));
+       if (opt) {
+               uint32_t cod = htobl(strtoul(opt, NULL, 16));
+               write_class_of_dev_cp cp;
+
+               memcpy(cp.dev_class, &cod, 3);
+
+               rq.ogf = OGF_HOST_CTL;
+               rq.ocf = OCF_WRITE_CLASS_OF_DEV;
+               rq.cparam = &cp;
+               rq.clen = WRITE_CLASS_OF_DEV_CP_SIZE;
+
+               if (hci_send_req(s, &rq, 1000) < 0) {
+                       printf("Can't write local class of device on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+                       exit(1);
+               }
+       } else {
+               read_class_of_dev_rp rp;
+
+               rq.ogf = OGF_HOST_CTL;
+               rq.ocf = OCF_READ_CLASS_OF_DEV;
+               rq.rparam = &rp;
+               rq.rlen = READ_CLASS_OF_DEV_RP_SIZE;
+
+               if (hci_send_req(s, &rq, 1000) < 0) {
+                       printf("Can't read class of device on hci%d. %s(%d)\n", 
+                               hdev, strerror(errno), errno);
+                       exit(1);
+               }
+
+               if (rp.status) {
+                       printf("Read class of device on hci%d returned status %d\n",
+                               hdev, rp.status);
+                       exit(1);
+               }
+               print_dev_hdr(&di);
+               printf("\tClass: 0x%02x%02x%02x\n", 
+                       rp.dev_class[2], rp.dev_class[1], rp.dev_class[0]);
+       }
+}
+
+void cmd_version(int ctl, int hdev, char *opt)
+{
+       struct hci_version ver;
+       int dd;
+
+       dd = hci_open_dev(hdev);
+       if (dd < 0) {
+               printf("Can't open device hci%d. %s(%d)\n", hdev, strerror(errno), errno);
+               exit(1);
+       }
+
+       if (hci_read_local_version(dd, &ver, 1000) < 0) {
+               printf("Can't read version info hci%d. %s(%d)\n", 
+                       hdev, strerror(errno), errno);
+               exit(1);
+       }
+
+       print_dev_hdr(&di);
+       printf( "\tHCI Ver: 0x%x HCI Rev: 0x%x LMP Ver: 0x%x LMP Subver: 0x%x\n"
+               "\tManufacturer: %d\n",
+               ver.hci_ver, ver.hci_rev, ver.lmp_ver, ver.lmp_subver, 
+               ver.manufacturer);
+}
+
+void print_dev_hdr(struct hci_dev_info *di)
+{
+       static int hdr = -1;
+       bdaddr_t bdaddr;
+
+       if (hdr == di->dev_id)
+               return;
+       hdr = di->dev_id;
+       
+       baswap(&bdaddr, &di->bdaddr);
+
+       printf("%s:\tType: %s\n", di->name, hci_dtypetostr(di->type) );
+       printf("\tBD Address: %s ACL MTU: %d:%d  SCO: MTU %d:%d\n",
+              batostr(&bdaddr), di->acl_mtu, di->acl_max,
+              di->sco_mtu, di->sco_max);
+}
+
+void print_dev_info(int ctl, struct hci_dev_info *di)
+{
+       struct hci_dev_stats *st = &di->stat;
+
+       print_dev_hdr(di);
+
+       printf("\t%s\n", hci_dflagstostr(di->flags) );
+
+       printf("\tRX bytes:%d acl:%d sco:%d events:%d errors:%d\n",
+              st->byte_rx, st->acl_rx, st->sco_rx, st->evt_rx, st->err_rx);
+
+       printf("\tTX bytes:%d acl:%d sco:%d commands:%d errors:%d\n",
+              st->byte_tx, st->acl_tx, st->sco_tx, st->cmd_tx, st->err_tx);
+
+       if (all) {
+               print_dev_features(di);
+               print_pkt_type(di);
+               print_link_policy(di);
+               print_link_mode(di);
+
+               cmd_name(ctl, di->dev_id, NULL);
+               cmd_class(ctl, di->dev_id, NULL);
+               cmd_version(ctl, di->dev_id, NULL);
+       }
+               
+       printf("\n");
+}
+
+struct {
+       char *cmd;
+       void (*func)(int ctl, int hdev, char *opt);
+       char *opt;
+       char *doc;
+} command[] = {
+       { "up",     cmd_up,     0,      "Open and initialize HCI device" },
+       { "down",   cmd_down,   0,      "Close HCI device" },
+       { "reset",  cmd_reset,  0,      "Reset HCI device" },
+       { "rstat",  cmd_rstat,  0,      "Reset statistic counters" },
+       { "auth",   cmd_auth,   0,      "Enable Authentication" },
+       { "noauth", cmd_auth,   0,      "Disable Authentication" },
+       { "encrypt",cmd_encrypt,0,      "Enable Encryption" },
+       { "noencrypt", cmd_encrypt, 0,  "Disable Encryption" },
+       { "piscan", cmd_scan,   0,      "Enable Page and Inquiry scan" },
+       { "noscan", cmd_scan,   0,      "Disable scan" },
+       { "iscan",  cmd_scan,   0,      "Enable Inquiry scan" },
+       { "pscan",  cmd_scan,   0,      "Enable Page scan" },
+       { "ptype",  cmd_ptype,   "[type]",   "Get/Set default packet type" },
+       { "lm",     cmd_lm,      "[mode]",   "Get/Set default link mode"   },
+       { "lp",     cmd_lp,      "[policy]", "Get/Set default link policy" },
+       { "name",   cmd_name,    "[name]",   "Get/Set local name" },
+       { "class",  cmd_class,   "[class]",  "Get/Set class of device" },
+       { "version",    cmd_version, 0,  "Display version information" },
+       { "features",   cmd_features, 0,"Display device features" },
+       { NULL, NULL, 0}
+};
+
+void usage(void)
+{
+       int i;
+
+       printf("hciconfig - HCI device configuration utility\n");
+       printf("Usage:\n"
+               "\thciconfig\n"
+               "\thciconfig [-a] hciX [command]\n");
+       printf("Commands:\n");
+       for (i=0; command[i].cmd; i++)
+               printf("\t%-10s %-8s\t%s\n", command[i].cmd,
+               command[i].opt ? command[i].opt : " ",
+               command[i].doc);
+}
+
+int main(int argc, char *argv[], char *env[])
+{
+       int opt, ctl, i, cmd=0;
+       char *dev;
+
+       while ((opt=getopt(argc, argv,"ha")) != EOF) {
+               switch(opt) {
+               case 'a':
+                       all = 1;
+                       break;
+               case 'h':
+                       usage();
+                       exit(0);
+               }
+       }
+
+       /* Open HCI socket  */
+       if ((ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) {
+               perror("Can't open HCI socket.");
+               exit(1);
+       }
+
+       if (argc - optind < 1) {
+               print_dev_list(ctl, 0);
+               exit(0);
+       }
+
+       dev  = strdup(argv[optind]);
+       di.dev_id = atoi(argv[optind]+3);
+       optind++;
+
+       if (ioctl(ctl, HCIGETDEVINFO, (void*)&di)) {
+               perror("Can't get device info");
+               exit(1);
+       }
+
+       while (optind < argc) {
+               for (i=0; command[i].cmd; i++) {
+                       if (strncmp(command[i].cmd, argv[optind],4)) 
+                               continue;
+
+                       if (command[i].opt)
+                               optind++;
+                       
+                       command[i].func(ctl, di.dev_id, argv[optind]);
+                       cmd = 1;
+                       break;
+               }
+               optind++;
+       }
+
+       if (!cmd)
+               print_dev_info(ctl, &di);
+
+       close(ctl);
+       return 0;
+}
diff --git a/tools/hcisecfilter.c b/tools/hcisecfilter.c
new file mode 100644 (file)
index 0000000..bee16df
--- /dev/null
@@ -0,0 +1,79 @@
+#include <stdio.h>
+#include <sys/socket.h>
+
+#include <bluetooth/bluetooth.h>
+#include <bluetooth/hci.h>
+#include <bluetooth/hci_lib.h>
+
+int main(void)
+{
+       uint32_t type_mask;
+       uint32_t event_mask[2];
+       uint32_t ocf_mask[4];
+
+       // Packet types
+       memset((void *)&type_mask, 0, sizeof(type_mask));
+       hci_set_bit(HCI_EVENT_PKT, &type_mask);
+       
+       printf("Type mask: { 0x%lx }\n", type_mask); 
+
+       // Events
+       memset((void *)event_mask, 0, sizeof(event_mask));
+       hci_set_bit(EVT_INQUIRY_COMPLETE, event_mask);  
+       hci_set_bit(EVT_INQUIRY_RESULT,   event_mask);  
+
+       hci_set_bit(EVT_CONN_COMPLETE, event_mask);     
+       hci_set_bit(EVT_CONN_REQUEST,  event_mask);     
+       hci_set_bit(EVT_DISCONN_COMPLETE, event_mask);  
+
+       hci_set_bit(EVT_AUTH_COMPLETE,  event_mask);    
+       hci_set_bit(EVT_ENCRYPT_CHANGE, event_mask);    
+
+       hci_set_bit(EVT_CMD_COMPLETE, event_mask);
+       hci_set_bit(EVT_CMD_STATUS,   event_mask);
+
+       hci_set_bit(EVT_READ_REMOTE_FEATURES_COMPLETE, event_mask);
+       hci_set_bit(EVT_READ_REMOTE_VERSION_COMPLETE,  event_mask);
+       hci_set_bit(EVT_REMOTE_NAME_REQ_COMPLETE,      event_mask);
+
+       printf("Event mask: { 0x%lx, 0x%lx }\n", event_mask[0], event_mask[1]); 
+
+       // OGF_LINK_CTL
+       memset((void *) ocf_mask, 0, sizeof(ocf_mask));
+       hci_set_bit(OCF_INQUIRY, ocf_mask);
+       hci_set_bit(OCF_REMOTE_NAME_REQ, ocf_mask);
+       hci_set_bit(OCF_READ_REMOTE_FEATURES, ocf_mask);
+       hci_set_bit(OCF_READ_REMOTE_VERSION,  ocf_mask);
+
+       printf("OGF_LINK_CTL: { 0x%lx, 0x%lx, 0x%lx, 0x%lx }\n",
+                       ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]); 
+
+       // OGF_LINK_POLICY
+       memset((void *) ocf_mask, 0, sizeof(ocf_mask));
+       hci_set_bit(OCF_ROLE_DISCOVERY,   ocf_mask);
+       hci_set_bit(OCF_READ_LINK_POLICY, ocf_mask);
+
+       printf("OGF_LINK_POLICY: { 0x%lx, 0x%lx, 0x%lx, 0x%lx }\n",
+                       ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]);
+
+       // OGF_HOST_CTL
+       memset((void *) ocf_mask, 0, sizeof(ocf_mask));
+       hci_set_bit(OCF_READ_AUTH_ENABLE, ocf_mask);
+       hci_set_bit(OCF_READ_ENCRYPT_MODE, ocf_mask);
+       hci_set_bit(OCF_READ_LOCAL_NAME, ocf_mask);
+       hci_set_bit(OCF_READ_CLASS_OF_DEV, ocf_mask);
+
+       printf("OGF_HOST_CTL: { 0x%lx, 0x%lx, 0x%lx, 0x%lx }\n",
+                       ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]); 
+
+       // OGF_INFO_PARAM
+       memset((void *) ocf_mask, 0, sizeof(ocf_mask));
+       hci_set_bit(OCF_READ_LOCAL_VERSION, ocf_mask);
+       hci_set_bit(OCF_READ_LOCAL_FEATURES, ocf_mask);
+       hci_set_bit(OCF_READ_BUFFER_SIZE, ocf_mask);
+       hci_set_bit(OCF_READ_BD_ADDR, ocf_mask);
+       hci_set_bit(OCF_READ_BD_ADDR, ocf_mask);
+
+       printf("OGF_INFO_PARAM: { 0x%lx, 0x%lx, 0x%lx, 0x%lx}\n", 
+                       ocf_mask[0], ocf_mask[1], ocf_mask[2], ocf_mask[3]); 
+}
diff --git a/tools/hcitool.c b/tools/hcitool.c
new file mode 100644 (file)
index 0000000..4d6380f
--- /dev/null
@@ -0,0 +1,368 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include <termios.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <asm/types.h>
+
+#include <bluetooth.h>
+#include <hci.h>
+#include <hci_lib.h>
+
+extern int optind,opterr,optopt;
+extern char *optarg;
+
+static int ctl;
+
+static int for_each_dev(int flag, int(*func)(int d, long arg), long arg)
+{
+       struct hci_dev_list_req *dl;
+       struct hci_dev_req *dr;
+       int i;
+
+       dl = malloc(HCI_MAX_DEV * sizeof(struct hci_dev_req) + sizeof(uint16_t));
+       if (!dl) {
+               perror("Can't allocate memory");
+               return -1;
+       }
+       dl->dev_num = HCI_MAX_DEV;
+       dr = dl->dev_req;
+
+       if (ioctl(ctl, HCIGETDEVLIST, (void*)dl)) {
+               perror("Can't get device list");
+               return -1;
+       }
+       
+       if (!dl->dev_num)
+               return -1;
+
+       for (i=0; i < dl->dev_num; i++, dr++) {
+               if (dr->dev_opt & (1<<flag)) {
+                       if (!func || func(dr->dev_id, arg))
+                               return dr->dev_id;
+               }
+       }
+       return -1;
+}
+
+static int other_bdaddr(int dev_id, long arg)
+{
+       struct hci_dev_info di = {dev_id: dev_id};
+       if (ioctl(ctl, HCIGETDEVINFO, (void*) &di))
+               return 0;
+       return bacmp((bdaddr_t *)arg, &di.bdaddr);
+}
+
+static int get_route(bdaddr_t *bdaddr)
+{
+       if (bdaddr)
+               return for_each_dev(HCI_UP, other_bdaddr, (long) bdaddr);
+       else
+               return for_each_dev(HCI_UP, NULL, 0);
+}
+
+static int dev_info(int dev_id, long arg)
+{
+       struct hci_dev_info di = {dev_id: dev_id};
+       bdaddr_t bdaddr;
+       if (ioctl(ctl, HCIGETDEVINFO, (void*) &di))
+               return 0;
+       
+       baswap(&bdaddr, &di.bdaddr);
+       printf("\t%s\t%s\n", di.name, batostr(&bdaddr));
+       return 0;
+}
+
+static int conn_list(int dev_id, long arg)
+{
+       struct hci_conn_list_req *cl;
+       struct hci_conn_info *ci;
+       int i;
+
+       if (!(cl = malloc(10 * sizeof(*ci) + sizeof(*cl)))) {
+               perror("Can't allocate memory");
+               exit(1);
+       }
+       cl->dev_id = dev_id;
+       cl->conn_num = 10;
+       ci = cl->conn_info;
+
+       if (ioctl(ctl, HCIGETCONNLIST, (void*)cl)) {
+               perror("Can't get connection list");
+               exit(1);
+       }
+
+       for (i=0; i < cl->conn_num; i++, ci++) {
+               bdaddr_t bdaddr;
+               baswap(&bdaddr, &ci->bdaddr);
+               printf("\t%s %s %s handle %d state %d lm %s\n",
+                       ci->out ? "<" : ">",
+                       ci->type == ACL_LINK ? "ACL" : "SCO",
+                       batostr(&bdaddr), ci->handle,
+                       ci->state,
+                       hci_lmtostr(ci->link_mode));
+       }
+       return 0;
+}
+
+static int find_conn(int dev_id, long arg)
+{
+       struct hci_conn_list_req *cl;
+       struct hci_conn_info *ci;
+       int i;
+
+       if (!(cl = malloc(10 * sizeof(*ci) + sizeof(*cl)))) {
+               perror("Can't allocate memory");
+               exit(1);
+       }
+       cl->dev_id = dev_id;
+       cl->conn_num = 10;
+       ci = cl->conn_info;
+
+       if (ioctl(ctl, HCIGETCONNLIST, (void*)cl)) {
+               perror("Can't get connection list");
+               exit(1);
+       }
+
+       for (i=0; i < cl->conn_num; i++, ci++)
+               if (!bacmp((bdaddr_t *)arg, &ci->bdaddr))
+                       return 1;
+       return 0;
+}
+
+static void cmd_dev(int dev_id, char **opt, int nopt)
+{
+       printf("Devices:\n");
+       for_each_dev(HCI_UP, dev_info, 0);      
+}
+
+static void cmd_inq(int dev_id, char **opt, int nopt)
+{
+       inquiry_info *info;
+       int i, num_rsp = 0, length, flags;
+       bdaddr_t bdaddr;
+       
+       if (dev_id < 0)
+               dev_id = get_route(NULL);
+       
+       if (nopt >= 1)
+               length = atoi(opt[0]);
+       else
+               length = 10; /* 10 seconds */
+
+       flags = 0;
+       if (nopt >= 2)
+               flags |= !strncasecmp("f", opt[1], 1) ? IREQ_CACHE_FLUSH : 0;
+               
+       printf("Inquiring ...\n");
+       info = hci_inquiry(dev_id, length, &num_rsp, NULL, flags);
+
+       if (!info) {
+               perror("Inquiry failed.");
+               exit(1);
+       }
+
+       for (i = 0; i < num_rsp; i++) {
+               baswap(&bdaddr, &(info+i)->bdaddr);
+               printf("\t%s\tclock offset: 0x%4.4x\tclass: 0x%2.2x%2.2x%2.2x\n",
+                       batostr(&bdaddr), (info+i)->clock_offset,
+                       (info+i)->dev_class[2], 
+                       (info+i)->dev_class[1], 
+                       (info+i)->dev_class[0]);
+       }
+       free(info);
+}
+
+static void cmd_con(int dev_id, char **opt, int nopt)
+{
+       printf("Connections:\n");
+       if (dev_id < 0)
+               for_each_dev(HCI_UP, conn_list, 0);
+       else
+               conn_list(dev_id, 0);
+}
+
+static void cmd_cc(int dev_id, char **opt, int nopt)
+{
+       bdaddr_t bdaddr;
+       int dd, ptype, role;
+
+       if (nopt < 1)
+               return;
+
+       baswap(&bdaddr, strtoba(opt[0]));
+
+       if (dev_id < 0) {
+               dev_id = get_route(&bdaddr);
+               if (dev_id < 0) {
+                       fprintf(stderr, "Device is not available.\n");
+                       exit(1);
+               }
+       }
+
+       dd = hci_open_dev(dev_id);
+       if (dd < 0) {
+               perror("HCI device open failed");
+               exit(1);
+       }
+
+       if (nopt >= 2)
+               hci_strtoptype(opt[1], &ptype);
+       else
+               ptype = HCI_DM1 | HCI_DM3 | HCI_DM5 | HCI_DH1 | HCI_DH3 | HCI_DH5;
+
+       if (nopt >= 3)
+               role = !strncasecmp("m", opt[2], 1) ? 0 : 1;
+       else
+               role = 0;
+       
+       hci_create_connection(dd, &bdaddr, ptype, role, 1000);
+
+       hci_close_dev(dd);
+}
+
+static void cmd_dc(int dev_id, char **opt, int nopt)
+{
+       struct hci_conn_info_req *cr;
+       bdaddr_t bdaddr;
+       int dd;
+
+       if (nopt < 1)
+               return;
+
+       baswap(&bdaddr, strtoba(*opt));
+
+       if (dev_id < 0) {
+               dev_id = for_each_dev(HCI_UP, find_conn, (long) &bdaddr);
+               if (dev_id < 0) {
+                       fprintf(stderr, "Not connected.\n");
+                       exit(1);
+               }
+       }
+       dd = hci_open_dev(dev_id);
+       if (dd < 0) {
+               perror("HCI device open failed");
+               exit(1);
+       }
+
+        cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
+        if (!cr)
+                return;
+
+        bacpy(&cr->bdaddr, &bdaddr);
+        cr->type = ACL_LINK;
+        if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {
+               perror("Get connection info failed");
+                exit(1);
+        }
+
+       hci_disconnect(dd, cr->conn_info->handle, 0, 100);
+
+       close(dd);
+       free(cr);
+}
+
+struct {
+       char *cmd;
+       void (*func)(int dev_id, char **opt, int nopt);
+       char *opt;
+       char *doc;
+} command[] = {
+       { "dev",  cmd_dev,  0,          "Display local devices"      },
+       { "inq",  cmd_inq,  "[lenght] [flush]", "Inquire remote devices"     },
+       { "con",  cmd_con,  0,          "Display active connections" },
+       { "cc",   cmd_cc,   "<bdaddr> [pkt type] [role]", "Create connection to remote device" },
+       { "dc",   cmd_dc,   "<bdaddr>", "Disconnect from remote device" },
+       { NULL, NULL, 0}
+};
+
+static void usage(void)
+{
+       int i;
+
+       printf("hcitool - HCI Tool\n");
+       printf("Usage:\n"
+               "\thcitool [-i hciX] [command]\n");
+       printf("Commands:\n");
+       for (i=0; command[i].cmd; i++)
+               printf("\t%-4s %-20s\t%s\n", command[i].cmd,
+               command[i].opt ? command[i].opt : " ",
+               command[i].doc);
+}
+
+int main(int argc, char *argv[], char *env[])
+{
+       int opt, i, dev_id = -1;
+       char *dev;
+
+       while ((opt=getopt(argc, argv, "i:h")) != EOF) {
+               switch(opt) {
+               case 'i':
+                       dev    = strdup(optarg);
+                       dev_id = atoi(dev + 3);
+                       break;
+
+               case 'h':
+               default:
+                       usage();
+                       exit(0);
+               }
+       }
+
+       if (argc - optind < 1) {
+               usage();
+               exit(0);
+       }
+
+       /* Open HCI socket  */
+       if ((ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI)) < 0) {
+               perror("Can't open HCI socket.");
+               exit(1);
+       }
+
+       for (i=0; command[i].cmd; i++) {
+               if (strncmp(command[i].cmd, argv[optind], 3)) 
+                       continue;
+               optind++;
+               command[i].func(dev_id, argv + optind, argc - optind);
+               break;
+       }
+
+       close(ctl);
+       return 0;
+}
diff --git a/tools/l2ping.8 b/tools/l2ping.8
new file mode 100644 (file)
index 0000000..41becdb
--- /dev/null
@@ -0,0 +1,49 @@
+.TH L2PING 8 "Jan 22 2002" BlueZ "Linux System Administration"
+.SH NAME
+l2ping \- Send L2CAP echo request and receive answer
+.SH SYNOPSIS
+.B l2ping
+[
+.I -S source addr
+] [
+.I -s size
+] [
+.I -c count
+] [
+.I -f
+] <
+.I bd_addr
+>
+.SH DESCRIPTION
+.LP
+L2ping sends a L2CAP echo request to the Bluetooth MAC address
+.B bd_addr
+given in dotted hex notation.
+.SH OPTIONS
+.TP
+.I -S source addr
+Select address to be used as source address for the request.
+.TP
+.I -s size
+The
+.B size
+of the data packets to be sent.
+.TP
+.I -c count
+Send
+.B count
+number of packets then exit.
+.TP
+.I -f
+Kind of flood ping. Use with care! It reduces the delay time between packets
+to 0.
+.TP
+.I bd_addr
+The Bluetooth MAC address to be pinged in dotted hex notation like
+.B 01:02:03:ab:cd:ef
+or
+.B 01:EF:cd:aB:02:03
+.SH AUTHORS
+Written by Maxim Krasnyansky <maxk@qualcomm.com>
+.PP
+man page by Nils Faerber <nils@kernelconcepts.de>
diff --git a/tools/l2ping.c b/tools/l2ping.c
new file mode 100644 (file)
index 0000000..9bb8a4d
--- /dev/null
@@ -0,0 +1,251 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <sys/poll.h>
+#include <sys/socket.h>
+
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <resolv.h>
+#include <netdb.h>
+
+#include <asm/types.h>
+#include <asm/byteorder.h>
+
+#include "bluetooth.h"
+#include "l2cap.h"
+
+/* Defaults */
+bdaddr_t bdaddr;
+int size  = 20;
+int ident = 200;
+int delay = 1;
+int count = -1;
+
+/* Stats */
+int sent_pkt = 0, recv_pkt = 0;
+
+static float tv2fl(struct timeval tv)
+{
+       return (float)(tv.tv_sec*1000.0) + (float)(tv.tv_usec/1000.0);
+}
+
+static void stat(int sig)
+{
+       int loss = sent_pkt ? (float)((sent_pkt-recv_pkt)/(sent_pkt/100.0)) : 0;
+       printf("%d sent, %d received, %d%% loss\n", sent_pkt, recv_pkt, loss);
+       exit(0);
+}
+
+static void ping(char *svr)
+{
+       struct sockaddr_l2 addr;
+       struct sigaction sa;
+       char buf[2048];
+       int s, i, opt, lost;
+       uint8_t id;
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_handler = stat;
+       sigaction(SIGINT, &sa, NULL);
+
+       if ((s = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP)) < 0) {
+               perror("Can't create socket.");
+               exit(1);
+       }
+
+       memset(&addr, 0, sizeof(addr));
+       addr.l2_family = AF_BLUETOOTH;
+       addr.l2_bdaddr = bdaddr;
+        if (bind(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+               perror("Can't bind socket.");
+               exit(1);
+        }
+
+       baswap(&addr.l2_bdaddr, strtoba(svr));
+       if (connect(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+               perror("Can't connect.");
+               exit(1);
+       }
+
+       /* Get local address */
+       opt = sizeof(addr);
+       if( getsockname(s, (struct sockaddr *)&addr, &opt) < 0 ) {
+               perror("Can't get local address.");
+               exit(1);
+       }
+       baswap(&bdaddr, &addr.l2_bdaddr);
+
+       printf("Ping: %s from %s (data size %d) ...\n", svr, batostr(&bdaddr), size);
+
+       /* Initialize buffer */
+       for(i = L2CAP_CMD_HDR_SIZE; i < sizeof(buf); i++)
+               buf[i]=(i%40)+'A';
+
+       id = ident;
+
+       while( count == -1 || count-- > 0 ){
+               struct timeval tv_send, tv_recv, tv_diff;
+               l2cap_cmd_hdr *cmd = (l2cap_cmd_hdr *) buf;
+
+               /* Build command header */
+               cmd->code  = L2CAP_ECHO_REQ;
+               cmd->ident = id;
+               cmd->len   = __cpu_to_le16(size);
+
+               gettimeofday(&tv_send, NULL);
+
+               /* Send Echo Request */
+               if( send(s, buf, size + L2CAP_CMD_HDR_SIZE, 0) <= 0 ){
+                       perror("Send failed");
+                       exit(1);
+               }
+
+               /* Wait for Echo Response */
+               lost = 0;
+               while( 1 ) {
+                       struct pollfd pf[1];
+                       register int err;
+
+                       pf[0].fd = s; pf[0].events = POLLIN;
+                       if( (err = poll(pf, 1, 10*1000)) < 0 ) {
+                               perror("Poll failed");
+                               exit(1);
+                       }
+
+                       if( !err ){
+                               lost = 1;
+                               break;
+                       }
+
+                       if( (err = recv(s, buf, sizeof(buf), 0)) < 0 ) {
+                               perror("Recv failed");
+                               exit(1);
+                       }
+
+                       if( !err ){
+                               printf("Disconnected\n");
+                               exit(1);
+                       }
+
+                       cmd->len = __le16_to_cpu(cmd->len);
+
+                       /* Check for our id */
+                       if( cmd->ident != id )
+                               continue;
+
+                       /* Check type */
+                       if( cmd->code == L2CAP_ECHO_RSP )
+                               break;
+                       if( cmd->code == L2CAP_COMMAND_REJ ){
+                               printf("Peer doesn't support Echo packets\n");
+                               exit(1);
+                       }
+
+               }
+               sent_pkt++;
+
+               if( !lost ){
+                       recv_pkt++;
+
+                       gettimeofday(&tv_recv, NULL);
+                       timersub(&tv_recv, &tv_send, &tv_diff);
+
+                       printf("%d bytes from %s id %d time %.2fms\n", cmd->len, svr, id, tv2fl(tv_diff));
+
+                       if( delay ) sleep(delay);
+               } else {
+                       printf("no response from %s: id %d\n", svr, id);
+               }
+
+               if( ++id > 254 ) id = ident;
+       }
+       stat(0);
+}
+
+static void usage(void)
+{
+       printf("l2ping - L2CAP ping\n");
+       printf("Usage:\n");
+       printf("\tl2ping [-S source addr] [-s size] [-c count] [-f] <bd_addr>\n");
+}
+
+extern int optind,opterr,optopt;
+extern char *optarg;
+
+int main(int argc, char *argv[])
+{
+       register int opt;
+
+       /* Default options */
+       bacpy(&bdaddr, BDADDR_ANY);
+
+       while ((opt=getopt(argc,argv,"s:c:fS:")) != EOF) {
+               switch(opt) {
+               case 'f':
+                       /* Kinda flood ping */
+                       delay = 0;
+                       break;
+
+               case 'c':
+                       count = atoi(optarg);
+                       break;
+
+               case 's':
+                       size = atoi(optarg);
+                       break;
+
+               case 'S':
+                       baswap(&bdaddr, strtoba(optarg));
+                       break;
+
+               default:
+                       usage();
+                       exit(1);
+               }
+       }
+
+       if (!(argc - optind)) {
+               usage();
+               exit(1);
+       }
+
+       ping(argv[optind]);
+
+       return 0;
+}
diff --git a/tools/l2test.c b/tools/l2test.c
new file mode 100644 (file)
index 0000000..be0b59e
--- /dev/null
@@ -0,0 +1,493 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <resolv.h>
+#include <netdb.h>
+#include <sys/socket.h>
+
+#include <bluetooth.h>
+#include <l2cap.h>
+
+/* Test modes */
+enum {
+       SEND,
+       RECV,
+       RECONNECT,
+       MULTY,
+       DUMP,
+       CONNECT
+};
+
+unsigned char *buf;
+
+/* Default mtu */
+int imtu = 672;
+int omtu = 0;
+
+/* Default data size */
+long data_size = 672;
+
+/* Default addr and psm */
+bdaddr_t bdaddr;
+unsigned short psm = 10;
+
+int master = 0;
+int auth = 0;
+int encrypt = 0;
+
+float tv2fl(struct timeval tv)
+{
+       return (float)tv.tv_sec + (float)(tv.tv_usec/1000000.0);
+}
+
+int do_connect(char *svr)
+{
+       struct sockaddr_l2 rem_addr, loc_addr;
+       struct l2cap_options opts;
+       int s, opt;
+
+       if( (s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)) < 0 ) {
+               syslog(LOG_ERR, "Can't create socket. %s(%d)", strerror(errno), errno);
+               return -1;
+       }
+
+       memset(&loc_addr, 0, sizeof(loc_addr));
+       loc_addr.l2_family = AF_BLUETOOTH;
+       loc_addr.l2_bdaddr = bdaddr;
+       if( bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) < 0 ) {
+               syslog(LOG_ERR, "Can't bind socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       /* Get default options */
+       opt = sizeof(opts);
+       if( getsockopt(s, SOL_L2CAP, L2CAP_OPTIONS, &opts, &opt) < 0 ) {
+               syslog(LOG_ERR, "Can't get default L2CAP options. %s(%d)", strerror(errno), errno);
+               return -1;      
+       }
+
+       /* Set new options */
+       opts.omtu = omtu;
+       opts.imtu = imtu;
+       if( setsockopt(s, SOL_L2CAP, L2CAP_OPTIONS, &opts, opt) < 0 ) {
+               syslog(LOG_ERR, "Can't set L2CAP options. %s(%d)", strerror(errno), errno);
+               return -1;
+       }
+
+       memset(&rem_addr, 0, sizeof(rem_addr));
+       rem_addr.l2_family = AF_BLUETOOTH;
+       baswap(&rem_addr.l2_bdaddr, strtoba(svr));
+       rem_addr.l2_psm = htobs(psm);
+       if( connect(s, (struct sockaddr *)&rem_addr, sizeof(rem_addr)) < 0 ){
+               syslog(LOG_ERR, "Can't connect. %s(%d)", strerror(errno), errno);
+               return -1;
+       }
+
+       opt = sizeof(opts);
+       if( getsockopt(s, SOL_L2CAP, L2CAP_OPTIONS, &opts, &opt) < 0 ){
+               syslog(LOG_ERR, "Can't get L2CAP options. %s(%d)", strerror(errno), errno);
+               return -1;
+       }
+
+       syslog(LOG_INFO, "Connected [imtu %d, omtu %d, flush_to %d]\n",
+              opts.imtu, opts.omtu, opts.flush_to);
+
+       return s;
+}
+
+void do_listen( void (*handler)(int sk) )
+{
+       struct sockaddr_l2 loc_addr, rem_addr;
+       struct l2cap_options opts;
+       int  s, s1, opt;
+       bdaddr_t ba;
+
+       if( (s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP)) < 0 ) {
+               syslog(LOG_ERR, "Can't create socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       loc_addr.l2_family = AF_BLUETOOTH;
+       loc_addr.l2_bdaddr = bdaddr;
+       loc_addr.l2_psm    = htobs(psm);
+       if( bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) < 0 ) {
+               syslog(LOG_ERR, "Can't bind socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       if( listen(s, 10) ) {
+               syslog(LOG_ERR,"Can not listen on the socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       /* Get default options */
+       opt = sizeof(opts);
+       if (getsockopt(s, SOL_L2CAP, L2CAP_OPTIONS, &opts, &opt) < 0) {
+               syslog(LOG_ERR, "Can't get default L2CAP options. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       /* Set new options */
+       opts.imtu = imtu;
+       if (setsockopt(s, SOL_L2CAP, L2CAP_OPTIONS, &opts, opt) < 0) {
+               syslog(LOG_ERR, "Can't set L2CAP options. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+
+       /* Set link mode */
+       opt = 0;
+       if (master)
+                opt |= L2CAP_LM_MASTER;
+
+       if (auth)
+                opt |= L2CAP_LM_AUTH;
+
+       if (encrypt)
+                opt |= L2CAP_LM_ENCRYPT;
+
+       if (setsockopt(s, SOL_L2CAP, L2CAP_LM, &opt, sizeof(opt)) < 0) {
+               syslog(LOG_ERR, "Can't set L2CAP link mode. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       syslog(LOG_INFO,"Waiting for connection on psm %d ...", psm);
+
+       while(1) {
+               opt = sizeof(rem_addr);
+               if( (s1 = accept(s, (struct sockaddr *)&rem_addr, &opt)) < 0 ) {
+                       syslog(LOG_ERR,"Accept failed. %s(%d)", strerror(errno), errno);
+                       exit(1);
+               }
+               if( fork() ) {
+                       /* Parent */
+                       close(s1);
+                       continue;
+               }
+               /* Child */
+
+               close(s);
+
+               opt = sizeof(opts);
+               if( getsockopt(s1, SOL_L2CAP, L2CAP_OPTIONS, &opts, &opt) < 0 ) {
+                       syslog(LOG_ERR, "Can't get L2CAP options. %s(%d)", strerror(errno), errno);
+                       exit(1);
+               }
+
+               baswap(&ba, &rem_addr.l2_bdaddr);
+               syslog(LOG_INFO, "Connect from %s [imtu %d, omtu %d, flush_to %d]\n",
+                      batostr(&ba), opts.imtu, opts.omtu, opts.flush_to);
+
+               handler(s1);
+
+               syslog(LOG_INFO, "Disconnect\n");
+               exit(0);
+       }
+}
+
+void dump_mode(int s)
+{
+       int len;
+
+       syslog(LOG_INFO,"Receiving ...");
+       while ((len = read(s, buf, data_size)) > 0)
+               syslog(LOG_INFO, "Recevied %d bytes\n", len);
+}
+
+void recv_mode(int s)
+{
+       struct timeval tv_beg,tv_end,tv_diff;
+       long total;
+       uint32_t seq;
+
+       syslog(LOG_INFO,"Receiving ...");
+
+       seq = 0;
+       while (1) {
+               gettimeofday(&tv_beg,NULL);
+               total = 0;
+               while (total < data_size) {
+                       uint32_t sq;
+                       uint16_t l;
+                       int i,r;
+
+                       if ((r = recv(s, buf, data_size, 0)) <= 0) {
+                               if (r < 0)
+                                       syslog(LOG_ERR, "Read failed. %s(%d)",
+                                                       strerror(errno), errno);
+                               return; 
+                       }
+
+                       /* Check sequence */
+                       sq = btohl(*(uint32_t *)buf);
+                       if (seq != sq) {
+                               syslog(LOG_INFO, "seq missmatch: %d -> %d", seq, sq);
+                               seq = sq;
+                       }
+                       seq++;
+                       
+                       /* Check length */
+                       l = btohs(*(uint16_t *)(buf+4));
+                       if (r != l) {
+                               syslog(LOG_INFO, "size missmatch: %d -> %d", r, l);
+                               continue;
+                       }
+                       
+                       /* Verify data */       
+                       for (i=6; i < r; i++) {
+                               if (buf[i] != 0x7f)
+                                       syslog(LOG_INFO, "data missmatch: byte %d 0x%2.2x", i, buf[i]);
+                       }
+
+                       total += r;
+               }
+               gettimeofday(&tv_end,NULL);
+
+               timersub(&tv_end,&tv_beg,&tv_diff);
+
+               syslog(LOG_INFO,"%ld bytes in %.2f sec, %.2f kB/s",total,
+                      tv2fl(tv_diff), (float)(total / tv2fl(tv_diff) ) / 1024.0);
+       }
+}
+
+void send_mode(char *svr)
+{
+       uint32_t seq;
+       int s, i;
+
+       if( (s = do_connect(svr)) < 0 ){
+               syslog(LOG_ERR, "Can't connect to the server. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       syslog(LOG_INFO,"Sending ...");
+
+       for(i=6; i < data_size; i++)
+               buf[i]=0x7f;
+
+       seq = 0;
+       while(1){
+               *(uint32_t *)buf = htobl(seq++);
+               *(uint16_t *)(buf+4) = htobs(data_size);
+               
+               if( send(s, buf, data_size, 0) <= 0 ) {
+                       syslog(LOG_ERR, "Send failed. %s(%d)", strerror(errno), errno);
+                       exit(1);
+               }
+       }
+}
+
+void reconnect_mode(char *svr)
+{
+       while(1){
+               int s;
+               if( (s = do_connect(svr)) < 0 ){
+                       syslog(LOG_ERR, "Can't connect to the server. %s(%d)", strerror(errno), errno);
+                       exit(1);
+               }
+               close(s);
+
+               usleep(10);
+       }
+}
+
+void connect_mode(char *svr)
+{
+       int s;
+       if ((s = do_connect(svr)) < 0) {
+               syslog(LOG_ERR, "Can't connect to the server. %s(%d)", 
+                               strerror(errno), errno);
+               exit(1);
+       }
+       sleep(99999999);
+}
+
+void multy_connect_mode(char *svr)
+{
+       while(1){
+               int i, s;
+               for(i=0; i<10; i++){
+                       if( fork() ) continue;
+
+                       /* Child */
+                       if( (s = do_connect(svr)) < 0 ){
+                               syslog(LOG_ERR, "Can't connect to the server. %s(%d)", strerror(errno), errno);
+                       }
+                       close(s);
+                       exit(0);
+               }
+               sleep(19);
+       }
+}
+
+void usage(void)
+{
+       printf("l2test - L2CAP testing\n"
+               "Usage:\n");
+       printf("\tl2test <mode> [-b bytes] [-S bd_addr] [-P psm] [-I imtu] [-O omtu] [-M] [bd_addr]\n");
+       printf("Modes:\n"
+               "\t-d dump (server)\n"
+               "\t-n silent connect (client)\n"
+               "\t-c reconnect (client)\n"
+               "\t-m multiple connects (client)\n"
+               "\t-r receive (server)\n"
+               "\t-s send (client)\n");
+}
+
+extern int optind,opterr,optopt;
+extern char *optarg;
+
+int main(int argc ,char *argv[])
+{
+       struct sigaction sa;
+       int opt, mode = RECV;
+
+       while ((opt=getopt(argc,argv,"rdscmnb:P:I:O:S:MAE")) != EOF) {
+               switch(opt) {
+               case 'r':
+                       mode = RECV;
+                       break;
+               
+               case 's':
+                       mode = SEND;
+                       break;
+
+               case 'd':
+                       mode = DUMP;
+                       break;
+
+               case 'c':
+                       mode = RECONNECT;
+                       break;
+
+               case 'n':
+                       mode = CONNECT;
+                       break;
+
+               case 'm':
+                       mode = MULTY;
+                       break;
+
+               case 'b':
+                       data_size = atoi(optarg);
+                       break;
+
+               case 'S':
+                       baswap(&bdaddr, strtoba(optarg));
+                       break;
+
+               case 'P':
+                       psm = atoi(optarg);
+                       break;
+
+               case 'I':
+                       imtu = atoi(optarg);
+                       break;
+
+               case 'O':
+                       omtu = atoi(optarg);
+                       break;
+
+               case 'M':
+                       master = 1;
+                       break;
+
+               case 'A':
+                       auth = 1;
+                       break;
+
+               case 'E':
+                       encrypt = 1;
+                       break;
+
+               default:
+                       usage();
+                       exit(1);
+               }
+       }
+
+       if (!(argc - optind) && (mode!=RECV && mode !=DUMP)) {
+               usage();
+               exit(1);
+       }
+
+       if (!(buf = malloc(data_size))) {
+               perror("Can't allocate data buffer");
+               exit(1);
+       }
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_handler = SIG_IGN;
+       sa.sa_flags   = SA_NOCLDSTOP;
+       sigaction(SIGCHLD, &sa, NULL);
+
+       openlog("l2test", LOG_PERROR | LOG_PID, LOG_LOCAL0);
+
+       switch( mode ){
+               case RECV:
+                       do_listen(recv_mode);
+                       break;
+
+               case DUMP:
+                       do_listen(dump_mode);
+                       break;
+
+               case SEND:
+                       send_mode(argv[optind]);
+                       break;
+
+               case RECONNECT:
+                       reconnect_mode(argv[optind]);
+                       break;
+
+               case MULTY:
+                       multy_connect_mode(argv[optind]);
+                       break;
+
+               case CONNECT:
+                       connect_mode(argv[optind]);
+                       break;
+       }
+       syslog(LOG_INFO, "Exit");
+
+       closelog();
+
+       return 0;
+}
diff --git a/tools/scotest.c b/tools/scotest.c
new file mode 100644 (file)
index 0000000..4b56d08
--- /dev/null
@@ -0,0 +1,358 @@
+/* 
+       BlueZ - Bluetooth protocol stack for Linux
+       Copyright (C) 2000-2001 Qualcomm Incorporated
+
+       Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License version 2 as
+       published by the Free Software Foundation;
+
+       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+       OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+       FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
+       IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY CLAIM,
+       OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER
+       RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+       NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
+       USE OR PERFORMANCE OF THIS SOFTWARE.
+
+       ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS, COPYRIGHTS,
+       TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS SOFTWARE IS DISCLAIMED.
+*/
+
+/*
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <resolv.h>
+#include <netdb.h>
+#include <sys/socket.h>
+
+#include <bluetooth.h>
+#include <sco.h>
+
+/* Test modes */
+enum {
+       SEND,
+       RECV,
+       RECONNECT,
+       MULTY,
+       DUMP
+};
+
+unsigned char *buf;
+
+/* Default data size */
+long data_size = 672;
+
+bdaddr_t bdaddr;
+
+float tv2fl(struct timeval tv)
+{
+       return (float)tv.tv_sec + (float)(tv.tv_usec/1000000.0);
+}
+
+int do_connect(char *svr)
+{
+       struct sockaddr_sco rem_addr, loc_addr;
+       int s;
+
+       if( (s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO)) < 0 ) {
+               syslog(LOG_ERR, "Can't create socket. %s(%d)", strerror(errno), errno);
+               return -1;
+       }
+
+       memset(&loc_addr, 0, sizeof(loc_addr));
+       loc_addr.sco_family = AF_BLUETOOTH;
+       loc_addr.sco_bdaddr = bdaddr;
+       if( bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) < 0 ) {
+               syslog(LOG_ERR, "Can't bind socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       memset(&rem_addr, 0, sizeof(rem_addr));
+       rem_addr.sco_family = AF_BLUETOOTH;
+       baswap(&rem_addr.sco_bdaddr, strtoba(svr));
+       if( connect(s, (struct sockaddr *)&rem_addr, sizeof(rem_addr)) < 0 ){
+               syslog(LOG_ERR, "Can't connect. %s(%d)", strerror(errno), errno);
+               return -1;
+       }
+
+       syslog(LOG_INFO, "Connected\n");
+
+       return s;
+}
+
+void do_listen( void (*handler)(int sk) )
+{
+       struct sockaddr_sco loc_addr, rem_addr;
+       int  s, s1, opt;
+       bdaddr_t ba;
+
+       if( (s = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO)) < 0 ) {
+               syslog(LOG_ERR, "Can't create socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       loc_addr.sco_family = AF_BLUETOOTH;
+       loc_addr.sco_bdaddr = bdaddr;
+       if( bind(s, (struct sockaddr *) &loc_addr, sizeof(loc_addr)) < 0 ) {
+               syslog(LOG_ERR, "Can't bind socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       if( listen(s, 10) ) {
+               syslog(LOG_ERR,"Can not listen on the socket. %s(%d)", strerror(errno), errno);
+               exit(1);
+       }
+
+       syslog(LOG_INFO,"Waiting for connection ...");
+
+       while(1) {
+               opt = sizeof(rem_addr);
+               if( (s1 = accept(s, (struct sockaddr *)&rem_addr, &opt)) < 0 ) {
+                       syslog(LOG_ERR,"Accept failed. %s(%d)", strerror(errno), errno);
+                       exit(1);
+               }
+               if( fork() ) {
+                       /* Parent */
+                       close(s1);
+                       continue;
+               }
+               /* Child */
+
+               close(s);
+
+               baswap(&ba, &rem_addr.sco_bdaddr);
+               syslog(LOG_INFO, "Connect from %s\n", batostr(&ba));
+
+               handler(s1);
+
+               syslog(LOG_INFO, "Disconnect\n");
+               exit(0);
+       }
+}
+
+void dump_mode(int s)
+{
+       int len;
+
+       syslog(LOG_INFO,"Receiving ...");
+       while ((len = read(s, buf, data_size)) > 0)
+               syslog(LOG_INFO, "Recevied %d bytes\n", len);
+}
+
+void recv_mode(int s)
+{
+       struct timeval tv_beg,tv_end,tv_diff;
+       long total;
+       uint32_t seq;
+
+       syslog(LOG_INFO, "Receiving ...");
+
+       seq = 0;
+       while (1) {
+               gettimeofday(&tv_beg,NULL);
+               total = 0;
+               while (total < data_size) {
+                       int r;
+                       if ((r = recv(s, buf, data_size, 0)) <= 0) {
+                               if (r < 0)
+                                       syslog(LOG_ERR, "Read failed. %s(%d)",
+                                                       strerror(errno), errno);
+                               return; 
+                       }
+                       total += r;
+               }
+               gettimeofday(&tv_end,NULL);
+
+               timersub(&tv_end,&tv_beg,&tv_diff);
+
+               syslog(LOG_INFO,"%ld bytes in %.2fm speed %.2f kb",total,
+                      tv2fl(tv_diff) / 60.0,
+                      (float)( total / tv2fl(tv_diff) ) / 1024.0 );
+       }
+}
+
+void send_mode(char *svr)
+{
+       struct sco_options so;
+       uint32_t seq;
+       int s, i, opt;
+
+       if ((s = do_connect(svr)) < 0) {
+               syslog(LOG_ERR, "Can't connect to the server. %s(%d)", 
+                               strerror(errno), errno);
+               exit(1);
+       }
+
+       opt = sizeof(so);
+       if (getsockopt(s, SOL_SCO, SCO_OPTIONS, &so, &opt) < 0) {
+               syslog(LOG_ERR, "Can't get SCO options. %s(%d)", 
+                               strerror(errno), errno);
+               exit(1);
+       }       
+
+       
+       syslog(LOG_INFO,"Sending ...");
+
+       for (i=6; i < so.mtu; i++)
+               buf[i]=0x7f;
+
+       seq = 0;
+       while (1) {
+               *(uint32_t *)buf = htobl(seq++);
+               *(uint16_t *)(buf+4) = htobs(data_size);
+               
+               if (send(s, buf, so.mtu, 0) <= 0) {
+                       syslog(LOG_ERR, "Send failed. %s(%d)", 
+                                       strerror(errno), errno);
+                       exit(1);
+               }
+               usleep(1);
+       }
+}
+
+void reconnect_mode(char *svr)
+{
+       while(1){
+               int s;
+               if( (s = do_connect(svr)) < 0 ){
+                       syslog(LOG_ERR, "Can't connect to the server. %s(%d)", strerror(errno), errno);
+                       exit(1);
+               }
+               close(s);
+
+               sleep(5);
+       }
+}
+
+void multy_connect_mode(char *svr)
+{
+       while(1){
+               int i, s;
+               for(i=0; i<10; i++){
+                       if( fork() ) continue;
+
+                       /* Child */
+                       if( (s = do_connect(svr)) < 0 ){
+                               syslog(LOG_ERR, "Can't connect to the server. %s(%d)", strerror(errno), errno);
+                       }
+                       close(s);
+                       exit(0);
+               }
+               sleep(19);
+       }
+}
+
+void usage(void)
+{
+       printf("scotest - SCO testing\n"
+               "Usage:\n");
+       printf("\tscotest <mode> [-b bytes] [bd_addr]\n");
+       printf("Modes:\n"
+               "\t-d dump (server)\n"
+               "\t-c reconnect (client)\n"
+               "\t-m multiple connects (client)\n"
+               "\t-r receive (server)\n"
+               "\t-s send (client)\n");
+}
+
+extern int optind,opterr,optopt;
+extern char *optarg;
+
+int main(int argc ,char *argv[])
+{
+       struct sigaction sa;
+       int opt, mode = RECV;
+
+       while ((opt=getopt(argc,argv,"rdscmb:")) != EOF) {
+               switch(opt) {
+               case 'r':
+                       mode = RECV;
+                       break;
+               
+               case 's':
+                       mode = SEND;
+                       break;
+
+               case 'd':
+                       mode = DUMP;
+                       break;
+
+               case 'c':
+                       mode = RECONNECT;
+                       break;
+
+               case 'm':
+                       mode = MULTY;
+                       break;
+
+               case 'b':
+                       data_size = atoi(optarg);
+                       break;
+
+               default:
+                       usage();
+                       exit(1);
+               }
+       }
+
+       if (!(argc - optind) && (mode!=RECV && mode !=DUMP)) {
+               usage();
+               exit(1);
+       }
+
+       if (!(buf = malloc(data_size))) {
+               perror("Can't allocate data buffer");
+               exit(1);
+       }
+
+       memset(&sa, 0, sizeof(sa));
+       sa.sa_handler = SIG_IGN;
+       sa.sa_flags   = SA_NOCLDSTOP;
+       sigaction(SIGCHLD, &sa, NULL);
+
+       openlog("scotest", LOG_PERROR | LOG_PID, LOG_LOCAL0);
+
+       switch( mode ){
+               case RECV:
+                       do_listen(recv_mode);
+                       break;
+
+               case DUMP:
+                       do_listen(dump_mode);
+                       break;
+
+               case SEND:
+                       send_mode(argv[optind]);
+                       break;
+
+               case RECONNECT:
+                       reconnect_mode(argv[optind]);
+                       break;
+
+               case MULTY:
+                       multy_connect_mode(argv[optind]);
+                       break;
+       }
+       syslog(LOG_INFO, "Exit");
+
+       closelog();
+
+       return 0;
+}