Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Feb 2019 14:32:15 +0000 (UTC)
From:      Lars Engels <lme@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r344096 - in stable/12: tools/build/mk usr.sbin/bluetooth usr.sbin/bluetooth/bluetooth-config
Message-ID:  <201902131432.x1DEWFTJ039930@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: lme (ports committer)
Date: Wed Feb 13 14:32:14 2019
New Revision: 344096
URL: https://svnweb.freebsd.org/changeset/base/344096

Log:
  MFC r342945, r342947, r343020
  
  Add `bluetooth-config` script to simplify setting up bluetooth connections to
  devices like mice, keyboards, bt-audio, ...
  
  This script currently allows scanning for nearby devices, adds one to
  /etc/bluetooth/hosts, adds an entry to hcsecd's conf and if it is a HID, add an
  entry to bthidd's configs, as well.
  
  Submitted by:   erdgeist <erdgeist at erdgeist.org>
  Approved by:    bapt
  MFC after:      2 weeks
  Differential Revision:  D3778
  Reviewers:      bapt, emax

Added:
  stable/12/usr.sbin/bluetooth/bluetooth-config/
     - copied from r342945, head/usr.sbin/bluetooth/bluetooth-config/
Modified:
  stable/12/tools/build/mk/OptionalObsoleteFiles.inc
  stable/12/usr.sbin/bluetooth/Makefile
  stable/12/usr.sbin/bluetooth/bluetooth-config/bluetooth-config.8
  stable/12/usr.sbin/bluetooth/bluetooth-config/bluetooth-config.sh

Modified: stable/12/tools/build/mk/OptionalObsoleteFiles.inc
==============================================================================
--- stable/12/tools/build/mk/OptionalObsoleteFiles.inc	Wed Feb 13 14:28:02 2019	(r344095)
+++ stable/12/tools/build/mk/OptionalObsoleteFiles.inc	Wed Feb 13 14:32:14 2019	(r344096)
@@ -486,6 +486,7 @@ OLD_FILES+=usr/lib32/libsdp_p.a
 .endif
 OLD_FILES+=usr/sbin/ath3kfw
 OLD_FILES+=usr/sbin/bcmfw
+OLD_FILES+=usr/sbin/bluetooth-config
 OLD_FILES+=usr/sbin/bt3cfw
 OLD_FILES+=usr/sbin/bthidcontrol
 OLD_FILES+=usr/sbin/bthidd
@@ -562,6 +563,7 @@ OLD_FILES+=usr/share/man/man5/bluetooth.protocols.5.gz
 OLD_FILES+=usr/share/man/man5/hcsecd.conf.5.gz
 OLD_FILES+=usr/share/man/man8/ath3kfw.8.gz
 OLD_FILES+=usr/share/man/man8/bcmfw.8.gz
+OLD_FILES+=usr/share/man/man8/bluetooth-config.8.gz
 OLD_FILES+=usr/share/man/man8/bt3cfw.8.gz
 OLD_FILES+=usr/share/man/man8/bthidcontrol.8.gz
 OLD_FILES+=usr/share/man/man8/bthidd.8.gz

Modified: stable/12/usr.sbin/bluetooth/Makefile
==============================================================================
--- stable/12/usr.sbin/bluetooth/Makefile	Wed Feb 13 14:28:02 2019	(r344095)
+++ stable/12/usr.sbin/bluetooth/Makefile	Wed Feb 13 14:32:14 2019	(r344096)
@@ -4,6 +4,7 @@
 .include <src.opts.mk>
 
 SUBDIR= \
+	bluetooth-config \
 	bt3cfw \
 	btpand \
 	hccontrol \

Modified: stable/12/usr.sbin/bluetooth/bluetooth-config/bluetooth-config.8
==============================================================================
--- head/usr.sbin/bluetooth/bluetooth-config/bluetooth-config.8	Fri Jan 11 15:52:09 2019	(r342945)
+++ stable/12/usr.sbin/bluetooth/bluetooth-config/bluetooth-config.8	Wed Feb 13 14:32:14 2019	(r344096)
@@ -109,114 +109,3 @@ utility first appeared in
 .An Dirk Engling Aq Mt erdgeist@erdgeist.org
 .Sh THANKS TO
 Lars Engels and Warren Block for suggestions, help, and testing.
-.\" Copyright (c) 2019 Dirk Engling
-.\" 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$
-.\"
-.Dd January 7, 2019
-.Dt BLUETOOTH-CONFIG 8
-.Os
-.Sh NAME
-.Nm bluetooth-config
-.Nd a script to manage config files for the bluetooth sub system
-.Sh SYNOPSIS
-.Nm
-.Ar scan
-.Op Fl d Ar device
-.Op Fl n Ar node
-.Sh DESCRIPTION
-The
-.Nm
-utility is an interactive script to provide a frontend to the complex bluetooth sub system daemons.
-.Pp
-The following options are available:
-.Bl -tag -width indent+
-.It Fl d
-Scan for a specific bluetooth device address.
-.It Fl n
-Limit scan to a specific host controller. Hint: List all netgraph nodes with
-.Ql /usr/sbin/ngctl list .
-.El
-.Pp
-.Nm
-will help finding and setting up bluetooth controllers, scan for nearby bluetooth devices in
-pairing mode, lookup their names, allow mapping to friendly names in
-.Pa /etc/bluetooth/hosts ,
-ask for the paring PIN, instrument
-.Xr hcsecd 8
-to securely pair with new devices and, if the device offers HID endpoints such as mice or
-keyboards, configure and restart
-.Xr bthidd 8 .
-.Pp
-.Nm
-can bring up any interface and daemon necessary for operation and, if a node is provided on
-command line, will do so automatically for that interface.
-.Sh CAVEATS
-.Nm
-can not parse entries in
-.Xr hcsecd 8
-config file and thus will ask the user to manually modify existing pairing PIN entries.
-.Sh FILES
-.Bl -tag -width ".Pa /etc/bluetooth/hosts" -compact
-.It Pa /etc/bluetooth/hosts
-.It Pa sysrc -n bthidd_config
-.It Pa sysrc -n hcsecd_config
-.El
-.Sh EXAMPLES
-.Nm
-scan -n ubt0 -a 00:26:bb:7a:58:95
-.Bd -ragged -offset indent
-This will scan the bluetooth controller ubt0hci for a bluetooth device with the address
-00:26:bb:7a:58:95, set up ubt0 if necessary and enter an interactive dialog to pair the
-new device. Since in this example a mouse is paired,
-.Nm
-will interact with
-.Xr bthidd 8 ,
-enabling it if necessary and then write an HID descriptor to its config.
-.Ed
-.Pp
-.Nm
-scan
-.Bd -ragged -offset indent
-This will scan all bluetooth controllers on the systems for bluetooth devices, prompting
-to bring up controllers or daemons along the way.
-.Ed
-.Sh SEE ALSO
-.Xr bthidcontrol 8 ,
-.Xr bthidd 8 ,
-.Xr bthost 1 ,
-.Xr hccontrol 8 ,
-.Xr hcsecd 8 ,
-.Xr sdpcontrol 8 ,
-.Xr sysrc 8
-.Sh HISTORY
-A
-.Nm
-utility first appeared in
-.Fx 12.1 .
-.Sh AUTHORS
-.An Dirk Engling Aq Mt erdgeist@erdgeist.org
-.Sh THANKS TO
-Lars Engels and Warren Block for suggestions, help, and testing.

Modified: stable/12/usr.sbin/bluetooth/bluetooth-config/bluetooth-config.sh
==============================================================================
--- head/usr.sbin/bluetooth/bluetooth-config/bluetooth-config.sh	Fri Jan 11 15:52:09 2019	(r342945)
+++ stable/12/usr.sbin/bluetooth/bluetooth-config/bluetooth-config.sh	Wed Feb 13 14:32:14 2019	(r344096)
@@ -1,9 +1,12 @@
 #!/bin/sh
 #-
-# Copyleft 2019 Dirk Engling
+# ----------------------------------------------------------------------------
+# "THE BEER-WARE LICENSE" (Revision 42):
+# <erdgeist@erdgeist.org> wrote this file. As long as you retain this notice you
+# can do whatever you want with this stuff. If we meet some day, and you think
+# this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp
+# ----------------------------------------------------------------------------
 #
-# This script is released under the beerware license.
-#
 # $FreeBSD$
 #
 
@@ -11,8 +14,6 @@
 exerr () { echo -e "Error: $*" >&2 ; exit 1; }
 print_syntax () { echo -e "Syntax: $0 scan [-d device] [-n node]"; exit 1; }
 
-# Assuming we are called to do the pair-new-device subcommand first
-
 main() {
 unset node device started bdaddresses retry
 
@@ -22,132 +23,140 @@ shift
 
 # Get command line options
 while getopts :d:n: arg; do
-  case ${arg} in
-    d) device="$OPTARG";;
-    n) node="$OPTARG";;
-    ?) print_syntax;;
-  esac
+	case ${arg} in
+		d) device="$OPTARG";;
+		n) node="$OPTARG";;
+		?) print_syntax;;
+	esac
 done
 
 # No use running without super user rights
-[ $( id -u ) -eq 0 ] || exerr "$0 must modify files that belong to root.  Re-run as root."
+if [ $( id -u ) -ne 0 ]; then
+	exerr "$0 must modify files that belong to root.  Re-run as root."
+fi
 
-known_nodes=$(/usr/sbin/hccontrol read_node_list 2>/dev/null | \
-    /usr/bin/tail -n +2 | /usr/bin/cut -d ' ' -f 1)
+known_nodes=$( /usr/sbin/hccontrol read_node_list 2>/dev/null |\
+	/usr/bin/tail -n +2 | /usr/bin/cut -d ' ' -f 1 )
 
 # Check if netgraph knows about any HCI nodes
 if ! [ "${known_nodes}" ]; then
-  ng_nodes=$(/usr/sbin/ngctl list 2>/dev/null | \
-    /usr/bin/grep -o "Name: .* Type: ubt" | /usr/bin/cut -d ' ' -f 2)
+	ng_nodes=$( /usr/sbin/ngctl list 2>/dev/null | \
+		/usr/bin/grep -o "Name: .* Type: ubt" |/usr/bin/cut -d' ' -f2 )
 
-  [ "${ng_nodes}" ] || exerr "No Bluetooth host controllers found."
+	[ "${ng_nodes}" ] || exerr "No Bluetooth host controllers found."
 
-  unset found
-  for n in ${ng_nodes}; do
-    if [ "${n}" = "${node%hci}" ]; then
-      # If we found the node but its stack is not set up, do it now
-      /usr/sbin/service bluetooth start ${node%hci} || exit 1
-      found="YES"
-    fi
-  done
+	unset found
+	for n in ${ng_nodes}; do
+		if [ "${n}" = "${node%hci}" ]; then
+			# Found the node but its stack is not set up? Do it now.
+			/usr/sbin/service bluetooth start ${node%hci} || exit 1
+			found="YES"
+		fi
+	done
 
-  # If we have Bluetooth controller nodes without a set up stack,
-  # ask the user if we shall start it up
-  if ! [ "${found}" ]; then
-    printf "No usable Bluetooth host controllers were found.\n"
-    printf "These host controllers exist in the system:\n  %s" " ${ng_nodes}"
-    read -p "Choose a host controller to set up: [${ng_nodes%% *}]" node
-    : ${node:="${ng_nodes%% *}"}
-    /usr/sbin/service bluetooth start ${node} || exit 1
-  fi
+	# If we have Bluetooth controller nodes without a set up stack,
+	# ask the user if we shall start it up
+	if ! [ "${found}" ]; then
+		printf "No usable Bluetooth host controllers were found.\n"
+		printf "These host controllers exist in the system:\n"
+		printf "  %s\n" "${ng_nodes}"
+		prompt="Choose a host controller to set up: [${ng_nodes%% *}]"
+		read -p "${prompt}" node
+		: ${node:="${ng_nodes%% *}"}
+		/usr/sbin/service bluetooth start ${node} || exit 1
+	fi
 
-  # Re-read known nodes
-  known_nodes=$(/usr/sbin/hccontrol read_node_list 2>/dev/null | \
-    /usr/bin/tail -n +2 | /usr/bin/cut -d ' ' -f 1)
-  # check if we succeeded in bringing it up
-  [ "${known_nodes}" ] || exerr "Failed to set up Bluetooth stack"
+	# Re-read known nodes
+	known_nodes=$(/usr/sbin/hccontrol read_node_list 2>/dev/null |
+		/usr/bin/tail -n +2 | /usr/bin/cut -d ' ' -f 1 )
+
+	# check if we succeeded in bringing it up
+	[ "${known_nodes}" ] || exerr "Failed to set up Bluetooth stack"
 fi
 
 # if a node was requested on command line, check if it is there
 if [ "${node}" ]; then
-  unset found
-  for n in ${known_nodes}; do
-    [ "${n}" = "${node}" ] && found="YES"
-    [ "${n}" = "${node}hci" ] && node="${node}hci" && found="YES"
-  done
-  [ "${found}" ] || exerr "Node ${node} not found"
+	unset found
+	for n in ${known_nodes}; do
+		[ "${n}" = "${node}" ] && found="YES"
+		[ "${n}" = "${node}hci" ] && node="${node}hci" && found="YES"
+	done
+	[ "${found}" ] || exerr "Node ${node} not found"
 fi
 
 [ "${node}" ] && node="-n ${node}"
 
 while ! [ "${bdaddresses}" ]; do
-  retry=X${retry}
-  printf "Scanning for new Bluetooth devices (Attempt %d of 5) ... " ${#retry}
-  bdaddresses=$( /usr/sbin/hccontrol -N ${node} inquiry 2>/dev/null | \
-    /usr/bin/grep -o "BD_ADDR: .*" | /usr/bin/cut -d ' ' -f 2 )
+	retry=X${retry}
+	printf "Scanning for new Bluetooth devices (Attempt %d of 5) ... " \
+		${#retry}
+	bdaddresses=$( /usr/sbin/hccontrol -N ${node} inquiry 2>/dev/null |
+		/usr/bin/grep -o "BD_ADDR: .*" | /usr/bin/cut -d ' ' -f 2 )
 
-  # Count entries and, if a device was requested on command line,
-  # try to find it
-  unset found count
-  for bdaddress in ${bdaddresses}; do
-    count=X${count}
-    if [ "${bdaddress}" = "${device}" ]; then
-      found=YES
-      bdaddresses="${device}"
-      count=X
-      break
-    fi
-  done
+	# Count entries and, if a device was requested on command line,
+	# try to find it
+	unset found count
+	for bdaddress in ${bdaddresses}; do
+		count=X${count}
+		if [ "${bdaddress}" = "${device}" ]; then
+			found=YES
+			bdaddresses="${device}"
+			count=X
+			break
+		fi
+	done
 
-  # If device was requested on command line but is not found,
-  # or no devices found at all, rescan until retry is exhausted
-  if ! [ "${found}" -o "${count}" -a -z "${device}" ]; then
-    printf "failed.\n"
-    if [ "${#retry}" -eq 5 ]; then
-      [ "${device}" ] && exerr "Device ${device} not found"
-      exerr "No new Bluetooth devices found"
-    fi
-    unset bdaddresses
-    sleep 2
-    continue
-  fi
+	# If device was requested on command line but is not found,
+	# or no devices found at all, rescan until retry is exhausted
+	if ! [ "${found}" -o "${count}" -a -z "${device}" ]; then
+		printf "failed.\n"
+		if [ "${#retry}" -eq 5 ]; then
+			[ "${device}" ] && exerr "Device ${device} not found"
+			exerr "No new Bluetooth devices found"
+		fi
+		unset bdaddresses
+		sleep 2
+		continue
+	fi
 
-  [ ${#count} -gt 1 ] && plural=s || plural=''
-  printf "done.\nFound %d new bluetooth device%s (scanning for names):\n" ${#count} ${plural}
+	[ ${#count} -gt 1 ] && plural=s || plural=''
+	printf "done.\nFound %d new bluetooth device%s " ${#count} ${plural}
+	printf "(now scanning for names):\n"
 
-  # Looping again for the faster feedback
-  unset count
-  for bdaddress in ${bdaddresses}; do
-    count=X${count}
-    bdname=$( /usr/bin/bthost -b "${bdaddress}" 2>/dev/null )
-    friendlyname=$( /usr/sbin/hccontrol Remote_Name_Request ${bdaddress} 2> /dev/null | \
-      /usr/bin/grep -o "Name: .*" | /usr/bin/cut -d ' ' -f 2- )
+	# Looping again for the faster feedback
+	unset count
+	for bdaddress in ${bdaddresses}; do
+		count=X${count}
+		bdname=$( /usr/bin/bthost -b "${bdaddress}" 2>/dev/null )
+		friendlyname=$( /usr/sbin/hccontrol Remote_Name_Request \
+			${bdaddress} 2> /dev/null |
+			/usr/bin/grep -o "Name: .*" |/usr/bin/cut -d ' ' -f 2- )
 
-    # sdpcontrol should be able to pull vendor and product id via sdp
-    printf "[%2d] %s\t\"%s\" (%s)\n" ${#count} "${bdaddress}" "${friendlyname}" "${bdname}"
+		# sdpcontrol should be able to pull vendor + product id via sdp
+		printf "[%2d] %s\t\"%s\" (%s)\n" ${#count} "${bdaddress}" \
+			"${friendlyname}" "${bdname}"
 
-    eval bdaddress_${#count}=\${bdaddress}
-    eval bdname_${#count}=\${bdname}
-    eval friendlyname_${#count}=\${friendlyname}
-  done
+		eval bdaddress_${#count}=\${bdaddress}
+		eval bdname_${#count}=\${bdname}
+		eval friendlyname_${#count}=\${friendlyname}
+	done
 
-  # If a device was pre-selected, do not query the user
-  [ "${device}" ] && topair=1 || unset topair
+	# If a device was pre-selected, do not query the user
+	[ "${device}" ] && topair=1 || unset topair
 
-  # Even if only one device was found, user may chose 0 to rescan
-  while ! [ "${topair}" ]; do
-    if [ ${#count} -eq 1 ]; then
-      read -p "Select device to pair with [1, or 0 to rescan]: " topair
-    else
-      read -p "Select device to pair with [1-${#count}, or 0 to rescan]: " topair
-    fi
-    if ! [ "${topair}" -ge 0 -a "${topair}" -le "${#count}" ] 2>/dev/null ; then
-      printf "Value out of range: %s.\n" {topair}
-      unset topair
-    fi
-  done
+	# Even if only one device was found, user may chose 0 to rescan
+	while ! [ "${topair}" ]; do
+		prompt="Select device to pair with [1"
+		[ ${#count} -gt 1 ] && prompt="${prompt}-${#count}"
+		read -p "${prompt}, or 0 to rescan]: " topair
+		if ! [ "${topair}" -ge 0 -a "${topair}" -le "${#count}" ] \
+			2>/dev/null ; then
+			printf "Value out of range: %s.\n" {topair}
+			unset topair
+		fi
+	done
 
-  [ "${topair}" -eq "0" ] && unset bdaddresses retry
+	[ "${topair}" -eq "0" ] && unset bdaddresses retry
 done
 
 eval bdaddress=\${bdaddress_${topair}}
@@ -156,20 +165,24 @@ eval friendlyname=\${friendlyname_${topair}}
 
 # Do we need to add an entry to /etc/bluetooth/hosts?
 if ! [ "${bdname}" ]; then
-  printf "\nAdding device ${bdaddress} to /etc/bluetooth/hosts.\n"
+	printf "\nAdding device ${bdaddress} to /etc/bluetooth/hosts.\n"
 
-  while ! [ "${bdname}" ]; do
-    read -p "Enter friendly name. [${friendlyname}]: " REPLY
-    : ${REPLY:="${friendlyname}"}
+	while ! [ "${bdname}" ]; do
+		read -p "Enter friendly name. [${friendlyname}]: " _r
+		: ${_r:="${friendlyname}"}
 
-    if [ "${REPLY}" ]; then
-      # Remove white space and non-friendly characters
-      bdname=$( printf "%s" "${REPLY}" | tr -c '[:alnum:]-,.' _ )
-      [ "${REPLY}" != "${bdname}" ] && printf "Notice: Using sanitized name \"%s\" in /etc/bluetooth/hosts.\n" "${bdname}"
-    fi
-  done
+		if [ "${_r}" ]; then
+			# Remove white space and non-friendly characters
+			bdname=$( printf "%s" "${_r}" | tr -c '[:alnum:]-,.' _ )
+			if [ "${_r}" != "${bdname}" ]; then
+				printf "Notice: Using sanitized name"
+				printf "\"%s\" in /etc/bluetooth/hosts.\n" \
+					"${bdname}"
+			fi
+		fi
+	done
 
-  printf "%s\t%s\n" "${bdaddress}" "${bdname}" >> /etc/bluetooth/hosts
+	printf "%s\t%s\n" "${bdaddress}" "${bdname}" >> /etc/bluetooth/hosts
 fi
 
 # If scanning for the name did not succeed, resort to bdname
@@ -183,86 +196,109 @@ fi
 # Also we cannot really modify the PIN in an existing entry. So we
 # need to prompt the user to manually do it and restart this script
 if ! /usr/sbin/service hcsecd enabled; then
-  printf "\nWarning: hcsecd is not enabled.\nThis daemon manages pairing requests.\n"
-  read -p "Enable hcsecd? [yes]: " REPLY
-  case "${REPLY}" in no|n|NO|N|No|nO) ;; *) /usr/sbin/sysrc hcsecd_enable="YES";; esac
+	printf "\nWarning: hcsecd is not enabled.\n"
+	printf "This daemon manages pairing requests.\n"
+	read -p "Enable hcsecd? [yes]: " _r
+	case "${_r}" in
+		no|n|NO|N|No|nO) ;;
+		*) /usr/sbin/service hcsecd enable;;
+	esac
 fi
+
 secd_config=$( /usr/sbin/sysrc -n hcsecd_config )
-secd_entries=$( /usr/bin/grep -Eo "bdaddr[[:space:]]+(${bdaddress}|${bdname})" ${secd_config} | awk '{ print $2; }' )
+secd_entries=$( /usr/bin/grep -Eo "bdaddr[[:space:]]+(${bdaddress}|${bdname})" \
+	${secd_config} | awk '{ print $2; }' )
 
 if [ "${secd_entries}" ]; then
-  printf "\nWarning: An entry for device %s is already present in %s.\n" ${secd_entries} ${secd_config}
-  printf "To modify pairing information, edit this file and run\n  service hcsecd restart\n"
-  read -p "Continue? [yes]: " REPLY
-  case "${REPLY}" in no|n|NO|N|No|nO) exit;; esac
+	printf "\nWarning: An entry for device %s is already present in %s.\n" \
+		${secd_entries} ${secd_config}
+	printf "To modify pairing information, edit this file and run\n"
+	printf "  service hcsecd restart\n"
+	read -p "Continue? [yes]: " _r
+	case "${_r}" in no|n|NO|N|No|nO) exit;; esac
 else
-  printf "\nWriting pairing information description block to %s.\n" ${secd_config}
-  printf "(To get PIN, put device in pairing mode first.)\n"
-  read -p "Enter PIN [nopin]: " pin
-  [ "${pin}" ] && pin=\""${pin}"\" || pin="nopin"
+	printf "\nWriting pairing information description block to %s.\n" \
+		${secd_config}
+	printf "(To get PIN, put device in pairing mode first.)\n"
+	read -p "Enter PIN [nopin]: " pin
+	[ "${pin}" ] && pin=\""${pin}"\" || pin="nopin"
 
-  # Write out new hcsecd config block
-  printf "\ndevice {\n\tbdaddr\t%s;\n\tname\t\"%s\";\n\tkey\tnokey\;\n\tpin\t%s\;\n}\n" \
-    "${bdaddress}" "${friendlyname}" "${pin}" >> ${secd_config}
+	# Write out new hcsecd config block
+	printf "\ndevice {\n\tbdaddr\t%s;\n\tname\t\"%s\";\n\tkey\tnokey\;\n\tpin\t%s\;\n}\n" \
+		"${bdaddress}" "${friendlyname}" "${pin}" >> ${secd_config}
 
-  # ... and make daemon reload config, TODO: hcsecd should provide a reload hook
-  /usr/sbin/service hcsecd restart
+	# ... and make daemon reload config
+	# TODO: hcsecd should provide a reload hook
+	/usr/sbin/service hcsecd onerestart
 
-  # TODO: we should check if hcsecd succeeded pairing and revert to an old version
-  # of hcsecd.conf so we can undo adding the block above and retry with a new PIN
-  # also, if there's a way to force devices to re-pair, try this
+	# TODO: we should check if hcsecd succeeded pairing and revert to an
+	# old version of hcsecd.conf so we can undo adding the block above and
+	# retry with a new PIN
+	# also, if there's a way to force devices to re-pair, try this
 fi
 
 # now check for specific services to be provided by the device
 # first up: HID
 
-if /usr/sbin/sdpcontrol -a "${bdaddress}" search HID | \
-   /usr/bin/grep -q "^Record Handle: "; then
+/usr/sbin/sdpcontrol -a "${bdaddress}" search HID | \
+	/usr/bin/grep -q "^Record Handle: " || exit 0
 
-  printf "\nThis device provides human interface device services.\n"
-  read -p "Set it up? [yes]: " REPLY
-  case "${REPLY}" in no|n|NO|N|No|nO) ;;
-  *)
-    if ! /usr/sbin/service bthidd enabled; then
-      printf "\nWarning: bthidd is not enabled."
-      printf "\nThis daemon manages Bluetooth HID devices.\n"
-      read -p "Enable bthidd? [yes]: " REPLY
-      case "${REPLY}" in no|n|NO|N|No|nO) ;; *) /usr/sbin/sysrc bthidd_enable="YES";; esac
-    fi
+printf "\nThis device provides human interface device services.\n"
+read -p "Set it up? [yes]: " _r
+case "${_r}" in
+	no|n|NO|N|No|nO) exit 0;;
+	*);;
+esac
 
-    # Check if bthidd already knows about this device
-    bthidd_known=$( /usr/sbin/bthidcontrol -a "${bdaddress}" known | \
-      /usr/bin/grep "${bdaddress}" )
-    if [ "${bthidd_known}" ]; then
-      printf "Notice: Device %s already known to bthidd.\n" "${bdaddress}"
-    else
-      bthidd_config=$( /usr/sbin/sysrc -n bthidd_config )
-      printf "Writing HID descriptor block to %s ... " "${bthidd_config}"
-      /usr/sbin/bthidcontrol -a "${bdaddress}" query >> "${bthidd_config}"
+# Here we have found an HID and were asked to set it up
+# NOTE: look out for the two exit 0 above if you extend this script
 
-      # Re-read config to see if we succeeded adding the device
-      bthidd_known=$( /usr/sbin/bthidcontrol -a "${bdaddress}" known | \
-        grep "${bdaddress}" )
-      if ! [ "${bthidd_known}" ]; then
-        printf "failed.\n"
-      else
-        printf "success.\nTo re-read its config, bthidd must be restarted.\n"
-        printf "Warning: If a Bluetooth keyboard is being used, the connection might be lost.\n"
-        printf "It can be manually restarted later with\n  service bthidd restart\n"
-        read -p "Restart bthidd now? [yes]: " REPLY
-        case "${REPLY}" in no|n|NO|N|No|nO) ;; *) /usr/sbin/service bthidd restart;; esac
-      fi
-    fi
-  ;;
-  esac
+if ! /usr/sbin/service bthidd enabled; then
+	printf "\nWarning: bthidd is not enabled."
+	printf "\nThis daemon manages Bluetooth HID devices.\n"
+	read -p "Enable bthidd? [yes]: " _r
+	case "${_r}" in
+		no|n|NO|N|No|nO) ;;
+		 *) /usr/sbin/service bthidd enable;;
+	esac
 fi
 
+# Check if bthidd already knows about this device
+bthidd_known=$( /usr/sbin/bthidcontrol -a "${bdaddress}" known | \
+	/usr/bin/grep "${bdaddress}" )
+
+if [ "${bthidd_known}" ]; then
+	printf "Notice: Device %s already known to bthidd.\n" "${bdaddress}"
+	return 0
+fi
+
+bthidd_config=$( /usr/sbin/sysrc -n bthidd_config )
+printf "Writing HID descriptor block to %s ... " "${bthidd_config}"
+/usr/sbin/bthidcontrol -a "${bdaddress}" query >> "${bthidd_config}"
+
+# Re-read config to see if we succeeded adding the device
+bthidd_known=$( /usr/sbin/bthidcontrol -a "${bdaddress}" known | \
+	grep "${bdaddress}" )
+if ! [ "${bthidd_known}" ]; then
+	printf "failed.\n"
+else
+	printf "success.\nTo re-read its config, bthidd must be restarted.\n"
+	printf "Warning: If a Bluetooth keyboard is being used, the connection"
+	printf "might be lost.\n"
+	printf "It can be manually restarted later with\n"
+	printf " service bthidd restart\n"
+	read -p "Restart bthidd now? [yes]: " _r
+	case "${_r}" in
+		no|n|NO|N|No|nO) ;;
+		*) /usr/sbin/service bthidd onerestart;;
+	esac
+fi
+
 }
 
 # After function definitions, main() can use them
 main "$@"
-
-exit
+exit 0
 
 # TODO
 # * If device is a keyboard, offer a text entry test field and if it does



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201902131432.x1DEWFTJ039930>