1 /*- 2 * Copyright (c) 2013 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Pawel Jakub Dawidek under sponsorship from 6 * the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 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. 16 * 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 27 * SUCH DAMAGE. 28 */ 29 30 #include <sys/nv.h> 31 32 #include <errno.h> 33 #include <stdio.h> 34 #include <stdlib.h> 35 #include <string.h> 36 #include <unistd.h> 37 38 static int ntest = 1; 39 40 #define CHECK(expr) do { \ 41 if ((expr)) \ 42 printf("ok # %d %s:%u\n", ntest, __FILE__, __LINE__); \ 43 else \ 44 printf("not ok # %d %s:%u\n", ntest, __FILE__, __LINE__);\ 45 ntest++; \ 46 } while (0) 47 48 int 49 main(void) 50 { 51 const nvlist_t *cnvl; 52 nvlist_t *nvl; 53 void *ptr; 54 size_t size; 55 int fd; 56 57 printf("1..52\n"); 58 59 nvl = nvlist_create(0); 60 61 CHECK(!nvlist_exists_string(nvl, "nvlist/string/")); 62 ptr = strdup(""); 63 CHECK(ptr != NULL); 64 nvlist_move_string(nvl, "nvlist/string/", ptr); 65 CHECK(nvlist_error(nvl) == 0); 66 CHECK(nvlist_exists_string(nvl, "nvlist/string/")); 67 CHECK(ptr == nvlist_get_string(nvl, "nvlist/string/")); 68 69 CHECK(!nvlist_exists_string(nvl, "nvlist/string/x")); 70 ptr = strdup("x"); 71 CHECK(ptr != NULL); 72 nvlist_move_string(nvl, "nvlist/string/x", ptr); 73 CHECK(nvlist_error(nvl) == 0); 74 CHECK(nvlist_exists_string(nvl, "nvlist/string/x")); 75 CHECK(ptr == nvlist_get_string(nvl, "nvlist/string/x")); 76 77 CHECK(!nvlist_exists_string(nvl, 78 "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 79 ptr = strdup("abcdefghijklmnopqrstuvwxyz"); 80 CHECK(ptr != NULL); 81 nvlist_move_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz", 82 ptr); 83 CHECK(nvlist_error(nvl) == 0); 84 CHECK(nvlist_exists_string(nvl, 85 "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 86 CHECK(ptr == 87 nvlist_get_string(nvl, "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 88 89 CHECK(!nvlist_exists_descriptor(nvl, 90 "nvlist/descriptor/STDERR_FILENO")); 91 fd = dup(STDERR_FILENO); 92 CHECK(fd >= 0); 93 nvlist_move_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO", fd); 94 CHECK(nvlist_error(nvl) == 0); 95 CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")); 96 CHECK(fd == 97 nvlist_get_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")); 98 99 CHECK(!nvlist_exists_binary(nvl, "nvlist/binary/x")); 100 ptr = malloc(1); 101 CHECK(ptr != NULL); 102 memcpy(ptr, "x", 1); 103 nvlist_move_binary(nvl, "nvlist/binary/x", ptr, 1); 104 CHECK(nvlist_error(nvl) == 0); 105 CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x")); 106 CHECK(ptr == nvlist_get_binary(nvl, "nvlist/binary/x", NULL)); 107 CHECK(ptr == nvlist_get_binary(nvl, "nvlist/binary/x", &size)); 108 CHECK(size == 1); 109 110 CHECK(!nvlist_exists_binary(nvl, 111 "nvlist/binary/abcdefghijklmnopqrstuvwxyz")); 112 ptr = malloc(sizeof("abcdefghijklmnopqrstuvwxyz")); 113 CHECK(ptr != NULL); 114 memcpy(ptr, "abcdefghijklmnopqrstuvwxyz", 115 sizeof("abcdefghijklmnopqrstuvwxyz")); 116 nvlist_move_binary(nvl, "nvlist/binary/abcdefghijklmnopqrstuvwxyz", 117 ptr, sizeof("abcdefghijklmnopqrstuvwxyz")); 118 CHECK(nvlist_error(nvl) == 0); 119 CHECK(nvlist_exists_binary(nvl, 120 "nvlist/binary/abcdefghijklmnopqrstuvwxyz")); 121 CHECK(ptr == nvlist_get_binary(nvl, 122 "nvlist/binary/abcdefghijklmnopqrstuvwxyz", NULL)); 123 CHECK(ptr == nvlist_get_binary(nvl, 124 "nvlist/binary/abcdefghijklmnopqrstuvwxyz", &size)); 125 CHECK(size == sizeof("abcdefghijklmnopqrstuvwxyz")); 126 127 CHECK(!nvlist_exists_nvlist(nvl, "nvlist/nvlist")); 128 ptr = nvlist_clone(nvl); 129 CHECK(ptr != NULL); 130 nvlist_move_nvlist(nvl, "nvlist/nvlist", ptr); 131 CHECK(nvlist_error(nvl) == 0); 132 CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist")); 133 CHECK(ptr == nvlist_get_nvlist(nvl, "nvlist/nvlist")); 134 135 CHECK(nvlist_exists_string(nvl, "nvlist/string/")); 136 CHECK(nvlist_exists_string(nvl, "nvlist/string/x")); 137 CHECK(nvlist_exists_string(nvl, 138 "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 139 CHECK(nvlist_exists_descriptor(nvl, "nvlist/descriptor/STDERR_FILENO")); 140 CHECK(nvlist_exists_binary(nvl, "nvlist/binary/x")); 141 CHECK(nvlist_exists_binary(nvl, 142 "nvlist/binary/abcdefghijklmnopqrstuvwxyz")); 143 CHECK(nvlist_exists_nvlist(nvl, "nvlist/nvlist")); 144 145 cnvl = nvlist_get_nvlist(nvl, "nvlist/nvlist"); 146 CHECK(nvlist_exists_string(cnvl, "nvlist/string/")); 147 CHECK(nvlist_exists_string(cnvl, "nvlist/string/x")); 148 CHECK(nvlist_exists_string(cnvl, 149 "nvlist/string/abcdefghijklmnopqrstuvwxyz")); 150 CHECK(nvlist_exists_descriptor(cnvl, 151 "nvlist/descriptor/STDERR_FILENO")); 152 CHECK(nvlist_exists_binary(cnvl, "nvlist/binary/x")); 153 CHECK(nvlist_exists_binary(cnvl, 154 "nvlist/binary/abcdefghijklmnopqrstuvwxyz")); 155 156 nvlist_destroy(nvl); 157 158 return (0); 159 } 160