/*
 * Copyright (c) 2015 Apple Inc. All rights reserved.
 *
 * @APPLE_APACHE_LICENSE_HEADER_START@
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @APPLE_APACHE_LICENSE_HEADER_END@
 */

#include <mach/std_types.defs>
#include <mach/mach_types.defs>

#include "firehose_types.defs"

subsystem firehose	11600;
serverprefix		firehose_server_;
userprefix			firehose_send_;

simpleroutine
register(
			server_port		: mach_port_t;
			mem_port		: mach_port_move_send_t;
			mem_size		: mach_vm_size_t;
			comm_recvp		: mach_port_move_receive_t;
			comm_sendp		: mach_port_make_send_t;
			extra_info_port : mach_port_move_send_t;
			extra_info_size : mach_vm_size_t;
			ServerAuditToken atoken : audit_token_t
);

routine
push_and_wait(
RequestPort	comm_port		: mach_port_t;
SReplyPort	reply_port		: mach_port_make_send_once_t;
			qos_class		: qos_class_t;
			for_io			: boolean_t;
out			push_reply		: firehose_push_reply_t;
out			quarantinedOut	: boolean_t
);

simpleroutine
push_async(
			comm_port		: mach_port_t;
			qos_class		: qos_class_t;
			for_io			: boolean_t;
			expects_notify	: boolean_t
);
