# Copyright (c) 2016, The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#    * Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
#    * 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.
#    * Neither the name of The Linux Foundation nor the names of its
#      contributors may be used to endorse or promote products derived
#      from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER 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.

# Bluetooth executables and script (init.msm.bt.sh, btnvtool)
type bluetooth_loader, domain;
type bluetooth_loader_exec, exec_type, file_type;

init_daemon_domain(bluetooth_loader)

# Access to /data/misc/bluedroid
allow bluetooth_loader bluetooth_data_file:dir rw_dir_perms;
allow bluetooth_loader bluetooth_data_file:file create_file_perms;
allow bluetooth_loader system_data_file:dir r_dir_perms;

# Run init.msm.bt.sh
allow bluetooth_loader shell_exec:file { entrypoint getattr read };
allow bluetooth_loader bluetooth_loader_exec:file { execute_no_trans getattr read };
allow bluetooth_loader sysfs:file rw_file_perms;
allow bluetooth_loader toolbox_exec:file rx_file_perms;

# Set properties for init
set_prop(bluetooth_loader, bluetooth_prop)

# Run hci_qcomm_init from init.msm.bt.sh
domain_auto_trans(bluetooth_loader, hciattach_exec, hciattach)
allow hciattach bluetooth_loader:fd use;
allow hciattach bluetooth_loader:fifo_file { write getattr };
