# Copyright (c) 2020 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.

type vendor_qccsyshal_qti, domain, coredomain;
type vendor_qccsyshal_qti_exec, system_file_type , exec_type, file_type;

hal_server_domain(vendor_qccsyshal_qti, vendor_qccsyshal);

#Add hwservice related rules
hal_attribute_hwservice(vendor_qccsyshal, vendor_qccsyshal_hwservice);

#Allow for transition from init domain to qccsyshal
init_daemon_domain(vendor_qccsyshal_qti)

#Allow the interaction with servicemanager
binder_use(vendor_qccsyshal_qti)

#Allow hwbinder call from hal client to server
binder_call(vendor_qccsyshal_client, vendor_qccsyshal_server)
binder_call(vendor_qccsyshal_server, vendor_qccsyshal_client)

allow vendor_qccsyshal_client vendor_qccsyshal_hwservice:hwservice_manager find;

# allow access to qdma dropbox (/data/misc/qdma)
allow vendor_qccsyshal_qti vendor_qcc_data_file:dir create_dir_perms;
allow vendor_qccsyshal_qti vendor_qcc_data_file:file create_file_perms;

# allow access to vendor_qcc_app_socket
unix_socket_connect(vendor_qccsyshal_qti, vendor_qcc_app, vendor_qcc_app)
allow vendor_qccsyshal_qti vendor_qcc_app_socket:dir r_dir_perms;
allow vendor_qccsyshal_qti vendor_qcc_app_socket:sock_file rw_file_perms;

userdebug_or_eng(`
  allow vendor_qccsyshal_qti vendor_qcc_lmtp_app:unix_stream_socket connectto;
')
