Update Red Hat Copyright Notices
[nbdkit.git] / server / exports.c
blob7fb150f76a7a04f4642df1f9dab4c05812080663
1 /* nbdkit
2 * Copyright Red Hat
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
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
30 * SUCH DAMAGE.
33 #include <config.h>
35 #include <stdlib.h>
36 #include <stdbool.h>
37 #include <string.h>
38 #include <errno.h>
39 #include <assert.h>
41 #include "vector.h"
43 #include "internal.h"
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 {
54 exports exports;
55 bool use_default;
58 NBDKIT_DLL_PUBLIC struct nbdkit_exports *
59 nbdkit_exports_new (void)
61 struct nbdkit_exports *r;
63 r = malloc (sizeof *r);
64 if (r == NULL) {
65 nbdkit_error ("nbdkit_exports_new: malloc: %m");
66 return NULL;
68 r->exports = (exports) empty_vector;
69 r->use_default = false;
70 return r;
73 static void
74 nbdkit_export_clear (struct nbdkit_export exp)
76 free (exp.name);
77 free (exp.description);
80 NBDKIT_DLL_PUBLIC void
81 nbdkit_exports_free (struct nbdkit_exports *exps)
83 if (exps) {
84 exports_iter (&exps->exports, nbdkit_export_clear);
85 free (exps->exports.ptr);
86 free (exps);
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");
111 errno = EINVAL;
112 return -1;
114 if (strlen (name) > NBD_MAX_STRING ||
115 (description && strlen (description) > NBD_MAX_STRING)) {
116 nbdkit_error ("nbdkit_add_export: string too long");
117 errno = EINVAL;
118 return -1;
121 e.name = strdup (name);
122 if (e.name == NULL) {
123 nbdkit_error ("nbdkit_add_export: strdup: %m");
124 return -1;
126 if (description) {
127 e.description = strdup (description);
128 if (e.description == NULL) {
129 nbdkit_error ("nbdkit_add_export: strdup: %m");
130 free (e.name);
131 errno = ENOMEM;
132 return -1;
136 if (exports_append (&exps->exports, e) == -1) {
137 nbdkit_error ("nbdkit_add_export: realloc: %m");
138 free (e.name);
139 free (e.description);
140 errno = ENOMEM;
141 return -1;
144 return 0;
147 NBDKIT_DLL_PUBLIC int
148 nbdkit_use_default_export (struct nbdkit_exports *exps)
150 exps->use_default = true;
151 return 0;
155 exports_resolve_default (struct nbdkit_exports *exps, struct backend *b,
156 int readonly)
158 const char *def = NULL;
160 if (exps->use_default) {
161 def = backend_default_export (b, readonly);
162 exps->use_default = false;
164 if (def)
165 return nbdkit_add_export (exps, def, NULL);
166 return 0;