#!/bin/sh /etc/rc.common
# Copyright (C) 2007 OpenWrt.org

#start after dbus (60)
START=62

append_bool() {
	local section="$1"
	local option="$2"
	local value="$3"
	local _val
	config_get_bool _val "$section" "$option" '0'
	[ $_val -gt 0 ] && append args "$3"
}

append_string() {
	local section="$1"
	local option="$2"
	local value="$3"
	local default="$4"
	local _val
	config_get _val "$section" "$option" "$default"
	[ -n "$_val" ] && append args "$3 $_val"
}

hcid_config() {
	local cfg="$1"
	config_get_bool enabled "$cfg" "enabled" '1'
	[ $enabled -gt 0 ] || return 1
	args=""
	append_bool "$cfg" nodaemon "-n"
	append_string "$cfg" config "-f"
	service_start /usr/sbin/hcid $args
}

hciattach_config() {
	local cfg="$1"
	config_get_bool enabled "$cfg" "enabled" '1'
	[ $enabled -gt 0 ] || return 1
	args=""
	append_string "$cfg" initspeed "-s" "115200"
	append_string "$cfg" tty " " "ttyS1"
	append_string "$cfg" type " " "csr"
	append_string "$cfg" speed " " "115200"
	append_string "$cfg" flow " " "noflow"
	service_start /usr/sbin/hciattach $args
}

rfcomm_config() {
	local cfg="$1"
	config_get_bool enabled "$cfg" "enabled" '1'
	[ $enabled -gt 0 ] || return 1
	args=""
	append_string "$cfg" config "-f"
	/usr/bin/rfcomm $args bind all
}

dund_config() {
	local cfg="$1"
	config_get_bool enabled "$cfg" "enabled" '1'
	[ $enabled -gt 0 ] || return 1
	args=""
	append_bool "$cfg" listen "--listen"
	append_string "$cfg" connect "--connect"
	append_string "$cfg" mrouter "--mrouter"
	append_bool "$cfg" search "--search"
	append_string "$cfg" channel "--channel"
	append_string "$cfg" device "--device"
	append_bool "$cfg" nosdp "--nosdp"
	append_bool "$cfg" auth "--auth"
	append_bool "$cfg" encrypt "--encrypt"
	append_bool "$cfg" secure "--secure"
	append_bool "$cfg" master "--master"
	append_bool "$cfg" nodetach "--nodetach"
	append_bool "$cfg" persist "--persist"
	append_string "$cfg" pppd "--pppd"
	append_bool "$cfg" msdun "--msdun"
	append_bool "$cfg" activesync "--activesync"
	append_bool "$cfg" cache "--cache"

	append_string "$cfg" pppdopts ""
	config_get ifn "$cfg" interface
	if [ -n "$ifn" ]; then
		config_get unit "$cfg" unit
		[ -z "$unit" ] || append args "unit $unit ipparam $ifn linkname $ifn"
	fi

	service_start /usr/bin/dund $args
}

pand_config() {
	local cfg="$1"
	config_get_bool enabled "$cfg" "enabled" '1'
	[ $enabled -gt 0 ] || return 1
	args=""
	append_bool "$cfg" listen "--listen"
	append_string "$cfg" connect "--connect"
	append_bool "$cfg" autozap "--autozap"
	append_bool "$cfg" search "--search"
	append_string "$cfg" role "--role"
	append_string "$cfg" service "--service"
	append_string "$cfg" ethernet "--ethernet"
	append_string "$cfg" device "--device"
	append_bool "$cfg" nosdp "-D"
	append_bool "$cfg" auth "-A"
	append_bool "$cfg" encrypt "-E"
	append_bool "$cfg" secure "-S"
	append_bool "$cfg" master "-M"
	append_bool "$cfg" nodetach "-n"
	append_bool "$cfg" persist "--persist"
	append_bool "$cfg" cache "--cache"
	append_string "$cfg" pidfile "--pidfile"
	service_start /usr/bin/pand $args
}

start() {
	config_load bluetooth
	config_foreach hcid_config hcid
	config_foreach hciattach_config hciattach
	config_foreach rfcomm_config rfcomm
	config_foreach dund_config dund
	config_foreach pand_config pand
}

stop() {
	service_stop /usr/bin/dund
	service_stop /usr/bin/pand
	/usr/bin/rfcomm release all
	service_stop /usr/sbin/hciattach
	service_stop /usr/sbin/hcid
}
