4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * * Neither the name of Red Hat nor the names of its contributors may be
16 * used to endorse or promote products derived from this software without
17 * specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
22 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
45 /* Cap nr_exports to avoid sending over-large replies to the client,
46 * and to avoid a plugin with large list consuming too much memory.
48 #define MAX_EXPORTS 10000
50 /* Appendable list of exports. */
51 DEFINE_VECTOR_TYPE (exports
, struct nbdkit_export
);
53 struct nbdkit_exports
{
58 NBDKIT_DLL_PUBLIC
struct nbdkit_exports
*
59 nbdkit_exports_new (void)
61 struct nbdkit_exports
*r
;
63 r
= malloc (sizeof *r
);
65 nbdkit_error ("nbdkit_exports_new: malloc: %m");
68 r
->exports
= (exports
) empty_vector
;
69 r
->use_default
= false;
74 nbdkit_export_clear (struct nbdkit_export exp
)
77 free (exp
.description
);
80 NBDKIT_DLL_PUBLIC
void
81 nbdkit_exports_free (struct nbdkit_exports
*exps
)
84 exports_iter (&exps
->exports
, nbdkit_export_clear
);
85 free (exps
->exports
.ptr
);
90 NBDKIT_DLL_PUBLIC
size_t
91 nbdkit_exports_count (const struct nbdkit_exports
*exps
)
93 return exps
->exports
.len
;
96 NBDKIT_DLL_PUBLIC
const struct nbdkit_export
97 nbdkit_get_export (const struct nbdkit_exports
*exps
, size_t i
)
99 assert (i
< exps
->exports
.len
);
100 return exps
->exports
.ptr
[i
];
103 NBDKIT_DLL_PUBLIC
int
104 nbdkit_add_export (struct nbdkit_exports
*exps
,
105 const char *name
, const char *description
)
107 struct nbdkit_export e
= { NULL
, NULL
};
109 if (exps
->exports
.len
== MAX_EXPORTS
) {
110 nbdkit_error ("nbdkit_add_export: too many exports");
114 if (strlen (name
) > NBD_MAX_STRING
||
115 (description
&& strlen (description
) > NBD_MAX_STRING
)) {
116 nbdkit_error ("nbdkit_add_export: string too long");
121 e
.name
= strdup (name
);
122 if (e
.name
== NULL
) {
123 nbdkit_error ("nbdkit_add_export: strdup: %m");
127 e
.description
= strdup (description
);
128 if (e
.description
== NULL
) {
129 nbdkit_error ("nbdkit_add_export: strdup: %m");
136 if (exports_append (&exps
->exports
, e
) == -1) {
137 nbdkit_error ("nbdkit_add_export: realloc: %m");
139 free (e
.description
);
147 NBDKIT_DLL_PUBLIC
int
148 nbdkit_use_default_export (struct nbdkit_exports
*exps
)
150 exps
->use_default
= true;
155 exports_resolve_default (struct nbdkit_exports
*exps
, struct backend
*b
,
158 const char *def
= NULL
;
160 if (exps
->use_default
) {
161 def
= backend_default_export (b
, readonly
);
162 exps
->use_default
= false;
165 return nbdkit_add_export (exps
, def
, NULL
);