Blame SOURCES/0016-dmidecode-Add-helper-function-pr_subattr.patch

f877e3
From 20d50c70b98d2a7013b604d575656a098d294f7f Mon Sep 17 00:00:00 2001
f877e3
From: Jean Delvare <jdelvare@suse.de>
f877e3
Date: Wed, 1 Apr 2020 10:00:27 +0200
f877e3
Subject: [PATCH 16/23] dmidecode: Add helper function pr_subattr
f877e3
f877e3
Print all second-level attributes through a helper function pr_subattr.
f877e3
f877e3
Signed-off-by: Jean Delvare <jdelvare@suse.de>
f877e3
---
f877e3
 dmidecode.c | 68 ++++++++++++++++++++++++++++-------------------------
f877e3
 dmioem.c    | 12 +++++-----
f877e3
 dmioutput.c | 12 ++++++++++
f877e3
 dmioutput.h |  1 +
f877e3
 4 files changed, 55 insertions(+), 38 deletions(-)
f877e3
f877e3
diff --git a/dmidecode.c b/dmidecode.c
f877e3
index 5a5299ed13ba..3d1da955bab8 100644
f877e3
--- a/dmidecode.c
f877e3
+++ b/dmidecode.c
f877e3
@@ -431,7 +431,8 @@ static void dmi_bios_characteristics_x2(u8 code)
f877e3
  * 7.2 System Information (Type 1)
f877e3
  */
f877e3
 
f877e3
-static void dmi_system_uuid(const char *attr, const u8 *p, u16 ver)
f877e3
+static void dmi_system_uuid(void (*print_cb)(const char *name, const char *format, ...),
f877e3
+			    const char *attr, const u8 *p, u16 ver)
f877e3
 {
f877e3
 	int only0xFF = 1, only0x00 = 1;
f877e3
 	int i;
f877e3
@@ -444,16 +445,16 @@ static void dmi_system_uuid(const char *attr, const u8 *p, u16 ver)
f877e3
 
f877e3
 	if (only0xFF)
f877e3
 	{
f877e3
-		if (attr)
f877e3
-			pr_attr(attr, "Not Present");
f877e3
+		if (print_cb)
f877e3
+			print_cb(attr, "Not Present");
f877e3
 		else
f877e3
 			printf("Not Present\n");
f877e3
 		return;
f877e3
 	}
f877e3
 	if (only0x00)
f877e3
 	{
f877e3
-		if (attr)
f877e3
-			pr_attr(attr, "Not Settable");
f877e3
+		if (print_cb)
f877e3
+			print_cb(attr, "Not Settable");
f877e3
 		else
f877e3
 			printf("Not Settable\n");
f877e3
 		return;
f877e3
@@ -469,8 +470,8 @@ static void dmi_system_uuid(const char *attr, const u8 *p, u16 ver)
f877e3
 	 */
f877e3
 	if (ver >= 0x0206)
f877e3
 	{
f877e3
-		if (attr)
f877e3
-			pr_attr(attr,
f877e3
+		if (print_cb)
f877e3
+			print_cb(attr,
f877e3
 				"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
f877e3
 				p[3], p[2], p[1], p[0], p[5], p[4], p[7], p[6],
f877e3
 				p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
f877e3
@@ -481,8 +482,8 @@ static void dmi_system_uuid(const char *attr, const u8 *p, u16 ver)
f877e3
 	}
f877e3
 	else
f877e3
 	{
f877e3
-		if (attr)
f877e3
-			pr_attr(attr,
f877e3
+		if (print_cb)
f877e3
+			print_cb(attr,
f877e3
 				"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
f877e3
 				p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
f877e3
 				p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);
f877e3
@@ -3655,7 +3656,7 @@ static const char *dmi_address_decode(u8 *data, char *storage, u8 addrtype)
f877e3
 /*
f877e3
  * DSP0270: 8.5: Parse the protocol record format
f877e3
  */
f877e3
-static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
f877e3
+static void dmi_parse_protocol_record(u8 *rec)
f877e3
 {
f877e3
 	u8 rid;
f877e3
 	u8 rlen;
f877e3
@@ -3666,6 +3667,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
f877e3
 	u8 hlen;
f877e3
 	const char *addrstr;
f877e3
 	const char *hname;
f877e3
+	char attr[38];
f877e3
 
f877e3
 	/* DSP0270: 8.5: Protocol Identifier */
f877e3
 	rid = rec[0x0];
f877e3
@@ -3674,7 +3676,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
f877e3
 	/* DSP0270: 8.5: Protocol Record Data */
f877e3
 	rdata = &rec[0x2];
f877e3
 
f877e3
-	printf("%sProtocol ID: %02x (%s)\n", prefix, rid,
f877e3
+	pr_attr("Protocol ID", "%02x (%s)", rid,
f877e3
 		dmi_protocol_record_type(rid));
f877e3
 
f877e3
 	/*
f877e3
@@ -3704,8 +3706,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
f877e3
 	 * endianess of the field is always little after version 2.6.0
f877e3
 	 * we can just pick a sufficiently recent version here.
f877e3
 	 */
f877e3
-	printf("%s\tService UUID: ", prefix);
f877e3
-	dmi_system_uuid(NULL, &rdata[0], 0x311);	/* FIXME */
f877e3
+	dmi_system_uuid(pr_subattr, "Service UUID", &rdata[0], 0x311);
f877e3
 
f877e3
 	/*
f877e3
 	 * DSP0270: 8.6: Redfish Over IP Host IP Assignment Type
f877e3
@@ -3713,13 +3714,13 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
f877e3
 	 * uses decimal, so as to make it more comparable
f877e3
 	 */
f877e3
 	assign_val = rdata[16];
f877e3
-	printf("%s\tHost IP Assignment Type: %s\n", prefix,
f877e3
+	pr_subattr("Host IP Assignment Type", "%s",
f877e3
 		dmi_protocol_assignment_type(assign_val));
f877e3
 
f877e3
 	/* DSP0270: 8.6: Redfish Over IP Host Address format */
f877e3
 	addrtype = rdata[17];
f877e3
 	addrstr = dmi_address_type(addrtype);
f877e3
-	printf("%s\tHost IP Address Format: %s\n", prefix,
f877e3
+	pr_subattr("Host IP Address Format", "%s",
f877e3
 		addrstr);
f877e3
 
f877e3
 	/* DSP0270: 8.6 IP Assignment types */
f877e3
@@ -3727,24 +3728,26 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
f877e3
 	if (assign_val == 0x1 || assign_val == 0x3)
f877e3
 	{
f877e3
 		/* DSP0270: 8.6: the Host IPv[4|6] Address */
f877e3
-		printf("%s\t%s Address: %s\n", prefix, addrstr,
f877e3
+		sprintf(attr, "%s Address", addrstr);
f877e3
+		pr_subattr(attr, "%s",
f877e3
 			dmi_address_decode(&rdata[18], buf, addrtype));
f877e3
 
f877e3
 		/* DSP0270: 8.6: Prints the Host IPv[4|6] Mask */
f877e3
-		printf("%s\t%s Mask: %s\n", prefix, addrstr,
f877e3
+		sprintf(attr, "%s Mask", addrstr);
f877e3
+		pr_subattr(attr, "%s",
f877e3
 			dmi_address_decode(&rdata[34], buf, addrtype));
f877e3
 	}
f877e3
 
f877e3
 	/* DSP0270: 8.6: Get the Redfish Service IP Discovery Type */
f877e3
 	assign_val = rdata[50];
f877e3
 	/* Redfish Service IP Discovery type mirrors Host IP Assignment type */
f877e3
-	printf("%s\tRedfish Service IP Discovery Type: %s\n", prefix,
f877e3
+	pr_subattr("Redfish Service IP Discovery Type", "%s",
f877e3
 		dmi_protocol_assignment_type(assign_val));
f877e3
 
f877e3
 	/* DSP0270: 8.6: Get the Redfish Service IP Address Format */
f877e3
 	addrtype = rdata[51];
f877e3
 	addrstr = dmi_address_type(addrtype);
f877e3
-	printf("%s\tRedfish Service IP Address Format: %s\n", prefix,
f877e3
+	pr_subattr("Redfish Service IP Address Format", "%s",
f877e3
 		addrstr);
f877e3
 
f877e3
 	if (assign_val == 0x1 || assign_val == 0x3)
f877e3
@@ -3753,20 +3756,22 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
f877e3
 		u32 vlan;
f877e3
 
f877e3
 		/* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Address */
f877e3
-		printf("%s\t%s Redfish Service Address: %s\n", prefix,
f877e3
-			addrstr, dmi_address_decode(&rdata[52], buf,
f877e3
+		sprintf(attr, "%s Redfish Service Address", addrstr);
f877e3
+		pr_subattr(attr, "%s",
f877e3
+			dmi_address_decode(&rdata[52], buf,
f877e3
 			addrtype));
f877e3
 
f877e3
 		/* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Mask */
f877e3
-		printf("%s\t%s Redfish Service Mask: %s\n", prefix,
f877e3
-			addrstr, dmi_address_decode(&rdata[68], buf,
f877e3
+		sprintf(attr, "%s Redfish Service Mask", addrstr);
f877e3
+		pr_subattr(attr, "%s",
f877e3
+			dmi_address_decode(&rdata[68], buf,
f877e3
 			addrtype));
f877e3
 
f877e3
 		/* DSP0270: 8.6: Redfish vlan and port info */
f877e3
 		port = WORD(&rdata[84]);
f877e3
 		vlan = DWORD(&rdata[86]);
f877e3
-		printf("%s\tRedfish Service Port: %hu\n", prefix, port);
f877e3
-		printf("%s\tRedfish Service Vlan: %u\n", prefix, vlan);
f877e3
+		pr_subattr("Redfish Service Port", "%hu", port);
f877e3
+		pr_subattr("Redfish Service Vlan", "%u", vlan);
f877e3
 	}
f877e3
 
f877e3
 	/* DSP0270: 8.6: Redfish host length and name */
f877e3
@@ -3783,7 +3788,7 @@ static void dmi_parse_protocol_record(const char *prefix, u8 *rec)
f877e3
 		hname = out_of_spec;
f877e3
 		hlen = strlen(out_of_spec);
f877e3
 	}
f877e3
-	printf("%s\tRedfish Service Hostname: %.*s\n", prefix, hlen, hname);
f877e3
+	pr_subattr("Redfish Service Hostname", "%.*s", hlen, hname);
f877e3
 }
f877e3
 
f877e3
 /*
f877e3
@@ -3803,8 +3808,7 @@ static const char *dmi_parse_device_type(u8 type)
f877e3
 	return out_of_spec;
f877e3
 }
f877e3
 
f877e3
-static void dmi_parse_controller_structure(const struct dmi_header *h,
f877e3
-					   const char *prefix)
f877e3
+static void dmi_parse_controller_structure(const struct dmi_header *h)
f877e3
 {
f877e3
 	int i;
f877e3
 	u8 *data = h->data;
f877e3
@@ -3936,7 +3940,7 @@ static void dmi_parse_controller_structure(const struct dmi_header *h,
f877e3
 				return;
f877e3
 			}
f877e3
 
f877e3
-			dmi_parse_protocol_record(prefix, rec);
f877e3
+			dmi_parse_protocol_record(rec);
f877e3
 
f877e3
 			/*
f877e3
 			 * DSP0270: 8.6
f877e3
@@ -4062,7 +4066,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
f877e3
 			pr_attr("Serial Number", "%s",
f877e3
 				dmi_string(h, data[0x07]));
f877e3
 			if (h->length < 0x19) break;
f877e3
-			dmi_system_uuid("UUID", data + 0x08, ver);
f877e3
+			dmi_system_uuid(pr_attr, "UUID", data + 0x08, ver);
f877e3
 			pr_attr("Wake-up Type", "%s",
f877e3
 				dmi_system_wake_up_type(data[0x18]));
f877e3
 			if (h->length < 0x1B) break;
f877e3
@@ -5002,7 +5006,7 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
f877e3
 				}
f877e3
 			}
f877e3
 			else
f877e3
-				dmi_parse_controller_structure(h, "\t");
f877e3
+				dmi_parse_controller_structure(h);
f877e3
 			break;
f877e3
 
f877e3
 		case 43: /* 7.44 TPM Device */
f877e3
@@ -5104,7 +5108,7 @@ static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver
f877e3
 				printf("%u.%u\n", data[key - 1], data[key]);
f877e3
 			break;
f877e3
 		case 0x108:
f877e3
-			dmi_system_uuid(NULL, data + offset, ver);
f877e3
+			dmi_system_uuid(NULL, NULL, data + offset, ver);
f877e3
 			break;
f877e3
 		case 0x305:
f877e3
 			printf("%s\n", dmi_chassis_type(data[offset]));
f877e3
diff --git a/dmioem.c b/dmioem.c
f877e3
index 873ec1068c16..9d6ec7520287 100644
f877e3
--- a/dmioem.c
f877e3
+++ b/dmioem.c
f877e3
@@ -97,10 +97,10 @@ static int dmi_decode_acer(const struct dmi_header *h)
f877e3
 			if (h->length < 0x0F) break;
f877e3
 			cap = WORD(data + 0x04);
f877e3
 			pr_attr("Function bitmap for Communication Button", "0x%04hx", cap);
f877e3
-			printf("\t\tWiFi: %s\n", cap & 0x0001 ? "Yes" : "No");
f877e3
-			printf("\t\t3G: %s\n", cap & 0x0040 ? "Yes" : "No");
f877e3
-			printf("\t\tWiMAX: %s\n", cap & 0x0080 ? "Yes" : "No");
f877e3
-			printf("\t\tBluetooth: %s\n", cap & 0x0800 ? "Yes" : "No");
f877e3
+			pr_subattr("WiFi", "%s", cap & 0x0001 ? "Yes" : "No");
f877e3
+			pr_subattr("3G", "%s", cap & 0x0040 ? "Yes" : "No");
f877e3
+			pr_subattr("WiMAX", "%s", cap & 0x0080 ? "Yes" : "No");
f877e3
+			pr_subattr("Bluetooth", "%s", cap & 0x0800 ? "Yes" : "No");
f877e3
 			pr_attr("Function bitmap for Application Button", "0x%04hx", WORD(data + 0x06));
f877e3
 			pr_attr("Function bitmap for Media Button", "0x%04hx", WORD(data + 0x08));
f877e3
 			pr_attr("Function bitmap for Display Button", "0x%04hx", WORD(data + 0x0A));
f877e3
@@ -278,8 +278,8 @@ static int dmi_decode_hp(const struct dmi_header *h)
f877e3
 			if (h->length < 0x14) break;
f877e3
 			feat = DWORD(data + 0x10);
f877e3
 			pr_attr("Misc. Features", "0x%08x", feat);
f877e3
-			printf("\t\tiCRU: %s\n", feat & 0x0001 ? "Yes" : "No");
f877e3
-			printf("\t\tUEFI: %s\n", feat & 0x1400 ? "Yes" : "No");
f877e3
+			pr_subattr("iCRU", "%s", feat & 0x0001 ? "Yes" : "No");
f877e3
+			pr_subattr("UEFI", "%s", feat & 0x1400 ? "Yes" : "No");
f877e3
 			break;
f877e3
 
f877e3
 		default:
f877e3
diff --git a/dmioutput.c b/dmioutput.c
f877e3
index 4c8a32a3569a..da04450494f7 100644
f877e3
--- a/dmioutput.c
f877e3
+++ b/dmioutput.c
f877e3
@@ -72,6 +72,18 @@ void pr_attr(const char *name, const char *format, ...)
f877e3
 	printf("\n");
f877e3
 }
f877e3
 
f877e3
+void pr_subattr(const char *name, const char *format, ...)
f877e3
+{
f877e3
+	va_list args;
f877e3
+
f877e3
+	printf("\t\t%s: ", name);
f877e3
+
f877e3
+	va_start(args, format);
f877e3
+	vprintf(format, args);
f877e3
+	va_end(args);
f877e3
+	printf("\n");
f877e3
+}
f877e3
+
f877e3
 void pr_list_start(const char *name, const char *format, ...)
f877e3
 {
f877e3
 	va_list args;
f877e3
diff --git a/dmioutput.h b/dmioutput.h
f877e3
index 33f09c4452bb..58ca5a854a79 100644
f877e3
--- a/dmioutput.h
f877e3
+++ b/dmioutput.h
f877e3
@@ -26,6 +26,7 @@ void pr_info(const char *format, ...);
f877e3
 void pr_handle(const struct dmi_header *h);
f877e3
 void pr_handle_name(const char *format, ...);
f877e3
 void pr_attr(const char *name, const char *format, ...);
f877e3
+void pr_subattr(const char *name, const char *format, ...);
f877e3
 void pr_list_start(const char *name, const char *format, ...);
f877e3
 void pr_list_item(const char *format, ...);
f877e3
 void pr_list_end(void);
f877e3
-- 
f877e3
2.17.1
f877e3