/* * Entry point: */ int main(int argc, char **argv) { int rc = EXIT_FAILURE; list_wrap_t *lw; /* * Be locale-aware. The JSON output functions will process multibyte * characters in the current locale, and emit a correct JSON encoding * for unprintable characters. */ if (setlocale(LC_ALL, "") == NULL) { (void) fprintf(stderr, "Could not set locale: %s\n", strerror(errno)); goto out; } lw = list_wrap_alloc(NULL); if (nvlist_alloc(&lw->lw_nvl[0], NV_UNIQUE_NAME, 0) != 0) goto out; /* * Generate the list from the commands passed to us on stdin: */ if (parse(stdin, &lw) != 0) goto out; /* * Print the resultant list, and a terminating newline: */ if (nvlist_print_json(stdout, lw->lw_nvl[0]) != 0 || fprintf(stdout, "\n") < 0) goto out; rc = EXIT_SUCCESS; out: (void) list_wrap_pop_and_free(lw); return (rc); }
/* * Dump a JSON-formatted representation of an nvlist to the provided FILE *. * This routine does not output any new-lines or additional whitespace other * than that contained in strings, nor does it call fflush(3C). */ int bunyan_nvlist_print_json(FILE *fp, nvlist_t *nvl) { nvpair_t *curr; boolean_t first = B_TRUE; FPRINTF(fp, "{"); for (curr = nvlist_next_nvpair(nvl, NULL); curr; curr = nvlist_next_nvpair(nvl, curr)) { data_type_t type = nvpair_type(curr); if (!first) FPRINTF(fp, ","); else first = B_FALSE; if (bunyan_nvlist_print_json_string(fp, nvpair_name(curr)) == -1) { return (-1); } FPRINTF(fp, ":"); switch (type) { case DATA_TYPE_STRING: { char *string = fnvpair_value_string(curr); if (bunyan_nvlist_print_json_string(fp, string) == -1) return (-1); break; } case DATA_TYPE_BOOLEAN: { FPRINTF(fp, "true"); break; } case DATA_TYPE_BOOLEAN_VALUE: { FPRINTF(fp, "%s", fnvpair_value_boolean_value(curr) == B_TRUE ? "true" : "false"); break; } case DATA_TYPE_BYTE: { FPRINTF(fp, "%hhu", fnvpair_value_byte(curr)); break; } case DATA_TYPE_INT8: { FPRINTF(fp, "%hhd", fnvpair_value_int8(curr)); break; } case DATA_TYPE_UINT8: { FPRINTF(fp, "%hhu", fnvpair_value_uint8_t(curr)); break; } case DATA_TYPE_INT16: { FPRINTF(fp, "%hd", fnvpair_value_int16(curr)); break; } case DATA_TYPE_UINT16: { FPRINTF(fp, "%hu", fnvpair_value_uint16(curr)); break; } case DATA_TYPE_INT32: { FPRINTF(fp, "%d", fnvpair_value_int32(curr)); break; } case DATA_TYPE_UINT32: { FPRINTF(fp, "%u", fnvpair_value_uint32(curr)); break; } case DATA_TYPE_INT64: { FPRINTF(fp, "%lld", (long long)fnvpair_value_int64(curr)); break; } case DATA_TYPE_UINT64: { FPRINTF(fp, "%llu", (unsigned long long)fnvpair_value_uint64(curr)); break; } case DATA_TYPE_HRTIME: { hrtime_t val; VERIFY0(nvpair_value_hrtime(curr, &val)); FPRINTF(fp, "%llu", (unsigned long long)val); break; } case DATA_TYPE_DOUBLE: { double val; VERIFY0(nvpair_value_double(curr, &val)); FPRINTF(fp, "%f", val); break; } case DATA_TYPE_NVLIST: { if (nvlist_print_json(fp, fnvpair_value_nvlist(curr)) == -1) return (-1); break; } case DATA_TYPE_STRING_ARRAY: { char **val; uint_t valsz, i; VERIFY0(nvpair_value_string_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); if (bunyan_nvlist_print_json_string(fp, val[i]) == -1) { return (-1); } } FPRINTF(fp, "]"); break; } case DATA_TYPE_NVLIST_ARRAY: { nvlist_t **val; uint_t valsz, i; VERIFY0(nvpair_value_nvlist_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); if (nvlist_print_json(fp, val[i]) == -1) return (-1); } FPRINTF(fp, "]"); break; } case DATA_TYPE_BOOLEAN_ARRAY: { boolean_t *val; uint_t valsz, i; VERIFY0(nvpair_value_boolean_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, val[i] == B_TRUE ? "true" : "false"); } FPRINTF(fp, "]"); break; } case DATA_TYPE_BYTE_ARRAY: { uchar_t *val; uint_t valsz, i; VERIFY0(nvpair_value_byte_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%hhu", val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_UINT8_ARRAY: { uint8_t *val; uint_t valsz, i; VERIFY0(nvpair_value_uint8_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%hhu", val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_INT8_ARRAY: { int8_t *val; uint_t valsz, i; VERIFY0(nvpair_value_int8_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%hd", val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_UINT16_ARRAY: { uint16_t *val; uint_t valsz, i; VERIFY0(nvpair_value_uint16_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%hu", val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_INT16_ARRAY: { int16_t *val; uint_t valsz, i; VERIFY0(nvpair_value_int16_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%hhd", val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_UINT32_ARRAY: { uint32_t *val; uint_t valsz, i; VERIFY0(nvpair_value_uint32_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%u", val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_INT32_ARRAY: { int32_t *val; uint_t valsz, i; VERIFY0(nvpair_value_int32_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%d", val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_UINT64_ARRAY: { uint64_t *val; uint_t valsz, i; VERIFY0(nvpair_value_uint64_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%llu", (unsigned long long)val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_INT64_ARRAY: { int64_t *val; uint_t valsz, i; VERIFY0(nvpair_value_int64_array(curr, &val, &valsz)); FPRINTF(fp, "["); for (i = 0; i < valsz; i++) { if (i > 0) FPRINTF(fp, ","); FPRINTF(fp, "%lld", (long long)val[i]); } FPRINTF(fp, "]"); break; } case DATA_TYPE_UNKNOWN: return (-1); } } FPRINTF(fp, "}"); return (0); }