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

# Policy for peripheral_manager
# per_mgr - peripheral_manager domain
type vendor_per_mgr, domain;

type vendor_per_mgr_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(vendor_per_mgr);

# Needed for binder transactions
use_vendor_per_mgr(vendor_per_mgr)
allow vendor_per_mgr vendor_per_mgr_service:service_manager { add };

allow vendor_per_mgr self:{ socket qipcrtr_socket } create_socket_perms;
allowxperm vendor_per_mgr self:{ socket qipcrtr_socket } ioctl msm_sock_ipc_ioctls;

# Needed by ipc_router
allow vendor_per_mgr self:capability net_bind_service;

# Needed to power on the peripheral
allow vendor_per_mgr ssr_device:chr_file r_file_perms;

# Needed by libmdmdetect to get subsystem info and to check their states
r_dir_file(vendor_per_mgr, firmware_file)
allow vendor_per_mgr sysfs_data:file r_file_perms;

# Set the peripheral state property
set_prop(vendor_per_mgr, vendor_per_mgr_state_prop);

allow vendor_per_mgr self:capability net_raw;
