blob: 79ea0867e92070837e8440479188a0912a978537 [file] [log] [blame]
// 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_