/*
 * 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 firehoseReply 11700;

serverprefix firehose_client_;
userprefix firehose_send_;

skip; // firehose_register

simpleroutine push_reply(
RequestPort	req_port		: mach_port_move_send_once_t;
in			rtc				: kern_return_t;
in			push_reply		: firehose_push_reply_t;
in			quarantined		: boolean_t
);

simpleroutine push_notify_async(
RequestPort	comm_port		: mach_port_t;
in			push_reply		: firehose_push_reply_t;
in			quarantined		: boolean_t;
WaitTime	timeout			: natural_t
);
