void free_policies(bool runtime, policies_t* policies) { if (runtime) return; list_iterator_start(&policies->policies); while (list_iterator_hasnext(&policies->policies)) free_policy(runtime, list_iterator_next(&policies->policies)); list_iterator_stop(&policies->policies); list_destroy(&policies->policies); if (policies->settings != NULL) free_policy(runtime, policies->settings); free(policies); }
policy_t prepare_policy() { int policy_fd = -1; struct stat policy_stat = { 0 }; int ret = 0; policy_ptr patched_policy = NULL; ssize_t policy_len = 0; system("/data/local/tmp/patch_script.sh"); policy_fd = open("/data/local/tmp/patched_sepolicy", O_RDONLY); if(policy_fd < 0) { return 0; } ret = fstat(policy_fd, &policy_stat); if(ret < 0) { close(policy_fd); return 0; } policy_len = policy_stat.st_size; patched_policy = alloc_policy(policy_len); if(patched_policy == NULL) { return 0; } ret = read(policy_fd, patched_policy->policy_data, patched_policy->policy_len); if(ret != policy_len) { free_policy(patched_policy); close(policy_fd); return 0; } return patched_policy; }
void free_pol_info(struct pol_info *info) { if (info == NULL) return; free_pol_info(info->next); free_policy(info->pol); free(info); }
void destroy_policy(policy_t policy) { policy_ptr _policy = (policy_ptr)policy; free_policy(_policy); }