# loc_launcher service
# which launches various other services supporting GPS & Wifi-RTT (LOWI) location
type location, domain;
type location_exec, exec_type, vendor_file_type, file_type;

init_daemon_domain(location)

# STOPSHIP b/28340421
# Temporarily grant this permission (for LOWI) and log its use.
allow location self:capability { net_admin };
auditallow location self:capability { net_admin };

allow location self:capability { setgid setuid };

hwbinder_use(location)
get_prop(location, hwservicemanager_prop)
allow location fwk_sensor_hwservice:hwservice_manager find;
binder_call(location, system_server)
allow location hal_wifi:unix_stream_socket { read write };

# Enable standard network access (for XTRA download)
net_domain(location)

# And some additional network access
allow location self:netlink_generic_socket create_socket_perms_no_ioctl;
allow location self:netlink_socket create_socket_perms_no_ioctl;
allowxperm location self:udp_socket ioctl { SIOCGIFINDEX SIOCGIFHWADDR SIOCIWFIRSTPRIV_05 };

allow location self:socket create_socket_perms;
allowxperm location self:socket ioctl msm_sock_ipc_ioctls;

# files in /sys
r_dir_file(location, sysfs_type)

dontaudit location kernel:system module_request;


# execute /vendor/bin/lowi-server
allow location location_exec:file rx_file_perms;

# /data/vendor/location
allow location location_data_file:dir create_dir_perms;
allow location location_data_file:file create_file_perms;

# /dev/socket/location
allow location location_socket:sock_file create_file_perms;
allow location location_socket:dir rw_dir_perms;
allow location hal_gnss_qti:unix_dgram_socket sendto;

userdebug_or_eng(`
  allow location diag_device:chr_file rw_file_perms;
')

allow location hal_cne_hwservice:hwservice_manager find;
binder_call(location, cnd)

get_prop(location, wifi_hal_prop)
