// Copyright 2019 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.

library zx;

// Mirrors alias_workarounds[.test].fidl. We don't want to pull real syscalls
// into the test data, so these are copied here. The structs and basic types
// will eventually go away when we can make this test pull in a zx.fidl that
// contains them.

struct HandleDisposition {};
struct HandleInfo {};
struct PciBar {};
struct PortPacket {};
struct WaitItem {};

alias charptr = uint64;
alias const_futexptr = int32;
alias const_voidptr = uint64;
alias mutable_string = string;
alias mutable_uint32 = uint32;
alias mutable_usize = usize;
alias mutable_vector_HandleDisposition_u32size = vector<HandleDisposition>;
alias mutable_vector_WaitItem = vector<WaitItem>;
alias mutable_vector_handle_u32size = vector<handle>;
alias mutable_vector_void = vector<byte>;
alias mutable_vector_void_u32size = vector<byte>;
alias optional_PciBar = PciBar;
alias optional_PortPacket = PortPacket;
alias optional_koid = koid;
alias optional_signals = signals;
alias optional_time = time;
alias optional_uint32 = uint32;
alias optional_usize = usize;
alias vector_HandleInfo_u32size = vector<HandleInfo>;
alias vector_handle_u32size = vector<handle>;
alias vector_paddr = vector<paddr>;
alias vector_void = vector<byte>;
alias vector_void_u32size = vector<byte>;
alias voidptr = uint64;
alias string_view = uint64;

[Transport="Syscall"]
protocol Aliases {
    SomeFunc(charptr a,
             const_futexptr b,
             const_voidptr c,
             mutable_string d,
             mutable_uint32 e,
             mutable_usize f,
             mutable_vector_HandleDisposition_u32size g,
             mutable_vector_WaitItem h,
             mutable_vector_handle_u32size i,
             mutable_vector_void j,
             mutable_vector_void_u32size k,
             vector_HandleInfo_u32size l,
             vector_handle_u32size m,
             vector_paddr n,
             vector_void o,
             vector_void_u32size p,
             voidptr q) ->
        (status status,
         optional_PciBar r,
         optional_PortPacket s,
         optional_koid t,
         optional_signals u,
         optional_time v,
         optional_uint32 w,
         optional_usize x,
         string_view y);
};
