Home | History | Annotate | Line # | Download | only in rc.d
      1 #!/bin/sh
      2 #
      3 # $NetBSD: bluetooth,v 1.3 2023/12/25 08:23:35 kre Exp $
      4 #
      5 
      6 # PROVIDE: bluetooth
      7 # REQUIRE: DAEMON
      8 # BEFORE:  LOGIN
      9 
     10 $_rc_subr_loaded . /etc/rc.subr
     11 
     12 name="bluetooth"
     13 rcvar=$name
     14 start_cmd="bluetooth_start"
     15 stop_cmd="bluetooth_stop"
     16 
     17 btattach_cmd="/usr/sbin/btattach"
     18 btconfig_cmd="/usr/sbin/btconfig"
     19 bthcid_cmd="/usr/sbin/bthcid"
     20 btdevctl_cmd="/usr/sbin/btdevctl"
     21 sdpd_cmd="/usr/sbin/sdpd"
     22 
     23 btattach_conf="/etc/bluetooth/btattach.conf"
     24 btdevctl_conf="/etc/bluetooth/btdevctl.conf"
     25 
     26 required_files="${btattach_conf} ${btdevctl_conf}"
     27 
     28 bluetooth_start()
     29 {
     30 	#
     31 	# attach Bluetooth serial controllers
     32 	#
     33 	while read type tty speed flags; do
     34 		case ${type} in
     35 		\#*|"")
     36 			continue
     37 			;;
     38 		esac
     39 
     40 		echo "attaching Bluetooth controller to $(basename ${tty})"
     41 		${btattach_cmd} ${flags} ${type} ${tty} ${speed}
     42 	done < ${btattach_conf}
     43 
     44 	#
     45 	# enable Bluetooth controllers.
     46 	#
     47 	# If ${btconfig_devices} is set, it is treated as a list of devices
     48 	# to configure. Otherwise, all available devices will be configured
     49 	#
     50 	# For each device we are configuring, enable it with maximum security
     51 	# settings (not discoverable, not connectable, auth and encryption
     52 	# required for all connections), relaxed link policy settings and
     53 	# the link master role, set a class of device for Computer, then apply
     54 	# any options from the 'btconfig_<dev>' or 'btconfig_args' variables
     55 	# on top of settings relaxing the security requirements, so that these
     56 	# can be overridden (btconfig parses all command line options before
     57 	# acting)
     58 	#
     59 	echo -n "configuring Bluetooth controllers:"
     60 	for dev in ${btconfig_devices:-$(${btconfig_cmd} -l)}; do
     61 		echo -n " ${dev}"
     62 		eval args=\${btconfig_${dev}:-\${btconfig_args}}
     63 		${btconfig_cmd} ${dev} enable -iscan -pscan auth encrypt
     64 		${btconfig_cmd} ${dev} switch hold sniff park master
     65 		${btconfig_cmd} ${dev} class 0x000100
     66 		${btconfig_cmd} ${dev} iscan pscan -auth -encrypt ${args}
     67 	done
     68 	echo "."
     69 
     70 	#
     71 	# start Bluetooth Link Key/PIN Code manager
     72 	#
     73 	if checkyesno bthcid; then
     74 		echo "starting Bluetooth Link Key/PIN Code manager"
     75 		${bthcid_cmd} ${bthcid_flags}
     76 	fi
     77 
     78 	#
     79 	# attach local Bluetooth service drivers
     80 	#
     81 	while read -r service addr dev junk; do
     82 		case ${service} in
     83 		\#*|"")
     84 			continue
     85 			;;
     86 		esac
     87 
     88 		if [ -z "${dev}" ] || [ -n "${junk}" ]; then
     89 			echo "${name}: invalid entry"
     90 			return 1
     91 		fi
     92 
     93 		echo "attaching Bluetooth ${service} service from \"${addr}\""
     94 		${btdevctl_cmd} -A -a "${addr}" -d "${dev}" -s "${service}"
     95 	done < ${btdevctl_conf}
     96 
     97 	#
     98 	# start Bluetooth Service Discovery server
     99 	#
    100 	if checkyesno sdpd; then
    101 		echo "starting Bluetooth Service Discovery server"
    102 		${sdpd_cmd} ${sdpd_flags}
    103 	fi
    104 }
    105 
    106 bluetooth_stop()
    107 {
    108 	#
    109 	# disable Bluetooth controllers, detaching local service drivers
    110 	#
    111 	echo -n "disabling Bluetooth controllers:"
    112 	for dev in ${btconfig_devices:-$(${btconfig_cmd} -l)}; do
    113 		echo -n " ${dev}"
    114 		${btconfig_cmd} "${dev}" disable
    115 	done
    116 	echo "."
    117 
    118 	#
    119 	# halt Service Discovery server, Link Key/PIN Code manager,
    120 	# and detach Bluetooth serial controllers
    121 	#
    122 	p1=$(check_pidfile /var/run/bthcid.pid ${bthcid_cmd})
    123 	p2=$(check_process ${sdpd_cmd})
    124 	p3=$(check_process ${btattach_cmd})
    125 	if [ -n "${p1}${p2}${p3}" ]; then
    126 		for pid in ${p1} ${p2} ${p3}; do
    127 			kill ${sig_stop} ${pid}
    128 		done
    129 		wait_for_pids ${p1} ${p2} ${p3}
    130 	fi
    131 }
    132 
    133 load_rc_config ${name}
    134 run_rc_command "$1"
    135