2 * Copyright (c) 2013 The FreeBSD Foundation
5 * This software was developed by Pawel Jakub Dawidek under sponsorship from
6 * the FreeBSD Foundation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 #include <sys/types.h>
33 #include <sys/socket.h>
46 #define CHECK(expr) do { \
48 printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \
50 printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\
54 #define fd_is_valid(fd) (fcntl((fd), F_GETFL) != -1 || errno != EBADF)
62 nvl = nvlist_create(0);
63 empty = nvlist_create(0);
65 nvlist_add_bool(nvl, "nvlist/bool/true", true);
66 nvlist_add_bool(nvl, "nvlist/bool/false", false);
67 nvlist_add_number(nvl, "nvlist/number/0", 0);
68 nvlist_add_number(nvl, "nvlist/number/1", 1);
69 nvlist_add_number(nvl, "nvlist/number/-1", -1);
70 nvlist_add_number(nvl, "nvlist/number/UINT64_MAX", UINT64_MAX);
71 nvlist_add_number(nvl, "nvlist/number/INT64_MIN", INT64_MIN);
72 nvlist_add_number(nvl, "nvlist/number/INT64_MAX", INT64_MAX);
73 nvlist_add_string(nvl, "nvlist/string/", "");
74 nvlist_add_string(nvl, "nvlist/string/x", "x");
75 nvlist_add_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz");
76 nvlist_add_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", STDERR_FILENO);
77 nvlist_add_binary(nvl, "nvlist/binary/x", "x", 1);
78 nvlist_add_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz"));
79 nvlist_move_nvlist(nvl, "nvlist/nvlist/empty", empty);
80 nvlist_add_nvlist(nvl, "nvlist/nvlist", nvl);
82 nvlist_send(sock, nvl);
91 const nvlist_t *cnvl, *empty;
92 const char *name, *cname;
93 void *cookie, *ccookie;
97 nvl = nvlist_recv(sock, 0);
98 CHECK(nvlist_error(nvl) == 0);
99 if (nvlist_error(nvl) != 0)
100 err(1, "nvlist_recv() failed");
104 name = nvlist_next(nvl, &type, &cookie);
106 CHECK(type == NV_TYPE_BOOL);
107 CHECK(strcmp(name, "nvlist/bool/true") == 0);
108 CHECK(nvlist_get_bool(nvl, name) == true);
110 name = nvlist_next(nvl, &type, &cookie);
112 CHECK(type == NV_TYPE_BOOL);
113 CHECK(strcmp(name, "nvlist/bool/false") == 0);
114 CHECK(nvlist_get_bool(nvl, name) == false);
116 name = nvlist_next(nvl, &type, &cookie);
118 CHECK(type == NV_TYPE_NUMBER);
119 CHECK(strcmp(name, "nvlist/number/0") == 0);
120 CHECK(nvlist_get_number(nvl, name) == 0);
122 name = nvlist_next(nvl, &type, &cookie);
124 CHECK(type == NV_TYPE_NUMBER);
125 CHECK(strcmp(name, "nvlist/number/1") == 0);
126 CHECK(nvlist_get_number(nvl, name) == 1);
128 name = nvlist_next(nvl, &type, &cookie);
130 CHECK(type == NV_TYPE_NUMBER);
131 CHECK(strcmp(name, "nvlist/number/-1") == 0);
132 CHECK((int)nvlist_get_number(nvl, name) == -1);
134 name = nvlist_next(nvl, &type, &cookie);
136 CHECK(type == NV_TYPE_NUMBER);
137 CHECK(strcmp(name, "nvlist/number/UINT64_MAX") == 0);
138 CHECK(nvlist_get_number(nvl, name) == UINT64_MAX);
140 name = nvlist_next(nvl, &type, &cookie);
142 CHECK(type == NV_TYPE_NUMBER);
143 CHECK(strcmp(name, "nvlist/number/INT64_MIN") == 0);
144 CHECK((int64_t)nvlist_get_number(nvl, name) == INT64_MIN);
146 name = nvlist_next(nvl, &type, &cookie);
148 CHECK(type == NV_TYPE_NUMBER);
149 CHECK(strcmp(name, "nvlist/number/INT64_MAX") == 0);
150 CHECK((int64_t)nvlist_get_number(nvl, name) == INT64_MAX);
152 name = nvlist_next(nvl, &type, &cookie);
154 CHECK(type == NV_TYPE_STRING);
155 CHECK(strcmp(name, "nvlist/string/") == 0);
156 CHECK(strcmp(nvlist_get_string(nvl, name), "") == 0);
158 name = nvlist_next(nvl, &type, &cookie);
160 CHECK(type == NV_TYPE_STRING);
161 CHECK(strcmp(name, "nvlist/string/x") == 0);
162 CHECK(strcmp(nvlist_get_string(nvl, name), "x") == 0);
164 name = nvlist_next(nvl, &type, &cookie);
166 CHECK(type == NV_TYPE_STRING);
167 CHECK(strcmp(name, "nvlist/string/abcdefghijklmnopqrstuvwxyz") == 0);
168 CHECK(strcmp(nvlist_get_string(nvl, name), "abcdefghijklmnopqrstuvwxyz") == 0);
170 name = nvlist_next(nvl, &type, &cookie);
172 CHECK(type == NV_TYPE_DESCRIPTOR);
173 CHECK(strcmp(name, "nvlist/descriptor/STDERR_FILENO") == 0);
174 CHECK(fd_is_valid(nvlist_get_descriptor(nvl, name)));
176 name = nvlist_next(nvl, &type, &cookie);
178 CHECK(type == NV_TYPE_BINARY);
179 CHECK(strcmp(name, "nvlist/binary/x") == 0);
180 CHECK(memcmp(nvlist_get_binary(nvl, name, NULL), "x", 1) == 0);
181 CHECK(memcmp(nvlist_get_binary(nvl, name, &size), "x", 1) == 0);
184 name = nvlist_next(nvl, &type, &cookie);
186 CHECK(type == NV_TYPE_BINARY);
187 CHECK(strcmp(name, "nvlist/binary/abcdefghijklmnopqrstuvwxyz") == 0);
188 CHECK(memcmp(nvlist_get_binary(nvl, name, NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
189 CHECK(memcmp(nvlist_get_binary(nvl, name, &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
190 CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
192 name = nvlist_next(nvl, &type, &cookie);
194 CHECK(type == NV_TYPE_NVLIST);
195 CHECK(strcmp(name, "nvlist/nvlist/empty") == 0);
196 cnvl = nvlist_get_nvlist(nvl, name);
197 CHECK(nvlist_empty(cnvl));
199 name = nvlist_next(nvl, &type, &cookie);
201 CHECK(type == NV_TYPE_NVLIST);
202 CHECK(strcmp(name, "nvlist/nvlist") == 0);
203 cnvl = nvlist_get_nvlist(nvl, name);
207 cname = nvlist_next(cnvl, &ctype, &ccookie);
208 CHECK(cname != NULL);
209 CHECK(ctype == NV_TYPE_BOOL);
210 CHECK(strcmp(cname, "nvlist/bool/true") == 0);
211 CHECK(nvlist_get_bool(cnvl, cname) == true);
213 cname = nvlist_next(cnvl, &ctype, &ccookie);
214 CHECK(cname != NULL);
215 CHECK(ctype == NV_TYPE_BOOL);
216 CHECK(strcmp(cname, "nvlist/bool/false") == 0);
217 CHECK(nvlist_get_bool(cnvl, cname) == false);
219 cname = nvlist_next(cnvl, &ctype, &ccookie);
220 CHECK(cname != NULL);
221 CHECK(ctype == NV_TYPE_NUMBER);
222 CHECK(strcmp(cname, "nvlist/number/0") == 0);
223 CHECK(nvlist_get_number(cnvl, cname) == 0);
225 cname = nvlist_next(cnvl, &ctype, &ccookie);
226 CHECK(cname != NULL);
227 CHECK(ctype == NV_TYPE_NUMBER);
228 CHECK(strcmp(cname, "nvlist/number/1") == 0);
229 CHECK(nvlist_get_number(cnvl, cname) == 1);
231 cname = nvlist_next(cnvl, &ctype, &ccookie);
232 CHECK(cname != NULL);
233 CHECK(ctype == NV_TYPE_NUMBER);
234 CHECK(strcmp(cname, "nvlist/number/-1") == 0);
235 CHECK((int)nvlist_get_number(cnvl, cname) == -1);
237 cname = nvlist_next(cnvl, &ctype, &ccookie);
238 CHECK(cname != NULL);
239 CHECK(ctype == NV_TYPE_NUMBER);
240 CHECK(strcmp(cname, "nvlist/number/UINT64_MAX") == 0);
241 CHECK(nvlist_get_number(cnvl, cname) == UINT64_MAX);
243 cname = nvlist_next(cnvl, &ctype, &ccookie);
244 CHECK(cname != NULL);
245 CHECK(ctype == NV_TYPE_NUMBER);
246 CHECK(strcmp(cname, "nvlist/number/INT64_MIN") == 0);
247 CHECK((int64_t)nvlist_get_number(cnvl, cname) == INT64_MIN);
249 cname = nvlist_next(cnvl, &ctype, &ccookie);
250 CHECK(cname != NULL);
251 CHECK(ctype == NV_TYPE_NUMBER);
252 CHECK(strcmp(cname, "nvlist/number/INT64_MAX") == 0);
253 CHECK((int64_t)nvlist_get_number(cnvl, cname) == INT64_MAX);
255 cname = nvlist_next(cnvl, &ctype, &ccookie);
256 CHECK(cname != NULL);
257 CHECK(ctype == NV_TYPE_STRING);
258 CHECK(strcmp(cname, "nvlist/string/") == 0);
259 CHECK(strcmp(nvlist_get_string(cnvl, cname), "") == 0);
261 cname = nvlist_next(cnvl, &ctype, &ccookie);
262 CHECK(cname != NULL);
263 CHECK(ctype == NV_TYPE_STRING);
264 CHECK(strcmp(cname, "nvlist/string/x") == 0);
265 CHECK(strcmp(nvlist_get_string(cnvl, cname), "x") == 0);
267 cname = nvlist_next(cnvl, &ctype, &ccookie);
268 CHECK(cname != NULL);
269 CHECK(ctype == NV_TYPE_STRING);
270 CHECK(strcmp(cname, "nvlist/string/abcdefghijklmnopqrstuvwxyz") == 0);
271 CHECK(strcmp(nvlist_get_string(cnvl, cname), "abcdefghijklmnopqrstuvwxyz") == 0);
273 cname = nvlist_next(cnvl, &ctype, &ccookie);
274 CHECK(cname != NULL);
275 CHECK(ctype == NV_TYPE_DESCRIPTOR);
276 CHECK(strcmp(cname, "nvlist/descriptor/STDERR_FILENO") == 0);
277 CHECK(fd_is_valid(nvlist_get_descriptor(cnvl, cname)));
279 cname = nvlist_next(cnvl, &ctype, &ccookie);
280 CHECK(cname != NULL);
281 CHECK(ctype == NV_TYPE_BINARY);
282 CHECK(strcmp(cname, "nvlist/binary/x") == 0);
283 CHECK(memcmp(nvlist_get_binary(cnvl, cname, NULL), "x", 1) == 0);
284 CHECK(memcmp(nvlist_get_binary(cnvl, cname, &size), "x", 1) == 0);
287 cname = nvlist_next(cnvl, &ctype, &ccookie);
288 CHECK(cname != NULL);
289 CHECK(ctype == NV_TYPE_BINARY);
290 CHECK(strcmp(cname, "nvlist/binary/abcdefghijklmnopqrstuvwxyz") == 0);
291 CHECK(memcmp(nvlist_get_binary(cnvl, cname, NULL), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
292 CHECK(memcmp(nvlist_get_binary(cnvl, cname, &size), "abcdefghijklmnopqrstuvwxyz", sizeof("abcdefghijklmnopqrstuvwxyz")) == 0);
293 CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz"));
295 cname = nvlist_next(cnvl, &ctype, &ccookie);
296 CHECK(cname != NULL);
297 CHECK(ctype == NV_TYPE_NVLIST);
298 CHECK(strcmp(cname, "nvlist/nvlist/empty") == 0);
299 empty = nvlist_get_nvlist(cnvl, cname);
300 CHECK(nvlist_empty(empty));
302 cname = nvlist_next(cnvl, &ctype, &ccookie);
303 CHECK(cname == NULL);
305 name = nvlist_next(nvl, &type, &cookie);
312 int status, socks[2];
318 if (socketpair(PF_UNIX, SOCK_STREAM, 0, socks) < 0)
319 err(1, "socketpair() failed");
324 err(1, "unable to fork");
337 if (waitpid(pid, &status, 0) < 0)
338 err(1, "waitpid() failed");