1b236bcf1SEnji Cooper /*- 2b236bcf1SEnji Cooper * Copyright (c) 2013 The FreeBSD Foundation 3b236bcf1SEnji Cooper * 4b236bcf1SEnji Cooper * This software was developed by Pawel Jakub Dawidek under sponsorship from 5b236bcf1SEnji Cooper * the FreeBSD Foundation. 6b236bcf1SEnji Cooper * 7b236bcf1SEnji Cooper * Redistribution and use in source and binary forms, with or without 8b236bcf1SEnji Cooper * modification, are permitted provided that the following conditions 9b236bcf1SEnji Cooper * are met: 10b236bcf1SEnji Cooper * 1. Redistributions of source code must retain the above copyright 11b236bcf1SEnji Cooper * notice, this list of conditions and the following disclaimer. 12b236bcf1SEnji Cooper * 2. Redistributions in binary form must reproduce the above copyright 13b236bcf1SEnji Cooper * notice, this list of conditions and the following disclaimer in the 14b236bcf1SEnji Cooper * documentation and/or other materials provided with the distribution. 15b236bcf1SEnji Cooper * 16b236bcf1SEnji Cooper * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 17b236bcf1SEnji Cooper * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18b236bcf1SEnji Cooper * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19b236bcf1SEnji Cooper * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 20b236bcf1SEnji Cooper * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21b236bcf1SEnji Cooper * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22b236bcf1SEnji Cooper * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23b236bcf1SEnji Cooper * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24b236bcf1SEnji Cooper * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25b236bcf1SEnji Cooper * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26b236bcf1SEnji Cooper * SUCH DAMAGE. 27b236bcf1SEnji Cooper */ 28b236bcf1SEnji Cooper 29*c36e54bbSMariusz Zaborski #include <sys/nv.h> 30*c36e54bbSMariusz Zaborski 31b236bcf1SEnji Cooper #include <errno.h> 32b236bcf1SEnji Cooper #include <stdio.h> 33b236bcf1SEnji Cooper #include <stdlib.h> 34b236bcf1SEnji Cooper #include <string.h> 35b236bcf1SEnji Cooper #include <unistd.h> 36b236bcf1SEnji Cooper 37b236bcf1SEnji Cooper static int ntest = 1; 38b236bcf1SEnji Cooper 39b236bcf1SEnji Cooper #define CHECK(expr) do { \ 40b236bcf1SEnji Cooper if ((expr)) \ 41b236bcf1SEnji Cooper printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \ 42b236bcf1SEnji Cooper else \ 43b236bcf1SEnji Cooper printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\ 44b236bcf1SEnji Cooper ntest++; \ 45b236bcf1SEnji Cooper } while (0) 46b236bcf1SEnji Cooper 47b236bcf1SEnji Cooper int 48b236bcf1SEnji Cooper main(void) 49b236bcf1SEnji Cooper { 50b236bcf1SEnji Cooper const nvlist_t *cnvl; 51b236bcf1SEnji Cooper nvlist_t *nvl; 52b236bcf1SEnji Cooper void *ptr; 53b236bcf1SEnji Cooper size_t size; 54b236bcf1SEnji Cooper int fd; 55b236bcf1SEnji Cooper 56b236bcf1SEnji Cooper printf("1..52\n"); 57b236bcf1SEnji Cooper 58b236bcf1SEnji Cooper nvl = nvlist_create(0); 59b236bcf1SEnji Cooper 60b236bcf1SEnji Cooper CHECK(!nvlist_exists_string(nvl, "nvlist/string/")); 61b236bcf1SEnji Cooper ptr = strdup(""); 62b236bcf1SEnji Cooper CHECK(ptr != NULL); 63b236bcf1SEnji Cooper nvlist_move_string(nvl, "nvlist/string/", ptr); 64b236bcf1SEnji Cooper CHECK(nvlist_error(nvl) == 0); 65b236bcf1SEnji Cooper CHECK(nvlist_exists_string(nvl, "nvlist/string/")); 66b236bcf1SEnji Cooper CHECK(ptr == nvlist_get_string(nvl, "nvlist/string/")); 67b236bcf1SEnji Cooper 68b236bcf1SEnji Cooper CHECK(!nvlist_exists_string(nvl, "nvlist/string/x")); 69b236bcf1SEnji Cooper ptr = strdup("x"); 70b236bcf1SEnji Cooper CHECK(ptr != NULL); 71b236bcf1SEnji Cooper nvlist_move_string(nvl, "nvlist/string/x", ptr); 72b236bcf1SEnji Cooper CHECK(nvlist_error(nvl) == 0); 73b236bcf1SEnji Cooper CHECK(nvlist_exists_string(nvl, "nvlist/string/x")); 74b236bcf1SEnji Cooper CHECK(ptr == nvlist_get_string(nvl, "nvlist/string/x")); 75b236bcf1SEnji Cooper 76b236bcf1SEnji Cooper CHECK(!nvlist_exists_string(nvl, 77b236bcf1SEnji Cooper "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 78b236bcf1SEnji Cooper ptr = strdup("abcdefghijklmnopqrstuvwxyz"); 79b236bcf1SEnji Cooper CHECK(ptr != NULL); 80b236bcf1SEnji Cooper nvlist_move_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", 81b236bcf1SEnji Cooper ptr); 82b236bcf1SEnji Cooper CHECK(nvlist_error(nvl) == 0); 83b236bcf1SEnji Cooper CHECK(nvlist_exists_string(nvl, 84b236bcf1SEnji Cooper "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 85b236bcf1SEnji Cooper CHECK(ptr == 86b236bcf1SEnji Cooper nvlist_get_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 87b236bcf1SEnji Cooper 88b236bcf1SEnji Cooper CHECK(!nvlist_exists_descriptor(nvl, 89b236bcf1SEnji Cooper "nvlist/descriptor/STDERR_FILENO")); 90b236bcf1SEnji Cooper fd = dup(STDERR_FILENO); 91b236bcf1SEnji Cooper CHECK(fd >= 0); 92b236bcf1SEnji Cooper nvlist_move_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", fd); 93b236bcf1SEnji Cooper CHECK(nvlist_error(nvl) == 0); 94b236bcf1SEnji Cooper CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")); 95b236bcf1SEnji Cooper CHECK(fd == 96b236bcf1SEnji Cooper nvlist_get_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")); 97b236bcf1SEnji Cooper 98b236bcf1SEnji Cooper CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x")); 99b236bcf1SEnji Cooper ptr = malloc(1); 100b236bcf1SEnji Cooper CHECK(ptr != NULL); 101b236bcf1SEnji Cooper memcpy(ptr, "x", 1); 102b236bcf1SEnji Cooper nvlist_move_binary(nvl, "nvlist/binary/x", ptr, 1); 103b236bcf1SEnji Cooper CHECK(nvlist_error(nvl) == 0); 104b236bcf1SEnji Cooper CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x")); 105b236bcf1SEnji Cooper CHECK(ptr == nvlist_get_binary(nvl, "nvlist/binary/x", NULL)); 106b236bcf1SEnji Cooper CHECK(ptr == nvlist_get_binary(nvl, "nvlist/binary/x", &size)); 107b236bcf1SEnji Cooper CHECK(size == 1); 108b236bcf1SEnji Cooper 109b236bcf1SEnji Cooper CHECK(!nvlist_exists_binary(nvl, 110b236bcf1SEnji Cooper "nvlist/binary/abcdefghijklmnopqrstuvwxyz")); 111b236bcf1SEnji Cooper ptr = malloc(sizeof("abcdefghijklmnopqrstuvwxyz")); 112b236bcf1SEnji Cooper CHECK(ptr != NULL); 113b236bcf1SEnji Cooper memcpy(ptr, "abcdefghijklmnopqrstuvwxyz", 114b236bcf1SEnji Cooper sizeof("abcdefghijklmnopqrstuvwxyz")); 115b236bcf1SEnji Cooper nvlist_move_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", 116b236bcf1SEnji Cooper ptr, sizeof("abcdefghijklmnopqrstuvwxyz")); 117b236bcf1SEnji Cooper CHECK(nvlist_error(nvl) == 0); 118b236bcf1SEnji Cooper CHECK(nvlist_exists_binary(nvl, 119b236bcf1SEnji Cooper "nvlist/binary/abcdefghijklmnopqrstuvwxyz")); 120b236bcf1SEnji Cooper CHECK(ptr == nvlist_get_binary(nvl, 121b236bcf1SEnji Cooper "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL)); 122b236bcf1SEnji Cooper CHECK(ptr == nvlist_get_binary(nvl, 123b236bcf1SEnji Cooper "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size)); 124b236bcf1SEnji Cooper CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz")); 125b236bcf1SEnji Cooper 126b236bcf1SEnji Cooper CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist")); 127b236bcf1SEnji Cooper ptr = nvlist_clone(nvl); 128b236bcf1SEnji Cooper CHECK(ptr != NULL); 129b236bcf1SEnji Cooper nvlist_move_nvlist(nvl, "nvlist/nvlist", ptr); 130b236bcf1SEnji Cooper CHECK(nvlist_error(nvl) == 0); 131b236bcf1SEnji Cooper CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist")); 132b236bcf1SEnji Cooper CHECK(ptr == nvlist_get_nvlist(nvl, "nvlist/nvlist")); 133b236bcf1SEnji Cooper 134b236bcf1SEnji Cooper CHECK(nvlist_exists_string(nvl, "nvlist/string/")); 135b236bcf1SEnji Cooper CHECK(nvlist_exists_string(nvl, "nvlist/string/x")); 136b236bcf1SEnji Cooper CHECK(nvlist_exists_string(nvl, 137b236bcf1SEnji Cooper "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 138b236bcf1SEnji Cooper CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")); 139b236bcf1SEnji Cooper CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x")); 140b236bcf1SEnji Cooper CHECK(nvlist_exists_binary(nvl, 141b236bcf1SEnji Cooper "nvlist/binary/abcdefghijklmnopqrstuvwxyz")); 142b236bcf1SEnji Cooper CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist")); 143b236bcf1SEnji Cooper 144b236bcf1SEnji Cooper cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist"); 145b236bcf1SEnji Cooper CHECK(nvlist_exists_string(cnvl, "nvlist/string/")); 146b236bcf1SEnji Cooper CHECK(nvlist_exists_string(cnvl, "nvlist/string/x")); 147b236bcf1SEnji Cooper CHECK(nvlist_exists_string(cnvl, 148b236bcf1SEnji Cooper "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 149b236bcf1SEnji Cooper CHECK(nvlist_exists_descriptor(cnvl, 150b236bcf1SEnji Cooper "nvlist/descriptor/STDERR_FILENO")); 151b236bcf1SEnji Cooper CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/x")); 152b236bcf1SEnji Cooper CHECK(nvlist_exists_binary(cnvl, 153b236bcf1SEnji Cooper "nvlist/binary/abcdefghijklmnopqrstuvwxyz")); 154b236bcf1SEnji Cooper 155b236bcf1SEnji Cooper nvlist_destroy(nvl); 156b236bcf1SEnji Cooper 157b236bcf1SEnji Cooper return (0); 158b236bcf1SEnji Cooper } 159