File: nbd_can_cache.pod

package info (click to toggle)
libnbd 1.22.5-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,636 kB
  • sloc: ansic: 53,855; ml: 12,311; sh: 8,499; python: 4,595; makefile: 2,902; perl: 165; cpp: 24
file content (179 lines) | stat: -rw-r--r-- 4,666 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
=head1 NAME

nbd_can_cache - does the server support the cache command?

=head1 SYNOPSIS

 #include <libnbd.h>

 int nbd_can_cache (
       struct nbd_handle *h
     );

=head1 DESCRIPTION

Returns true if the server supports the cache command
(see L<nbd_cache(3)>, L<nbd_aio_cache(3)>).  Returns false if
the server does not.

This call does not block, because it returns data that is saved in
the handle from the NBD protocol handshake.

=head1 RETURN VALUE

This call returns a boolean value.

=head1 ERRORS

On error C<-1> is returned.

Refer to L<libnbd(3)/ERROR HANDLING>
for how to get further details of the error.

The following parameters must not be NULL: C<h>.
For more information see L<libnbd(3)/Non-NULL parameters>.

=head1 HANDLE STATE

nbd_can_cache
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                │
 └─────────────────────────────────────┴─────────────────────────┘

=head1 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_CAN_CACHE 1

=head1 EXAMPLE

This example is also available as F<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>

 int
 main (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_DESCRIPTION
   str = 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);
 #endif
   PRINT_FLAG (nbd_is_read_only);
   PRINT_FLAG (nbd_is_rotational);

   /* Close the libnbd handle. */
   nbd_close (nbd);

   exit (EXIT_SUCCESS);
 }

=head1 SEE ALSO

L<nbd_aio_cache(3)>,
L<nbd_cache(3)>,
L<nbd_create(3)>,
L<nbd_opt_info(3)>,
L<libnbd(3)/Flag calls>,
L<libnbd(3)>.

=head1 AUTHORS

Eric Blake

Richard W.M. Jones

=head1 COPYRIGHT

Copyright Red Hat