FreeBSD/sys/cddl/contrib/opensolaris/uts/common/os/fm.c
/*
 * Recursively print a nvlist in the specified column width and return the
 * column we end up in.  This function is called recursively by fm_nvprint(),
 * below.  We generically format the entire nvpair using hexadecimal
 * integers and strings, and elide any integer arrays.  Arrays are basically
 * used for cache dumps right now, so we suppress them so as not to overwhelm
 * the amount of console output we produce at panic time.  This can be further
 * enhanced as FMA technology grows based upon the needs of consumers.  All
 * FMA telemetry is logged using the dump device transport, so the console
 * output serves only as a fallback in case this procedure is unsuccessful.
 */
Recursively print a nvlist in the specified column width and return the
column we end up in.  This function is called recursively by fm_nvprint(),
below.  We generically format the entire nvpair using hexadecimal
integers and strings, and elide any integer arrays.  Arrays are basically
used for cache dumps right now, so we suppress them so as not to overwhelm
the amount of console output we produce at panic time.  This can be further
enhanced as FMA technology grows based upon the needs of consumers.  All
FMA telemetry is logged using the dump device transport, so the console
output serves only as a fallback in case this procedure is unsuccessful.
Recursively print a nvlist in the specified column width and return the column we end up in . This function is called recursively by fm_nvprint () below . We generically format the entire nvpair using hexadecimal integers and strings and elide any integer arrays . Arrays are basically used for cache dumps right now so we suppress them so as not to overwhelm the amount of console output we produce at panic time . This can be further enhanced as FMA technology grows based upon the needs of consumers . All FMA telemetry is logged using the dump device transport so the console output serves only as a fallback in case this procedure is unsuccessful .
static int
fm_nvprintr(nvlist_t *nvl, int d, int c, int cols)
{
	nvpair_t *nvp;
	for (nvp = nvlist_next_nvpair(nvl, NULL);
	    nvp != NULL; nvp = nvlist_next_nvpair(nvl, nvp)) {
		data_type_t type = nvpair_type(nvp);
		const char *name = nvpair_name(nvp);
		boolean_t b;
		uint8_t i8;
		uint16_t i16;
		uint32_t i32;
		uint64_t i64;
		char *str;
		nvlist_t *cnv;
		if (strcmp(name, FM_CLASS) == 0)
			continue; 
		c = fm_printf(d, c, cols, " %s=", name);
		switch (type) {
		case DATA_TYPE_BOOLEAN:
			c = fm_printf(d + 1, c, cols, " 1");
			break;
		case DATA_TYPE_BOOLEAN_VALUE:
			(void) nvpair_value_boolean_value(nvp, &b);
			c = fm_printf(d + 1, c, cols, b ? "1" : "0");
			break;
		case DATA_TYPE_BYTE:
			(void) nvpair_value_byte(nvp, &i8);
			c = fm_printf(d + 1, c, cols, "%x", i8);
			break;
		case DATA_TYPE_INT8:
			(void) nvpair_value_int8(nvp, (void *)&i8);
			c = fm_printf(d + 1, c, cols, "%x", i8);
			break;
		case DATA_TYPE_UINT8:
			(void) nvpair_value_uint8(nvp, &i8);
			c = fm_printf(d + 1, c, cols, "%x", i8);
			break;
		case DATA_TYPE_INT16:
			(void) nvpair_value_int16(nvp, (void *)&i16);
			c = fm_printf(d + 1, c, cols, "%x", i16);
			break;
		case DATA_TYPE_UINT16:
			(void) nvpair_value_uint16(nvp, &i16);
			c = fm_printf(d + 1, c, cols, "%x", i16);
			break;
		case DATA_TYPE_INT32:
			(void) nvpair_value_int32(nvp, (void *)&i32);
			c = fm_printf(d + 1, c, cols, "%x", i32);
			break;
		case DATA_TYPE_UINT32:
			(void) nvpair_value_uint32(nvp, &i32);
			c = fm_printf(d + 1, c, cols, "%x", i32);
			break;
		case DATA_TYPE_INT64:
			(void) nvpair_value_int64(nvp, (void *)&i64);
			c = fm_printf(d + 1, c, cols, "%llx",
			    (u_longlong_t)i64);
			break;
		case DATA_TYPE_UINT64:
			(void) nvpair_value_uint64(nvp, &i64);
			c = fm_printf(d + 1, c, cols, "%llx",
			    (u_longlong_t)i64);
			break;
		case DATA_TYPE_HRTIME:
			(void) nvpair_value_hrtime(nvp, (void *)&i64);
			c = fm_printf(d + 1, c, cols, "%llx",
			    (u_longlong_t)i64);
			break;
		case DATA_TYPE_STRING:
			(void) nvpair_value_string(nvp, &str);
			c = fm_printf(d + 1, c, cols, "\"%s\"",
			    str ? str : "<NULL>");
			break;
		case DATA_TYPE_NVLIST:
			c = fm_printf(d + 1, c, cols, "[");
			(void) nvpair_value_nvlist(nvp, &cnv);
			c = fm_nvprintr(cnv, d + 1, c, cols);
			c = fm_printf(d + 1, c, cols, " ]");
			break;
		case DATA_TYPE_NVLIST_ARRAY: {
			nvlist_t **val;
			uint_t i, nelem;
			c = fm_printf(d + 1, c, cols, "[");
			(void) nvpair_value_nvlist_array(nvp, &val, &nelem);
			for (i = 0; i < nelem; i++) {
				c = fm_nvprintr(val[i], d + 1, c, cols);
			}
			c = fm_printf(d + 1, c, cols, " ]");
			}
			break;
		case DATA_TYPE_BOOLEAN_ARRAY:
		case DATA_TYPE_BYTE_ARRAY:
		case DATA_TYPE_INT8_ARRAY:
		case DATA_TYPE_UINT8_ARRAY:
		case DATA_TYPE_INT16_ARRAY:
		case DATA_TYPE_UINT16_ARRAY:
		case DATA_TYPE_INT32_ARRAY:
		case DATA_TYPE_UINT32_ARRAY:
		case DATA_TYPE_INT64_ARRAY:
		case DATA_TYPE_UINT64_ARRAY:
		case DATA_TYPE_STRING_ARRAY:
			c = fm_printf(d + 1, c, cols, "[...]");
			break;
		case DATA_TYPE_UNKNOWN:
			c = fm_printf(d + 1, c, cols, "<unknown>");
			break;
		}
	}
	return (c);
}
static int fm_nvprintr ( nvlist_t * nvl , int d , int c , int cols ) { nvpair_t * nvp ; for ( nvp = nvlist_next_nvpair ( nvl , NULL ) ; nvp != NULL ; nvp = nvlist_next_nvpair ( nvl , nvp ) ) { data_type_t type = nvpair_type ( nvp ) ; const char * name = nvpair_name ( nvp ) ; boolean_t b ; uint8_t i8 ; uint16_t i16 ; uint32_t i32 ; uint64_t i64 ; char * str ; nvlist_t * cnv ; if ( strcmp ( name , FM_CLASS ) == 0 ) continue ; c = fm_printf ( d , c , cols , " " , name ) ; switch ( type ) { case DATA_TYPE_BOOLEAN : c = fm_printf ( d + 1 , c , cols , " " ) ; break ; case DATA_TYPE_BOOLEAN_VALUE : ( void ) nvpair_value_boolean_value ( nvp , & b ) ; c = fm_printf ( d + 1 , c , cols , b ? " " : " " ) ; break ; case DATA_TYPE_BYTE : ( void ) nvpair_value_byte ( nvp , & i8 ) ; c = fm_printf ( d + 1 , c , cols , " " , i8 ) ; break ; case DATA_TYPE_INT8 : ( void ) nvpair_value_int8 ( nvp , ( void * ) & i8 ) ; c = fm_printf ( d + 1 , c , cols , " " , i8 ) ; break ; case DATA_TYPE_UINT8 : ( void ) nvpair_value_uint8 ( nvp , & i8 ) ; c = fm_printf ( d + 1 , c , cols , " " , i8 ) ; break ; case DATA_TYPE_INT16 : ( void ) nvpair_value_int16 ( nvp , ( void * ) & i16 ) ; c = fm_printf ( d + 1 , c , cols , " " , i16 ) ; break ; case DATA_TYPE_UINT16 : ( void ) nvpair_value_uint16 ( nvp , & i16 ) ; c = fm_printf ( d + 1 , c , cols , " " , i16 ) ; break ; case DATA_TYPE_INT32 : ( void ) nvpair_value_int32 ( nvp , ( void * ) & i32 ) ; c = fm_printf ( d + 1 , c , cols , " " , i32 ) ; break ; case DATA_TYPE_UINT32 : ( void ) nvpair_value_uint32 ( nvp , & i32 ) ; c = fm_printf ( d + 1 , c , cols , " " , i32 ) ; break ; case DATA_TYPE_INT64 : ( void ) nvpair_value_int64 ( nvp , ( void * ) & i64 ) ; c = fm_printf ( d + 1 , c , cols , " " , ( u_longlong_t ) i64 ) ; break ; case DATA_TYPE_UINT64 : ( void ) nvpair_value_uint64 ( nvp , & i64 ) ; c = fm_printf ( d + 1 , c , cols , " " , ( u_longlong_t ) i64 ) ; break ; case DATA_TYPE_HRTIME : ( void ) nvpair_value_hrtime ( nvp , ( void * ) & i64 ) ; c = fm_printf ( d + 1 , c , cols , " " , ( u_longlong_t ) i64 ) ; break ; case DATA_TYPE_STRING : ( void ) nvpair_value_string ( nvp , & str ) ; c = fm_printf ( d + 1 , c , cols , " \" \" " , str ? str : " " ) ; break ; case DATA_TYPE_NVLIST : c = fm_printf ( d + 1 , c , cols , " " ) ; ( void ) nvpair_value_nvlist ( nvp , & cnv ) ; c = fm_nvprintr ( cnv , d + 1 , c , cols ) ; c = fm_printf ( d + 1 , c , cols , " " ) ; break ; case DATA_TYPE_NVLIST_ARRAY : { nvlist_t * * val ; uint_t i , nelem ; c = fm_printf ( d + 1 , c , cols , " " ) ; ( void ) nvpair_value_nvlist_array ( nvp , & val , & nelem ) ; for ( i = 0 ; i < nelem ; i ++ ) { c = fm_nvprintr ( val [ i ] , d + 1 , c , cols ) ; } c = fm_printf ( d + 1 , c , cols , " " ) ; } break ; case DATA_TYPE_BOOLEAN_ARRAY : case DATA_TYPE_BYTE_ARRAY : case DATA_TYPE_INT8_ARRAY : case DATA_TYPE_UINT8_ARRAY : case DATA_TYPE_INT16_ARRAY : case DATA_TYPE_UINT16_ARRAY : case DATA_TYPE_INT32_ARRAY : case DATA_TYPE_UINT32_ARRAY : case DATA_TYPE_INT64_ARRAY : case DATA_TYPE_UINT64_ARRAY : case DATA_TYPE_STRING_ARRAY : c = fm_printf ( d + 1 , c , cols , " " ) ; break ; case DATA_TYPE_UNKNOWN : c = fm_printf ( d + 1 , c , cols , " " ) ; break ; } } return ( c ) ; }
Recursively print a nvlist in the specified column width and return the
 column we end up in.
Recursively print a nvlist in the specified column width and return the column we end up in .
/* already printed by caller */