// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "private.h"

__EXPORT zx_status_t _zx_channel_call(zx_handle_t handle, uint32_t options, zx_time_t deadline,
                                      const zx_channel_call_args_t* args, uint32_t* actual_bytes,
                                      uint32_t* actual_handles) {
  zx_status_t status = SYSCALL_zx_channel_call_noretry(handle, options, deadline, args,
                                                       actual_bytes, actual_handles);
  while (unlikely(status == ZX_ERR_INTERNAL_INTR_RETRY)) {
    status = SYSCALL_zx_channel_call_finish(deadline, args, actual_bytes, actual_handles);
  }
  return status;
}

VDSO_INTERFACE_FUNCTION(zx_channel_call);

__EXPORT zx_status_t _zx_channel_call_etc(zx_handle_t handle, uint32_t options, zx_time_t deadline,
                                          zx_channel_call_etc_args_t* args, uint32_t* actual_bytes,
                                          uint32_t* actual_handles) {
  zx_status_t status = SYSCALL_zx_channel_call_etc_noretry(handle, options, deadline, args,
                                                           actual_bytes, actual_handles);
  while (unlikely(status == ZX_ERR_INTERNAL_INTR_RETRY)) {
    status = SYSCALL_zx_channel_call_etc_finish(deadline, args, actual_bytes, actual_handles);
  }
  return status;
}

VDSO_INTERFACE_FUNCTION(zx_channel_call_etc);
