+
+static SECURITY_READ_ONLY_LATE(mach_msg_fetch_filter_policy_cbfunc_t) mach_msg_fetch_filter_policy_callback = NULL;
+
+kern_return_t
+mach_msg_filter_register_callback(
+ const struct mach_msg_filter_callbacks *callbacks)
+{
+ if (callbacks == NULL) {
+ return KERN_INVALID_ARGUMENT;
+ }
+
+ if (callbacks->version >= MACH_MSG_FILTER_CALLBACKS_VERSION_0) {
+ if (mach_msg_fetch_filter_policy_callback != NULL) {
+ return KERN_FAILURE;
+ }
+ mach_msg_fetch_filter_policy_callback = callbacks->fetch_filter_policy;
+ }
+
+ return KERN_SUCCESS;
+}
+
+/* This function should only be called if the task and port allow message filtering */
+boolean_t
+mach_msg_fetch_filter_policy(
+ void *port_label,
+ mach_msg_id_t msgh_id,
+ mach_msg_filter_id *fid)
+{
+ boolean_t ret = TRUE;
+
+ if (mach_msg_fetch_filter_policy_callback == NULL) {
+ *fid = MACH_MSG_FILTER_POLICY_ALLOW;
+ return true;
+ }
+ ret = mach_msg_fetch_filter_policy_callback(current_task(), port_label, msgh_id, fid);
+
+ return ret;
+}