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

typeattribute vendor_qvrd coredomain;
typeattribute vendor_qvrd mlstrustedsubject;
type vendor_qvrd_exec, system_file_type, exec_type, file_type;

init_daemon_domain(vendor_qvrd)

#
# General
#

binder_call(vendor_qvrd, system_server);

# Allow interracting with vendor_qvrd directory
allow vendor_qvrd vendor_qvrd_data_file:dir create_dir_perms;
allow vendor_qvrd vendor_qvrd_data_file:file create_file_perms;

#allow binder use for checking permissions
binder_use(vendor_qvrd)
allow vendor_qvrd permission_service:service_manager find;

#Allow hardware binder use
hwbinder_use(vendor_qvrd)
get_prop(vendor_qvrd, hwservicemanager_prop)

# Allow access to our socket
allow vendor_qvrd vendor_qvrd_socket:sock_file rw_file_perms;
allow vendor_qvrd vendor_qvrd_controller_socket:sock_file rw_file_perms;

#
# Sensors
#


# Allow access to sensor1 API
allow vendor_qvrd self:socket create_socket_perms_no_ioctl;

#
# Display
#

# Allow access to /dev/graphics/fb0 for configuring vsync interrupts
allow vendor_qvrd graphics_device:dir r_dir_perms;
allow vendor_qvrd graphics_device:chr_file rw_file_perms;

#
# Graphics
#

#Allow hal graphics mapper permissions
hal_client_domain(vendor_qvrd, hal_graphics_composer);

#Allow hal graphics allocator permissions
hal_client_domain(vendor_qvrd, hal_graphics_allocator);

#
# Scheduler
#

allow vendor_qvrd self:capability { sys_nice };
userdebug_or_eng(`
  allow vendor_qvrd su:process setsched;
')
allow vendor_qvrd appdomain:process setsched;

# whitelisting ioctlcmd c302
allowxperm vendor_qvrd self:socket ioctl msm_sock_ipc_ioctls_system;
allow vendor_qvrd self:socket ioctl;
