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

#ifndef LIB_FDIO_UNSAFE_H_
#define LIB_FDIO_UNSAFE_H_

#include <stdint.h>
#include <zircon/availability.h>
#include <zircon/compiler.h>
#include <zircon/types.h>

__BEGIN_CDECLS

// WARNING: These interfaces exist to allow integration of fdio file descriptors with handle-centric
// message loops.  If used incorrectly they can seriously mess up the state of fdio, fds, etc.

typedef struct fdio fdio_t;

// This looks up a file descriptor, and if it exists, upreferences the fdio_t under it and returns
// that. fdio_unsafe_release() must be called later to release the reference.
//
// If the fd does not exist, it returns NULL
fdio_t* fdio_unsafe_fd_to_io(int fd) ZX_AVAILABLE_SINCE(1);

// Returns the handle corresponding to the underlying fdio, if there is one. Returns
// ZX_HANDLE_INVALID otherwise.
//
// Since this handle is borrowed from the underlying fdio_t, it is unsafe to close it or use it
// after fdio_unsafe_release is called.
zx_handle_t fdio_unsafe_borrow_channel(fdio_t* io) ZX_AVAILABLE_SINCE(1);

// Releases a reference on a fdio_t.  Used to "return" a fdio_t obtained from fdio_unsafe_fd_to_io()
// when you're done with it.
void fdio_unsafe_release(fdio_t* io) ZX_AVAILABLE_SINCE(1);

// This given a fdio_t, and a bitmask of posix-style events (EPOLLIN, EPOLLOUT, EPOLLERR), this
// returns a handle that may be waited upon and a  bitmask of which signals to wait on for the
// desired events.
//
// The handle belongs to the fdio_t, is not duplicated, and may be closed() by the fdio library but
// MUST NOT be closed by the caller.
//
// If waiting is not supported by this fdio_t, the returned handle is ZX_HANDLE_INVALID.
//
// This function is only safe to call on a fdio_t you hold a reference to.  It is not required that
// `fdio_unsafe_wait_end()` be called after this.
void fdio_unsafe_wait_begin(fdio_t* io, uint32_t events, zx_handle_t* handle_out,
                            zx_signals_t* signals_out) ZX_AVAILABLE_SINCE(1);

// This given a set of signals observed on a handle obtained from fdio_unsafe_wait_begin() returns a
// set of posix-style events that are indicated.
//
// This function is only safe to call on a fdio_t you hold a reference to.
void fdio_unsafe_wait_end(fdio_t* io, zx_signals_t signals, uint32_t* events_out)
    ZX_AVAILABLE_SINCE(1);

__END_CDECLS

#endif  // LIB_FDIO_UNSAFE_H_
