Index: sys/cddl/compat/opensolaris/kern/opensolaris_sysevent.c =================================================================== --- sys/cddl/compat/opensolaris/kern/opensolaris_sysevent.c +++ sys/cddl/compat/opensolaris/kern/opensolaris_sysevent.c @@ -159,26 +159,15 @@ ev->se_nvl = NULL; } -int -log_sysevent(sysevent_t *evp, int flag, sysevent_id_t *eid) +static void +print_nvlist_sbuf(nvlist_t *nvl, struct sbuf *sb, const char **type) { - struct sysevent *ev = (struct sysevent *)evp; - struct sbuf *sb; - const char *type; - char typestr[128]; nvpair_t *elem = NULL; - ASSERT(evp != NULL); - ASSERT(ev->se_nvl != NULL); - ASSERT(flag == SE_SLEEP); - ASSERT(eid != NULL); + if (type != NULL) + *type = NULL; - sb = sbuf_new_auto(); - if (sb == NULL) - return (SE_ENOMEM); - type = NULL; - - while ((elem = nvlist_next_nvpair(ev->se_nvl, elem)) != NULL) { + while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) { switch (nvpair_type(elem)) { case DATA_TYPE_BOOLEAN: { @@ -239,13 +228,24 @@ (void) nvpair_value_string(elem, &value); sbuf_printf(sb, " %s=%s", nvpair_name(elem), value); - if (strcmp(FM_CLASS, nvpair_name(elem)) == 0) - type = value; + if (type != NULL && + strcmp(FM_CLASS, nvpair_name(elem)) == 0) + *type = value; break; } + case DATA_TYPE_NVLIST: + { + nvlist_t *value; + + (void) nvpair_value_nvlist(elem, &value); + sbuf_printf(sb, " %s=[", nvpair_name(elem)); + print_nvlist_sbuf(value, sb, NULL); + sbuf_printf(sb, "]"); + break; + } case DATA_TYPE_UINT8_ARRAY: { - uint8_t *value; + uint8_t *value; uint_t ii, nelem; (void) nvpair_value_uint8_array(elem, &value, &nelem); @@ -256,7 +256,7 @@ } case DATA_TYPE_UINT16_ARRAY: { - uint16_t *value; + uint16_t *value; uint_t ii, nelem; (void) nvpair_value_uint16_array(elem, &value, &nelem); @@ -267,7 +267,7 @@ } case DATA_TYPE_UINT32_ARRAY: { - uint32_t *value; + uint32_t *value; uint_t ii, nelem; (void) nvpair_value_uint32_array(elem, &value, &nelem); @@ -278,7 +278,7 @@ } case DATA_TYPE_UINT64_ARRAY: { - uint64_t *value; + uint64_t *value; uint_t ii, nelem; (void) nvpair_value_uint64_array(elem, &value, &nelem); @@ -287,6 +287,32 @@ sbuf_printf(sb, "%016jx", (uintmax_t)value[ii]); break; } + case DATA_TYPE_STRING_ARRAY: + { + char **value; + uint_t ii, nelem; + + (void) nvpair_value_string_array(elem, &value, &nelem); + sbuf_printf(sb, " %s=", nvpair_name(elem)); + for (ii = 0; ii < nelem; ii++) + sbuf_printf(sb, "%s,", value[ii]); + break; + } + case DATA_TYPE_NVLIST_ARRAY: + { + nvlist_t **value; + uint_t ii, nelem; + + (void) nvpair_value_nvlist_array(elem, &value, &nelem); + sbuf_printf(sb, " %s=[", nvpair_name(elem)); + for (ii = 0; ii < nelem; ii++) { + sbuf_printf(sb, "["); + print_nvlist_sbuf(value[ii], sb, NULL); + sbuf_printf(sb, "]"); + } + sbuf_printf(sb, "]"); + break; + } default: #if 0 printf("%s: type %d is not implemented\n", __func__, @@ -295,6 +321,26 @@ break; } } +} + +int +log_sysevent(sysevent_t *evp, int flag, sysevent_id_t *eid) +{ + struct sysevent *ev = (struct sysevent *)evp; + struct sbuf *sb; + const char *type; + char typestr[128]; + + ASSERT(evp != NULL); + ASSERT(ev->se_nvl != NULL); + ASSERT(flag == SE_SLEEP); + ASSERT(eid != NULL); + + sb = sbuf_new_auto(); + if (sb == NULL) + return (SE_ENOMEM); + + print_nvlist_sbuf(ev->se_nvl, sb, &type); if (sbuf_finish(sb) != 0) { sbuf_delete(sb);