---
name: "nbd_aio_get_direction"
section: "3"
platform: "linux"
package: "libnbd"
version: "1.24.4-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/nbd_aio_get_direction"
---

# nbd\_aio\_get\_direction(3)

return the read or write direction

## NAME

nbd\_aio\_get\_direction - return the read or write direction

## SYNOPSIS

```
 #include <libnbd.h>
 unsigned nbd_aio_get_direction (
            struct nbd_handle *h
          );
```

## DESCRIPTION

Return the current direction of this connection, which means whether we are next expecting to read data from the server, write data to the server, or both.  It returns

- 0

  We are not expected to interact with the server file descriptor from the current state. It is not worth attempting to use [**poll**(2)](/poll/2.md); if the connection is not dead, then state machine progress must instead come from some other means such as [**nbd\_aio\_connect**(3)](/nbd_aio_connect/3.md).

- "LIBNBD\_AIO\_DIRECTION\_READ" = 1

  We are expected next to read from the server.  If using [**poll**(2)](/poll/2.md) you would set `"events = POLLIN"`.  If `"revents"` returns `"POLLIN"` or `"POLLHUP"` you would then call [**nbd\_aio\_notify\_read**(3)](/nbd_aio_notify_read/3.md).

  Note that once libnbd reaches [**nbd\_aio\_is\_ready**(3)](/nbd_aio_is_ready/3.md), this direction is returned even when there are no commands in flight (see [**nbd\_aio\_in\_flight**(3)](/nbd_aio_in_flight/3.md)). In a single-threaded use of libnbd, it is not worth polling until after issuing a command, as otherwise the server will never wake up the poll. In a multi-threaded scenario, you can have one thread begin a polling loop prior to any commands, but any other thread that issues a command will need a way to kick the polling thread out of poll in case issuing the command changes the needed polling direction. Possible ways to do this include polling for activity on a pipe-to-self, or using [**pthread\_kill**(3)](/pthread_kill/3.md) to send a signal that is masked except during [**ppoll**(2)](/ppoll/2.md).

- "LIBNBD\_AIO\_DIRECTION\_WRITE" = 2

  We are expected next to write to the server.  If using [**poll**(2)](/poll/2.md) you would set `"events = POLLOUT"`.  If `"revents"` returns `"POLLOUT"` you would then call [**nbd\_aio\_notify\_write**(3)](/nbd_aio_notify_write/3.md).

- "LIBNBD\_AIO\_DIRECTION\_BOTH" = 3

  We are expected next to either read or write to the server.  If using [**poll**(2)](/poll/2.md) you would set `"events = POLLIN|POLLOUT"`.  If only one of `"POLLIN"` or `"POLLOUT"` is returned, then see above.  However, if both are returned, it is better to call only [**nbd\_aio\_notify\_read**(3)](/nbd_aio_notify_read/3.md), as processing the server's reply may change the state of the connection and invalidate the need to write more commands.

## RETURN VALUE

This call returns a bitmask.

## ERRORS

This function does not fail.

The following parameters must not be NULL: `"h"`. For more information see "Non-NULL parameters" in [**libnbd**(3)](/libnbd/3.md).

## VERSION

This function first appeared in libnbd 1.0.

If you need to test if this function is available at compile time check if the following macro is defined:

```
 #define LIBNBD_HAVE_NBD_AIO_GET_DIRECTION 1
```

## SEE ALSO

[**nbd\_aio\_connect**(3)](/nbd_aio_connect/3.md), [**nbd\_aio\_in\_flight**(3)](/nbd_aio_in_flight/3.md), [**nbd\_aio\_is\_ready**(3)](/nbd_aio_is_ready/3.md), [**nbd\_aio\_notify\_read**(3)](/nbd_aio_notify_read/3.md), [**nbd\_aio\_notify\_write**(3)](/nbd_aio_notify_write/3.md), [**nbd\_create**(3)](/nbd_create/3.md), [**libnbd**(3)](/libnbd/3.md), [**poll**(2)](/poll/2.md), [**ppoll**(2)](/ppoll/2.md), [**pthread\_kill**(3)](/pthread_kill/3.md).

## AUTHORS

Eric Blake

Richard W.M. Jones

## COPYRIGHT

Copyright Red Hat

## LICENSE

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
