12db6d663SJoshua M. Clulow /* 22db6d663SJoshua M. Clulow * This file and its contents are supplied under the terms of the 32db6d663SJoshua M. Clulow * Common Development and Distribution License ("CDDL"), version 1.0. 42db6d663SJoshua M. Clulow * You may only use this file in accordance with the terms of version 52db6d663SJoshua M. Clulow * 1.0 of the CDDL. 62db6d663SJoshua M. Clulow * 72db6d663SJoshua M. Clulow * A full copy of the text of the CDDL should have accompanied this 82db6d663SJoshua M. Clulow * source. A copy of the CDDL is also available via the Internet at 92db6d663SJoshua M. Clulow * http://www.illumos.org/license/CDDL. 102db6d663SJoshua M. Clulow */ 112db6d663SJoshua M. Clulow /* 12*37c79205SJoshua M. Clulow * Copyright (c) 2014, Joyent, Inc. 132db6d663SJoshua M. Clulow */ 142db6d663SJoshua M. Clulow 152db6d663SJoshua M. Clulow #include <stdio.h> 162db6d663SJoshua M. Clulow #include <stdlib.h> 172db6d663SJoshua M. Clulow #include <strings.h> 182db6d663SJoshua M. Clulow #include <wchar.h> 192db6d663SJoshua M. Clulow #include <sys/debug.h> 202db6d663SJoshua M. Clulow 212db6d663SJoshua M. Clulow #include "libnvpair.h" 222db6d663SJoshua M. Clulow 232db6d663SJoshua M. Clulow #define FPRINTF(fp, ...) \ 24*37c79205SJoshua M. Clulow do { \ 252db6d663SJoshua M. Clulow if (fprintf(fp, __VA_ARGS__) < 0) \ 26*37c79205SJoshua M. Clulow return (-1); \ 27*37c79205SJoshua M. Clulow } while (0) 282db6d663SJoshua M. Clulow 292db6d663SJoshua M. Clulow /* 302db6d663SJoshua M. Clulow * When formatting a string for JSON output we must escape certain characters, 312db6d663SJoshua M. Clulow * as described in RFC4627. This applies to both member names and 322db6d663SJoshua M. Clulow * DATA_TYPE_STRING values. 332db6d663SJoshua M. Clulow * 342db6d663SJoshua M. Clulow * This function will only operate correctly if the following conditions are 352db6d663SJoshua M. Clulow * met: 362db6d663SJoshua M. Clulow * 372db6d663SJoshua M. Clulow * 1. The input String is encoded in the current locale. 382db6d663SJoshua M. Clulow * 392db6d663SJoshua M. Clulow * 2. The current locale includes the Basic Multilingual Plane (plane 0) 402db6d663SJoshua M. Clulow * as defined in the Unicode standard. 412db6d663SJoshua M. Clulow * 422db6d663SJoshua M. Clulow * The output will be entirely 7-bit ASCII (as a subset of UTF-8) with all 432db6d663SJoshua M. Clulow * representable Unicode characters included in their escaped numeric form. 442db6d663SJoshua M. Clulow */ 452db6d663SJoshua M. Clulow static int 462db6d663SJoshua M. Clulow nvlist_print_json_string(FILE *fp, const char *input) 472db6d663SJoshua M. Clulow { 482db6d663SJoshua M. Clulow mbstate_t mbr; 492db6d663SJoshua M. Clulow wchar_t c; 502db6d663SJoshua M. Clulow size_t sz; 512db6d663SJoshua M. Clulow 522db6d663SJoshua M. Clulow bzero(&mbr, sizeof (mbr)); 532db6d663SJoshua M. Clulow 542db6d663SJoshua M. Clulow FPRINTF(fp, "\""); 552db6d663SJoshua M. Clulow while ((sz = mbrtowc(&c, input, MB_CUR_MAX, &mbr)) > 0) { 562db6d663SJoshua M. Clulow switch (c) { 572db6d663SJoshua M. Clulow case '"': 582db6d663SJoshua M. Clulow FPRINTF(fp, "\\\""); 592db6d663SJoshua M. Clulow break; 602db6d663SJoshua M. Clulow case '\n': 612db6d663SJoshua M. Clulow FPRINTF(fp, "\\n"); 622db6d663SJoshua M. Clulow break; 632db6d663SJoshua M. Clulow case '\r': 642db6d663SJoshua M. Clulow FPRINTF(fp, "\\r"); 652db6d663SJoshua M. Clulow break; 662db6d663SJoshua M. Clulow case '\\': 672db6d663SJoshua M. Clulow FPRINTF(fp, "\\\\"); 682db6d663SJoshua M. Clulow break; 692db6d663SJoshua M. Clulow case '\f': 702db6d663SJoshua M. Clulow FPRINTF(fp, "\\f"); 712db6d663SJoshua M. Clulow break; 722db6d663SJoshua M. Clulow case '\t': 732db6d663SJoshua M. Clulow FPRINTF(fp, "\\t"); 742db6d663SJoshua M. Clulow break; 752db6d663SJoshua M. Clulow case '\b': 762db6d663SJoshua M. Clulow FPRINTF(fp, "\\b"); 772db6d663SJoshua M. Clulow break; 782db6d663SJoshua M. Clulow default: 792db6d663SJoshua M. Clulow if ((c >= 0x00 && c <= 0x1f) || 802db6d663SJoshua M. Clulow (c > 0x7f && c <= 0xffff)) { 812db6d663SJoshua M. Clulow /* 822db6d663SJoshua M. Clulow * Render both Control Characters and Unicode 832db6d663SJoshua M. Clulow * characters in the Basic Multilingual Plane 842db6d663SJoshua M. Clulow * as JSON-escaped multibyte characters. 852db6d663SJoshua M. Clulow */ 862db6d663SJoshua M. Clulow FPRINTF(fp, "\\u%04x", (int)(0xffff & c)); 872db6d663SJoshua M. Clulow } else if (c >= 0x20 && c <= 0x7f) { 882db6d663SJoshua M. Clulow /* 892db6d663SJoshua M. Clulow * Render other 7-bit ASCII characters directly 902db6d663SJoshua M. Clulow * and drop other, unrepresentable characters. 912db6d663SJoshua M. Clulow */ 922db6d663SJoshua M. Clulow FPRINTF(fp, "%c", (int)(0xff & c)); 932db6d663SJoshua M. Clulow } 942db6d663SJoshua M. Clulow break; 952db6d663SJoshua M. Clulow } 962db6d663SJoshua M. Clulow input += sz; 972db6d663SJoshua M. Clulow } 982db6d663SJoshua M. Clulow 992db6d663SJoshua M. Clulow if (sz == (size_t)-1 || sz == (size_t)-2) { 1002db6d663SJoshua M. Clulow /* 1012db6d663SJoshua M. Clulow * We last read an invalid multibyte character sequence, 1022db6d663SJoshua M. Clulow * so return an error. 1032db6d663SJoshua M. Clulow */ 1042db6d663SJoshua M. Clulow return (-1); 1052db6d663SJoshua M. Clulow } 1062db6d663SJoshua M. Clulow 1072db6d663SJoshua M. Clulow FPRINTF(fp, "\""); 1082db6d663SJoshua M. Clulow return (0); 1092db6d663SJoshua M. Clulow } 1102db6d663SJoshua M. Clulow 1112db6d663SJoshua M. Clulow /* 1122db6d663SJoshua M. Clulow * Dump a JSON-formatted representation of an nvlist to the provided FILE *. 1132db6d663SJoshua M. Clulow * This routine does not output any new-lines or additional whitespace other 1142db6d663SJoshua M. Clulow * than that contained in strings, nor does it call fflush(3C). 1152db6d663SJoshua M. Clulow */ 1162db6d663SJoshua M. Clulow int 1172db6d663SJoshua M. Clulow nvlist_print_json(FILE *fp, nvlist_t *nvl) 1182db6d663SJoshua M. Clulow { 1192db6d663SJoshua M. Clulow nvpair_t *curr; 1202db6d663SJoshua M. Clulow boolean_t first = B_TRUE; 1212db6d663SJoshua M. Clulow 1222db6d663SJoshua M. Clulow FPRINTF(fp, "{"); 1232db6d663SJoshua M. Clulow 1242db6d663SJoshua M. Clulow for (curr = nvlist_next_nvpair(nvl, NULL); curr; 1252db6d663SJoshua M. Clulow curr = nvlist_next_nvpair(nvl, curr)) { 1262db6d663SJoshua M. Clulow data_type_t type = nvpair_type(curr); 1272db6d663SJoshua M. Clulow 1282db6d663SJoshua M. Clulow if (!first) 1292db6d663SJoshua M. Clulow FPRINTF(fp, ","); 1302db6d663SJoshua M. Clulow else 1312db6d663SJoshua M. Clulow first = B_FALSE; 1322db6d663SJoshua M. Clulow 1332db6d663SJoshua M. Clulow if (nvlist_print_json_string(fp, nvpair_name(curr)) == -1) 1342db6d663SJoshua M. Clulow return (-1); 1352db6d663SJoshua M. Clulow FPRINTF(fp, ":"); 1362db6d663SJoshua M. Clulow 1372db6d663SJoshua M. Clulow switch (type) { 1382db6d663SJoshua M. Clulow case DATA_TYPE_STRING: { 1392db6d663SJoshua M. Clulow char *string = fnvpair_value_string(curr); 1402db6d663SJoshua M. Clulow if (nvlist_print_json_string(fp, string) == -1) 1412db6d663SJoshua M. Clulow return (-1); 1422db6d663SJoshua M. Clulow break; 1432db6d663SJoshua M. Clulow } 1442db6d663SJoshua M. Clulow 1452db6d663SJoshua M. Clulow case DATA_TYPE_BOOLEAN: { 1462db6d663SJoshua M. Clulow FPRINTF(fp, "true"); 1472db6d663SJoshua M. Clulow break; 1482db6d663SJoshua M. Clulow } 1492db6d663SJoshua M. Clulow 1502db6d663SJoshua M. Clulow case DATA_TYPE_BOOLEAN_VALUE: { 1512db6d663SJoshua M. Clulow FPRINTF(fp, "%s", fnvpair_value_boolean_value(curr) == 1522db6d663SJoshua M. Clulow B_TRUE ? "true" : "false"); 1532db6d663SJoshua M. Clulow break; 1542db6d663SJoshua M. Clulow } 1552db6d663SJoshua M. Clulow 1562db6d663SJoshua M. Clulow case DATA_TYPE_BYTE: { 1572db6d663SJoshua M. Clulow FPRINTF(fp, "%hhu", fnvpair_value_byte(curr)); 1582db6d663SJoshua M. Clulow break; 1592db6d663SJoshua M. Clulow } 1602db6d663SJoshua M. Clulow 1612db6d663SJoshua M. Clulow case DATA_TYPE_INT8: { 1622db6d663SJoshua M. Clulow FPRINTF(fp, "%hhd", fnvpair_value_int8(curr)); 1632db6d663SJoshua M. Clulow break; 1642db6d663SJoshua M. Clulow } 1652db6d663SJoshua M. Clulow 1662db6d663SJoshua M. Clulow case DATA_TYPE_UINT8: { 1672db6d663SJoshua M. Clulow FPRINTF(fp, "%hhu", fnvpair_value_uint8_t(curr)); 1682db6d663SJoshua M. Clulow break; 1692db6d663SJoshua M. Clulow } 1702db6d663SJoshua M. Clulow 1712db6d663SJoshua M. Clulow case DATA_TYPE_INT16: { 1722db6d663SJoshua M. Clulow FPRINTF(fp, "%hd", fnvpair_value_int16(curr)); 1732db6d663SJoshua M. Clulow break; 1742db6d663SJoshua M. Clulow } 1752db6d663SJoshua M. Clulow 1762db6d663SJoshua M. Clulow case DATA_TYPE_UINT16: { 1772db6d663SJoshua M. Clulow FPRINTF(fp, "%hu", fnvpair_value_uint16(curr)); 1782db6d663SJoshua M. Clulow break; 1792db6d663SJoshua M. Clulow } 1802db6d663SJoshua M. Clulow 1812db6d663SJoshua M. Clulow case DATA_TYPE_INT32: { 1822db6d663SJoshua M. Clulow FPRINTF(fp, "%d", fnvpair_value_int32(curr)); 1832db6d663SJoshua M. Clulow break; 1842db6d663SJoshua M. Clulow } 1852db6d663SJoshua M. Clulow 1862db6d663SJoshua M. Clulow case DATA_TYPE_UINT32: { 1872db6d663SJoshua M. Clulow FPRINTF(fp, "%u", fnvpair_value_uint32(curr)); 1882db6d663SJoshua M. Clulow break; 1892db6d663SJoshua M. Clulow } 1902db6d663SJoshua M. Clulow 1912db6d663SJoshua M. Clulow case DATA_TYPE_INT64: { 1922db6d663SJoshua M. Clulow FPRINTF(fp, "%lld", 1932db6d663SJoshua M. Clulow (long long)fnvpair_value_int64(curr)); 1942db6d663SJoshua M. Clulow break; 1952db6d663SJoshua M. Clulow } 1962db6d663SJoshua M. Clulow 1972db6d663SJoshua M. Clulow case DATA_TYPE_UINT64: { 1982db6d663SJoshua M. Clulow FPRINTF(fp, "%llu", 1992db6d663SJoshua M. Clulow (unsigned long long)fnvpair_value_uint64(curr)); 2002db6d663SJoshua M. Clulow break; 2012db6d663SJoshua M. Clulow } 2022db6d663SJoshua M. Clulow 2032db6d663SJoshua M. Clulow case DATA_TYPE_HRTIME: { 2042db6d663SJoshua M. Clulow hrtime_t val; 2052db6d663SJoshua M. Clulow VERIFY0(nvpair_value_hrtime(curr, &val)); 2062db6d663SJoshua M. Clulow FPRINTF(fp, "%llu", (unsigned long long)val); 2072db6d663SJoshua M. Clulow break; 2082db6d663SJoshua M. Clulow } 2092db6d663SJoshua M. Clulow 2102db6d663SJoshua M. Clulow case DATA_TYPE_DOUBLE: { 2112db6d663SJoshua M. Clulow double val; 2122db6d663SJoshua M. Clulow VERIFY0(nvpair_value_double(curr, &val)); 2132db6d663SJoshua M. Clulow FPRINTF(fp, "%f", val); 2142db6d663SJoshua M. Clulow break; 2152db6d663SJoshua M. Clulow } 2162db6d663SJoshua M. Clulow 2172db6d663SJoshua M. Clulow case DATA_TYPE_NVLIST: { 2182db6d663SJoshua M. Clulow if (nvlist_print_json(fp, 2192db6d663SJoshua M. Clulow fnvpair_value_nvlist(curr)) == -1) 2202db6d663SJoshua M. Clulow return (-1); 2212db6d663SJoshua M. Clulow break; 2222db6d663SJoshua M. Clulow } 2232db6d663SJoshua M. Clulow 2242db6d663SJoshua M. Clulow case DATA_TYPE_STRING_ARRAY: { 2252db6d663SJoshua M. Clulow char **val; 2262db6d663SJoshua M. Clulow uint_t valsz, i; 2272db6d663SJoshua M. Clulow VERIFY0(nvpair_value_string_array(curr, &val, &valsz)); 2282db6d663SJoshua M. Clulow FPRINTF(fp, "["); 2292db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 2302db6d663SJoshua M. Clulow if (i > 0) 2312db6d663SJoshua M. Clulow FPRINTF(fp, ","); 2322db6d663SJoshua M. Clulow if (nvlist_print_json_string(fp, val[i]) == -1) 2332db6d663SJoshua M. Clulow return (-1); 2342db6d663SJoshua M. Clulow } 2352db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 2362db6d663SJoshua M. Clulow break; 2372db6d663SJoshua M. Clulow } 2382db6d663SJoshua M. Clulow 2392db6d663SJoshua M. Clulow case DATA_TYPE_NVLIST_ARRAY: { 2402db6d663SJoshua M. Clulow nvlist_t **val; 2412db6d663SJoshua M. Clulow uint_t valsz, i; 2422db6d663SJoshua M. Clulow VERIFY0(nvpair_value_nvlist_array(curr, &val, &valsz)); 2432db6d663SJoshua M. Clulow FPRINTF(fp, "["); 2442db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 2452db6d663SJoshua M. Clulow if (i > 0) 2462db6d663SJoshua M. Clulow FPRINTF(fp, ","); 2472db6d663SJoshua M. Clulow if (nvlist_print_json(fp, val[i]) == -1) 2482db6d663SJoshua M. Clulow return (-1); 2492db6d663SJoshua M. Clulow } 2502db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 2512db6d663SJoshua M. Clulow break; 2522db6d663SJoshua M. Clulow } 2532db6d663SJoshua M. Clulow 2542db6d663SJoshua M. Clulow case DATA_TYPE_BOOLEAN_ARRAY: { 2552db6d663SJoshua M. Clulow boolean_t *val; 2562db6d663SJoshua M. Clulow uint_t valsz, i; 2572db6d663SJoshua M. Clulow VERIFY0(nvpair_value_boolean_array(curr, &val, &valsz)); 2582db6d663SJoshua M. Clulow FPRINTF(fp, "["); 2592db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 2602db6d663SJoshua M. Clulow if (i > 0) 2612db6d663SJoshua M. Clulow FPRINTF(fp, ","); 2622db6d663SJoshua M. Clulow FPRINTF(fp, val[i] == B_TRUE ? 2632db6d663SJoshua M. Clulow "true" : "false"); 2642db6d663SJoshua M. Clulow } 2652db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 2662db6d663SJoshua M. Clulow break; 2672db6d663SJoshua M. Clulow } 2682db6d663SJoshua M. Clulow 2692db6d663SJoshua M. Clulow case DATA_TYPE_BYTE_ARRAY: { 2702db6d663SJoshua M. Clulow uchar_t *val; 2712db6d663SJoshua M. Clulow uint_t valsz, i; 2722db6d663SJoshua M. Clulow VERIFY0(nvpair_value_byte_array(curr, &val, &valsz)); 2732db6d663SJoshua M. Clulow FPRINTF(fp, "["); 2742db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 2752db6d663SJoshua M. Clulow if (i > 0) 2762db6d663SJoshua M. Clulow FPRINTF(fp, ","); 2772db6d663SJoshua M. Clulow FPRINTF(fp, "%hhu", val[i]); 2782db6d663SJoshua M. Clulow } 2792db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 2802db6d663SJoshua M. Clulow break; 2812db6d663SJoshua M. Clulow } 2822db6d663SJoshua M. Clulow 2832db6d663SJoshua M. Clulow case DATA_TYPE_UINT8_ARRAY: { 2842db6d663SJoshua M. Clulow uint8_t *val; 2852db6d663SJoshua M. Clulow uint_t valsz, i; 2862db6d663SJoshua M. Clulow VERIFY0(nvpair_value_uint8_array(curr, &val, &valsz)); 2872db6d663SJoshua M. Clulow FPRINTF(fp, "["); 2882db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 2892db6d663SJoshua M. Clulow if (i > 0) 2902db6d663SJoshua M. Clulow FPRINTF(fp, ","); 2912db6d663SJoshua M. Clulow FPRINTF(fp, "%hhu", val[i]); 2922db6d663SJoshua M. Clulow } 2932db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 2942db6d663SJoshua M. Clulow break; 2952db6d663SJoshua M. Clulow } 2962db6d663SJoshua M. Clulow 2972db6d663SJoshua M. Clulow case DATA_TYPE_INT8_ARRAY: { 2982db6d663SJoshua M. Clulow int8_t *val; 2992db6d663SJoshua M. Clulow uint_t valsz, i; 3002db6d663SJoshua M. Clulow VERIFY0(nvpair_value_int8_array(curr, &val, &valsz)); 3012db6d663SJoshua M. Clulow FPRINTF(fp, "["); 3022db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 3032db6d663SJoshua M. Clulow if (i > 0) 3042db6d663SJoshua M. Clulow FPRINTF(fp, ","); 3052db6d663SJoshua M. Clulow FPRINTF(fp, "%hd", val[i]); 3062db6d663SJoshua M. Clulow } 3072db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 3082db6d663SJoshua M. Clulow break; 3092db6d663SJoshua M. Clulow } 3102db6d663SJoshua M. Clulow 3112db6d663SJoshua M. Clulow case DATA_TYPE_UINT16_ARRAY: { 3122db6d663SJoshua M. Clulow uint16_t *val; 3132db6d663SJoshua M. Clulow uint_t valsz, i; 3142db6d663SJoshua M. Clulow VERIFY0(nvpair_value_uint16_array(curr, &val, &valsz)); 3152db6d663SJoshua M. Clulow FPRINTF(fp, "["); 3162db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 3172db6d663SJoshua M. Clulow if (i > 0) 3182db6d663SJoshua M. Clulow FPRINTF(fp, ","); 3192db6d663SJoshua M. Clulow FPRINTF(fp, "%hu", val[i]); 3202db6d663SJoshua M. Clulow } 3212db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 3222db6d663SJoshua M. Clulow break; 3232db6d663SJoshua M. Clulow } 3242db6d663SJoshua M. Clulow 3252db6d663SJoshua M. Clulow case DATA_TYPE_INT16_ARRAY: { 3262db6d663SJoshua M. Clulow int16_t *val; 3272db6d663SJoshua M. Clulow uint_t valsz, i; 3282db6d663SJoshua M. Clulow VERIFY0(nvpair_value_int16_array(curr, &val, &valsz)); 3292db6d663SJoshua M. Clulow FPRINTF(fp, "["); 3302db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 3312db6d663SJoshua M. Clulow if (i > 0) 3322db6d663SJoshua M. Clulow FPRINTF(fp, ","); 333*37c79205SJoshua M. Clulow FPRINTF(fp, "%hd", val[i]); 3342db6d663SJoshua M. Clulow } 3352db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 3362db6d663SJoshua M. Clulow break; 3372db6d663SJoshua M. Clulow } 3382db6d663SJoshua M. Clulow 3392db6d663SJoshua M. Clulow case DATA_TYPE_UINT32_ARRAY: { 3402db6d663SJoshua M. Clulow uint32_t *val; 3412db6d663SJoshua M. Clulow uint_t valsz, i; 3422db6d663SJoshua M. Clulow VERIFY0(nvpair_value_uint32_array(curr, &val, &valsz)); 3432db6d663SJoshua M. Clulow FPRINTF(fp, "["); 3442db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 3452db6d663SJoshua M. Clulow if (i > 0) 3462db6d663SJoshua M. Clulow FPRINTF(fp, ","); 3472db6d663SJoshua M. Clulow FPRINTF(fp, "%u", val[i]); 3482db6d663SJoshua M. Clulow } 3492db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 3502db6d663SJoshua M. Clulow break; 3512db6d663SJoshua M. Clulow } 3522db6d663SJoshua M. Clulow 3532db6d663SJoshua M. Clulow case DATA_TYPE_INT32_ARRAY: { 3542db6d663SJoshua M. Clulow int32_t *val; 3552db6d663SJoshua M. Clulow uint_t valsz, i; 3562db6d663SJoshua M. Clulow VERIFY0(nvpair_value_int32_array(curr, &val, &valsz)); 3572db6d663SJoshua M. Clulow FPRINTF(fp, "["); 3582db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 3592db6d663SJoshua M. Clulow if (i > 0) 3602db6d663SJoshua M. Clulow FPRINTF(fp, ","); 3612db6d663SJoshua M. Clulow FPRINTF(fp, "%d", val[i]); 3622db6d663SJoshua M. Clulow } 3632db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 3642db6d663SJoshua M. Clulow break; 3652db6d663SJoshua M. Clulow } 3662db6d663SJoshua M. Clulow 3672db6d663SJoshua M. Clulow case DATA_TYPE_UINT64_ARRAY: { 3682db6d663SJoshua M. Clulow uint64_t *val; 3692db6d663SJoshua M. Clulow uint_t valsz, i; 3702db6d663SJoshua M. Clulow VERIFY0(nvpair_value_uint64_array(curr, &val, &valsz)); 3712db6d663SJoshua M. Clulow FPRINTF(fp, "["); 3722db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 3732db6d663SJoshua M. Clulow if (i > 0) 3742db6d663SJoshua M. Clulow FPRINTF(fp, ","); 3752db6d663SJoshua M. Clulow FPRINTF(fp, "%llu", 3762db6d663SJoshua M. Clulow (unsigned long long)val[i]); 3772db6d663SJoshua M. Clulow } 3782db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 3792db6d663SJoshua M. Clulow break; 3802db6d663SJoshua M. Clulow } 3812db6d663SJoshua M. Clulow 3822db6d663SJoshua M. Clulow case DATA_TYPE_INT64_ARRAY: { 3832db6d663SJoshua M. Clulow int64_t *val; 3842db6d663SJoshua M. Clulow uint_t valsz, i; 3852db6d663SJoshua M. Clulow VERIFY0(nvpair_value_int64_array(curr, &val, &valsz)); 3862db6d663SJoshua M. Clulow FPRINTF(fp, "["); 3872db6d663SJoshua M. Clulow for (i = 0; i < valsz; i++) { 3882db6d663SJoshua M. Clulow if (i > 0) 3892db6d663SJoshua M. Clulow FPRINTF(fp, ","); 3902db6d663SJoshua M. Clulow FPRINTF(fp, "%lld", (long long)val[i]); 3912db6d663SJoshua M. Clulow } 3922db6d663SJoshua M. Clulow FPRINTF(fp, "]"); 3932db6d663SJoshua M. Clulow break; 3942db6d663SJoshua M. Clulow } 3952db6d663SJoshua M. Clulow 3962db6d663SJoshua M. Clulow case DATA_TYPE_UNKNOWN: 3972db6d663SJoshua M. Clulow return (-1); 3982db6d663SJoshua M. Clulow } 3992db6d663SJoshua M. Clulow } 4002db6d663SJoshua M. Clulow 4012db6d663SJoshua M. Clulow FPRINTF(fp, "}"); 4022db6d663SJoshua M. Clulow return (0); 4032db6d663SJoshua M. Clulow } 404