mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-15 16:24:28 +08:00
Initial revision
This commit is contained in:
commit
c98b2f82a4
22
AUTHORS
Normal file
22
AUTHORS
Normal file
@ -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.
|
304
COPYING
Normal file
304
COPYING
Normal file
@ -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
|
20
ChangeLog
Normal file
20
ChangeLog
Normal file
@ -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.
|
7
Makefile.am
Normal file
7
Makefile.am
Normal file
@ -0,0 +1,7 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
EXTRA_DIST = ChangeLog README CREDITS
|
||||
|
||||
SUBDIRS = hcid tools scripts pcmcia
|
342
Makefile.in
Normal file
342
Makefile.in
Normal file
@ -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:
|
35
README
Normal file
35
README
Normal file
@ -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>
|
99
acinclude.m4
Normal file
99
acinclude.m4
Normal file
@ -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
|
||||
])
|
213
aclocal.m4
vendored
Normal file
213
aclocal.m4
vendored
Normal file
@ -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])
|
||||
|
951
config.guess
vendored
Executable file
951
config.guess
vendored
Executable file
@ -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
|
955
config.sub
vendored
Executable file
955
config.sub
vendored
Executable file
@ -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
|
89
configure.in
Normal file
89
configure.in
Normal file
@ -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)
|
28
hcid/Makefile.am
Normal file
28
hcid/Makefile.am
Normal file
@ -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)
|
362
hcid/Makefile.in
Normal file
362
hcid/Makefile.in
Normal file
@ -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:
|
63
hcid/hcid.conf
Normal file
63
hcid/hcid.conf
Normal file
@ -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;
|
||||
}
|
92
hcid/hcid.h
Normal file
92
hcid/hcid.h
Normal file
@ -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);
|
75
hcid/kword.c
Normal file
75
hcid/kword.c
Normal file
@ -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;
|
||||
}
|
36
hcid/kword.h
Normal file
36
hcid/kword.h
Normal file
@ -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);
|
129
hcid/lexer.l
Normal file
129
hcid/lexer.l
Normal file
@ -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;
|
||||
}
|
171
hcid/lib.c
Normal file
171
hcid/lib.c
Normal file
@ -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);
|
||||
}
|
85
hcid/lib.h
Normal file
85
hcid/lib.h
Normal file
@ -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;
|
||||
}
|
430
hcid/main.c
Normal file
430
hcid/main.c
Normal file
@ -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;
|
||||
}
|
272
hcid/parser.y
Normal file
272
hcid/parser.y
Normal file
@ -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;
|
||||
}
|
477
hcid/security.c
Normal file
477
hcid/security.c
Normal file
@ -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;
|
||||
}
|
251
install-sh
Executable file
251
install-sh
Executable file
@ -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
|
198
missing
Executable file
198
missing
Executable file
@ -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
|
40
mkinstalldirs
Executable file
40
mkinstalldirs
Executable file
@ -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
|
12
pcmcia/Makefile.am
Normal file
12
pcmcia/Makefile.am
Normal file
@ -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)
|
198
pcmcia/Makefile.in
Normal file
198
pcmcia/Makefile.in
Normal file
@ -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:
|
34
pcmcia/bluetooth
Executable file
34
pcmcia/bluetooth
Executable file
@ -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
|
26
pcmcia/bluetooth.conf
Normal file
26
pcmcia/bluetooth.conf
Normal file
@ -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"
|
18
scripts/Makefile.am
Normal file
18
scripts/Makefile.am
Normal file
@ -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
|
227
scripts/Makefile.in
Normal file
227
scripts/Makefile.in
Normal file
@ -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:
|
148
scripts/bluepin
Executable file
148
scripts/bluepin
Executable file
@ -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()
|
72
scripts/bluetooth.rc.rh
Executable file
72
scripts/bluetooth.rc.rh
Executable file
@ -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
|
10
tools/Makefile.am
Normal file
10
tools/Makefile.am
Normal file
@ -0,0 +1,10 @@
|
||||
#
|
||||
# $Id$
|
||||
#
|
||||
|
||||
mandir = $(prefix)/usr/share/man
|
||||
|
||||
sbin_PROGRAMS = hciattach hciconfig
|
||||
bin_PROGRAMS = hcitool l2ping
|
||||
|
||||
man_MANS = hciattach.8 l2ping.8
|
433
tools/Makefile.in
Normal file
433
tools/Makefile.in
Normal file
@ -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:
|
102
tools/hciattach.8
Normal file
102
tools/hciattach.8
Normal file
@ -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>
|
751
tools/hciattach.c
Normal file
751
tools/hciattach.c
Normal file
@ -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;
|
||||
}
|
524
tools/hciconfig.c
Normal file
524
tools/hciconfig.c
Normal file
@ -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;
|
||||
}
|
79
tools/hcisecfilter.c
Normal file
79
tools/hcisecfilter.c
Normal file
@ -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]);
|
||||
}
|
368
tools/hcitool.c
Normal file
368
tools/hcitool.c
Normal file
@ -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;
|
||||
}
|
49
tools/l2ping.8
Normal file
49
tools/l2ping.8
Normal file
@ -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>
|
251
tools/l2ping.c
Normal file
251
tools/l2ping.c
Normal file
@ -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;
|
||||
}
|
493
tools/l2test.c
Normal file
493
tools/l2test.c
Normal file
@ -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;
|
||||
}
|
358
tools/scotest.c
Normal file
358
tools/scotest.c
Normal file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user