nbd_is_read_only3
Is the nbd export read-only?
Usage
#include <libnbd.h>int nbd_is_read_only (struct nbd_handle *h);
Overview
Returns true if the NBD export is read-only; writes and write-like operations will fail.
This call does not block, because it returns data that is saved in the handle from the NBD protocol handshake.
Return value
This call returns a boolean value.
Errors
On error -1 is returned.
Refer to "ERROR HANDLING" in libnbd(3) for how to get further details of the error.
The following parameters must not be NULL: "h". For more information see "Non-NULL parameters" in libnbd(3).
Handle state
nbd_is_read_only can be called when the handle is in the following states:
┌─────────────────────────────────────┬─────────────────────────┐│ Handle created, before connecting │ ❌ error ││ Connecting │ ❌ error ││ Connecting & handshaking (opt_mode) │ ✅ allowed ││ Connected to the server │ ✅ allowed ││ Connection shut down │ ✅ allowed ││ Handle dead │ ❌ error │└─────────────────────────────────────┴─────────────────────────┘
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_IS_READ_ONLY 1
Examples
This example is also available as examples/server-flags.c in the libnbd source code.
/* This example shows how to connect to an NBD* server and print the export flags.** You can test it with nbdkit like this:** nbdkit -U - memory 1M \* --run './server-flags $unixsocket'*/#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <libnbd.h>intmain (int argc, char *argv[]){struct nbd_handle *nbd;char *str;int flag;if (argc != 2) {fprintf (stderr, "%s socket\n", argv[0]);exit (EXIT_FAILURE);}/* Create the libnbd handle. */nbd = nbd_create ();if (nbd == NULL) {fprintf (stderr, "%s\n", nbd_get_error ());exit (EXIT_FAILURE);}/* Request full information. */#if LIBNBD_HAVE_NBD_SET_FULL_INFO /* Added in 1.4 */if (nbd_set_full_info (nbd, true) == -1) {fprintf (stderr, "%s\n", nbd_get_error ());exit (EXIT_FAILURE);}#endif/* Connect to the NBD server over a* Unix domain socket.*/if (nbd_connect_unix (nbd, argv[1]) == -1) {fprintf (stderr, "%s\n", nbd_get_error ());exit (EXIT_FAILURE);}/* See if the server provided extra details,* using functions added in 1.4*/#if LIBNBD_HAVE_NBD_GET_EXPORT_DESCRIPTIONstr = nbd_get_canonical_export_name (nbd);if (str)printf ("canonical_name = %s\n", str);free (str);str = nbd_get_export_description (nbd);if (str)printf ("description = %s\n", str);free (str);#endif/* Read and print the flags. */#define PRINT_FLAG(flag_fn) \flag = flag_fn (nbd); \if (flag == -1) { \fprintf (stderr, "%s\n", nbd_get_error ()); \exit (EXIT_FAILURE); \} \printf (#flag_fn " = %s\n", \flag ? "true" : "false");PRINT_FLAG (nbd_can_cache);PRINT_FLAG (nbd_can_df);PRINT_FLAG (nbd_can_flush);PRINT_FLAG (nbd_can_fua);PRINT_FLAG (nbd_can_multi_conn);PRINT_FLAG (nbd_can_trim);PRINT_FLAG (nbd_can_zero);#if LIBNBD_HAVE_NBD_CAN_FAST_ZERO/* Added in 1.2 */PRINT_FLAG (nbd_can_fast_zero);#endif#if LIBNBD_HAVE_NBD_CAN_BLOCK_STATUS_PAYLOAD/* Added in 1.18 */PRINT_FLAG (nbd_can_block_status_payload);#endifPRINT_FLAG (nbd_is_read_only);PRINT_FLAG (nbd_is_rotational);/* Close the libnbd handle. */nbd_close (nbd);exit (EXIT_SUCCESS);}
Releases
4 releases since Debian 11 (Bullseye); the text changed 3 times.