diff options
| -rw-r--r-- | AUTHORS | 22 | ||||
| -rw-r--r-- | COPYING | 304 | ||||
| -rw-r--r-- | ChangeLog | 20 | ||||
| -rw-r--r-- | INSTALL | 0 | ||||
| -rw-r--r-- | Makefile.am | 7 | ||||
| -rw-r--r-- | Makefile.in | 342 | ||||
| -rw-r--r-- | NEWS | 0 | ||||
| -rw-r--r-- | README | 35 | ||||
| -rw-r--r-- | acinclude.m4 | 99 | ||||
| -rw-r--r-- | aclocal.m4 | 213 | ||||
| -rwxr-xr-x | config.guess | 951 | ||||
| -rwxr-xr-x | config.sub | 955 | ||||
| -rwxr-xr-x | configure | 2217 | ||||
| -rw-r--r-- | configure.in | 89 | ||||
| -rw-r--r-- | hcid/Makefile.am | 28 | ||||
| -rw-r--r-- | hcid/Makefile.in | 362 | ||||
| -rw-r--r-- | hcid/hcid.conf | 63 | ||||
| -rw-r--r-- | hcid/hcid.h | 92 | ||||
| -rw-r--r-- | hcid/kword.c | 75 | ||||
| -rw-r--r-- | hcid/kword.h | 36 | ||||
| -rw-r--r-- | hcid/lexer.l | 129 | ||||
| -rw-r--r-- | hcid/lib.c | 171 | ||||
| -rw-r--r-- | hcid/lib.h | 85 | ||||
| -rw-r--r-- | hcid/main.c | 430 | ||||
| -rw-r--r-- | hcid/parser.y | 272 | ||||
| -rw-r--r-- | hcid/security.c | 477 | ||||
| -rwxr-xr-x | install-sh | 251 | ||||
| -rwxr-xr-x | missing | 198 | ||||
| -rwxr-xr-x | mkinstalldirs | 40 | ||||
| -rw-r--r-- | pcmcia/Makefile.am | 12 | ||||
| -rw-r--r-- | pcmcia/Makefile.in | 198 | ||||
| -rwxr-xr-x | pcmcia/bluetooth | 34 | ||||
| -rw-r--r-- | pcmcia/bluetooth.conf | 26 | ||||
| -rw-r--r-- | scripts/Makefile.am | 18 | ||||
| -rw-r--r-- | scripts/Makefile.in | 227 | ||||
| -rwxr-xr-x | scripts/bluepin | 148 | ||||
| -rwxr-xr-x | scripts/bluetooth.rc.rh | 72 | ||||
| -rw-r--r-- | tools/Makefile.am | 10 | ||||
| -rw-r--r-- | tools/Makefile.in | 433 | ||||
| -rw-r--r-- | tools/hciattach.8 | 102 | ||||
| -rw-r--r-- | tools/hciattach.c | 751 | ||||
| -rw-r--r-- | tools/hciconfig.c | 524 | ||||
| -rw-r--r-- | tools/hcisecfilter.c | 79 | ||||
| -rw-r--r-- | tools/hcitool.c | 368 | ||||
| -rw-r--r-- | tools/l2ping.8 | 49 | ||||
| -rw-r--r-- | tools/l2ping.c | 251 | ||||
| -rw-r--r-- | tools/l2test.c | 493 | ||||
| -rw-r--r-- | tools/scotest.c | 358 | 
48 files changed, 12116 insertions, 0 deletions
| diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..08f12162 --- /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 index 00000000..357e7469 --- /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 index 00000000..7149ba9b --- /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 index 00000000..e69de29b --- /dev/null +++ b/INSTALL diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..17255ef5 --- /dev/null +++ b/Makefile.am @@ -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 index 00000000..03dcae4e --- /dev/null +++ b/Makefile.in @@ -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: @@ -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 index 00000000..1dc30479 --- /dev/null +++ b/acinclude.m4 @@ -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 index 00000000..7b89b4b2 --- /dev/null +++ b/aclocal.m4 @@ -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 index 00000000..2960d6e0 --- /dev/null +++ b/config.guess @@ -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 index 00000000..00bea6e6 --- /dev/null +++ b/config.sub @@ -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 index 00000000..8b56bff4 --- /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 index 00000000..7bcfab76 --- /dev/null +++ b/configure.in @@ -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 index 00000000..edc4f653 --- /dev/null +++ b/hcid/Makefile.am @@ -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 index 00000000..037379a9 --- /dev/null +++ b/hcid/Makefile.in @@ -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 index 00000000..cfd06e5f --- /dev/null +++ b/hcid/hcid.conf @@ -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 index 00000000..677a02dd --- /dev/null +++ b/hcid/hcid.h @@ -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 index 00000000..a496591f --- /dev/null +++ b/hcid/kword.c @@ -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 index 00000000..854c91d0 --- /dev/null +++ b/hcid/kword.h @@ -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 index 00000000..a7af9c63 --- /dev/null +++ b/hcid/lexer.l @@ -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 index 00000000..ac47603d --- /dev/null +++ b/hcid/lib.c @@ -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 index 00000000..4683c0ff --- /dev/null +++ b/hcid/lib.h @@ -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 index 00000000..5b3c3d30 --- /dev/null +++ b/hcid/main.c @@ -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 index 00000000..e8be6c99 --- /dev/null +++ b/hcid/parser.y @@ -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 index 00000000..bca27805 --- /dev/null +++ b/hcid/security.c @@ -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 index 00000000..e9de2384 --- /dev/null +++ b/install-sh @@ -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 index 00000000..d46f79f6 --- /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 index 00000000..6b3b5fc5 --- /dev/null +++ b/mkinstalldirs @@ -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 index 00000000..3664b3e7 --- /dev/null +++ b/pcmcia/Makefile.am @@ -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 index 00000000..ed120814 --- /dev/null +++ b/pcmcia/Makefile.in @@ -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 index 00000000..ea22ce40 --- /dev/null +++ b/pcmcia/bluetooth @@ -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 index 00000000..ca48419d --- /dev/null +++ b/pcmcia/bluetooth.conf @@ -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 index 00000000..12f32c78 --- /dev/null +++ b/scripts/Makefile.am @@ -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 index 00000000..d750a69c --- /dev/null +++ b/scripts/Makefile.in @@ -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 index 00000000..db1f8196 --- /dev/null +++ b/scripts/bluepin @@ -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 index 00000000..f0586788 --- /dev/null +++ b/scripts/bluetooth.rc.rh @@ -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 index 00000000..d3133e5f --- /dev/null +++ b/tools/Makefile.am @@ -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 index 00000000..fe838a44 --- /dev/null +++ b/tools/Makefile.in @@ -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 index 00000000..b327336b --- /dev/null +++ b/tools/hciattach.8 @@ -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 index 00000000..a4489019 --- /dev/null +++ b/tools/hciattach.c @@ -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 index 00000000..3cbec922 --- /dev/null +++ b/tools/hciconfig.c @@ -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 index 00000000..bee16df1 --- /dev/null +++ b/tools/hcisecfilter.c @@ -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 index 00000000..4d6380fb --- /dev/null +++ b/tools/hcitool.c @@ -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 index 00000000..41becdba --- /dev/null +++ b/tools/l2ping.8 @@ -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 index 00000000..9bb8a4d6 --- /dev/null +++ b/tools/l2ping.c @@ -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 index 00000000..be0b59e1 --- /dev/null +++ b/tools/l2test.c @@ -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 index 00000000..4b56d081 --- /dev/null +++ b/tools/scotest.c @@ -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; +} | 
