head	1.6;
access;
symbols
	RELENG_8_4:1.6.0.2
	RELENG_9_1_0_RELEASE:1.5.2.1.4.2
	RELENG_9_1:1.5.2.1.0.4
	RELENG_9_1_BP:1.5.2.1
	RELENG_8_3_0_RELEASE:1.4.2.2.6.1
	RELENG_8_3:1.4.2.2.0.6
	RELENG_8_3_BP:1.4.2.2
	RELENG_9_0_0_RELEASE:1.5.2.1.2.1
	RELENG_9_0:1.5.2.1.0.2
	RELENG_9_0_BP:1.5.2.1
	RELENG_9:1.5.0.2
	RELENG_9_BP:1.5
	RELENG_7_4_0_RELEASE:1.3.2.1.2.1
	RELENG_8_2_0_RELEASE:1.4.2.2.4.1
	RELENG_7_4:1.3.2.1.0.2
	RELENG_7_4_BP:1.3.2.1
	RELENG_8_2:1.4.2.2.0.4
	RELENG_8_2_BP:1.4.2.2
	RELENG_8_1_0_RELEASE:1.4.2.2.2.1
	RELENG_8_1:1.4.2.2.0.2
	RELENG_8_1_BP:1.4.2.2
	RELENG_7_3_0_RELEASE:1.3.10.1
	RELENG_7_3:1.3.0.10
	RELENG_7_3_BP:1.3
	RELENG_8_0_0_RELEASE:1.4.2.1.2.1
	RELENG_8_0:1.4.2.1.0.2
	RELENG_8_0_BP:1.4.2.1
	RELENG_8:1.4.0.2
	RELENG_8_BP:1.4
	RELENG_7_2_0_RELEASE:1.3.8.1
	RELENG_7_2:1.3.0.8
	RELENG_7_2_BP:1.3
	RELENG_7_1_0_RELEASE:1.3.6.1
	RELENG_6_4_0_RELEASE:1.1.2.2.4.1
	RELENG_7_1:1.3.0.6
	RELENG_7_1_BP:1.3
	RELENG_6_4:1.1.2.2.0.4
	RELENG_6_4_BP:1.1.2.2
	RELENG_7_0_0_RELEASE:1.3
	RELENG_6_3_0_RELEASE:1.1.2.2
	RELENG_7_0:1.3.0.4
	RELENG_7_0_BP:1.3
	RELENG_6_3:1.1.2.2.0.2
	RELENG_6_3_BP:1.1.2.2
	RELENG_7:1.3.0.2
	RELENG_7_BP:1.3
	RELENG_6_2_0_RELEASE:1.1.2.1
	RELENG_6_2:1.1.2.1.0.4
	RELENG_6_2_BP:1.1.2.1
	RELENG_5_5_0_RELEASE:1.1.4.1
	RELENG_5_5:1.1.4.1.0.2
	RELENG_5_5_BP:1.1.4.1
	RELENG_6_1_0_RELEASE:1.1.2.1
	RELENG_6_1:1.1.2.1.0.2
	RELENG_6_1_BP:1.1.2.1
	RELENG_5:1.1.0.4
	RELENG_6:1.1.0.2;
locks; strict;
comment	@# @;


1.6
date	2012.11.17.01.49.04;	author svnexp;	state Exp;
branches
	1.6.2.1;
next	1.5;

1.5
date	2010.05.14.04.53.57;	author dougb;	state Exp;
branches
	1.5.2.1;
next	1.4;

1.4
date	2008.07.19.20.11.33;	author marcel;	state Exp;
branches
	1.4.2.1;
next	1.3;

1.3
date	2006.12.31.10.37.18;	author yar;	state Exp;
branches
	1.3.2.1
	1.3.6.1
	1.3.8.1
	1.3.10.1;
next	1.2;

1.2
date	2006.12.30.22.53.20;	author yar;	state Exp;
branches;
next	1.1;

1.1
date	2005.11.10.19.09.22;	author emax;	state Exp;
branches
	1.1.2.1
	1.1.4.1;
next	;

1.6.2.1
date	2012.11.17.01.49.04;	author svnexp;	state dead;
branches;
next	1.6.2.2;

1.6.2.2
date	2013.03.28.13.02.43;	author svnexp;	state Exp;
branches;
next	;

1.5.2.1
date	2011.09.23.00.51.37;	author kensmith;	state Exp;
branches
	1.5.2.1.2.1
	1.5.2.1.4.1;
next	1.5.2.2;

1.5.2.2
date	2012.11.17.11.36.11;	author svnexp;	state Exp;
branches;
next	;

1.5.2.1.2.1
date	2011.11.11.04.20.22;	author kensmith;	state Exp;
branches;
next	1.5.2.1.2.2;

1.5.2.1.2.2
date	2012.11.17.08.36.11;	author svnexp;	state Exp;
branches;
next	;

1.5.2.1.4.1
date	2012.08.05.23.54.33;	author kensmith;	state Exp;
branches;
next	1.5.2.1.4.2;

1.5.2.1.4.2
date	2012.11.17.08.47.01;	author svnexp;	state Exp;
branches;
next	;

1.4.2.1
date	2009.08.03.08.13.06;	author kensmith;	state Exp;
branches
	1.4.2.1.2.1;
next	1.4.2.2;

1.4.2.2
date	2010.05.14.19.28.16;	author dougb;	state Exp;
branches
	1.4.2.2.2.1
	1.4.2.2.4.1
	1.4.2.2.6.1;
next	1.4.2.3;

1.4.2.3
date	2012.11.17.10.35.56;	author svnexp;	state Exp;
branches;
next	;

1.4.2.1.2.1
date	2009.10.25.01.10.29;	author kensmith;	state Exp;
branches;
next	;

1.4.2.2.2.1
date	2010.06.14.02.09.06;	author kensmith;	state Exp;
branches;
next	;

1.4.2.2.4.1
date	2010.12.21.17.09.25;	author kensmith;	state Exp;
branches;
next	;

1.4.2.2.6.1
date	2012.03.03.06.15.13;	author kensmith;	state Exp;
branches;
next	1.4.2.2.6.2;

1.4.2.2.6.2
date	2012.11.17.08.24.38;	author svnexp;	state Exp;
branches;
next	;

1.3.2.1
date	2010.05.14.19.36.11;	author dougb;	state Exp;
branches
	1.3.2.1.2.1;
next	1.3.2.2;

1.3.2.2
date	2012.11.17.08.01.20;	author svnexp;	state Exp;
branches;
next	;

1.3.2.1.2.1
date	2010.12.21.17.10.29;	author kensmith;	state Exp;
branches;
next	1.3.2.1.2.2;

1.3.2.1.2.2
date	2012.11.17.08.16.37;	author svnexp;	state Exp;
branches;
next	;

1.3.6.1
date	2008.11.25.02.59.29;	author kensmith;	state Exp;
branches;
next	;

1.3.8.1
date	2009.04.15.03.14.26;	author kensmith;	state Exp;
branches;
next	;

1.3.10.1
date	2010.02.10.00.26.20;	author kensmith;	state Exp;
branches;
next	;

1.1.2.1
date	2005.11.23.18.03.33;	author emax;	state Exp;
branches;
next	1.1.2.2;

1.1.2.2
date	2007.10.25.14.36.11;	author mtm;	state Exp;
branches
	1.1.2.2.4.1;
next	1.1.2.3;

1.1.2.3
date	2010.05.14.19.57.18;	author dougb;	state Exp;
branches;
next	1.1.2.4;

1.1.2.4
date	2012.11.17.07.39.06;	author svnexp;	state Exp;
branches;
next	;

1.1.2.2.4.1
date	2008.10.02.02.57.24;	author kensmith;	state Exp;
branches;
next	;

1.1.4.1
date	2005.11.23.22.51.01;	author emax;	state Exp;
branches;
next	;


desc
@@


1.6
log
@Switching exporter and resync
@
text
@#!/bin/sh
#
# Copyright (c) 2005 Maksim Yevmenkin <m_evmenkin@@yahoo.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD: head/etc/rc.d/bluetooth 208060 2010-05-14 04:53:57Z dougb $

# PROVIDE: bluetooth
# REQUIRE: DAEMON
# KEYWORD: nojail nostart

. /etc/rc.subr

name="bluetooth"
rcvar=
start_cmd="bluetooth_start"
stop_cmd="bluetooth_stop"
required_modules="ng_bluetooth ng_hci ng_l2cap ng_btsocket"

##############################################################################
# Read and parse Bluetooth device configuration file
##############################################################################

bluetooth_read_conf()
{
	local _err _file _line _namespace

	_file=$1
	_namespace=$2
	_err=0

	if [ ! -e $_file ]; then
		return 0
	fi

	if [ ! -f $_file -o ! -r $_file ]; then
		err 1 "Bluetooth configuration file $_file is not a file or not readable"
	fi

	while read _line
	do
		case "$_line" in
		\#*)
			continue
			;;

		*)
			if [ -z "$_line" ]; then
				continue;
			fi


			if expr "$_line" : "[a-zA-Z0-9_]*=" > /dev/null 2>&1; then
				eval "${_namespace}${_line}"
			else
				warn "Unable to parse line \"$_line\" in $_file"
				_err=1
			fi
			;;
		esac
	done < $_file

	return $_err
}

##############################################################################
# Setup Bluetooth stack. Create and connect nodes
##############################################################################

bluetooth_setup_stack()
{
	dev=$1
	shift
	hook=$1
	shift

	# Setup HCI
	ngctl mkpeer ${dev}: hci ${hook} drv \
		> /dev/null 2>&1 || return 1

	ngctl name ${dev}:${hook} ${dev}hci \
		> /dev/null 2>&1 || return 1

	ngctl msg ${dev}hci: set_debug ${bluetooth_device_hci_debug_level} \
		> /dev/null 2>&1 || return 1

	# Setup L2CAP
	ngctl mkpeer ${dev}hci: l2cap acl hci \
		> /dev/null 2>&1 || return 1

	ngctl name ${dev}hci:acl ${dev}l2cap \
		> /dev/null 2>&1 || return 1

	ngctl msg ${dev}l2cap: set_debug ${bluetooth_device_l2cap_debug_level} \
		> /dev/null 2>&1 || return 1

	# Connect HCI node to the Bluetooth sockets layer
	ngctl connect ${dev}hci: btsock_hci_raw: raw ${dev}raw \
		> /dev/null 2>&1 || return 1

	# Connect L2CAP node to Bluetooth sockets layer
	ngctl connect ${dev}l2cap: btsock_l2c_raw: ctl ${dev}ctl \
		> /dev/null 2>&1 || return 1

	ngctl connect ${dev}l2cap: btsock_l2c: l2c ${dev}l2c \
		> /dev/null 2>&1 || return 1

	# Initilalize HCI node
	${hccontrol} -n ${dev}hci reset \
		> /dev/null 2>&1 || return 1

	${hccontrol} -n ${dev}hci read_bd_addr \
		> /dev/null 2>&1 || return 1

	${hccontrol} -n ${dev}hci read_local_supported_features \
		> /dev/null 2>&1 || return 1

	${hccontrol} -n ${dev}hci read_buffer_size \
		> /dev/null 2>&1 || return 1

	if checkyesno bluetooth_device_discoverable; then
		if checkyesno bluetooth_device_connectable; then
			${hccontrol} -n ${dev}hci write_scan_enable 3 \
				> /dev/null 2>&1 || return 1
		else
			${hccontrol} -n ${dev}hci write_scan_enable 1 \
				> /dev/null 2>&1 || return 1
		fi
	else
		if checkyesno bluetooth_device_connectable; then
			${hccontrol} -n ${dev}hci write_scan_enable 2 \
				> /dev/null 2>&1 || return 1
		else
			${hccontrol} -n ${dev}hci write_scan_enable 0 \
				> /dev/null 2>&1 || return 1
		fi
	fi


	${hccontrol} -n ${dev}hci write_class_of_device ${bluetooth_device_class} \
		> /dev/null 2>&1 || return 1

	if checkyesno bluetooth_device_authentication_enable; then
		${hccontrol} -n ${dev}hci write_authentication_enable 1 \
			> /dev/null 2>&1 || return 1
	else
		${hccontrol} -n ${dev}hci write_authentication_enable 0 \
			> /dev/null 2>&1 || return 1
	fi

	case "${bluetooth_device_encryption_mode}" in
	[Nn][Oo][Nn][Ee]|0)
		${hccontrol} -n ${dev}hci write_encryption_mode 0 \
			> /dev/null 2>&1 || return 1
		;;

	[Pp][2][Pp]|1)
		${hccontrol} -n ${dev}hci write_encryption_mode 1 \
			> /dev/null 2>&1 || return 1
		;;

	[Al][Ll][Ll]|2)
		${hccontrol} -n ${dev}hci write_encryption_mode 2 \
			> /dev/null 2>&1 || return 1
		;;

	*)
		warn "Unsupported encryption mode ${bluetooth_device_encryption_mode} for device ${dev}"
		return 1
		;;
	esac

	if checkyesno bluetooth_device_role_switch; then
		${hccontrol} -n ${dev}hci write_node_role_switch 1 \
			> /dev/null 2>&1 || return 1
	else
		${hccontrol} -n ${dev}hci write_node_role_switch 0 \
			> /dev/null 2>&1 || return 1
	fi

	${hccontrol} -n ${dev}hci change_local_name "${bluetooth_device_local_name}" \
		> /dev/null 2>&1 || return 1

	${hccontrol} -n ${dev}hci initialize \
		> /dev/null 2>&1 || return 1

	return 0
}

##############################################################################
# Shutdown Bluetooth stack. Destroy all nodes
##############################################################################

bluetooth_shutdown_stack()
{
	dev=$1

	ngctl shutdown ${dev}hci: > /dev/null 2>&1
	ngctl shutdown ${dev}l2cap: > /dev/null 2>&1

	return 0
}

##############################################################################
# bluetooth_start()
##############################################################################

bluetooth_start()
{
	local _file

	dev=$1

	# Try to figure out device type by looking at device name
	case "${dev}" in
	# uartX - serial/UART Bluetooth device
	uart*)
		load_kld ng_h4 || return 1

		hook="hook"

		# Obtain unit number from device.
		unit=`expr ${dev} : 'uart\([0-9]\{1,\}\)'`
		if [ -z "${unit}" ]; then
			err 1 "Unable to get uart unit number: ${dev}"
		fi

		${hcseriald} -f /dev/cuau${unit} -n ${dev}
		sleep 1 # wait a little bit

		if [ ! -f "/var/run/hcseriald.${dev}.pid" ]; then
			err 1 "Unable to start hcseriald on ${dev}"
		fi
		;;

	# 3Com Bluetooth Adapter 3CRWB60-A
	btccc*)
		hook="hook"

		# Obtain unit number from device.
		unit=`expr ${dev} : 'btccc\([0-9]\{1,\}\)'`
		if [ -z "${unit}" ]; then
			err 1 "Unable to get bt3c unit number: ${dev}"
		fi
		;;

	# USB Bluetooth adapters
	ubt*)
		hook="hook"

		# Obtain unit number from device.
		unit=`expr ${dev} : 'ubt\([0-9]\{1,\}\)'`
		if [ -z "${unit}" ]; then
			err 1 "Unable to get ubt unit number: ${dev}"
		fi
		;;

	# Unknown
	*)
		err 1 "Unsupported device: ${dev}"
		;;
	esac

	# Be backward compatible and setup reasonable defaults
	bluetooth_device_authentication_enable="0"
	bluetooth_device_class="ff:01:0c"
	bluetooth_device_connectable="1"
	bluetooth_device_discoverable="1"
	bluetooth_device_encryption_mode="0"
	bluetooth_device_hci_debug_level="3"
	bluetooth_device_l2cap_debug_level="3"
	bluetooth_device_local_name="`/usr/bin/uname -n` (${dev})"
	bluetooth_device_role_switch="1"

	# Load default device configuration parameters
	_file="/etc/defaults/bluetooth.device.conf"

	if ! bluetooth_read_conf $_file bluetooth_device_ ; then
		err 1 "Unable to read default Bluetooth configuration from $_file"
	fi

	# Load device specific overrides
	_file="/etc/bluetooth/$dev.conf"

	if ! bluetooth_read_conf $_file bluetooth_device_ ; then
		err 1 "Unable to read Bluetooth device configuration from $_file"
	fi

	# Setup stack
	if ! bluetooth_setup_stack ${dev} ${hook} ; then
		bluetooth_shutdown_stack $dev
		err 1 "Unable to setup Bluetooth stack for device ${dev}"
	fi

	return 0
}

##############################################################################
# bluetooth_stop()
##############################################################################

bluetooth_stop()
{
	dev=$1

	# Try to figure out device type by looking at device name
	case "${dev}" in
	# uartX - serial/UART Bluetooth device
	uart*)
		if [ -f "/var/run/hcseriald.${dev}.pid" ]; then
			kill `cat /var/run/hcseriald.${dev}.pid`
			sleep 1 # wait a little bit
		fi
		;;

	# 3Com Bluetooth Adapter 3CRWB60-A
	btccc*)
		;;

	# USB Bluetooth adapters
	ubt*)
		;;

	# Unknown
	*)
		err 1 "Unsupported device: ${dev}"
		;;
	esac

	bluetooth_shutdown_stack ${dev}

	return 0
}

##############################################################################
# Start here
##############################################################################

load_rc_config $name
hccontrol="${bluetooth_hccontrol:-/usr/sbin/hccontrol}"
hcseriald="${bluetooth_hcseriald:-/usr/sbin/hcseriald}"

run_rc_command $*

@


1.6.2.1
log
@file bluetooth was added on branch RELENG_8_4 on 2013-03-28 13:02:43 +0000
@
text
@d1 365
@


1.6.2.2
log
@## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/248810
## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated
@
text
@a0 365
#!/bin/sh
#
# Copyright (c) 2005 Maksim Yevmenkin <m_evmenkin@@yahoo.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
# $FreeBSD: releng/8.4/etc/rc.d/bluetooth 208094 2010-05-14 19:28:16Z dougb $

# PROVIDE: bluetooth
# REQUIRE: DAEMON
# KEYWORD: nojail nostart

. /etc/rc.subr

name="bluetooth"
rcvar=
start_cmd="bluetooth_start"
stop_cmd="bluetooth_stop"
required_modules="ng_bluetooth ng_hci ng_l2cap ng_btsocket"

##############################################################################
# Read and parse Bluetooth device configuration file
##############################################################################

bluetooth_read_conf()
{
	local _err _file _line _namespace

	_file=$1
	_namespace=$2
	_err=0

	if [ ! -e $_file ]; then
		return 0
	fi

	if [ ! -f $_file -o ! -r $_file ]; then
		err 1 "Bluetooth configuration file $_file is not a file or not readable"
	fi

	while read _line
	do
		case "$_line" in
		\#*)
			continue
			;;

		*)
			if [ -z "$_line" ]; then
				continue;
			fi


			if expr "$_line" : "[a-zA-Z0-9_]*=" > /dev/null 2>&1; then
				eval "${_namespace}${_line}"
			else
				warn "Unable to parse line \"$_line\" in $_file"
				_err=1
			fi
			;;
		esac
	done < $_file

	return $_err
}

##############################################################################
# Setup Bluetooth stack. Create and connect nodes
##############################################################################

bluetooth_setup_stack()
{
	dev=$1
	shift
	hook=$1
	shift

	# Setup HCI
	ngctl mkpeer ${dev}: hci ${hook} drv \
		> /dev/null 2>&1 || return 1

	ngctl name ${dev}:${hook} ${dev}hci \
		> /dev/null 2>&1 || return 1

	ngctl msg ${dev}hci: set_debug ${bluetooth_device_hci_debug_level} \
		> /dev/null 2>&1 || return 1

	# Setup L2CAP
	ngctl mkpeer ${dev}hci: l2cap acl hci \
		> /dev/null 2>&1 || return 1

	ngctl name ${dev}hci:acl ${dev}l2cap \
		> /dev/null 2>&1 || return 1

	ngctl msg ${dev}l2cap: set_debug ${bluetooth_device_l2cap_debug_level} \
		> /dev/null 2>&1 || return 1

	# Connect HCI node to the Bluetooth sockets layer
	ngctl connect ${dev}hci: btsock_hci_raw: raw ${dev}raw \
		> /dev/null 2>&1 || return 1

	# Connect L2CAP node to Bluetooth sockets layer
	ngctl connect ${dev}l2cap: btsock_l2c_raw: ctl ${dev}ctl \
		> /dev/null 2>&1 || return 1

	ngctl connect ${dev}l2cap: btsock_l2c: l2c ${dev}l2c \
		> /dev/null 2>&1 || return 1

	# Initilalize HCI node
	${hccontrol} -n ${dev}hci reset \
		> /dev/null 2>&1 || return 1

	${hccontrol} -n ${dev}hci read_bd_addr \
		> /dev/null 2>&1 || return 1

	${hccontrol} -n ${dev}hci read_local_supported_features \
		> /dev/null 2>&1 || return 1

	${hccontrol} -n ${dev}hci read_buffer_size \
		> /dev/null 2>&1 || return 1

	if checkyesno bluetooth_device_discoverable; then
		if checkyesno bluetooth_device_connectable; then
			${hccontrol} -n ${dev}hci write_scan_enable 3 \
				> /dev/null 2>&1 || return 1
		else
			${hccontrol} -n ${dev}hci write_scan_enable 1 \
				> /dev/null 2>&1 || return 1
		fi
	else
		if checkyesno bluetooth_device_connectable; then
			${hccontrol} -n ${dev}hci write_scan_enable 2 \
				> /dev/null 2>&1 || return 1
		else
			${hccontrol} -n ${dev}hci write_scan_enable 0 \
				> /dev/null 2>&1 || return 1
		fi
	fi


	${hccontrol} -n ${dev}hci write_class_of_device ${bluetooth_device_class} \
		> /dev/null 2>&1 || return 1

	if checkyesno bluetooth_device_authentication_enable; then
		${hccontrol} -n ${dev}hci write_authentication_enable 1 \
			> /dev/null 2>&1 || return 1
	else
		${hccontrol} -n ${dev}hci write_authentication_enable 0 \
			> /dev/null 2>&1 || return 1
	fi

	case "${bluetooth_device_encryption_mode}" in
	[Nn][Oo][Nn][Ee]|0)
		${hccontrol} -n ${dev}hci write_encryption_mode 0 \
			> /dev/null 2>&1 || return 1
		;;

	[Pp][2][Pp]|1)
		${hccontrol} -n ${dev}hci write_encryption_mode 1 \
			> /dev/null 2>&1 || return 1
		;;

	[Al][Ll][Ll]|2)
		${hccontrol} -n ${dev}hci write_encryption_mode 2 \
			> /dev/null 2>&1 || return 1
		;;

	*)
		warn "Unsupported encryption mode ${bluetooth_device_encryption_mode} for device ${dev}"
		return 1
		;;
	esac

	if checkyesno bluetooth_device_role_switch; then
		${hccontrol} -n ${dev}hci write_node_role_switch 1 \
			> /dev/null 2>&1 || return 1
	else
		${hccontrol} -n ${dev}hci write_node_role_switch 0 \
			> /dev/null 2>&1 || return 1
	fi

	${hccontrol} -n ${dev}hci change_local_name "${bluetooth_device_local_name}" \
		> /dev/null 2>&1 || return 1

	${hccontrol} -n ${dev}hci initialize \
		> /dev/null 2>&1 || return 1

	return 0
}

##############################################################################
# Shutdown Bluetooth stack. Destroy all nodes
##############################################################################

bluetooth_shutdown_stack()
{
	dev=$1

	ngctl shutdown ${dev}hci: > /dev/null 2>&1
	ngctl shutdown ${dev}l2cap: > /dev/null 2>&1

	return 0
}

##############################################################################
# bluetooth_start()
##############################################################################

bluetooth_start()
{
	local _file

	dev=$1

	# Try to figure out device type by looking at device name
	case "${dev}" in
	# uartX - serial/UART Bluetooth device
	uart*)
		load_kld ng_h4 || return 1

		hook="hook"

		# Obtain unit number from device.
		unit=`expr ${dev} : 'uart\([0-9]\{1,\}\)'`
		if [ -z "${unit}" ]; then
			err 1 "Unable to get uart unit number: ${dev}"
		fi

		${hcseriald} -f /dev/cuau${unit} -n ${dev}
		sleep 1 # wait a little bit

		if [ ! -f "/var/run/hcseriald.${dev}.pid" ]; then
			err 1 "Unable to start hcseriald on ${dev}"
		fi
		;;

	# 3Com Bluetooth Adapter 3CRWB60-A
	btccc*)
		hook="hook"

		# Obtain unit number from device.
		unit=`expr ${dev} : 'btccc\([0-9]\{1,\}\)'`
		if [ -z "${unit}" ]; then
			err 1 "Unable to get bt3c unit number: ${dev}"
		fi
		;;

	# USB Bluetooth adapters
	ubt*)
		hook="hook"

		# Obtain unit number from device.
		unit=`expr ${dev} : 'ubt\([0-9]\{1,\}\)'`
		if [ -z "${unit}" ]; then
			err 1 "Unable to get ubt unit number: ${dev}"
		fi
		;;

	# Unknown
	*)
		err 1 "Unsupported device: ${dev}"
		;;
	esac

	# Be backward compatible and setup reasonable defaults
	bluetooth_device_authentication_enable="0"
	bluetooth_device_class="ff:01:0c"
	bluetooth_device_connectable="1"
	bluetooth_device_discoverable="1"
	bluetooth_device_encryption_mode="0"
	bluetooth_device_hci_debug_level="3"
	bluetooth_device_l2cap_debug_level="3"
	bluetooth_device_local_name="`/usr/bin/uname -n` (${dev})"
	bluetooth_device_role_switch="1"

	# Load default device configuration parameters
	_file="/etc/defaults/bluetooth.device.conf"

	if ! bluetooth_read_conf $_file bluetooth_device_ ; then
		err 1 "Unable to read default Bluetooth configuration from $_file"
	fi

	# Load device specific overrides
	_file="/etc/bluetooth/$dev.conf"

	if ! bluetooth_read_conf $_file bluetooth_device_ ; then
		err 1 "Unable to read Bluetooth device configuration from $_file"
	fi

	# Setup stack
	if ! bluetooth_setup_stack ${dev} ${hook} ; then
		bluetooth_shutdown_stack $dev
		err 1 "Unable to setup Bluetooth stack for device ${dev}"
	fi

	return 0
}

##############################################################################
# bluetooth_stop()
##############################################################################

bluetooth_stop()
{
	dev=$1

	# Try to figure out device type by looking at device name
	case "${dev}" in
	# uartX - serial/UART Bluetooth device
	uart*)
		if [ -f "/var/run/hcseriald.${dev}.pid" ]; then
			kill `cat /var/run/hcseriald.${dev}.pid`
			sleep 1 # wait a little bit
		fi
		;;

	# 3Com Bluetooth Adapter 3CRWB60-A
	btccc*)
		;;

	# USB Bluetooth adapters
	ubt*)
		;;

	# Unknown
	*)
		err 1 "Unsupported device: ${dev}"
		;;
	esac

	bluetooth_shutdown_stack ${dev}

	return 0
}

##############################################################################
# Start here
##############################################################################

load_rc_config $name
hccontrol="${bluetooth_hccontrol:-/usr/sbin/hccontrol}"
hcseriald="${bluetooth_hcseriald:-/usr/sbin/hcseriald}"

run_rc_command $*

@


1.5
log
@SVN rev 208060 on 2010-05-14 04:53:57Z by dougb

Remove trailing white space. No functional changes.
@
text
@d27 1
a27 1
# $FreeBSD$
@


1.5.2.1
log
@SVN rev 225736 on 2011-09-23 00:51:37Z by kensmith

Copy head to stable/9 as part of 9.0-RELEASE release cycle.

Approved by:	re (implicit)
@
text
@@


1.5.2.2
log
@## SVN ##
## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/ 242902
## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated
## SVN ##
## SVN ## ------------------------------------------------------------------------
## SVN ## r242902 | dteske | 2012-11-11 23:29:45 +0000 (Sun, 11 Nov 2012) | 10 lines
## SVN ##
## SVN ## Fix a regression introduced by SVN r211417 that saw the breakage of a feature
## SVN ## documented in usr.sbin/sysinstall/help/shortcuts.hlp (reproduced below):
## SVN ##
## SVN ## If /usr/sbin/sysinstall is linked to another filename, say
## SVN ## `/usr/local/bin/configPackages', then the basename will be used
## SVN ## as an implicit command name.
## SVN ##
## SVN ## Reviewed by:	adrian (co-mentor)
## SVN ## Approved by:	adrian (co-mentor)
## SVN ##
## SVN ## ------------------------------------------------------------------------
## SVN ##
@
text
@d27 1
a27 1
# $FreeBSD: stable/9/etc/rc.d/bluetooth 208060 2010-05-14 04:53:57Z dougb $
@


1.5.2.1.4.1
log
@SVN rev 239080 on 2012-08-05 23:54:33Z by kensmith

Copy stable/9 to releng/9.1 as part of the 9.1-RELEASE release process.

Approved by:	re (implicit)
@
text
@@


1.5.2.1.4.2
log
@Switch importer
@
text
@d27 1
a27 1
# $FreeBSD: releng/9.1/etc/rc.d/bluetooth 208060 2010-05-14 04:53:57Z dougb $
@


1.5.2.1.2.1
log
@SVN rev 227445 on 2011-11-11 04:20:22Z by kensmith

Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
cycle.

Approved by:	re (implicit)
@
text
@@


1.5.2.1.2.2
log
@Switch importer
@
text
@d27 1
a27 1
# $FreeBSD: releng/9.0/etc/rc.d/bluetooth 208060 2010-05-14 04:53:57Z dougb $
@


1.4
log
@SVN rev 180618 on 2008-07-19 20:11:33Z by marcel

With uart(4) default, change /dev/cuad# to /dev/cuau# and
sio# to uart# so that out-of-the-box FreeBSD is consistent.
@
text
@d98 1
a98 1
	# Setup HCI 
d285 1
a285 1
	# Be backward compatible and setup reasonable defaults 
d315 1
a315 1
		
@


1.4.2.1
log
@SVN rev 196045 on 2009-08-03 08:13:06Z by kensmith

Copy head to stable/8 as part of 8.0 Release cycle.

Approved by:	re (Implicit)
@
text
@@


1.4.2.2
log
@SVN rev 208094 on 2010-05-14 19:28:16Z by dougb

MFC 208060:

Remove trailing white space. No functional changes.
@
text
@d98 1
a98 1
	# Setup HCI
d285 1
a285 1
	# Be backward compatible and setup reasonable defaults
d315 1
a315 1

@


1.4.2.3
log
@## SVN ##
## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/ 242909
## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated
## SVN ##
## SVN ## ------------------------------------------------------------------------
## SVN ## r242909 | dim | 2012-11-12 07:47:19 +0000 (Mon, 12 Nov 2012) | 20 lines
## SVN ##
## SVN ## MFC r242625:
## SVN ##
## SVN ## Remove duplicate const specifiers in many drivers (I hope I got all of
## SVN ## them, please let me know if not).  Most of these are of the form:
## SVN ##
## SVN ## static const struct bzzt_type {
## SVN ##       [...list of members...]
## SVN ## } const bzzt_devs[] = {
## SVN ##       [...list of initializers...]
## SVN ## };
## SVN ##
## SVN ## The second const is unnecessary, as arrays cannot be modified anyway,
## SVN ## and if the elements are const, the whole thing is const automatically
## SVN ## (e.g. it is placed in .rodata).
## SVN ##
## SVN ## I have verified this does not change the binary output of a full kernel
## SVN ## build (except for build timestamps embedded in the object files).
## SVN ##
## SVN ## Reviewed by:	yongari, marius
## SVN ##
## SVN ## ------------------------------------------------------------------------
## SVN ##
@
text
@d27 1
a27 1
# $FreeBSD: stable/8/etc/rc.d/bluetooth 208094 2010-05-14 19:28:16Z dougb $
@


1.4.2.2.6.1
log
@SVN rev 232438 on 2012-03-03 06:15:13Z by kensmith

Copy stable/8 to releng/8.3 as part of 8.3-RELEASE release cycle.

Approved by:	re (implicit)
@
text
@@


1.4.2.2.6.2
log
@Switch importer
@
text
@d27 1
a27 1
# $FreeBSD: releng/8.3/etc/rc.d/bluetooth 208094 2010-05-14 19:28:16Z dougb $
@


1.4.2.2.4.1
log
@SVN rev 216617 on 2010-12-21 17:09:25Z by kensmith

Copy stable/8 to releng/8.2 in preparation for FreeBSD-8.2 release.

Approved by:	re (implicit)
@
text
@@


1.4.2.2.2.1
log
@SVN rev 209145 on 2010-06-14 02:09:06Z by kensmith

Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.

Approved by:	re (implicit)
@
text
@@


1.4.2.1.2.1
log
@SVN rev 198460 on 2009-10-25 01:10:29Z by kensmith

Copy stable/8 to releng/8.0 as part of 8.0-RELEASE release procedure.

Approved by:	re (implicit)
@
text
@@


1.3
log
@Use $required_modules wherever suitable.  Use load_kld() in special
cases.  So we get rid of quite a few lines of duplicated code.
@
text
@d237 2
a238 2
	# sioX - serial/UART Bluetooth device
	sio*)
d244 1
a244 1
		unit=`expr ${dev} : 'sio\([0-9]\{1,\}\)'`
d246 1
a246 1
			err 1 "Unable to get sio unit number: ${dev}"
d249 1
a249 1
		${hcseriald} -f /dev/cuad${unit} -n ${dev}
d329 2
a330 2
	# sioX - serial/UART Bluetooth device
	sio*)
@


1.3.2.1
log
@SVN rev 208095 on 2010-05-14 19:36:11Z by dougb

MFC 208060:

Remove trailing white space. No functional changes.

Hand-delete trailing ws from rc.firewall while I'm here.
@
text
@d98 1
a98 1
	# Setup HCI
d285 1
a285 1
	# Be backward compatible and setup reasonable defaults
d315 1
a315 1

@


1.3.2.2
log
@Switch importer
@
text
@d27 1
a27 1
# $FreeBSD: stable/7/etc/rc.d/bluetooth 220110 2011-03-28 19:29:30Z dougb $
@


1.3.2.1.2.1
log
@SVN rev 216618 on 2010-12-21 17:10:29Z by kensmith

Copy stable/7 to releng/7.4 in preparation for FreeBSD-7.4 release.

Approved by:	re (implicit)
@
text
@@


1.3.2.1.2.2
log
@Switch importer
@
text
@d27 1
a27 1
# $FreeBSD: releng/7.4/etc/rc.d/bluetooth 208095 2010-05-14 19:36:11Z dougb $
@


1.3.10.1
log
@SVN rev 203736 on 2010-02-10 00:26:20Z by kensmith

Copy stable/7 to releng/7.3 as part of the 7.3-RELEASE process.

Approved by:	re (implicit)
@
text
@@


1.3.8.1
log
@SVN rev 191087 on 2009-04-15 03:14:26Z by kensmith

Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.

Approved by:	re (implicit)
@
text
@@


1.3.6.1
log
@SVN rev 185281 on 2008-11-25 02:59:29Z by kensmith

Create releng/7.1 in preparation for moving into RC phase of 7.1 release
cycle.

Approved by:	re (implicit)
@
text
@@


1.2
log
@Eliminate global symbols starting with an underscore from rc.d
scripts, except for mdconfig* and jail.  Such symbols are reserved
for the rc.subr internals.  Most scripts can be fixed by just
declaring _foo symbols as local: few scripts actually need them to
be global.

Discussed with:	dougb in freebsd-rc
@
text
@d39 1
a234 6
	# Automatically load modules
	kldload ng_bluetooth > /dev/null 2>&1
	kldload ng_hci > /dev/null 2>&1
	kldload ng_l2cap > /dev/null 2>&1
	kldload ng_btsocket > /dev/null 2>&1

d239 1
a239 1
		kldload ng_h4 > /dev/null 2>&1
@


1.1
log
@Start integrating Bluetooth into rc.d system.

Introduce /etc/rc.d/bluetooth script to start/stop Bluetooth devices. It
will be called from devd(8) in response to device arrival/departure events.
It is also possible to call it by hand to start/stop particular device
without unplugging it.

Introduce generic way to set configuration parameters for Bluetooth devices.
By default /etc/rc.d/bluetooth script has hardwired defaults compatible
with old rc.bluetooth from /usr/share/netgraph/bluetooth/examples. These
can be overridden using /etc/defaults/bluetooth.device.conf file (system
wide defaults). Finally, there could be another device specific override
file located in /etc/bluetooth/$device.conf (where $device is ubt0, btccc0
etc.)

The list of configuration parameters and their meaning described in the
/etc/defaults/bluetooth.device.conf file. Even though Bluetooth device
configuration files are not shell scripts, they must follow basic sh(1) syntax.

The bluetooth.device.conf(5) and handbook update will follow shortly.

Inspired by:	Panagiotis Astithas ( past at ebs dot gr )
Reviewed by:	brooks, yar
MFC after:	1 week
@
text
@d46 2
d230 2
@


1.1.4.1
log
@MFC: Start Bluetooth integration into rc.d system.

Introduce /etc/rc.d/bluetooth script to start/stop Bluetooth devices. It
will be called from devd(8) in response to device arrival/departure events.
It is also possible to call it by hand to start/stop particular device
without unplugging it.

Introduce generic way to set configuration parameters for Bluetooth devices.
By default /etc/rc.d/bluetooth script has hardwired defaults compatible
with old rc.bluetooth from /usr/share/netgraph/bluetooth/examples. These
can be overridden using /etc/defaults/bluetooth.device.conf file (system
wide defaults). Finally, there could be another device specific override
file located in /etc/bluetooth/$device.conf (where $device is ubt0, btccc0
etc.)

The list of configuration parameters and their meaning described in the
/etc/defaults/bluetooth.device.conf file. Even though Bluetooth device
configuration files are not shell scripts, they must follow basic sh(1) syntax.

Add rc.d scripts for the hcsecd(8) and sdpd(8) daemons. Put defaults into
/etc/defaults/rc.conf. Both daemons can run even if no Bluetooth devices
are attached to the system. Both daemons depend on Bluetooth socket layer.

Fix Bluetooth assigned numbers URL in /etc/bluetooth/protocols file.
@
text
@@


1.1.2.1
log
@MFC: Start Bluetooth integration into rc.d system.

Introduce /etc/rc.d/bluetooth script to start/stop Bluetooth devices. It
will be called from devd(8) in response to device arrival/departure events.
It is also possible to call it by hand to start/stop particular device
without unplugging it.

Introduce generic way to set configuration parameters for Bluetooth devices.
By default /etc/rc.d/bluetooth script has hardwired defaults compatible
with old rc.bluetooth from /usr/share/netgraph/bluetooth/examples. These
can be overridden using /etc/defaults/bluetooth.device.conf file (system
wide defaults). Finally, there could be another device specific override
file located in /etc/bluetooth/$device.conf (where $device is ubt0, btccc0
etc.)

The list of configuration parameters and their meaning described in the
/etc/defaults/bluetooth.device.conf file. Even though Bluetooth device
configuration files are not shell scripts, they must follow basic sh(1) syntax.

Add rc.d scripts for the hcsecd(8) and sdpd(8) daemons. Put defaults into
/etc/defaults/rc.conf. Both daemons can run even if no Bluetooth devices
are attached to the system. Both daemons depend on Bluetooth socket layer.

Fix Bluetooth assigned numbers URL in /etc/bluetooth/protocols file.
@
text
@@


1.1.2.2
log
@MFC:
  Eliminate global symbols starting with an underscore from rc.d
  scripts, except for mdconfig* and jail.  Such symbols are reserved
  for the rc.subr internals.  Most scripts can be fixed by just
  declaring _foo symbols as local: few scripts actually need them to
  be global.
@
text
@a45 2
	local _err _file _line _namespace

a227 2
	local _file

@


1.1.2.3
log
@SVN rev 208096 on 2010-05-14 19:57:18Z by dougb

MFC 208060:

Remove trailing white space. No functional changes.

Hand-delete trailing ws from rc.subr, rc.d/nsswitch, and rc.d/nfslocking
while I'm here.
@
text
@d97 1
a97 1
	# Setup HCI
d290 1
a290 1
	# Be backward compatible and setup reasonable defaults
d320 1
a320 1

@


1.1.2.4
log
@Switch importer
@
text
@d27 1
a27 1
# $FreeBSD: stable/6/etc/rc.d/bluetooth 208096 2010-05-14 19:57:18Z dougb $
@


1.1.2.2.4.1
log
@SVN rev 183531 on 2008-10-02 02:57:24Z by kensmith

Create releng/6.4 from stable/6 in preparation for 6.4-RC1.

Approved by:	re (implicit)
@
text
@@


